From 253004262e532e85ee4fd98d38542b7eb01412be Mon Sep 17 00:00:00 2001 From: Timur Sultanov Date: Thu, 1 Jun 2023 22:14:02 +0400 Subject: [PATCH] [Playground] Fix graph.dot search path (#26951) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix search path for the graph.dot file which contains the graph of the pipeline execution. The feature got broken after PR #26842. Adds a utility for starting up the Transform Service from Java (#26834) * Adds a utility for starting up the Transform Service from Java and adds an option for enabling it * Address reviewer comments * Addressing reviewer comments Feedback google forms iframe (#26864) * google forms * iframe * Fix tests --------- Co-authored-by: darkhan.nausharipov Make lulls message in Python SDK to be consistent with the implementation in Java SDK (#26936) * Make lulls message in Python SDK to be consistent with the implementation in Java SDK * Adjust unit tests to match introduced changes * Fix linting error Revert "populate jobs with gradle scans access (#26379)" (#26972) This reverts commit dbc1c1597fef3674e6261eb8c0728735aa517a31. adding myself to author list for blog (#26984) add back deleted line + test (#26976) [GO SDK] - avroio nullable fields fix (#26812) * fixing nullable fields issue in Go avroio * readability * updating all references to goavro [#22737] Fit & Finish for Go SDK timer support. (#26782) fix output_handler (#26923) Remove this log "Default Python SDK image for environment..." (#27002) [Refactor] Beam Python Healthcare Connectors (#26917) remove 360M of installer files bloat. (#26971) Adds new python avro example, removes broken example (#26689) Add new Beam Java SDK examples (#26488) * Add new Beam Java SDK examples These examples are intended for use in interactive embedded Playground frames in the Beam documentation. * Add license comment to new examples * Fix context_line * Added example for FlatMapElements transform * Add example for Partition transform * Add example for WithKeys transform * Add CoGroupByKey example * Add examples for Combine transform * Add example for Sum transform * Add examples for Count transform * Fix message in CoGroupByKey * Add example for GroupByKey transform * Add examples for Min transform * Add example for Max transform * Use generic variants of Min transform * Add examples for Mean transform * Move new examples into examples/java * Resolve linter error * Add example for Create transform * Add example for Flatten transform * Add section names to Java WordCount examples * Improve log output in new examples * Rename examples to avoid name conflict with katas * Fix compilation of examples * Add example for Window transform * Add example for Window transform * Move new examples to the root of the examples directory as running them from new directory fails in Playground as org.apache.beam.examples.basic namespace doesn't exist in the version of Beam deployed in the Playground. * Add example for View transform * Drop "Demo" suffix from new examples * Add example for Keys transform * Remove Kata suffix * Move GroupByKey example to avoid name conflict * Add "Combiners category to CombineExample.java * Remove "multifile: true" from WindowedWordCount Removing an unnecessary dependency (#27001) update tags after including guppy dataflow legacy container (#26973) [#25896] Add an initial UI to standalone prism command. (#26961) * Fail pipelines with unimplemented win strats. * Update stateful integ tests for reuse. Validate in prism. * Make the integration tests use ptest.BuildAndRun * Make transform URN support explicit. * [#25896][prism] v-1 of jobs console ui. in progress * [prismUI] weekend work * Update styles and tidy up handlers. * consolidate error handler * pre PR cleanup. * Add basic management tests. --------- Co-authored-by: lostluck <13907733+lostluck@users.noreply.github.com> Fix blog links (#27016) Add new Beam Python SDK examples (#26671) * Adapt cogroupbykey.py example to be compatible with Playgorund * Adapt combineglobally.py example to be compatible with Playgorund * Change cogroupbykey.py example name to avoid conflict * Fix combineglobally references in doc * Update tags for combineglobally * Adapt combineperkey.py to work with Playground * Fix test * Fix doc * Adapt combinevalues.py to work with Playground * Adapt count.py to work with Playground * Adapt distinc.py to work with Playground * Adapt groupbykey.py to work with Playground * Adapt groupintobatches.py to work with Playground * Adapt latest.py to work with Playground * Adapt max.py to work with Playground * Adapt mean.py to work with Playground * Adapt min.py to work with Playground * Adapt sample.py to work with Playground * Adapt sum.py to work with Playground * Adapt top.py to work with Playground * Adapt filter.py to work with Playground * Adapt flatmap.py to work with Playground * Adapt keys.py to work with Playground * Adapt kvswap.py to work with Playground * Adapt map.py to work with Playground * Adapt pardo.py to work with Playground * Adapt partition.py to work with Playground * Adapt regex.py to work with Playground * Adapt runinference.py to work with Playground * Adapt tostring.py to work with Playground * Adapt values.py to work with Playground * Adapt withtimestamps.py to work with Playground * Adapt groupby_test.py to work with Playground * Remove empty files * Adapt wordcount snippets to be runnable using Playground * Add example for Flatten transform * Add example for Window transform * Add example for Create transform * Add missing license * Fix example names * Fix formatting * Fix linter issues * Formattig fixes Overview of adding snippets to Playground (#25506) (#25507) * Overview of adding snippets to Playground (#25506) * Minor README changes (#25506) * Minor README changes (#25506) * List scanned directories, update example paths (#25506) * Edit after review answers (#25506) * Format comments (#25506) * Clean up (#25506) * Remove mentions of GCS support for datasets * Add documentation on how to add examples which use Kafka emulator * Add `location` field to tag example * Add license to get_your_code.md document * Revised iteration, it still is work in progress * Whitespace and other fixes * Improve Markdown formatting, fix internal links, fix typos (#25506) * Changes after internal review (#25506) * Replace the metadata table with a full YAML example (#25506) * Update the workflow diagram and the howto for adding an unlisted example (#25506) * Remove "GCS" variant from DatasetLocation as it's unsupported * Data access limitations changed * Note that context_line and categories are optional in example metadata (#25506) * Update try-beam-playground page with a link to the load_your_code doc (#25506) * Navigate to load_your_code.md on buttons in Playground (#25506) * Review and udpates * Update the diagram (#25506) * Link to ToB docs, add example URLs (#25506) * Clean up (#25506) * Fix links (#25506) * Playground doc update (#466) * Add Playground update guide to release-guide.md * Add SCHEMA.md with datastore schema description * Add information on when to implement data schema migrations and how * Add a note about indexes * Add commented out lines for local backend to backend_urls.dart * Use default version for python container * New Readme for playground * Update release-guide * Whitespace fix * Remove TODO related to Python sDK image build * Clarify TODOs * Add clarification on Redis usage * Document dependencies update process * Add script to fetch SCIO examples * Add a note on SCIO examples to load_your_code.md --------- Co-authored-by: Timur Sultanov * HOWTO for Flutter upgrade (#25506) * Clarify what to update in build.gradle for Go runner * Fix argument name * Update backend project structure * Add secription of directories used by the Playground project * Add link to manual Cloudbuild setup guide * README file update * README - HELM steps were added --------- Co-authored-by: Timur Sultanov Co-authored-by: Alex Kosolapov Co-authored-by: Rouslan <115221004+rshamunov@users.noreply.github.com> Co-authored-by: Sergey Makarkin Added dlq and error metrics to SpannerChangestreamsReadSchemaTransformProvider (#26970) * Added dlq and error metrics to SpannerChangestreamsReadSchemaTransformProvider * Add error tags in BigQuery Write and Spanner Write Transfroms Add metric counting finalized rows as reported by BQ (#26989) * Add metric counting finalized rows as reported by BQ * Run Spotless * Move stream finalization log to debug now that we have a metric to capture the information Do not skip latest blog entry from footer (#26999) Reduce the number of layers in Python base image. (#27006) Make sure spark/flink get tagged correctly (#26957) Add yaml validation using jsonschema. (#26920) * Add yaml validation using jsonschema. * Address comments. use max byte size and not max msg length in size check (#27017) Remove Beam Dependency Report code (#26954) * Remove Beam Dependency Report code * Remove reference in README * Remove other references to the dependency job * More references added initial node count variable (#27011) Co-authored-by: vdjerek Add minimal example for BigQuery usage (#26713) * Add minimal example for BigQuery usage * Add project name to default pipeline options * Add role for Service account - BigQuery * BigQuery DataViewer role added * Update MinimalBigQueryTornadoes.java --------- Co-authored-by: Sergey Makarkin Beam Quest Blogpost (#27004) Co-authored-by: Rebecca Szper <98840847+rszper@users.noreply.github.com> add runners theory for golang (#25251) * add runners theory for golang * correct tags * Update learning/tour-of-beam/learning-content/introduction/introduction-concepts/runner-concepts/description.md Co-authored-by: Ritesh Ghorse --------- Co-authored-by: mende1esmende1es Co-authored-by: Ritesh Ghorse Lint fixes: receiver consistency. (#27037) [Playground] Add KafkaStreaming example (#26890) * Add KafkaStreaming example Add an example for demostrating how to work with streaming data. The example produces random data, sends it into a Kafka topic and then consumes it. * Terminate example after 5 minutes * Start producing data only on next window start * Remove automatic application termination as it shuts down the whole Java VM instead of only shutting down the pipeline * Add "always_run" tag so the example will always be started using RunCode endpoint by the frontend Pass reference instead of value to cmp.Diff (#27053) Always make runner v2 default and return legacy container tag when runner_v1 is disabled (#27052) * Change the check for for runner_v2 * Add tests explicitly enabling runner v2 * change disable_runner_v2 to disable_runner_v2_until_v2.50 Disable kaniko cache compression when prebuilding images (#27023) Disable pip cache on the workers to reduce prebuilt container image size (#27035) Co-authored-by: tvalentyn Beam quest Blog Addon (#27051) Co-authored-by: Rebecca Szper <98840847+rszper@users.noreply.github.com> Co-authored-by: Ahmet Altay Make use of prism in periodic tests not cross compile. (#27054) Co-authored-by: lostluck <13907733+lostluck@users.noreply.github.com> Move AdaptiveThrottler impl to new Components directory (#27018) * Move AdaptiveThrottler impl to new Components directory * Remove unused consts from util.py * Linting * More linting Merge pull request #27047: Enable pubsub dynamic destinations by default [Playground] Make new python examples runnable (#27028) * fix examples not being invoked when running in Playground * Fix wordcount_wordcount example options * Make wordcount_debugging work exactly as it does in tests * Formatting fix * Add output to groupby_simple_aggregate * Fix formatting * Write text to output.txt reads all files from metadata list (#27059) [Tour of Beam] Learning content for "Splittable DoFn" module (#25707) * correct examples * delete whitespace * correct space * remove line and correct one line * correct context line --------- Co-authored-by: mende1esmende1es Unpin tox version in Beam code base (#26082) * Update BeamModulePlugin.groovy * add run to the tox cmd * Pin tox upper bound * Revert "Pin tox upper bound" This reverts commit 15020171aa6d0224f3a4ddd16106c701c9897c99. * Add /bin/bash to allow list externals * Remove tox versioning * Add comma * Add curl to the allowlist externals * Update sdks/python/tox.ini * Update sdks/python/tox.ini Issue26858 tob tests examples (#26932) * temp comment * handled examples failed to load error * issue26858 minor changes * Fix reporting examples failed to load in ToB frontend (#26858) * move ignore for file * returned commented tests * Fix playground_components tests (#26858) * Fix loading ExampleViewOptions for standard examples (#26858) * fix tests * try to fix tests * some prints for debugging added * removed prints * retrigger checks --------- Co-authored-by: Alexey Inkin Co-authored-by: darkhan.nausharipov Co-authored-by: Alexey Inkin Fix direct SDF runner handle_process_outputs (#27062) * Fix Direct Runner SDF output handler * Remove never worked test Remove leftovers * Fix lint [#27064] Make Tag existence explicit in release docs. (#27070) * [#27064] Make Tag existence explicit in release docs. * Add tag check. * ws --------- Co-authored-by: lostluck <13907733+lostluck@users.noreply.github.com> Add Certification + Beam Quest to Documentation (#26997) Co-authored-by: Rebecca Szper <98840847+rszper@users.noreply.github.com> Add note for updated release tag for 2.48 (#27073) Quote Addition + Sharing instructions [Beam Quest Blog] (#27066) Update Playground examples (#25032) * Merge changes * Remove incorrect tags * transforms tags unified * Tags amended * Fix context_lines for all examples * Update Kafka examples * Fixes for Kafka examples * Java spotless * Fix Java compilation issues * Fix Java compilation issues * Add Java dependencies Update TensorRT dockerfile (#27072) Option to return timezone aware datetime for to_utc_datetime (#26962) * Option to return timezone aware datetime for to_utc_datetime * Fix lint * Add pydoc reminding possible timezone mismatch * Fix pydoc Update to libraries-bom 26.16.0 (#27074) [Tour of Beam] Learning content for "Cross-language Transforms" module (#26227) Bump google.golang.org/api from 0.125.0 to 0.126.0 in /sdks (#27081) Bumps [google.golang.org/api](https://github.com/googleapis/google-api-go-client) from 0.125.0 to 0.126.0. - [Release notes](https://github.com/googleapis/google-api-go-client/releases) - [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.125.0...v0.126.0) --- updated-dependencies: - dependency-name: google.golang.org/api dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bigquery schema generation fix (#26960) * Detect collisions in Avro schema generation and use fully-qualified schema names when that happens. This should not interfere with existing behavior as this code path cannot currently encode schemas with the same name for a RECORD field in the schema (position and depth do not matter as a flat namespace is used) Github Workflow Replacement for Jenkins Job, beam_PreCommit_Go (Cron, Commit, Phrase) (#27042) * triggers fix for comment, cron, push * cron condition fix * cron trigger fix Preserve output when a pipeline dies on timeout (#26928) (#26929) [Playground] [Frontend] FCE updated to v0.3.0, minor improvements (#27063) * FCE updated to v0.3.0 * no wildcard_variable_uses * Add ToB HTML title --------- Co-authored-by: darkhan.nausharipov Co-authored-by: Alexey Inkin Embed examples (#26933) * Embed the word count examples * Fix links * Add Go examples to the WordCount tutorial * Embed the examples to the transform catalog * Drop the non-runnable Python examples from the WordCount tutorial, embed the Java ones by path * Minor embedding fixes * Delete the old example in CoGroupByKey * Fix minor embedding issues * Do not autofocus to embedded playground * Undo old example deletion * Clean up * Clean up * Fix embedded playground failure in WebKit * Fix not starting tostring_iterables.py * Undo an old example deletion * Fix SDK-dependent titles --------- Co-authored-by: Timur Sultanov [Playground] - New role add (#27082) * New role add * add comma --------- Co-authored-by: Sergey Makarkin Release Guide update for Playground environment (#27043) * Added steps to Release management doc * Added CD step Update learning-resources.md with links to video material (#27079) Cut the Playground output if it is too long (#27083) (#27084) * Cut the Playground if it is too long (#27083) * Improve error logging (#27083) Refactor key coder for Samza portable runner (#27095) Add required commands to allowlist_externals in tox.ini (#27089) * Remove multiple allowlist and place them at a single place * Add additional commands to allowlist Adding error tags in BigQuery Write Transforms (#27020) * Added dlq and error metrics to SpannerChangestreamsReadSchemaTransformProvider * Add error tags in BigQuery Write and Spanner Write Transfroms * Adding error tag in BigQueryStorageWriteApiSchemaTransformProvider Update BQ Autosahrding notes (#26874) Add fallback reviewers. (#26835) Bump google.golang.org/api from 0.123.0 to 0.124.0 in /sdks (#26856) Bumps [google.golang.org/api](https://github.com/googleapis/google-api-go-client) from 0.123.0 to 0.124.0. - [Release notes](https://github.com/googleapis/google-api-go-client/releases) - [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.123.0...v0.124.0) --- updated-dependencies: - dependency-name: google.golang.org/api dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: Naireen Hussain Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Add notebook for run inference with streaming pipeline example (#27075) * add notebook for run inference with streaming pipeline example * updated name, doc comments, removed pubsub * changed title, filename * Update examples/notebooks/beam-ml/run_inference_generative_AI.ipynb Co-authored-by: Rebecca Szper <98840847+rszper@users.noreply.github.com> --------- Co-authored-by: Rebecca Szper <98840847+rszper@users.noreply.github.com> [Python] Rename example notebook to fix links (#27102) Fix graph, update the Playground frontend README (#27100) * Update README * Fix typos * Fix graph * Trigger tests [Playground] Remove old deployment workflows (#27027) * [Playground] Remove old deployment workflows These workflows had been replaced by new CloudBuild triggers based ones. * Remove doc for non-existing workflows Bump github.com/tetratelabs/wazero from 1.1.0 to 1.2.0 in /sdks (#27010) Bumps [github.com/tetratelabs/wazero](https://github.com/tetratelabs/wazero) from 1.1.0 to 1.2.0. - [Release notes](https://github.com/tetratelabs/wazero/releases) - [Commits](https://github.com/tetratelabs/wazero/compare/v1.1.0...v1.2.0) --- updated-dependencies: - dependency-name: github.com/tetratelabs/wazero dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump go.mongodb.org/mongo-driver from 1.11.6 to 1.11.7 in /sdks (#27041) Bumps [go.mongodb.org/mongo-driver](https://github.com/mongodb/mongo-go-driver) from 1.11.6 to 1.11.7. - [Release notes](https://github.com/mongodb/mongo-go-driver/releases) - [Commits](https://github.com/mongodb/mongo-go-driver/compare/v1.11.6...v1.11.7) --- updated-dependencies: - dependency-name: go.mongodb.org/mongo-driver dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump cloud.google.com/go/bigquery from 1.51.1 to 1.51.2 in /sdks (#26627) Bumps [cloud.google.com/go/bigquery](https://github.com/googleapis/google-cloud-go) from 1.51.1 to 1.51.2. - [Release notes](https://github.com/googleapis/google-cloud-go/releases) - [Changelog](https://github.com/googleapis/google-cloud-go/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-cloud-go/compare/bigquery/v1.51.1...bigquery/v1.51.2) --- updated-dependencies: - dependency-name: cloud.google.com/go/bigquery dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> added beam_PreCommit_Typescript Github Actions job added beam_PreCommit_Typescript Github Actions job added beam_PreCommit_Typescript Github Actions job added beam_PreCommit_Typescript Github Actions job test test test test test test test test test test test added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job added beam_PreCommit_Java_Examples_Dataflow job test beam_PreCommit_Java_Examples_Dataflow added required steps Bump google.golang.org/api from 0.126.0 to 0.127.0 in /sdks (#27112) Bumps [google.golang.org/api](https://github.com/googleapis/google-api-go-client) from 0.126.0 to 0.127.0. - [Release notes](https://github.com/googleapis/google-api-go-client/releases) - [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.126.0...v0.127.0) --- updated-dependencies: - dependency-name: google.golang.org/api dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Merge pull request #26975: Add upsert and delete support to BigQueryIO Merge pull request #26849: add attribute support to writeAvros and writeProtos Bump golang.org/x/oauth2 from 0.8.0 to 0.9.0 in /sdks (#27124) Bumps [golang.org/x/oauth2](https://github.com/golang/oauth2) from 0.8.0 to 0.9.0. - [Commits](https://github.com/golang/oauth2/compare/v0.8.0...v0.9.0) --- updated-dependencies: - dependency-name: golang.org/x/oauth2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump cryptography from 40.0.2 to 41.0.0 in /sdks/python/container/py37 (#26995) Bumps [cryptography](https://github.com/pyca/cryptography) from 40.0.2 to 41.0.0. - [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pyca/cryptography/compare/40.0.2...41.0.0) --- updated-dependencies: - dependency-name: cryptography dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Portable bundle manager in Samza Runner (#26475) Add OWNERS file for Samza Runner (#27130) Initial implementation of QuotaEvent (#27078) * Initial implementation of QuotaEvent * Fix style * Fix typo * Add benchmark * Added clarification about close() QuotaEvents for BigQuery Upgrade Node dependency to 14.x (#26988) Bump actions/stale from 6 to 8 (#27111) Bumps [actions/stale](https://github.com/actions/stale) from 6 to 8. - [Release notes](https://github.com/actions/stale/releases) - [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/stale/compare/v6...v8) --- updated-dependencies: - dependency-name: actions/stale dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Github Workflow Replacement for Jenkins Job, beam_PreCommit_Whitespace (Cron, Commit, Phrase) (#27099) * added workflow beam_PreCommit_Whitespace * apache license block add * push path add Bump transformers (#27109) Bumps [transformers](https://github.com/huggingface/transformers) from 4.24.0 to 4.30.0. - [Release notes](https://github.com/huggingface/transformers/releases) - [Commits](https://github.com/huggingface/transformers/compare/v4.24.0...v4.30.0) --- updated-dependencies: - dependency-name: transformers dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump transformers (#27107) Bumps [transformers](https://github.com/huggingface/transformers) from 4.21.1 to 4.30.0. - [Release notes](https://github.com/huggingface/transformers/releases) - [Commits](https://github.com/huggingface/transformers/compare/v4.21.1...v4.30.0) --- updated-dependencies: - dependency-name: transformers dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Github Workflow Replacement for Jenkins Job, beam_PreCommit_Website (Cron, Commit, Phrase) (#27098) * workflow added beam_PreCommit_Website * apache license block add * push path website add Implement Java exception sampling (#27121) * Implement Java exception sampling * spotless * s/Exception/IOException Implement basic mapping capabilities for YAML. (#27096) Bump golang.org/x/sync from 0.2.0 to 0.3.0 in /sdks (#27137) Bumps [golang.org/x/sync](https://github.com/golang/sync) from 0.2.0 to 0.3.0. - [Commits](https://github.com/golang/sync/compare/v0.2.0...v0.3.0) --- updated-dependencies: - dependency-name: golang.org/x/sync dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Move to a conditionVariable for messages+state stream + test. (#27060) Co-authored-by: lostluck <13907733+lostluck@users.noreply.github.com> fix: fix beam metrics after migrating to async batcher (#27085) * fix: fix beam metrics after migrating to async batcher * update version * update bigtable version * update format * fix format Bump github.com/aws/aws-sdk-go-v2/service/s3 in /sdks (#27149) Bumps [github.com/aws/aws-sdk-go-v2/service/s3](https://github.com/aws/aws-sdk-go-v2) from 1.33.1 to 1.34.1. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.33.1...service/s3/v1.34.1) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/s3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Adding error tag and metrics in SpannerWriteSchemaTransformProvider (#27021) .test-infra Pipeline reads from Dataflow API and writes to BigQuery (#27008) * Create terraform to setup eventarc pipeline * Initial commit of pipeline * Fix stackoverflow * wip * aip * wip * wip * wip * wip * code cleanup to pass check * fix get metrics * Fix schema of embedded types * pass checks * Run locally, data written to BigQuery * Make Descriptor Schema registry static final instance * Configure flex template * Configure local template build * Allow dataflow worker to read artifact registry * Give dataflow worker access to api * Modify storage bucket * Throttle requests * Change Executors to single threaded * Additional cleanup * Gracefully shutdown threadpool * Add requests success/failure counters * Add items metrics * Cache and centralize channel shutdowns * Cleanup terraform * Cleanup code comments * Fix rat/whitespace checks * Remove unnecessary added dependency * Add @Internal to all classes Pylint repression same line install release candidates if available for setupVirtualEnv and instalLGCPTest tasks (#27068) Fix Python37 PostCommit azure-cli not support Bookworm (#27153) * Fix tox whitelist breaking change * Disable azurite azure API version check Fix sklearn requirement file in Py311 (#27152) * Fix sklearn requirement file in Py311 * Skip the test where model incompatible with newer sklearn version Select dedicated avro datum reader and writer (#26320) * Select dedicated avro darum reader and writer Use proper datum reader and writer and exose factories so users can provide custome ones. * Drop useReflectApi * Make test datum factory serializable * Reduce breaking changes * Keep old PubSubIO API * Do not deprecate API so far * Revert pubsub test * Remove leftover deprecated annotaions * Checkstyle imports * Remove abstract modifier to AvroCoder * Remove AvroCoder sub-types * Delegate coder type info to datum factory * Normalize coder factory usage * spotless & checkstyle * Fix compilation issue with parametrized type * Fix could object test for specialized AvroGenericCoder * Fix comment * Harden avroVersionsTest and add custom factory example * Revert AvroCoder constructor behavior change * Leverage AvroDatumFactory if passed are reader factory in AvroSource * Apply checkstyle * Cleanup build script * Add entry in CHANGES.md * Add extra test for nullable logical-type conversion in 1.9+ Update numpy requirement in /sdks/python (#27160) Updates the requirements on [numpy](https://github.com/numpy/numpy) to permit the latest version. - [Release notes](https://github.com/numpy/numpy/releases) - [Changelog](https://github.com/numpy/numpy/blob/main/doc/RELEASE_WALKTHROUGH.rst) - [Commits](https://github.com/numpy/numpy/compare/v1.14.3...v1.25.0) --- updated-dependencies: - dependency-name: numpy dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump google.golang.org/api from 0.127.0 to 0.128.0 in /sdks (#27163) Bumps [google.golang.org/api](https://github.com/googleapis/google-api-go-client) from 0.127.0 to 0.128.0. - [Release notes](https://github.com/googleapis/google-api-go-client/releases) - [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.127.0...v0.128.0) --- updated-dependencies: - dependency-name: google.golang.org/api dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump github.com/tetratelabs/wazero from 1.2.0 to 1.2.1 in /sdks (#27162) Bumps [github.com/tetratelabs/wazero](https://github.com/tetratelabs/wazero) from 1.2.0 to 1.2.1. - [Release notes](https://github.com/tetratelabs/wazero/releases) - [Commits](https://github.com/tetratelabs/wazero/compare/v1.2.0...v1.2.1) --- updated-dependencies: - dependency-name: github.com/tetratelabs/wazero dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump actions/setup-go from 3 to 4 (#27110) Bumps [actions/setup-go](https://github.com/actions/setup-go) from 3 to 4. - [Release notes](https://github.com/actions/setup-go/releases) - [Commits](https://github.com/actions/setup-go/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/setup-go dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> [website] #27115 Add supported Flink versions (#27117) Bump github.com/aws/aws-sdk-go-v2/service/s3 in /sdks (#27172) Bumps [github.com/aws/aws-sdk-go-v2/service/s3](https://github.com/aws/aws-sdk-go-v2) from 1.34.1 to 1.35.0. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.34.1...service/s3/v1.35.0) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/s3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Avro datum factory fixup (#27173) * Remove DecimalConversion from logical-type conversions * Restore AvroCloudObject compatibility Add initial DLQ router (#27045) * Add initial DLQ router * fix apache licenses Fix locking race between duplicate PartitionRecords w matching uid (#27055) Change default work remaining to 0.0 instead of 1.0 (#27032) * Factor out the SubscriptionPartitionRestrictionTracker and add a hasProgress implementation * Change default workremaining to 0 instead of 1 for improving downscaling * fix nullable annotation * Improve DoFnInvoker comments on the change from a default backlog of 1.0 to 0.0 * apply spotless [Code Completion Plugin] Define Element Pattern for java sdk obsolete action removed (#27143) Issue26977 changing sdk bug (#26978) * temp comment * handled examples failed to load error * issue26858 minor changes * issue26938 fixed examples loading twice * issue26977 fix change sdk bug * revert testing feature * remove unused imports * rename method * issue26977 tests added * fixed test * issue26977 fixed sdk changing tests * method extracted * tests simplified * fixed tests * Upgrade Flutter to v3.10.4 (#26977) --------- Co-authored-by: Alexey Inkin [Website] add project shield case study (#27087) Ensure that the BeamFnLoggingClient terminates process if stream breaks (#25186) * Ensure that a failure of the logging stream in BeamFnLoggingClient does not cause logging to block indefinitely but instead triggers SDK teardown. * fix test * fix racy test * address comments Bump cloud.google.com/go/spanner from 1.46.0 to 1.47.0 in /sdks (#27198) Bumps [cloud.google.com/go/spanner](https://github.com/googleapis/google-cloud-go) from 1.46.0 to 1.47.0. - [Release notes](https://github.com/googleapis/google-cloud-go/releases) - [Changelog](https://github.com/googleapis/google-cloud-go/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.46.0...spanner/v1.47.0) --- updated-dependencies: - dependency-name: cloud.google.com/go/spanner dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> [prism] UI improvements. (#27144) exception handling for loading models (#27186) [Tour of Beam] [Frontend] UI refinement from 01.06.23 (#26964) * default sdk, solution warning, bottom panel alignment * deleted code * markdown font sizes * review * removed Until we select an SDK the dropdown is not shown * _checkSdksLoadedCorrectly fix * _sdk in tour page test * relaunch ci * relaunch ci * deleted import, print exception * separate google forms url for tob * relaunch ci * relaunch ci * prints in tabbed_snippet_editor for debugging * reverted TabbedSnippetEditor with todo --------- Co-authored-by: darkhan.nausharipov Add banner and links to Tour of Beam to website (#26113) (#26145) * Add banner and links to Tour of Beam to website (#26113) * Lighten up the Tour of Beam desktop banner background (#26113) * Revert "Lighten up the Tour of Beam desktop banner background (#26113)" * Responsive height for top banners on desktop (#26113 * Semi-transparent pagination for banners (#26113) disable examples check (#27126) * disable examples check * Clean up (#27125) * Fix a Gradle task (#27125) * Fix a SCIO example descriptor (#27125) * Test local code instead of fetching from GitHub (#27125) * Fix tests (#27125) * Fix tests (#27125) * Update README (#27125) * Re-run tests (#27125) --------- Co-authored-by: Alexey Inkin Fix incorrect metadata for ToB Splittable DoFN module (#27092) * add work example * correct * fixing incorrect module structure * fixed io example tag * correct tags for bigquery examples --------- Co-authored-by: mende1esmende1es Performance improvements (#27119) * Performance improvements * Add a missing file Fix not sharing code from a duplicate tab (#27127) (#27128) [runners-flink] #27175 fix coder for eagerly bound state (#27176) * [runners-flink] #27175 fix coder for eagerly bound state * [website] update pipeline options for FlinkRunner [Security] Upgrade snappy-java to 1.1.10.0 (#27030) Revert "Adding error tag and metrics in SpannerWriteSchemaTransformProvider (#27021)" (#27204) This reverts commit 7ecd8e514448406a15bedc85a680b1e7153774f9. Add PortableUtils for Samza Runner (#27131) Bump github.com/aws/aws-sdk-go-v2/config in /sdks (#27148) Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.18.25 to 1.18.27. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.18.25...config/v1.18.27) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bigtable Read Xlang Wrapper for Python SDK (#26593) * create a more friendly BigtableRow * allow ByteBuffer Map value type in Beam Row * ReadFromBigtable and tests * skip if expansion port doesn't exist * formatting fixes * formatting * move attribute up * validate invalid configs * format fix * write 20 rows for test * format fix * debug find sdk location * debug: dont use wheels distribution * add sdk_container_image to df tests * use beamjarexpansionservice directly * ensure runs on python virtual env * format fix * remove unused labels field * add test for _BeamRowToPartialRowData * skip tests if bt dependencies not installed * test row key equality * fix test [Playground] Decrease severity of not important log messages (#27116) * Decrease log message severity for catalog cache timeout messages * Decrease severity of readiness check messages * Log transaction errors as warnings * Decrease severity of run error messages as they litter logs when user supplied code crashes * Revert "Decrease severity of readiness check messages" This reverts commit 9663bbad8a24e8dd1ee6cb634c23f05a4c420c03. [Playground] - Cloudfunction rename (#27139) * Change CloudFunction name * Fix function name * revert gradle file and change terraform file * Minor changes in Readme file * readme file update --------- Co-authored-by: Sergey Makarkin Adding error tag and metrics in SpannerWriteSchemaTransformProvider (#27184) Add (GPN:Beam) to the user-agent string of Python GCS SDKs. (#27211) * Add (GPN:Beam) to the user-agent string of Python GCS SDKs. For a valid user-agent string, the version number should be separated with the product name by "/". In addition, the requested string of "(GPN:Beam)" is considered a comment, and could not be the start of the user-agent string. * Add (GPN:Beam) to the user-agent string of Python GCS SDKs. For a valid user-agent string, the version number should be separated with the product name by "/". In addition, the requested string of "(GPN:Beam)" is considered a comment, and could not be the start of the user-agent string. Bump google.golang.org/grpc from 1.55.0 to 1.56.1 in /sdks (#27216) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.55.0 to 1.56.1. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.55.0...v1.56.1) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Fixes naming conflict with "Tour of Beam" (#27206) * rename * rename * rename * rename * renaming + link to the tour of beam. * renaming + link to the tour of beam. * move quotes * minor fixes * delete old tour of beam page * delete from nav page Remove python 3.7 support (#27194) * Remove python 3.7 support * Fix few places where py37 was removed * Add notes to changes.MD * fix pylint mypy * Add lint task to py38 * Fix error: The u prefix for strings is no longer necessary in Python >=3.0 * Fix few more lint errors * Don't modify bq client files disabling triggers on precommit website due to regression (#27185) Refactor code to make the UI more readable. Look at https://github.com/apache/beam/issues/27005#issuecomment-1599358169 (#27192) Add an affinity concept to yaml providers. (#27105) This will allow for selection of more-likely-to-fuse implementations for adjacent operations when more than one provider services the same operation. Update to libraries-bom 26.17.0 (#27209) Bump github.com/testcontainers/testcontainers-go in /sdks (#27229) Bumps [github.com/testcontainers/testcontainers-go](https://github.com/testcontainers/testcontainers-go) from 0.20.1 to 0.21.0. - [Release notes](https://github.com/testcontainers/testcontainers-go/releases) - [Commits](https://github.com/testcontainers/testcontainers-go/compare/v0.20.1...v0.21.0) --- updated-dependencies: - dependency-name: github.com/testcontainers/testcontainers-go dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump github.com/aws/aws-sdk-go-v2/feature/s3/manager in /sdks (#27161) Bumps [github.com/aws/aws-sdk-go-v2/feature/s3/manager](https://github.com/aws/aws-sdk-go-v2) from 1.11.67 to 1.11.70. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/feature/s3/manager/v1.11.67...feature/s3/manager/v1.11.70) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/feature/s3/manager dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Using capabilities instead of the container name to set use_single_core_per_container Add Exception metadata to the data sampling protocol Add https://github.com/apache/beam/issues/27000 as a known issue released in Beam 2.48.0 (#27235) Python data sampling optimization (#27157) * Python optimization work * Exception Sampling perf tests * add better element sampling microbenchmark * slowly move towards plumbing the samplers to the bundle processors * cleaned up * starting clean up and more testing * finish tests * fix unused data_sampler args and comments * yapf, comments, and simplifications * linter * lint and mypy * linter * run tests * address review comments * run tests --------- Co-authored-by: Sam Rohde Improve autoscaler throughput estimates and account for heartbeats (#27056) The throughput estimates are improved by storing the estimates per partition (in StreamProgress) rather than per dofn instance. This required some refactoring of ThroughputEstimator/SizeEstimator. It now estimates throughput (per second) of the last ReadChangeStream request. fix(typescript): Publish types correctly, don't publish tests fix(typescript): added more exports Basic error handling for yaml. (#27145) Updates Python ExternalTransform to use the transform service when needed (#27228) * Updates Python ExternalTransform to use the transform service when needed * Addressing reviewer comments * Fix yapf * Fix lint * Fix yapf Add blog post for Managing Beam dependencies in Java Vertex AI Remote Model Handler (#27091) * Move WIP code to new branch at HEAD * Add client-side throttling * Various linting issues * More linting, add dependency to setup.py * Fix Docstring * new flags, types, framework for eventual file read * Route to correct tutorial * Better flag name * Align type hints, pylint cleanup * Move off of constant, preprocess image * Change to keyed version for output * Yapf * Pylint * Clean up ToDo * Add TODOs for file globs * Fix cast, remove unneccessary assert * whitespace * More whitespace * Import order * More import ordering * Amend comment [Playground] [Frontend] Brand colors in Playground flutter_code_editor (#27218) * brand colors in PG FCE * link to website * restart ci * restart ci --------- Co-authored-by: darkhan.nausharipov Bump go.mongodb.org/mongo-driver from 1.11.7 to 1.12.0 in /sdks (#27215) Bumps [go.mongodb.org/mongo-driver](https://github.com/mongodb/mongo-go-driver) from 1.11.7 to 1.12.0. - [Release notes](https://github.com/mongodb/mongo-go-driver/releases) - [Commits](https://github.com/mongodb/mongo-go-driver/compare/v1.11.7...v1.12.0) --- updated-dependencies: - dependency-name: go.mongodb.org/mongo-driver dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> update readme with Beam Playground, Tour of Beam (#27243) Co-authored-by: xqhu runner image and arc changes (#27118) * runner image and arc changes * add state bucket comment in env file for reference * add readme for manual image push and sync beam environment --------- Co-authored-by: vdjerek Fix whitespace (#27247) test beam_PreCommit_Website test beam_PreCommit_Website test beam_PreCommit_Website [Tour of Beam] Learning content for "Final challenge" module (#26861) * add final challenge * correct examples * changge * correct golang * correct example hint * correct examples and add golang example * delete whitespace * delete whitespace * add file tag * correct final challenge * fixing incorrect tags and names * minor formatting * fixing example formatting * correct challenge * correct whitespace * change final-challenge-2 * correct imports * fix splittable unit id * formatting * format change * formatting * fixing template * temp fix of url * backend urls fix * restore backend urls * change * remove window --------- Co-authored-by: mende1esmende1es Co-authored-by: Oleh Borysevych Bump transformers (#27108) Bumps [transformers](https://github.com/huggingface/transformers) from 4.21.1 to 4.30.0. - [Release notes](https://github.com/huggingface/transformers/releases) - [Commits](https://github.com/huggingface/transformers/compare/v4.21.1...v4.30.0) --- updated-dependencies: - dependency-name: transformers dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Code completion plugin: add plugin tests workflow (#27212) * Code completion plugin: add plugin tests workflow * Testing changing directory in code_completion_plugin_tests.yml * Making gradlew executable * Fix gradlew intellij plugin import * change gradlew premissions * code-completion-plugin: fixing GA tests workflow * Revert "change gradlew premissions" This reverts commit ee396be64ec3bccb883d687fc0c201c6c0d35562. * Revert "code-completion-plugin: fixing GA tests workflow" This reverts commit 9baa351a003d30980ff0bcbe582a80c5853e0fd0. * fix code_completion_plugin_tests.yml * Making gradlew executable * code-completion-plugin-fix intellij plugin version in build.gradle.kts * code-completion-plugin: change java version (17 -> 11) in code_completion_plugin_tests.yml * test code completion plugin CI * Add env vars to code_completion_plugin_test.yml * code-completion-plugin: test ci * code-completion-plugin: clone intellij-community to CI runner --------- Co-authored-by: Pablo Co-authored-by: Pablo E add job rerun action (#27210) * add job rerun action * Update .github/actions/rerun-job-action/action.yml Typo Co-authored-by: Danny McCormick * header and a comment explaining the logic for going into re-run flow * deduplicate API calls * added some explanation within the action file * Update .github/actions/rerun-job-action/action.yml Typo Co-authored-by: Danny McCormick --------- Co-authored-by: vdjerek Co-authored-by: Danny McCormick Code completion plugin: Add Java SDK Transform Completions (Hard Coded) (#27168) * [Code Completion Plugin] Define Element Pattern for java sdk * Code Completion Plugin: Add java sdk transform completions * Verifying that tests are running as expected :) Sorry! * Update BeamCompletionContributorTestCase.java --------- Co-authored-by: Pablo [Website] add hsbc case study (#27200) [Tour of Beam] add work example (#27080) * add work example * correct * correct tags for bigquery examples * correct read-query * correct read-query tag * correct imports * remove package * correct * fixed example name --------- Co-authored-by: mende1esmende1es Co-authored-by: Oleh Borysevych Remove py37 references (#27252) Handling issue where keystore file is empty for MongoDB SSL (#27250) Bump worker image dependency (#27253) [#22737] Add line about timer support for Go (#27263) Bump actions/checkout from 2 to 3 (#27259) Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 3. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Add Tour of Beam Page (#27244) * add tour of beam page to redirect. * add tour of beam page to redirect. * add tour of beam page to redirect. Bump transformers (#27106) Bumps [transformers](https://github.com/huggingface/transformers) from 4.21.0 to 4.30.0. - [Release notes](https://github.com/huggingface/transformers/releases) - [Commits](https://github.com/huggingface/transformers/compare/v4.21.0...v4.30.0) --- updated-dependencies: - dependency-name: transformers dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump google.golang.org/protobuf from 1.30.0 to 1.31.0 in /sdks (#27262) Bumps google.golang.org/protobuf from 1.30.0 to 1.31.0. --- updated-dependencies: - dependency-name: google.golang.org/protobuf dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> [prism] Fix linting issue for flag var (#27248) updated job conditions test test test test improved if conditions improved if conditions test test test test Add notebook for image processing using beam (#27034) * Add notebook for image processing using beam * Delete image_processing_tensorflow.ipynb * add image processing use case using tensorflow * Delete image_processing_tensorflow.ipynb * Add image processing use case after suggestions * Delete image_processing_beam.ipynb * Add image processing with implemented suggestions Enable remote caching for Beam builds (#27015) Remove some null checks for optional SplunkIO parameters (#27177) don't error-log expected offset mismatch errors (#27251) Update Release Guide DockerHub beammaintainers team to beam (#27264) Add error metrics and DLQ support to GCS/File write schema transforms (#27039) * init * fixing * fixed avro schema transform * json error metrics * parquet error metric * xml error metrics * fix comments * spotless * add tests * spotless * Change name of ErrorCounterFn * add generic test for BeamRowMapperWithDlq Disable FirestoreIT tests on Dataflow (#27267) * Disable FirestoreIT tests on Dataflow * Fix spotless Fix perf tool tests (#27270) * Fix tests * Don't publish data when running analyzer in PR * Update .github/workflows/run_perf_alert_tool.yml * Run perf analysis tests during schedules * Don't authenticate during pull_request Bump google.golang.org/api from 0.128.0 to 0.129.0 in /sdks (#27265) Bumps [google.golang.org/api](https://github.com/googleapis/google-api-go-client) from 0.128.0 to 0.129.0. - [Release notes](https://github.com/googleapis/google-api-go-client/releases) - [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.128.0...v0.129.0) --- updated-dependencies: - dependency-name: google.golang.org/api dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Use a more mnemonic variable name (#27217) Co-authored-by: Julian Berzborn Bump cloud.google.com/go/bigquery from 1.51.2 to 1.52.0 in /sdks (#27266) Bumps [cloud.google.com/go/bigquery](https://github.com/googleapis/google-cloud-go) from 1.51.2 to 1.52.0. - [Release notes](https://github.com/googleapis/google-cloud-go/releases) - [Changelog](https://github.com/googleapis/google-cloud-go/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-cloud-go/compare/bigquery/v1.51.2...bigquery/v1.52.0) --- updated-dependencies: - dependency-name: cloud.google.com/go/bigquery dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Start expansion service containers before the controller container Cleanup for GA launch of ReadChangeStream (#27249) This includes a series of small changes to release the connector: - Remove option for users to override heartbeat duration - Add option to skip creating metadata table and standalone utility to create metadata table - Add hard timeout to mutateRow requests as workaround for hanging requests - Remove excessive RCSP logging for debugging during preview - Increase read rows timeout to better accomodate large tables - Remove side effects from InitializeDoFn - Lower ReadChangeStream deadline to closer align with checkpoint duration - Add release note to CHANGES.md Decrease run log failures severity (#27230) Decrease severity of messages which come from child processes as they usually indicate error in user-submitted code BigTable write SchemaTransform and Python wrapper (#27146) * python wrapper * schematransform; started some tests * schematransform and tests done * python wrapper and tests done * add tests for _DirectRowMutationsToBeamRow DoFn * use expansion service * style fix * style fix * use secrets token in instance name to prevent race condition between py37 & py311 tests * use typing typehints * style fix * add missing import * test fix * resolve merge issues * style fix * raise timeout of dataflow tests * fix setting timeout * address reviewer comments * address reviewer comments * trivial change * remove unused imports; lint fixes * add unittest main call [Security] Upgrade guava to 32.0.1-jre (#27279) * [Security] Upgrade guava to 32.0.1-jre * Update j2objc-annotations reference to match Guava's Bump cloud.google.com/go/pubsub from 1.31.0 to 1.32.0 in /sdks (#27282) Bumps [cloud.google.com/go/pubsub](https://github.com/googleapis/google-cloud-go) from 1.31.0 to 1.32.0. - [Release notes](https://github.com/googleapis/google-cloud-go/releases) - [Changelog](https://github.com/googleapis/google-cloud-go/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-cloud-go/compare/pubsub/v1.31.0...pubsub/v1.32.0) --- updated-dependencies: - dependency-name: cloud.google.com/go/pubsub dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Programmatically choose target Beam version for Automated Expansion Service tests (#27274) * Increase target Beam version for Automated Expansion Service testing * Automate selection of target JAR version Add explicit PortablePipelineOptions.enableHeapDumps to control heap dumping. (#26982) Finish Java Exception Sampling (#27257) * Finish Java Exception Sampling * wrong param name in comment * run tests * run tests * run tests [Python] Add note for using TF2 models with TensorFlow Hub (#27276) * add note for tf2 models * Update examples/notebooks/beam-ml/run_inference_with_tensorflow_hub.ipynb Co-authored-by: Rebecca Szper <98840847+rszper@users.noreply.github.com> * Update examples/notebooks/beam-ml/run_inference_with_tensorflow_hub.ipynb Co-authored-by: Rebecca Szper <98840847+rszper@users.noreply.github.com> --------- Co-authored-by: Rebecca Szper <98840847+rszper@users.noreply.github.com> Bump cloud.google.com/go/datastore from 1.11.0 to 1.12.0 in /sdks (#27281) Bumps [cloud.google.com/go/datastore](https://github.com/googleapis/google-cloud-go) from 1.11.0 to 1.12.0. - [Release notes](https://github.com/googleapis/google-cloud-go/releases) - [Changelog](https://github.com/googleapis/google-cloud-go/blob/main/documentai/CHANGES.md) - [Commits](https://github.com/googleapis/google-cloud-go/compare/kms/v1.11.0...kms/v1.12.0) --- updated-dependencies: - dependency-name: cloud.google.com/go/datastore dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Add boilerplate Java21 security properties support to sdk containers (#26798) Fix cleanUpDockerJavaImages fail (#27287) Implement Exception Sampling in the Python SDK (#27280) * Python exception sampling implementation * add to cython def * add more cython defs * address comments * fix circular imports * linter * fix tests * remove print * Add traceback to exception * fix tests --------- Co-authored-by: Sam Rohde Moving to 2.50.0-SNAPSHOT on master branch. Bump datastore-v1-proto-client dependency to match libraries-bom (#27285) Bump github.com/aws/aws-sdk-go-v2/feature/s3/manager in /sdks (#27295) Bumps [github.com/aws/aws-sdk-go-v2/feature/s3/manager](https://github.com/aws/aws-sdk-go-v2) from 1.11.70 to 1.11.71. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/feature/s3/manager/v1.11.70...feature/s3/manager/v1.11.71) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/feature/s3/manager dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump cloud.google.com/go/storage from 1.30.1 to 1.31.0 in /sdks (#27294) Bumps [cloud.google.com/go/storage](https://github.com/googleapis/google-cloud-go) from 1.30.1 to 1.31.0. - [Release notes](https://github.com/googleapis/google-cloud-go/releases) - [Changelog](https://github.com/googleapis/google-cloud-go/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-cloud-go/compare/pubsub/v1.30.1...pubsub/v1.31.0) --- updated-dependencies: - dependency-name: cloud.google.com/go/storage dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> bump govers to 1.20.5 (#27293) Simplify SchemaTransform API (#27202) * first batch: schematransform API, sql, debezium, fileIO, bigquery, bigtable, jdbc, singlestore * second batch: pubsub, pubsublite, spanner * third batch: kafka * fixes * fix missing override * bigtable write * spotless Update multi model notebook to remove workarounds (#27305) * Update multi model notebook to remove workarounds * Clean up + add conclusion Use requirements file as a constraint when building the expansion service container [#27207] Simplify Go quickstart. Add flag to do a docker system prune between docker push steps (#26967) * Add flag to do a docker system prune between docker push steps * Push to my docker image * order/prune python container pushes * Prune docker between pushes * Consolidate to loop * Temporarily point to my dockerhub to test/confirm * restore apache as dockerhub repo root * whitespace changed rerun logic to accomodate when job is not in check list (#27318) Populate getWorkStream latencies in dataflow streaming worker harness (#26085) Squash of two similar checks, not null check for "restriction.milisToRun" before unboxing the primitive (#27304) Co-authored-by: Anton_Shalkovich Publish Docker artifacts from build_release_candidate.yml (#26950) * Update build_release_candidate.yml * rm maven settings * Install python * Run docker prune after each big push * Add note to remove the settings.xml workaround if we move to self-hosted * Make best effort Remove relative imports. (#27323) Add topicPattern property to KafkaIO.Read to match topics using a regex (#26948) * Add topicPattern property to KafkaIO.Read to match topics using a regex * Add partially matched and unmatched topic pattern test * Change method signature of withTopicPattern to use String Replace StorageV1 client with GCS client (#25965) Update CHANGES.md after 2.49.0 cut (#27328) * Move entry added in between to correct section set _isPlaygroundShown after _currentUnitContent (#27242) Co-authored-by: darkhan.nausharipov add gcloud auth and push to registry on merge PR (#27341) * add gcloud auth and push to registry on merge PR * revert checkout version lower * Update build_runner_image.yml Removed tags and release branches from push trigger Upgrade obsolete Avro plugin to 0.16.0 (#27232) * Upgrade obsolete Gradle plugin to latest pre-1.0.0 version (#27231) * Upgrade to maintained plugin at oldest available version number * Downgrade to 0.20.0 due to mismatch in logical type for date/time * Force dateTimeLogicalType to JODA * Downgrade to 0.13.0 due to compatibility with Avro 1.8.2 * Suppress style checks on generated test Avro * Undo formatting changes * Upgrade to 0.16.0 Consider beam_services option when determining the expansion service type updated go precommit with new condition, re-run action, pull_req_targ… (#27321) * updated go precommit with new condition, re-run action, pull_req_target and permissions * permissions update * adding GH CLI install witin the rerun action * id_token does not accept read so none put adds GitHub CLI to runner image (#27342) Bump github.com/proullon/ramsql in /sdks (#27337) Bumps [github.com/proullon/ramsql](https://github.com/proullon/ramsql) from 0.0.0-20211120092837-c8d0a408b939 to 0.0.1. - [Release notes](https://github.com/proullon/ramsql/releases) - [Commits](https://github.com/proullon/ramsql/commits/v0.0.1) --- updated-dependencies: - dependency-name: github.com/proullon/ramsql dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump actions/setup-python from 3 to 4 (#27336) Bumps [actions/setup-python](https://github.com/actions/setup-python) from 3 to 4. - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/setup-python dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Verify script improvements (#27309) * Support run verify_release_build.sh on macOS * Fix filtering out Sickbay not work fix repo and add paths to push trigger (#27357) * fix repo and add paths to push trigger * added workflow as path for push Update Storage Write API Autosharding documentation (#27316) * update documentation * Add some styling Bump golang.org/x/text from 0.10.0 to 0.11.0 in /sdks (#27351) Bumps [golang.org/x/text](https://github.com/golang/text) from 0.10.0 to 0.11.0. - [Release notes](https://github.com/golang/text/releases) - [Commits](https://github.com/golang/text/compare/v0.10.0...v0.11.0) --- updated-dependencies: - dependency-name: golang.org/x/text dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Updates PythonExternalTransform to support IPv6 addresses wrong path fix (#27359) Respect BigQuery insert byte size limits (#24979) * limit insert request by bytes; unit test * make limit checks before adding row; log a warning when seeing a large row * send large rows to DLQ * fix tests * use number instead of variable * use global variable * use number * use global variable * use number * expose max payload size as a parameter * syntax fix * remove warning log; revert irrelevant tests * maintain buffer byte size for each destination * only delete buffer if it exists * attribute name change to indicate private * check user specified maximum is within allowed limits Keep roles for gcp SA updated (#27306) adding glcoud cli and kubectl (#27358) Add Windmill support for MultimapState (#23492) Fix windmill proto (#27361) Use DOCKERHUB_USER instead of username (#27362) [Go SDK][Prism] Improve failed pipeline handling (#27297) * Maintain job on requirement failure. * Clean up user failure logic to not panic. Fix flakiness for BeamFnLoggingClientTest (#27308) Inherit Generic for TimestampedValue (#26290) * Inherit Generic for TimestampedValue * add one test * change the generic only for value * polished the test * first try with type check * polish the type checks * linting * fix link * fix sorting * ignore mypy errors * normalize to beam type * fix the test * update the doc * added one typevar test --------- Co-authored-by: xqhu Update 2.50 release notes to include new Kafka topicPattern feature (#27367) Bump golang.org/x/oauth2 from 0.9.0 to 0.10.0 in /sdks (#27376) Bumps [golang.org/x/oauth2](https://github.com/golang/oauth2) from 0.9.0 to 0.10.0. - [Commits](https://github.com/golang/oauth2/compare/v0.9.0...v0.10.0) --- updated-dependencies: - dependency-name: golang.org/x/oauth2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump @grpc/grpc-js from 1.6.7 to 1.8.8 in /sdks/typescript (#27372) Bumps [@grpc/grpc-js](https://github.com/grpc/grpc-node) from 1.6.7 to 1.8.8. - [Release notes](https://github.com/grpc/grpc-node/releases) - [Commits](https://github.com/grpc/grpc-node/compare/@grpc/grpc-js@1.6.7...@grpc/grpc-js@1.8.8) --- updated-dependencies: - dependency-name: "@grpc/grpc-js" dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Update dataflow container versions (#27381) Update python options in runners/spark.md. (#27334) similar to https://github.com/apache/beam/pull/10465/, but for Spark Fix mismatched section title in Release Guide (#27383) MLTransform (#26795) * Initial work on MLTransform and ProcessHandler * Support for containers: List, Dict[str, np.ndarray] pass types Support Pyarrow schema Artifact WIP * Add min, max, artifacts for scale_0_to_1 * Add more transform functions and artifacts WIP on inferring types Remove pyarrow implementation Add MLTransformOutput Refactor files * Add generic type annotations * Add unit tests Fix artifacts code Add more tests fix lint erors Change namespaces from ml_transform to transforms Add doc strings Add tests and refactor * Add support for saving intermediate results for a transform Sort imports Add metrics namespaces Refactor * Add schema to the output PCollection * Remove MLTransformOutput and return Row instead with schema * Convert primitive type to list using a DoFn. Remove FixedLenFeatureSpec Make VarLenFeatureSpec as default Refactoring * Add append_transform to the ProcessHandler Some more refactoring * Remove param self.has_artifacts, add artifact_location to handler..and address PR comments Add skip conditions for tests Add test suite for tft tests * Move tensorflow import into the try except catch Try except in __init__.py Remove imports from __init__ Add docstrings, refactor * Add type annotations for the data transforms * Add tft test in tox.ini Mock tensorflow_transform in pydocs fix tft pypi name Skip a test Add step name Update supported versions of TFT * Add step name for TFTProcessHandler * Remove unsupported tft versions * Fix mypy * Refactor TFTProcessHandlerDict to TFTProcessHandlerSchema * Update doc for data processing transforms * Fix checking the typing container types * Refactor code * Fail TFTProcessHandler on a non-global window PColl * Remove underscore * Remove high level functions * Add TFIDF * Fix tests with new changes[WIP] * Fix tests * Refactor class name to CamelCase and remove kwrags * use is_default instead of isinstance * Remove falling back to staging location for artifact location * Add TFIDF tests * Remove __str__ * Refactor skip statement * Add utils for fetching artifacts on compute and apply vocab * Make ProcessHandler internal class * Only run analyze stage when transform_fn(artifacts) is not computed before. * Fail if pipeline has non default window during artifact producing stage * Add support for Dict, recordbatch and introduce artifact_mode * Hide process_handler from user. Make TFTProcessHandler as default * Refactor few tests * Comment a test * Save raw_data_meta_data so that it can be used during consume stage * Refactor code * Add test on artifacts * Fix imports * Add tensorflow_metadata to pydocs * Fix test * Add TFIDF to import * Add basic example * Remove redundant logging statements * Add test for multiple columns on MLTransform * Add todo about what to do when new process handler is introduced * Add abstractmethod decorator * Edit Error message * Update docs, error messages * Remove record batch input/output arg * Modify generic types * Fix import sort * Fix mypy errors - best effort * Fix tests * Add TFTOperation doc * Rename tft_transform to tft * Fix hadler_test * Fix base_test * Fix pydocs Arc additional pools (#27369) * adds additional pools object * adding disk size and removing old variables * changed default labelset for additional pools * updated beam.env * formatting * add gcloud login to readme and sync environment added the re-run step test test test test test test Address failing BT read tests in #27319 (#27322) * create table during setup instead * spotless * use slf4j logging * spotless Automatically use Docker Compose based transform service for PythonExternalTransform when needed. python precommit jobs and readme (#27379) Bump google.golang.org/grpc from 1.56.1 to 1.56.2 in /sdks (#27387) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.56.1 to 1.56.2. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.56.1...v1.56.2) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump google.golang.org/api from 0.129.0 to 0.130.0 in /sdks (#27377) Bumps [google.golang.org/api](https://github.com/googleapis/google-api-go-client) from 0.129.0 to 0.130.0. - [Release notes](https://github.com/googleapis/google-api-go-client/releases) - [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.129.0...v0.130.0) --- updated-dependencies: - dependency-name: google.golang.org/api dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Revert "Replace StorageV1 client with GCS client (#25965)" (#27388) This reverts commit 34a17963d57cc9b7dbf8cd0225dde63c5e254925. Fix CombineGlobally with GlobalWindows (#26922) Adds a better error message when this is used in an unsupported way as well as more testing. Restore trailing slash accidentally removed in https://github.com/apache/beam/pull/25665 fixes rerun call in matrix jobs (#27392) added beam_PreCommit_Java_Examples_Dataflow job (#27233) Migrate "beam_PreCommit_Typescript" Jenkins job to Github Actions (#27141) * added beam_PreCommit_Typescript job * improved if conditions * added the re-run step Fix staged RC source name in GA (#27394) * Fix staged RC source name format in GitHub Action Ensure CancellableQueue doesn't keep references to logically removed objects. (#27403) temporarily disable PreCommit_Java_Examples_Dataflow.yml (#27420) Fix a typo in the GenAI notebook (#27418) [Python] Make BigQuery load job names deterministic for retry resilience (#27384) * use partition key instead of uuid for job suffix * use pane index in job name to distinguish different load jobs in a streaming pipeline * clarify name components * fix affected tests Support for read from Cosmos DB Core SQL API (#25672) * feat(azure-cosmosdb): Add support for cosmosdb with Core (SQL) API Refs: #23604 * build(azure-cosmosdb): Add fleet in .gitignore * docs(azure-cosmosdb): Add scaladoc, license, experimental annotation and move the feature in CHANGELOG.md to 2.50.0 version. --------- Co-authored-by: Hector Miuler Malpica Gallegos sync test with master fix SparkRunner url (#27405) Bump cloud.google.com/go/datastore from 1.12.0 to 1.12.1 in /sdks (#27422) Bumps [cloud.google.com/go/datastore](https://github.com/googleapis/google-cloud-go) from 1.12.0 to 1.12.1. - [Release notes](https://github.com/googleapis/google-cloud-go/releases) - [Changelog](https://github.com/googleapis/google-cloud-go/blob/main/documentai/CHANGES.md) - [Commits](https://github.com/googleapis/google-cloud-go/compare/kms/v1.12.0...kms/v1.12.1) --- updated-dependencies: - dependency-name: cloud.google.com/go/datastore dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Beam pre commit java examples dataflow (#27432) * added beam_PreCommit_Java_Examples_Dataflow job * revert pull_request_target back Add build.gradle.kts to whitespace check (#27431) * Add build.gradle.kts to whitespace check * test - add some whitespace * Revert "test - add some whitespace" This reverts commit 13319f9b3686c3ce1d5d619ea19bfe5f4efabd64. * Fix more whitespace Runner image buildx and Website Precommit update (#27427) * add buildx and fix gcloud * precommit website update and enable Bump cloud.google.com/go/bigtable from 1.18.1 to 1.19.0 in /sdks (#27421) Bumps [cloud.google.com/go/bigtable](https://github.com/googleapis/google-cloud-go) from 1.18.1 to 1.19.0. - [Release notes](https://github.com/googleapis/google-cloud-go/releases) - [Changelog](https://github.com/googleapis/google-cloud-go/blob/main/documentai/CHANGES.md) - [Commits](https://github.com/googleapis/google-cloud-go/compare/storage/v1.18.1...pubsub/v1.19.0) --- updated-dependencies: - dependency-name: cloud.google.com/go/bigtable dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Refactor MLTrasform BaseOperation class (#27389) * Refactor code. Make get_artifacts abstract method of BaseOperation * rename apply to apply_transform * Add Docstring to MLTransform * Add _validate_transform method * Fix mypy * Provide default value while fetching vocab size from utils * Fix base test Implement environment variable type (#27407) Remove unneeded Dataflow Runner v1 code. (#27196) Provision a redis cluster on Kubernetes (#27409) [AWS Sqs] Add SqsIO.writeBatches for improved performance (closes #21429) (#26946) adding main labels to workflows. Updated whitespace job (#27442) Add beam_PreCommit_RAT job (#27423) * Add Beam PreCommit RAT job * Add RAT PreCommit workflow to README * Add name for Checkout step * Change Precommit to PreCommit Unbreak presubmit lint. (#27447) Update runinference.md (#27440) Bump github.com/tetratelabs/wazero from 1.2.1 to 1.3.0 in /sdks (#27446) Bumps [github.com/tetratelabs/wazero](https://github.com/tetratelabs/wazero) from 1.2.1 to 1.3.0. - [Release notes](https://github.com/tetratelabs/wazero/releases) - [Commits](https://github.com/tetratelabs/wazero/compare/v1.2.1...v1.3.0) --- updated-dependencies: - dependency-name: github.com/tetratelabs/wazero dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> [Python] Fix python lint (#27451) Add tighter bound to VertexAI retry filter (#27429) * Add tighter bound to VertexAI retry filter * Trailing whitespace * Add google-api-core dependency * Skip unit test if missing GCP dependencies * Move utility fn into vertex file * Skip on failed model handler import * Mark retry fn as internal helper Update document Storage API Support in `Google BigQuery I/O connector` for Python SDK (#26889) * Update BigQuery document; Python SDK(#26693) Add usage of BigQuery StorageWriteAPI in Python. --------- Co-authored-by: Ahmed Abualsaud <65791736+ahmedabu98@users.noreply.github.com> Fix prober tests (#27453) Bump semver (#27452) Bumps [semver](https://github.com/npm/node-semver) from 5.7.1 to 5.7.2. - [Release notes](https://github.com/npm/node-semver/releases) - [Changelog](https://github.com/npm/node-semver/blob/v5.7.2/CHANGELOG.md) - [Commits](https://github.com/npm/node-semver/compare/v5.7.1...v5.7.2) --- updated-dependencies: - dependency-name: semver dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> fix typo in docstring (#27456) [Python] use get_buffer to fetch buffer when the buffer is None (#27373) * Create empty ListBuffer when buffer is none * Replace empty buffer with a List/GroupBuffer * Apply suggestions from code review * Fix mypy error * Update sdks/python/apache_beam/runners/portability/fn_api_runner/fn_runner.py * Add test * Add note to CHANGES.md * Fix link in CHANGES.md Do not prompt yN in gpg sign (#27455) Add dockerhub step to release guide (#27457) [Yaml] Unit Tests for SafeLineLoader and LightweightScope (yaml/yaml_transform.py) (#27086) Remove ValidatesRunner_V1 suite (#26543) * Remove ValidatesRunner_V1 suite * Remove v2 from naming + update readme * Remove v1 from gradle.properties * Remove unused tasks added beam_PreCommit_Java_Examples_Dataflow_Java11.yml job added beam_PreCommit_Java_Examples_Dataflow_Java11.yml job fixes issue with pagination when PR has more than 30 jobs (#27468) adding runner image 738c02cac (#27441) * adding runner image 738c02cac * change runner and node max * bump main pool to 16 max Bump protobufjs from 6.11.3 to 7.2.4 in /sdks/typescript Bumps [protobufjs](https://github.com/protobufjs/protobuf.js) from 6.11.3 to 7.2.4. - [Release notes](https://github.com/protobufjs/protobuf.js/releases) - [Changelog](https://github.com/protobufjs/protobuf.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/protobufjs/protobuf.js/compare/v6.11.3...protobufjs-v7.2.4) --- updated-dependencies: - dependency-name: protobufjs dependency-type: direct:production ... Signed-off-by: dependabot[bot] Some more runner v2 cleanup (#27464) * Some more runner v2 cleanup * Fix suffix * Remove duplicate tasks * Remove duplicate tasks * Syntax Allow use of private endpoints for Vertex AI requests (#27458) Remove obsolete native (dataflow) io from Beam Python. (#27444) This was only needed for Runner v1. Fix BigQuery batch insertion loop (#27477) [#27435] Describe the Source and Sink transform and urns in the protos. (#27437) * [#27435] Describe source and sink transforms. * Add underscores. * re-order because * Move to fn_api.proto * rm space * Describe the enum messages. * import beam_urn correctly * robertwb's pr comments & suggestions --------- Co-authored-by: lostluck <13907733+lostluck@users.noreply.github.com> Finish removing dataflow runner v1/v2 splits (#27479) * Finish removing v1/v2 splits * Add changes.md entry * Lint Add PythonDocs PreCommit job (#27467) * Add PythonDocs PreCommit job Interrupt previous test runs when a new run kicks off (#27439) Use plain Impulse rather than a full Read for 0, 1 element Creates. (#26332) Most of the complexity here is in preserving the read for update compatibility. Revert "[Python] use get_buffer to fetch buffer when the buffer is None (#27373)" (#27491) This reverts commit 63d5171b70fd05ea8c79cc549d1ec94b3eb4c57d. Stop release kafka-xxx artifacts (#27490) Bump github.com/aws/aws-sdk-go-v2/service/s3 in /sdks (#27500) Bumps [github.com/aws/aws-sdk-go-v2/service/s3](https://github.com/aws/aws-sdk-go-v2) from 1.36.0 to 1.37.0. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.36.0...service/s3/v1.37.0) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/s3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump github.com/aws/aws-sdk-go-v2/feature/s3/manager in /sdks (#27497) Bumps [github.com/aws/aws-sdk-go-v2/feature/s3/manager](https://github.com/aws/aws-sdk-go-v2) from 1.11.71 to 1.11.72. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/feature/s3/manager/v1.11.71...feature/s3/manager/v1.11.72) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/feature/s3/manager dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Add branch protection rules via .asf.yaml (#27502) * Add branch protection rules via .asf.yaml * Fix branch replacement Bump google.golang.org/api from 0.130.0 to 0.131.0 in /sdks (#27481) Bumps [google.golang.org/api](https://github.com/googleapis/google-api-go-client) from 0.130.0 to 0.131.0. - [Release notes](https://github.com/googleapis/google-api-go-client/releases) - [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.130.0...v0.131.0) --- updated-dependencies: - dependency-name: google.golang.org/api dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> added beam_PreCommit_Java_Examples_Dataflow_Java11.yml job added beam_PreCommit_Java_Examples_Dataflow_Java11.yml job added beam_PreCommit_Java_Examples_Dataflow_Java11.yml job added beam_PreCommit_Java_Examples_Dataflow_Java11.yml job added beam_PreCommit_Java_Examples_Dataflow_Java11.yml job added beam_PreCommit_Java_Examples_Dataflow_Java11.yml job added beam_PreCommit_Java_Examples_Dataflow_Java11.yml job added beam_PreCommit_Java_Examples_Dataflow_Java11.yml job added beam_PreCommit_Java_Examples_Dataflow_Java11.yml job added beam_PreCommit_Java_Examples_Dataflow_Java11.yml job added beam_PreCommit_Java_Examples_Dataflow_Java11.yml job added beam_PreCommit_Java_Examples_Dataflow_Java11.yml job added beam_PreCommit_Java_Examples_Dataflow_Java11.yml job Append `anomaly` to the right change point index (#27288) * Append `anomaly` to the right change point index * Update sdks/python/apache_beam/testing/analyzers/github_issues_utils.py * Add test * Fix imports * Update sdks/python/apache_beam/testing/analyzers/perf_analysis_test.py Co-authored-by: tvalentyn * Address comments * Refactor code * Refactor code; address comments * Fix test check * Update perf_analysis_test.py * Fix formatting * address comments/remove new_lines_joiner constant * fix test --------- Co-authored-by: tvalentyn Add ScaleByMinMax and NGrams data processing transformations (#27493) * Add ScaleByMinMax and NGrams * Update sdks/python/apache_beam/ml/transforms/tft.py * Add comment and TODO * add different inputs to test Refactor MLTransform basic example (#27430) * Refactor MLTransform basic example * Refactor and add comments on artifacts * Add example output in comments * Add comments [#22737] Add Go SDK timers to programming guide (#27496) * [#22737] Add Go SDK timers to programming guide * pr comments --------- Co-authored-by: lostluck <13907733+lostluck@users.noreply.github.com> Update Python base image requirements. (#27494) Update Beam website to release 2.49.0 (#27374) * Update Beam website to release 2.49.0 * Simplify Flink Version Compatibility table * Update support status of IO as of 2.49.0 Report total time at max active threads (#27195) * add "totalTime" variable in BoundedQueueExecutor, tracking total time at max active threads used * add timeAtMaxActiveThreads cumulative metric * adding a unit test and smaller changes * fixing formatting issues with `spotlessApply` * removing comment in build.gradle that runs individual test * Update runners/google-cloud-dataflow-java/worker/src/main/java/org/apache/beam/runners/dataflow/worker/util/BoundedQueueExecutor.java Co-authored-by: Bruno Volpato * changing get to getAnd(SomeOperation). * checking if total threads is greater than or equal to max --------- Co-authored-by: Bruno Volpato Pin Build Python Wheels to Cython < 1 (#27525) * Pin Build Python Wheels to Cython < 1 * Pin gradle usage * Correct version pinning Add splitting string for string related data transforms (#27517) * add string split * Refactor test * support multi delimiter split * Apply suggestions from code review Co-authored-by: Ritesh Ghorse * update delimiter --------- Co-authored-by: Ritesh Ghorse Moving Pubsub Transforms to beam (#27366) Bump org.checkerframework:checkerframework-gradle-plugin (#27378) Bumps org.checkerframework:checkerframework-gradle-plugin from 0.6.19 to 0.6.29. --- updated-dependencies: - dependency-name: org.checkerframework:checkerframework-gradle-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Add PreCommit PythonIT job (#27519) * Add PreCommit PythonIT job * Rename Python_Integration job Added GitHub Workflow Replacement for Jenkins job_PreCommit_CommunityMetrics (#27466) Add missing package to imports. (#27528) [Python] Fix python lints (#27543) Show the proper error message if a GCS exception is thrown without a .message. (#27538) * Show the proper error message if an exception is thrown without a .message. * Use "raise from" instead of message introspection. * Linting added beam_PreCommit_Java_Examples_Dataflow_Java17.yml job added beam_PreCommit_Java_Spark3_Versions.yml job added beam_PreCommit_Java_Spark3_Versions.yml job Update Dataflow dev container image tag. (#27545) Various release script fixes (#27548) * Various release script fixes * Remove Release_Gradle_Build job from release verification * Fix publish docker image script to work with remotely built images * Change empty file to .json to make RAT_PreCommit happy * Set base branch to the release branch for build snapshot PR * Bump pubsub signal wait for pipeline start to 8 min in integration tests * Change message head from Warning to Level for PubsubInjector as it follows by an exit(1) * Fix Pylint Bump word-wrap from 1.2.3 to 1.2.4 in /sdks/typescript (#27556) Bumps [word-wrap](https://github.com/jonschlinkert/word-wrap) from 1.2.3 to 1.2.4. - [Release notes](https://github.com/jonschlinkert/word-wrap/releases) - [Commits](https://github.com/jonschlinkert/word-wrap/compare/1.2.3...1.2.4) --- updated-dependencies: - dependency-name: word-wrap dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump distlib from 0.3.6 to 0.3.7 in /sdks/python (#27531) Bumps [distlib](https://github.com/pypa/distlib) from 0.3.6 to 0.3.7. - [Release notes](https://github.com/pypa/distlib/releases) - [Changelog](https://github.com/pypa/distlib/blob/master/CHANGES.rst) - [Commits](https://github.com/pypa/distlib/compare/0.3.6...0.3.7) --- updated-dependencies: - dependency-name: distlib dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> add worker metadata to windmill* protos (#27462) cleanup tests (#27434) test beam_PreCommit_Java_Spark3_Versions job --- .asf.yaml | 60 + .github/ACTIONS.md | 2 + .github/actions/rerun-job-action/action.yml | 129 + .../test-properties.json | 14 +- .../setup-self-hosted-action/action.yml | 9 - .../arc/README.md | 44 +- .../arc/config/arc_autoscaler.tpl | 4 +- .../arc/config/arc_deployment.tpl | 35 +- .../arc/environments/beam.env | 47 +- .../gh-actions-self-hosted-runners/arc/gke.tf | 54 +- .../arc/helm.tf | 2 +- .../gh-actions-self-hosted-runners/arc/iam.tf | 7 - .../arc/images/Dockerfile | 68 + .../arc/images/README.md | 36 + .../arc/kubernetes.tf | 30 +- .../arc/variables.tf | 87 +- .github/workflows/README.md | 35 + .../beam_PreCommit_CommunityMetrics.yml | 92 + .github/workflows/beam_PreCommit_Go.yml | 89 +- .../beam_PreCommit_Java_Examples_Dataflow.yml | 114 + ...reCommit_Java_Examples_Dataflow_Java11.yml | 116 + ...reCommit_Java_Examples_Dataflow_Java17.yml | 116 + .../beam_PreCommit_Java_Spark3_Versions.yml | 101 + .../workflows/beam_PreCommit_PythonDocs.yml | 83 + .../beam_PreCommit_Python_Integration.yml | 108 + .github/workflows/beam_PreCommit_RAT.yml | 77 + .../workflows/beam_PreCommit_Typescript.yml | 86 + .github/workflows/beam_PreCommit_Website.yml | 83 + .../workflows/beam_PreCommit_Whitespace.yml | 85 + .../workflows/build_playground_backend.yml | 98 - .../workflows/build_playground_frontend.yml | 92 - .github/workflows/build_release_candidate.yml | 49 +- .github/workflows/build_runner_image.yml | 71 + .github/workflows/build_wheels.yml | 10 +- .../code_completion_plugin_tests.yml | 112 + .github/workflows/cut_release_branch.yml | 12 +- .github/workflows/dask_runner_tests.yml | 3 +- .github/workflows/go_tests.yml | 2 +- .github/workflows/job_PreCommit_Python.yml | 100 + .../job_PreCommit_PythonAutoformatter.yml | 83 + .../workflows/job_PreCommit_PythonLint.yml | 86 + .../job_PreCommit_Python_Coverage.yml | 89 + .../job_PreCommit_Python_Dataframes.yml | 98 + .../job_PreCommit_Python_DockerBuild.yml | 99 + .../job_PreCommit_Python_Examples.yml | 99 + .../job_PreCommit_Python_Runners.yml | 100 + .../job_PreCommit_Python_Transforms.yml | 100 + .github/workflows/local_env_tests.yml | 4 +- .../workflows/playground_deploy_backend.yml | 91 - .../workflows/playground_deploy_examples.yml | 198 - .../playground_examples_cd_reusable.yml | 77 - .github/workflows/playground_examples_ci.yml | 51 - .../playground_examples_ci_reusable.yml | 201 - .../workflows/playground_frontend_test.yml | 2 +- .github/workflows/python_dependency_tests.yml | 1 - .github/workflows/python_tests.yml | 9 +- .github/workflows/run_perf_alert_tool.yml | 6 + .github/workflows/run_rc_validation.yml | 4 +- .github/workflows/stale.yml | 2 +- .github/workflows/tour_of_beam_backend.yml | 2 +- .../tour_of_beam_backend_integration.yml | 2 +- .../workflows/tour_of_beam_examples_ci.yml | 47 - .../workflows/tour_of_beam_frontend_test.yml | 4 +- .gitignore | 3 + .../jenkins/CommonJobProperties.groovy | 2 +- .../jenkins/PythonTestProperties.groovy | 5 +- .test-infra/jenkins/README.md | 9 +- .../dependency_check/bigquery_client_utils.py | 149 - .../dependency_check_report_generator.py | 350 - .../dependency_check_report_generator_test.py | 134 - .../dependency_check/generate_report.sh | 64 - .../report_generator_config.py | 81 - .../dependency_check/version_comparer.py | 51 - .../dependency_check/version_comparer_test.py | 54 - .../jenkins/job_Dependency_Check.groovy | 73 - .../job_PerformanceTests_Python.groovy | 2 +- .../job_PostCommit_PortableJar_Flink.groovy | 2 +- .../job_PostCommit_PortableJar_Spark.groovy | 2 +- ...t_Python_CrossLanguage_Gcp_Dataflow.groovy | 2 +- ...mit_Python_ValidatesRunner_Dataflow.groovy | 5 +- ..._Python_ValidatesRunner_Dataflow_V2.groovy | 46 - .../jenkins/job_PreCommit_Whitespace.groovy | 1 + .../jenkins/job_Release_Gradle_Build.groovy | 49 - .test-infra/metrics/build.gradle | 2 +- .../Python_WordCount_IT_Benchmarks.json | 2 +- .../src/test/groovy/ProberTests.groovy | 2 +- .../metrics/sync/jenkins/syncjenkins.py | 46 +- .test-infra/pipelines/README.md | 34 + .test-infra/pipelines/build.gradle | 85 + .test-infra/pipelines/go.mod | 21 + .test-infra/pipelines/go.sum | 2 + .../01.setup/.terraform.lock.hcl | 40 + .../infrastructure/01.setup/README.md | 83 + .../01.setup/apache-beam-testing.tfbackend | 11 +- .../01.setup/apache-beam-testing.tfvars | 19 + .../01.setup/artifactregistry.tf | 30 + .../infrastructure/01.setup/common.tfvars | 21 + .../pipelines/infrastructure/01.setup/iam.tf | 37 + .../infrastructure/01.setup/provider.tf | 22 + .../infrastructure/01.setup/services.tf | 35 + .../infrastructure/01.setup/state.tf | 26 + .../infrastructure/01.setup/storage.tf | 43 + .../infrastructure/01.setup/variables.tf | 37 + .../02.network/.terraform.lock.hcl | 22 + .../infrastructure/02.network/README.md | 81 + .../02.network/apache-beam-testing.tfbackend | 19 + .../02.network/apache-beam-testing.tfvars | 19 + .../infrastructure/02.network/common.tfvars | 22 + .../infrastructure/02.network/data.tf | 22 + .../infrastructure/02.network/network.tf | 46 + .../infrastructure/02.network/provider.tf | 16 +- .../infrastructure/02.network/state.tf | 26 + .../infrastructure/02.network/variables.tf | 42 + .../pipelines/infrastructure/03.io/README.md | 24 + .../api-overuse-study/02.redis/README.md | 46 + .../api-overuse-study/02.redis/common.tfvars | 19 + .../03.io/api-overuse-study/02.redis/data.tf | 24 + .../api-overuse-study/02.redis/provider.tf | 16 +- .../03.io/api-overuse-study/02.redis/redis.tf | 35 + .../api-overuse-study/02.redis/variables.tf | 22 + .../dataflow-to-bigquery/.terraform.lock.hcl | 21 + .../03.io/dataflow-to-bigquery/README.md | 86 + .../apache-beam-testing.tfbackend | 19 + .../apache-beam-testing.tfvars | 19 + .../03.io/dataflow-to-bigquery/bigquery.tf | 30 + .../03.io/dataflow-to-bigquery/common.tfvars | 22 + .../03.io/dataflow-to-bigquery/data.tf | 27 + .../03.io/dataflow-to-bigquery/iam.tf | 41 + .../03.io/dataflow-to-bigquery/provider.tf | 21 + .../03.io/dataflow-to-bigquery/pubsub.tf | 39 + .../03.io/dataflow-to-bigquery/state.tf | 26 + .../03.io/dataflow-to-bigquery/variables.tf | 42 + .../03.io/dataflow-to-bigquery/workflow.tf | 67 + .../dataflow-to-bigquery/README.md | 66 + .../apache-beam-testing.tfvars | 20 + .../dataflow-to-bigquery/common.tfvars | 24 + .../04.template/dataflow-to-bigquery/data.tf | 53 + .../dataflow-template.json | 20 + .../dataflow-to-bigquery/output.tf | 22 + .../dataflow-to-bigquery/provider.tf | 21 + .../dataflow-to-bigquery/template.tf | 58 + .../dataflow-to-bigquery/variables.tf | 57 + .../pipelines/infrastructure/README.md | 65 + .../main/go/internal/environment/variable.go | 81 + .../go/internal/environment/variable_test.go | 358 + .../ReadDataflowApiWriteBigQuery.java | 362 + .../bigquery/BigQueryWriteOptions.java | 35 + .../pipelines/bigquery/BigQueryWrites.java | 166 + .../bigquery/DatasetReferenceOptionValue.java | 58 + .../pipelines/bigquery/package-info.java | 20 + .../conversions/ConversionError.java | 73 + .../conversions/EventarcConversions.java | 116 + .../pipelines/conversions/JobsToRow.java | 89 + .../conversions/RowConversionResult.java | 81 + .../conversions/WithAppendedDetailsToRow.java | 265 + .../pipelines/conversions/package-info.java | 20 + .../dataflow/DataflowClientFactory.java | 102 + .../DataflowClientFactoryConfiguration.java | 54 + .../dataflow/DataflowFilterEventarcJobs.java | 110 + .../DataflowGetJobExecutionDetails.java | 160 + .../dataflow/DataflowGetJobMetrics.java | 139 + .../pipelines/dataflow/DataflowGetJobs.java | 121 + .../DataflowGetStageExecutionDetails.java | 166 + .../dataflow/DataflowJobsOptions.java | 36 + .../dataflow/DataflowReadResult.java | 90 + .../dataflow/DataflowRequestError.java | 95 + .../pipelines/dataflow/DataflowRequests.java | 52 + .../JobMetricsWithAppendedDetails.java | 84 + .../StageSummaryWithAppendedDetails.java | 84 + .../pipelines/dataflow/Throttle.java | 74 + .../WorkerDetailsWithAppendedDetails.java | 84 + .../pipelines/dataflow/package-info.java | 20 + .../testinfra/pipelines/package-info.java | 19 + .../pipelines/pubsub/PubsubReadOptions.java | 35 + .../pubsub/SubscriptionPathOptionValue.java | 45 + .../pipelines/pubsub/package-info.java | 20 + .../DependencyDrivenDescriptorQueue.java | 110 + .../schemas/DescriptorSchemaRegistry.java | 153 + .../schemas/GeneratedMessageV3RowBuilder.java | 280 + .../pipelines/schemas/package-info.java | 20 + .../conversions/EventarcConversionsTest.java | 271 + .../JobMetricsWithAppendedDetailsTest.java | 143 + .../StageSummaryWithAppendedDetailsTest.java | 146 + .../WithAppendedDetailsToRowTest.java | 153 + .../WorkerDetailsWithAppendedDetailsTest.java | 153 + .../DataflowFilterEventarcJobsTest.java | 145 + ...tractGeneratedMessageV3RowBuilderTest.java | 409 + .../DependencyDrivenDescriptorQueueTest.java | 56 + .../schemas/DescriptorSchemaRegistryTest.java | 79 + .../schemas/EnvironmentRowBuilderTest.java | 140 + .../schemas/ExecutionStageSummaryTest.java | 84 + .../TransformSummaryRowBuilderTest.java | 83 + .../has_extra_data_payload_foo_property.json | 1 + .../job_state_canceled_streaming.json | 1 + .../job_state_canceling_streaming.json | 1 + .../eventarc_data/job_state_done_batch.json | 1 + .../job_state_pending_batch.json | 1 + .../job_state_pending_streaming.json | 1 + .../job_state_queued_streaming.json | 1 + .../job_state_running_batch.json | 1 + .../job_state_running_streaming.json | 1 + .test-infra/tools/README.md | 2 +- .test-infra/tools/python_installer.sh | 2 +- CHANGES.md | 37 +- CI.md | 3 + README.md | 6 +- build.gradle.kts | 83 +- buildSrc/build.gradle.kts | 9 +- .../beam/gradle/BeamModulePlugin.groovy | 38 +- examples/java/build.gradle | 2 + .../examples/ApproximateQuantilesExample.java | 78 + .../beam/examples/CoGroupByKeyExample.java | 92 + .../apache/beam/examples/CombineExample.java | 76 + .../apache/beam/examples/CountExample.java | 71 + .../beam/examples/CountPerKeyExample.java | 75 + .../apache/beam/examples/CreateExample.java | 87 + .../beam/examples/DebuggingWordCount.java | 2 +- .../apache/beam/examples/DistinctExample.java | 76 + .../beam/examples/FlatMapElementsExample.java | 86 + .../examples/GroupIntoBatchesExample.java | 82 + .../examples/KafkaPassengerCountJson.java | 174 + .../apache/beam/examples/KafkaStreaming.java | 320 + .../beam/examples/KafkaWordCountAvro.java | 39 +- .../beam/examples/KafkaWordCountJson.java | 38 +- .../org/apache/beam/examples/KeysExample.java | 78 + .../apache/beam/examples/KvSwapExample.java | 77 + .../apache/beam/examples/LatestExample.java | 92 + .../beam/examples/MapElementsExample.java | 84 + .../org/apache/beam/examples/MaxExample.java | 71 + .../beam/examples/MaxPerKeyExample.java | 75 + .../org/apache/beam/examples/MeanExample.java | 71 + .../beam/examples/MeanPerKeyExample.java | 75 + .../org/apache/beam/examples/MinExample.java | 71 + .../beam/examples/MinPerKeyExample.java | 75 + .../beam/examples/MinimalWordCount.java | 24 +- .../beam/examples/PartitionExample.java | 200 + .../apache/beam/examples/RegexExample.java | 83 + .../apache/beam/examples/SampleExample.java | 84 + .../org/apache/beam/examples/SumExample.java | 71 + .../beam/examples/SumPerKeyExample.java | 75 + .../apache/beam/examples/ToStringExample.java | 82 + .../org/apache/beam/examples/TopExample.java | 72 + .../apache/beam/examples/ValuesExample.java | 78 + .../org/apache/beam/examples/ViewExample.java | 120 + .../apache/beam/examples/WindowExample.java | 95 + .../beam/examples/WindowedWordCount.java | 3 +- .../org/apache/beam/examples/WordCount.java | 8 +- .../apache/beam/examples/complete/TfIdf.java | 2 +- .../complete/TopWikipediaSessions.java | 2 +- .../examples/complete/TrafficMaxLaneFlow.java | 2 +- .../beam/examples/complete/TrafficRoutes.java | 2 +- .../complete/game/injector/InjectorUtils.java | 2 +- .../examples/cookbook/DistinctExample.java | 2 +- .../cookbook/MinimalBigQueryTornadoes.java | 142 + .../beam/examples/complete/TfIdfTest.java | 13 - .../examples/complete/game/GameStatsTest.java | 13 - .../cookbook/DistinctExampleTest.java | 13 - .../MinimalBigQueryTornadoesTest.java | 82 + .../beam-ml/image_processing_tensorflow.ipynb | 951 + .../beam-ml/run_inference_generative_ai.ipynb | 323 + .../beam-ml/run_inference_multi_model.ipynb | 294 +- .../run_inference_with_tensorflow_hub.ipynb | 19 +- .../dataframes.ipynb | 0 .../getting-started.ipynb | 0 .../reading-and-writing-data.ipynb | 0 .../windowing.ipynb | 0 gradle.properties | 6 +- learning/beamdoc/CombinePerKeyExample.java | 84 + learning/beamdoc/FlattenExample.java | 77 + learning/beamdoc/GroupByKeyExample.java | 77 + learning/beamdoc/WithKeysExample.java | 80 + .../aggregation/count/Task.java | 2 +- .../aggregation/max/Task.java | 2 +- .../aggregation/mean/Task.java | 2 +- .../aggregation/min/Task.java | 2 +- .../aggregation/sum/Task.java | 2 +- .../commontransforms/filter/filter/Task.java | 2 +- .../commontransforms/filter/pardo/Task.java | 2 +- .../katas/commontransforms/withkeys/Task.java | 4 +- .../katas/coretransforms/branching/Task.java | 4 +- .../coretransforms/cogroupbykey/Task.java | 2 +- .../combine/binarycombinefnlambda/Task.java | 4 +- .../combine/binarycombinefn/Task.java | 4 +- .../combine/combineperkey/Task.java | 2 +- .../combine/combinefn/Task.java | 2 +- .../coretransforms/combine/simple/Task.java | 2 +- .../katas/coretransforms/composite/Task.java | 2 +- .../katas/coretransforms/flatten/Task.java | 4 +- .../katas/coretransforms/groupbykey/Task.java | 4 +- .../coretransforms/map/mapelements/Task.java | 4 +- .../map/pardoonetomany/Task.java | 4 +- .../katas/coretransforms/map/pardo/Task.java | 4 +- .../katas/coretransforms/partition/Task.java | 4 +- .../katas/coretransforms/sideinput/Task.java | 20 +- .../katas/coretransforms/sideoutput/Task.java | 4 +- .../katas/examples/wordcount/Task.java | 4 +- .../beam/learning/katas/intro/hello/Task.java | 6 +- .../katas/triggers/earlytriggers/Task.java | 2 +- .../triggers/eventtimetriggers/Task.java | 2 +- .../katas/triggers/windowaccummode/Task.java | 2 +- .../windowing/addingtimestamp/pardo/Task.java | 4 +- .../addingtimestamp/withtimestamps/Task.java | 4 +- .../katas/windowing/fixedwindow/Task.java | 2 +- .../Aggregation/Count/task.py | 2 +- .../Aggregation/Largest/task.py | 2 +- .../Aggregation/Mean/task.py | 2 +- .../Aggregation/Smallest/task.py | 2 +- .../Common Transforms/Aggregation/Sum/task.py | 2 +- .../Common Transforms/Filter/Filter/task.py | 2 +- .../Common Transforms/Filter/ParDo/task.py | 2 +- .../WithKeys/WithKeys/task.py | 2 +- .../Branching/Branching/task.py | 2 +- .../CoGroupByKey/CoGroupByKey/task.py | 2 +- .../Combine/Combine PerKey/task.py | 2 +- .../Core Transforms/Combine/CombineFn/task.py | 4 +- .../Combine/Simple Function/task.py | 2 +- .../Composite Transform/task.py | 2 +- .../Core Transforms/Flatten/Flatten/task.py | 2 +- .../GroupByKey/GroupByKey/task.py | 2 +- .../Core Transforms/Map/FlatMap/task.py | 2 +- .../python/Core Transforms/Map/Map/task.py | 2 +- .../Map/ParDo OneToMany/task.py | 4 +- .../python/Core Transforms/Map/ParDo/task.py | 4 +- .../Partition/Partition/task.py | 2 +- .../Side Input/Side Input/task.py | 4 +- .../Side Output/Side Output/task.py | 4 +- .../Examples/Word Count/Word Count/task.py | 6 +- .../python/IO/TextIO/ReadFromText/task.py | 2 +- .../Hello Beam/Hello Beam/task.py | 3 +- .../Timestamps/Add Timestamps/task.py | 2 +- .../Streaming/Triggers/Early Triggers/task.py | 2 +- .../Triggers/Event Time Triggers/task.py | 2 +- .../Window Accumulation Modes/task.py | 2 +- .../Streaming/Windows/Fixed Windows/task.py | 2 +- .../scripts/tob_deploy_infra_backend.sh | 5 +- .../integration_test/tour_page_test.dart | 184 +- .../integration_test/welcome_page_test.dart | 17 +- .../frontend/lib/cache/unit_content.dart | 2 +- .../frontend/lib/cache/unit_progress.dart | 18 +- .../frontend/lib/components/footer.dart | 8 +- .../frontend/lib/components/logo.dart | 4 +- .../lib/components/profile/user_menu.dart | 13 +- .../frontend/lib/components/scaffold.dart | 15 +- .../frontend/lib/constants/links.dart | 20 + .../frontend/lib/constants/params.dart | 11 +- .../tour-of-beam/frontend/lib/locator.dart | 2 - learning/tour-of-beam/frontend/lib/main.dart | 1 + .../frontend/lib/models/node.dart | 11 +- .../pages/tour/controllers/content_tree.dart | 8 +- .../frontend/lib/pages/tour/page.dart | 4 - .../frontend/lib/pages/tour/screen.dart | 39 +- .../frontend/lib/pages/tour/state.dart | 65 +- .../lib/pages/tour/widgets/content_tree.dart | 26 +- .../tour/widgets/markdown/code_builder.dart | 16 +- .../lib/pages/tour/widgets/playground.dart | 1 + .../lib/pages/tour/widgets/unit_content.dart | 14 +- .../frontend/lib/pages/welcome/screen.dart | 21 +- learning/tour-of-beam/frontend/lib/state.dart | 13 +- learning/tour-of-beam/frontend/pubspec.lock | 6 +- learning/tour-of-beam/frontend/pubspec.yaml | 2 +- .../learning-content/content-info.yaml | 6 +- .../go-solution/main.go | 2 +- .../cross-language/module-info.yaml | 28 + .../multi-pipeline/description.md | 415 + .../multi-pipeline/java-example/Task.java | 135 + .../multi-pipeline/python-example/input.txt | 24 + .../multi-pipeline/python-example/output.log | 21 + .../multi-pipeline/python-example/task.py | 96 + .../multi-pipeline/unit-info.yaml | 28 + .../sql-transform/description.md | 128 + .../sql-transform/java-example/Task.java | 89 + .../sql-transform/java-example/output.log | 17 + .../sql-transform/python-example/output.log | 17 + .../sql-transform/python-example/task.py | 53 + .../sql-transform/unit-info.yaml | 26 + .../final-challenge-1/description.md | 27 + .../final-challenge-1/go-challenge/input.csv | 1500 ++ .../final-challenge-1/go-challenge/main.go | 65 + .../final-challenge-1/go-solution/input.csv | 1500 ++ .../final-challenge-1/go-solution/main.go | 150 + .../final-challenge-1/hint1.md | 160 + .../java-challenge/Task.java | 120 + .../java-challenge/input.csv | 1500 ++ .../final-challenge-1/java-solution/Task.java | 212 + .../final-challenge-1/java-solution/input.csv | 1500 ++ .../python-challenge/input.csv | 1500 ++ .../python-challenge/task.py | 59 + .../python-solution/input.csv | 1500 ++ .../final-challenge-1/python-solution/task.py | 99 + .../final-challenge-1/unit-info.yaml | 27 + .../final-challenge-2/description.md | 22 + .../go-challenge/analysis.csv | 3877 ++++ .../final-challenge-2/go-challenge/main.go | 69 + .../go-solution/analysis.csv | 3877 ++++ .../final-challenge-2/go-solution/main.go | 171 + .../final-challenge-2/hint1.md | 182 + .../java-challenge/Task.java | 107 + .../java-challenge/analysis.csv | 3877 ++++ .../final-challenge-2/java-solution/Task.java | 167 + .../java-solution/analysis.csv | 3877 ++++ .../python-challenge/analysis.csv | 3877 ++++ .../python-challenge/task.py | 68 + .../python-solution/analysis.csv | 3877 ++++ .../final-challenge-2/python-solution/task.py | 135 + .../final-challenge-2/unit-info.yaml | 27 + .../final-challenge/module-info.yaml | 29 + .../from-memory/go-example/from_memory.go | 2 +- .../reading-from-csv/go-example/csvExample.go | 2 +- .../reading-from-text/go-example/textIo.go | 2 +- .../creating-pipeline/go-example/main.go | 2 +- .../runner-concepts/description.md | 75 +- .../read-query/go-example/main.go | 74 +- .../read-query/java-example/Task.java | 64 +- .../read-query/python-example/task.py | 54 +- .../io/big-query-io/read-table/description.md | 15 +- .../read-table/go-example/main.go | 74 +- .../read-table/java-example/Task.java | 36 +- .../read-table/python-example/task.py | 44 +- .../splittable-dofn/module-info.yaml | 30 + .../splittable-dofn/splittable/description.md | 129 + .../splittable/go-example/main.go | 225 + .../splittable/java-example/Task.java | 122 + .../splittable/python-example/task.py | 74 + .../splittable-dofn/splittable/unit-info.yaml | 27 + .../tour-of-beam/terraform/build.gradle.kts | 10 +- local-env-setup.sh | 6 +- .../model/fn_execution/v1/beam_fn_api.proto | 95 +- ownership/JAVA_DEPENDENCY_OWNERS.yaml | 11 +- playground/CI.md | 118 - playground/README.md | 405 +- playground/TASKS.md | 272 + playground/backend/CONTRIBUTE.md | 65 +- playground/backend/SCHEMA.md | 185 + playground/backend/containers/java/Dockerfile | 24 + .../backend/containers/python/build.gradle | 4 +- .../backend/containers/scio/build.gradle | 2 +- .../backend/datasets/NYCTaxi1000Avro.avro | Bin 0 -> 76451 bytes .../backend/datasets/NYCTaxi1000Json.json | 18964 ++++++++++++++++ .../datasets/NYCTaxi1000_simpleAvro.avro | Bin 0 -> 2228 bytes .../datasets/NYCTaxi1000_simpleJson.json | 3994 ++++ playground/backend/go.mod | 50 +- playground/backend/go.sum | 1607 +- .../internal/cache/redis/redis_cache.go | 2 +- .../code_processing/code_processing.go | 7 +- .../internal/components/cache_component.go | 4 +- .../internal/db/datastore/datastore_db.go | 2 +- .../backend/internal/emulators/kafka.go | 4 +- .../internal/errors/lifecycle_error.go | 13 + playground/backend/internal/fs_tool/fs.go | 2 +- .../backend/internal/fs_tool/fs_test.go | 4 +- .../backend/internal/fs_tool/go_fs_test.go | 2 +- .../internal/fs_tool/lc_constructor.go | 2 +- .../backend/internal/utils/file_utils.go | 4 +- playground/categories.yaml | 1 + .../load_your_code/images/share-my-code.png | Bin 0 -> 29370 bytes .../doc/load_your_code/images/workflow.png | Bin 0 -> 58871 bytes playground/frontend/CONTRIBUTE.md | 108 +- playground/frontend/Dockerfile | 2 +- playground/frontend/README.md | 14 +- playground/frontend/build.gradle | 27 +- .../integration_test/initial_urls_test.dart | 78 +- .../external_url_navigation.dart | 5 +- .../miscellaneous_ui/feedback_test.dart | 34 +- .../output_placement_test.dart | 1 - .../miscellaneous_ui/resize_output_test.dart | 1 - .../shortcuts_modal_test.dart | 1 - ...tandalone_change_example_sdk_run_test.dart | 40 +- .../standalone_default_examples_test.dart | 2 +- .../standalone_editing_test.dart | 34 +- playground/frontend/lib/constants/links.dart | 3 +- playground/frontend/lib/locator.dart | 1 - .../actions/components/new_example.dart | 2 +- .../share_dropdown/share_tabs/share_tabs.dart | 5 +- .../examples/examples_dropdown_content.dart | 3 +- .../examples_loading_descriptor_factory.dart | 2 +- .../no_url_example_loading_descriptor.dart | 3 + .../messages/parsers/messages_parser.dart | 4 +- .../shortcuts/constants/global_shortcuts.dart | 2 +- .../widgets/embedded_editor.dart | 1 + .../widgets/editor_textarea_wrapper.dart | 1 + .../widgets/playground_page_footer.dart | 2 + playground/frontend/lib/playground_app.dart | 5 +- .../frontend/lib/router/page_factory.dart | 6 +- .../lib/src/constants/backend_urls.dart | 8 + .../lib/src/constants/colors.dart | 10 +- .../lib/src/constants/links.dart | 2 + .../lib/src/controllers/code_runner.dart | 29 +- .../example_loader_factory.dart | 1 - .../example_loaders/examples_loader.dart | 31 +- .../standard_example_loader.dart | 31 +- .../snippet_editing_controller.dart | 27 + .../src/exceptions/detailed_exception.dart | 22 + .../src/exceptions/multiple_exceptions.dart | 12 +- .../lib/src/models/example.dart | 28 + ...og_default_example_loading_descriptor.dart | 3 + .../content_example_loading_descriptor.dart | 3 + .../empty_example_loading_descriptor.dart | 3 + .../example_loading_descriptor.dart | 5 + .../hive_example_loading_descriptor.dart | 3 + .../http_example_loading_descriptor.dart | 3 + .../standard_example_loading_descriptor.dart | 3 + ...ser_shared_example_loading_descriptor.dart | 3 + .../lib/src/repositories/backend_urls.dart | 8 +- .../lib/src/services/toast_notifier.dart | 13 + .../lib/src/theme/theme.dart | 33 +- .../lib/src/theme/transitions.dart | 30 +- .../lib/src/widgets/copyright.dart | 2 +- .../lib/src/widgets/feedback.dart | 57 +- .../lib/src/widgets/iframe/iframe.dart | 19 + .../src/widgets/iframe/iframe_non_web.dart | 41 + .../lib/src/widgets/iframe/iframe_web.dart | 61 + .../widgets/output/result_tab_content.dart | 20 + .../lib/src/widgets/snippet_editor.dart | 4 + .../lib/src/widgets/snippet_file_editor.dart | 4 +- .../src/widgets/tabbed_snippet_editor.dart | 6 +- .../playground_components/pubspec.yaml | 4 +- .../controllers/example_loaders/common.dart | 5 + .../example_loader_factory_test.dart | 3 + .../example_loaders/examples_loader_test.dart | 10 +- .../analysis_options.yaml | 4 + .../lib/playground_components_dev.dart | 1 + .../lib/src/examples/example_descriptor.dart | 31 +- .../lib/src/examples/go/example.dart | 45 + .../src/examples/java/content/example.java | 30 +- .../lib/src/examples/java/example.dart | 111 + .../src/examples/scio/minimal_word_count.dart | 3 +- .../lib/src/expect.dart | 36 +- .../lib/src/widget_tester.dart | 4 +- .../playground_components_dev/pubspec.yaml | 4 +- playground/frontend/pubspec.lock | 14 +- playground/frontend/pubspec.yaml | 6 +- playground/frontend/web/index.html | 3 +- playground/infrastructure/models.py | 94 +- playground/infrastructure/requirements.txt | 2 +- playground/load_your_code.md | 600 + playground/terraform/README.md | 94 + playground/terraform/build.gradle.kts | 3 +- .../02.builders/locals.tf | 1 + .../02.builders/triggers.tf | 1 + .../02.builders/variables.tf | 5 +- .../infrastructure/cloudfunctions/main.tf | 4 +- .../terraform/infrastructure/gke/main.tf | 3 +- .../terraform/infrastructure/gke/variables.tf | 5 + playground/terraform/infrastructure/main.tf | 1 + .../terraform/infrastructure/setup/iam.tf | 2 +- .../terraform/infrastructure/variables.tf | 5 +- .../build.gradle.kts | 2 + plugins/beam-code-completion-plugin/gradlew | 0 .../main/java/BeamCompletionConfidence.java | 35 + .../main/java/BeamCompletionContributor.java | 89 +- .../src/main/resources/META-INF/plugin.xml | 4 +- .../BeamCompletionContributorTestCase.java | 49 + .../src/test/testData/TestCompletions.java | 38 + release/src/main/Dockerfile | 3 +- .../python_release_automation.sh | 2 +- .../main/scripts/build_release_candidate.sh | 4 +- release/src/main/scripts/jenkins_jobs.txt | 3 - release/src/main/scripts/mass_comment.py | 2 +- .../src/main/scripts/publish_docker_images.sh | 25 +- release/src/main/scripts/run_rc_validation.sh | 4 +- .../src/main/scripts/verify_release_build.sh | 16 +- .../renderer/PipelineDotRendererTest.java | 5 +- .../flink_job_server_container.gradle | 6 +- .../streaming/state/FlinkStateInternals.java | 7 +- .../google-cloud-dataflow-java/build.gradle | 4 + .../scripts/cleanup_untagged_gcr_images.sh | 3 +- .../beam/runners/dataflow/DataflowRunner.java | 74 +- .../options/DataflowPipelineOptions.java | 7 - .../util/AvroCoderCloudObjectTranslator.java | 43 +- ...ltCoderCloudObjectTranslatorRegistrar.java | 2 + .../DataflowPipelineTranslatorTest.java | 8 +- .../runners/dataflow/DataflowRunnerTest.java | 1 - .../dataflow/util/CloudObjectsTest.java | 10 +- .../worker/DataflowSystemMetrics.java | 1 + .../worker/StreamingDataflowWorker.java | 65 +- .../worker/WindmillStateInternals.java | 674 +- .../dataflow/worker/WindmillStateReader.java | 319 +- .../worker/util/BoundedQueueExecutor.java | 32 +- .../worker/windmill/GrpcWindmillServer.java | 169 +- .../worker/windmill/WindmillServerStub.java | 7 +- .../dataflow/worker/FakeWindmillServer.java | 13 +- .../worker/StreamingDataflowWorkerTest.java | 190 +- .../worker/WindmillStateInternalsTest.java | 1225 + .../worker/WindmillStateReaderTest.java | 723 +- .../windmill/GrpcWindmillServerTest.java | 63 +- .../windmill/src/main/proto/windmill.proto | 182 +- .../src/main/proto/windmill_service.proto | 4 + runners/samza/OWNERS | 6 + .../beam/runners/samza/runtime/DoFnOp.java | 21 +- .../samza/runtime/PortableBundleManager.java | 216 + .../samza/translation/ConfigBuilder.java | 8 +- .../ParDoBoundMultiTranslator.java | 9 +- .../samza/util/PortableConfigUtils.java | 43 + .../runtime/PortableBundleManagerTest.java | 178 + .../samza/util/PipelineJsonRendererTest.java | 5 +- .../samza/util/PortableConfigUtilsTest.java | 58 + .../spark_job_server_container.gradle | 6 +- .../spark/SparkRunnerDebuggerTest.java | 3 +- .../release/test/resources/mass_comment.txt | 3 +- sdks/go.mod | 109 +- sdks/go.sum | 233 +- sdks/go/cmd/prism/README.md | 44 + sdks/go/cmd/prism/prism.go | 67 + sdks/go/data/tweetwithnulls.avro | Bin 0 -> 352 bytes sdks/go/examples/contains/contains.go | 2 +- .../debugging_wordcount.go | 2 +- sdks/go/examples/forest/forest.go | 2 +- sdks/go/examples/grades/grades.go | 2 +- .../minimal_wordcount/minimal_wordcount.go | 2 +- sdks/go/examples/multiout/multiout.go | 2 +- sdks/go/examples/snippets/04transforms.go | 485 +- sdks/go/examples/stringsplit/stringsplit.go | 2 +- sdks/go/examples/timer_wordcap/wordcap.go | 104 +- .../windowed_wordcount/windowed_wordcount.go | 2 +- sdks/go/examples/wordcount/wordcount.go | 2 +- sdks/go/examples/yatzy/yatzy.go | 2 +- sdks/go/pkg/beam/combine_test.go | 12 - sdks/go/pkg/beam/core/core.go | 2 +- sdks/go/pkg/beam/core/graph/edge.go | 1 - sdks/go/pkg/beam/core/runtime/exec/coder.go | 33 +- .../pkg/beam/core/runtime/exec/datasource.go | 6 +- .../beam/core/runtime/exec/datasource_test.go | 23 +- sdks/go/pkg/beam/core/runtime/exec/fn.go | 8 +- sdks/go/pkg/beam/core/runtime/exec/pardo.go | 145 +- .../pkg/beam/core/runtime/exec/pardo_test.go | 126 + sdks/go/pkg/beam/core/runtime/exec/timers.go | 348 +- .../pkg/beam/core/runtime/exec/timers_test.go | 470 +- .../pkg/beam/core/runtime/exec/translate.go | 16 +- .../pkg/beam/core/runtime/graphx/translate.go | 26 +- sdks/go/pkg/beam/core/timers/timers.go | 34 +- sdks/go/pkg/beam/io/avroio/avroio.go | 4 +- sdks/go/pkg/beam/io/avroio/avroio_test.go | 56 +- sdks/go/pkg/beam/io/bigqueryio/bigquery.go | 5 +- sdks/go/pkg/beam/pardo.go | 11 - sdks/go/pkg/beam/partition_test.go | 12 - .../pkg/beam/runners/prism/internal/README.md | 5 + .../go/pkg/beam/runners/prism/internal/doc.go | 24 + .../runners/prism/internal/execute_test.go | 14 + .../runners/prism/internal/jobservices/job.go | 52 +- .../prism/internal/jobservices/management.go | 139 +- .../internal/jobservices/management_test.go | 449 + .../prism/internal/jobservices/server.go | 2 + .../pkg/beam/runners/prism/internal/stage.go | 12 +- .../beam/runners/prism/internal/testdofns.go | 5 + .../runners/prism/internal/testdofns_test.go | 1 + .../prism/internal/web/assets/style.css | 132 + .../runners/prism/internal/web/index.html | 51 + .../prism/internal/web/jobdetails.html | 111 + .../beam/runners/prism/internal/web/web.go | 300 + .../runners/prism/internal/worker/bundle.go | 7 + .../runners/prism/internal/worker/worker.go | 40 +- sdks/go/pkg/beam/runners/prism/prism.go | 32 + .../runners/universal/extworker/extworker.go | 2 +- .../pkg/beam/runners/universal/universal.go | 3 +- .../beam/transforms/filter/distinct_test.go | 15 - .../pkg/beam/transforms/filter/filter_test.go | 12 - .../pkg/beam/transforms/periodic/periodic.go | 2 +- .../beam/transforms/periodic/periodic_test.go | 4 + sdks/go/run_with_go_version.sh | 2 +- .../test/integration/xlang/expansion_test.go | 41 +- .../src/main/resources/beam/suppressions.xml | 2 + .../java21/java21-security.properties | 48 + .../java21/option-java21-security.json | 9 + .../license_scripts/dep_urls_java.yaml | 2 +- .../sdk/options/PortablePipelineOptions.java | 17 + .../schemas/transforms/SchemaTransform.java | 7 +- .../transforms/SchemaTransformProvider.java | 4 +- .../apache/beam/sdk/transforms/Create.java | 69 +- .../reflect/ByteBuddyDoFnInvokerFactory.java | 2 +- .../sdk/transforms/reflect/DoFnInvoker.java | 4 +- .../org/apache/beam/sdk/values/RowUtils.java | 6 +- .../TypedSchemaTransformProviderTest.java | 5 +- .../apache/beam/sdk/testing/PAssertTest.java | 2 +- .../beam/sdk/testing/TestStreamTest.java | 12 - .../beam/sdk/transforms/CombineFnsTest.java | 13 - .../beam/sdk/transforms/FilterTest.java | 13 - .../transforms/reflect/DoFnInvokersTest.java | 2 +- ...pansionServiceSchemaTransformProvider.java | 2 +- ...ionServiceSchemaTransformProviderTest.java | 49 +- sdks/java/extensions/avro/build.gradle | 69 +- .../sdk/extensions/avro/coders/AvroCoder.java | 257 +- .../avro/coders/AvroGenericCoder.java | 5 +- .../extensions/avro/io/AvroDatumFactory.java | 196 + .../beam/sdk/extensions/avro/io/AvroIO.java | 194 +- .../beam/sdk/extensions/avro/io/AvroSink.java | 40 +- .../sdk/extensions/avro/io/AvroSource.java | 123 +- .../avro/schemas/AvroRecordSchema.java | 5 +- .../utils/AvroJavaTimeConversions.java | 288 + .../utils/AvroJodaTimeConversions.java | 154 + .../avro/schemas/utils/AvroUtils.java | 39 +- .../sdk/extensions/avro/schemas/test.avsc | 71 +- .../extensions/avro/coders/AvroCoderTest.java | 148 +- .../sdk/extensions/avro/io/AvroIOTest.java | 4 +- .../extensions/avro/io/AvroSourceTest.java | 40 +- .../schemas/TestAvroConversionFactory.java | 41 + .../avro/schemas/TestAvroFactory.java | 66 +- .../avro/schemas/utils/AvroUtilsTest.java | 34 +- sdks/java/extensions/python/build.gradle | 1 + .../python/PythonExternalTransform.java | 138 +- .../PythonExternalTransformOptions.java | 32 + ...honExternalTransformOptionsRegistrar.java} | 35 +- .../SqlTransformSchemaTransformProvider.java | 162 +- .../apache/beam/sdk/fn/CancellableQueue.java | 26 +- .../sdk/fn/stream/DirectStreamObserver.java | 24 +- .../beam/sdk/fn/CancellableQueueTest.java | 28 + .../logging/BeamFnLoggingClientBenchmark.java | 20 +- .../org/apache/beam/fn/harness/FnHarness.java | 7 +- .../harness/control/BeamFnControlClient.java | 5 +- .../control/ExecutionStateSampler.java | 16 +- .../data/PCollectionConsumerRegistry.java | 40 +- .../beam/fn/harness/debug/ElementSample.java | 57 + .../beam/fn/harness/debug/OutputSampler.java | 111 +- .../harness/logging/BeamFnLoggingClient.java | 452 +- .../beam/fn/harness/logging/QuotaEvent.java | 108 + .../beam/fn/harness/status/MemoryMonitor.java | 4 +- .../control/BeamFnControlClientTest.java | 4 +- .../fn/harness/debug/OutputSamplerTest.java | 158 +- .../logging/BeamFnLoggingClientTest.java | 218 +- .../status/BeamFnStatusClientTest.java | 2 +- .../aws2/common/AsyncBatchWriteHandler.java | 403 + .../io/aws2/common/ClientConfiguration.java | 1 + .../aws2/kinesis/AsyncPutRecordsHandler.java | 271 - .../beam/sdk/io/aws2/kinesis/KinesisIO.java | 46 +- .../apache/beam/sdk/io/aws2/sqs/SqsIO.java | 488 +- .../common/AsyncBatchWriteHandlerTest.java | 267 + .../kinesis/AsyncPutRecordsHandlerTest.java | 192 - .../io/aws2/sqs/SqsIOWriteBatchesTest.java | 264 + .../beam/sdk/io/aws2/sqs/testing/SqsIOIT.java | 31 +- sdks/java/io/azure-cosmos/build.gradle | 50 + .../beam/sdk/io/azure/cosmos/CosmosIO.java | 307 + .../sdk/io/azure/cosmos/CosmosOptions.java | 81 + .../sdk/io/azure/cosmos/NormalizedRange.java | 66 + .../sdk/io/azure/cosmos/package-info.java | 20 + .../azure/cosmos/examples/common/Address.java | 50 + .../azure/cosmos/examples/common/Child.java | 68 + .../cosmos/examples/common/Families.java | 133 + .../azure/cosmos/examples/common/Family.java | 88 + .../azure/cosmos/examples/common/Parent.java | 48 + .../azure/cosmos/examples/common/Pet.java} | 22 +- .../sdk/io/azure/cosmos/CosmosIOTest.java | 176 + sdks/java/io/azure/README.md | 19 - sdks/java/io/azure/build.gradle | 23 +- .../sdk/io/azure/options/AzureOptions.java | 61 + .../io/azure/options/BlobstoreOptions.java | 39 +- sdks/java/io/components/build.gradle | 41 + .../components/deadletterqueue/DLQRouter.java | 55 + .../deadletterqueue/sinks/ThrowingSink.java | 45 + .../deadletterqueue/DLQRouterTest.java | 75 + .../DebeziumReadSchemaTransformProvider.java | 146 +- .../io/debezium/KafkaSourceConsumerFn.java | 8 +- .../debezium/DebeziumIOMySqlConnectorIT.java | 3 +- .../DebeziumIOPostgresSqlConnectorIT.java | 3 +- .../DebeziumReadSchemaTransformTest.java | 3 +- ...vroWriteSchemaTransformFormatProvider.java | 49 +- ...CsvWriteSchemaTransformFormatProvider.java | 16 +- .../FileReadSchemaTransformProvider.java | 8 +- ...ileWriteSchemaTransformFormatProvider.java | 6 +- ...leWriteSchemaTransformFormatProviders.java | 55 + .../FileWriteSchemaTransformProvider.java | 26 +- ...sonWriteSchemaTransformFormatProvider.java | 41 +- ...uetWriteSchemaTransformFormatProvider.java | 49 +- ...XmlWriteSchemaTransformFormatProvider.java | 37 +- ...ReadSchemaTransformFormatProviderTest.java | 16 +- ...riteSchemaTransformFormatProviderTest.java | 83 +- ...riteSchemaTransformFormatProviderTest.java | 9 +- ...ReadSchemaTransformFormatProviderTest.java | 6 +- ...riteSchemaTransformFormatProviderTest.java | 4 +- ...iteSchemaTransformFormatProvidersTest.java | 86 + .../FileWriteSchemaTransformProviderTest.java | 7 +- ...ReadSchemaTransformFormatProviderTest.java | 8 +- ...riteSchemaTransformFormatProviderTest.java | 60 + ...ReadSchemaTransformFormatProviderTest.java | 8 +- ...ReadSchemaTransformFormatProviderTest.java | 16 +- ...riteSchemaTransformFormatProviderTest.java | 75 + ...riteSchemaTransformFormatProviderTest.java | 43 + .../io/google-cloud-platform/build.gradle | 1 + .../sdk/io/gcp/bigquery/AppendClientInfo.java | 17 +- .../AvroGenericRecordToStorageApiProto.java | 24 +- .../bigquery/BeamRowToStorageApiProto.java | 18 +- .../io/gcp/bigquery/BigQueryAvroUtils.java | 45 +- .../BigQueryCoderProviderRegistrar.java | 4 +- ...ueryExportReadSchemaTransformProvider.java | 29 +- ...FileLoadsWriteSchemaTransformProvider.java | 32 +- .../sdk/io/gcp/bigquery/BigQueryHelpers.java | 19 + .../beam/sdk/io/gcp/bigquery/BigQueryIO.java | 117 +- .../io/gcp/bigquery/BigQueryServicesImpl.java | 50 +- .../bigquery/DynamicDestinationsHelpers.java | 9 +- .../beam/sdk/io/gcp/bigquery/RowMutation.java | 69 + .../gcp/bigquery/RowMutationInformation.java | 46 + .../sdk/io/gcp/bigquery/StorageApiCDC.java | 46 + .../bigquery/StorageApiConvertMessages.java | 26 +- .../StorageApiDynamicDestinations.java | 7 +- .../StorageApiDynamicDestinationsBeamRow.java | 39 +- ...geApiDynamicDestinationsGenericRecord.java | 38 +- ...StorageApiDynamicDestinationsTableRow.java | 40 +- .../StorageApiFinalizeWritesDoFn.java | 10 +- .../sdk/io/gcp/bigquery/StorageApiLoads.java | 26 +- .../StorageApiWriteRecordsInconsistent.java | 8 +- .../StorageApiWriteUnshardedRecords.java | 92 +- .../StorageApiWritesShardedRecords.java | 40 +- .../bigquery/TableRowToStorageApiProto.java | 106 +- .../gcp/bigquery/UpdateSchemaDestination.java | 5 +- ...ueryDirectReadSchemaTransformProvider.java | 20 +- ...torageWriteApiSchemaTransformProvider.java | 28 +- .../beam/sdk/io/gcp/bigtable/BigtableIO.java | 154 +- ... BigtableReadSchemaTransformProvider.java} | 117 +- .../BigtableWriteSchemaTransformProvider.java | 246 + .../changestreams/action/ActionFactory.java | 20 +- .../action/ChangeStreamAction.java | 89 +- .../ReadChangeStreamPartitionAction.java | 47 +- .../dao/BigtableChangeStreamAccessor.java | 44 +- .../changestreams/dao/ChangeStreamDao.java | 14 +- .../changestreams/dao/DaoFactory.java | 15 +- .../dao/MetadataTableAdminDao.java | 5 + .../changestreams/dao/MetadataTableDao.java | 57 +- .../dofn/FilterForMutationDoFn.java | 40 + .../changestreams/dofn/InitializeDoFn.java | 35 +- .../dofn/ReadChangeStreamPartitionDoFn.java | 88 +- .../estimator/BytesThroughputEstimator.java | 152 +- .../estimator/CoderSizeEstimator.java | 71 + ...tEstimator.java => NullSizeEstimator.java} | 32 +- .../estimator/SizeEstimator.java | 52 +- .../restriction/StreamProgress.java | 36 +- .../beam/sdk/io/gcp/pubsub/ExternalWrite.java | 14 +- .../io/gcp/pubsub/PreparePubsubWriteDoFn.java | 12 +- .../beam/sdk/io/gcp/pubsub/PubsubIO.java | 72 +- ...ubsubReadSchemaTransformConfiguration.java | 160 +- .../PubsubReadSchemaTransformProvider.java | 335 +- ...subSchemaTransformMessageToRowFactory.java | 179 - ...bsubWriteSchemaTransformConfiguration.java | 174 +- .../PubsubWriteSchemaTransformProvider.java | 455 +- ...PubsubLiteReadSchemaTransformProvider.java | 76 +- ...ubsubLiteWriteSchemaTransformProvider.java | 73 +- .../SpannerWriteSchemaTransformProvider.java | 146 +- ...ngestreamsReadSchemaTransformProvider.java | 204 +- .../sdk/io/gcp/testing/BigqueryClient.java | 4 + .../io/gcp/testing/FakeDatasetService.java | 100 +- .../sdk/io/gcp/testing/TableContainer.java | 120 +- ...vroGenericRecordToStorageApiProtoTest.java | 43 +- .../BeamRowToStorageApiProtoTest.java | 34 +- .../gcp/bigquery/BigQueryAvroUtilsTest.java | 90 + ...ExportReadSchemaTransformProviderTest.java | 38 +- ...LoadsWriteSchemaTransformProviderTest.java | 24 +- .../bigquery/BigQueryIOStorageWriteIT.java | 8 +- .../io/gcp/bigquery/BigQueryIOWriteTest.java | 924 +- .../bigquery/StorageApiSinkRowUpdateIT.java | 161 + .../TableRowToStorageApiProtoTest.java | 86 +- ...DirectReadSchemaTransformProviderTest.java | 10 +- ...geWriteApiSchemaTransformProviderTest.java | 24 +- ...igtableReadSchemaTransformProviderIT.java} | 132 +- ...igtableWriteSchemaTransformProviderIT.java | 413 + .../action/ChangeStreamActionTest.java | 123 +- .../ReadChangeStreamPartitionActionTest.java | 46 +- .../dao/MetadataTableDaoTest.java | 84 +- .../dofn/FilterForMutationDoFnTest.java | 71 + .../dofn/InitializeDoFnTest.java | 71 +- .../ReadChangeStreamPartitionDoFnTest.java | 76 +- .../BytesThroughputEstimatorTest.java | 98 +- ...orTest.java => NullSizeEstimatorTest.java} | 14 +- ...ngeStreamPartitionProgressTrackerTest.java | 4 +- .../io/gcp/firestore/it/BaseFirestoreIT.java | 3 - .../sdk/io/gcp/healthcare/FhirIOReadIT.java | 2 +- .../beam/sdk/io/gcp/pubsub/PubsubIOTest.java | 40 +- .../beam/sdk/io/gcp/pubsub/PubsubReadIT.java | 4 +- ...PubsubReadSchemaTransformProviderTest.java | 426 +- ...chemaTransformMessageToRowFactoryTest.java | 337 - .../PubsubWriteSchemaTransformProviderIT.java | 180 - ...ubsubWriteSchemaTransformProviderTest.java | 786 - .../sdk/io/gcp/pubsublite/ReadWriteIT.java | 10 +- .../sdk/io/gcp/spanner/SpannerWriteIT.java | 3 +- .../SpannerChangestreamsReadDlqTest.java | 168 + ...SpannerChangeStreamsSchemaTransformIT.java | 3 +- .../jdbc/JdbcReadSchemaTransformProvider.java | 45 +- .../JdbcWriteSchemaTransformProvider.java | 35 +- .../JdbcReadSchemaTransformProviderTest.java | 16 +- .../JdbcWriteSchemaTransformProviderTest.java | 14 +- .../io/kafka/kafka-integration-test.gradle | 1 + .../org/apache/beam/sdk/io/kafka/KafkaIO.java | 71 +- ...afkaIOReadImplementationCompatibility.java | 1 + .../KafkaReadSchemaTransformProvider.java | 206 +- .../sdk/io/kafka/KafkaUnboundedSource.java | 30 +- .../KafkaWriteSchemaTransformProvider.java | 71 +- .../kafka/WatchForKafkaTopicPartitions.java | 26 +- .../apache/beam/sdk/io/kafka/KafkaIOIT.java | 6 +- .../apache/beam/sdk/io/kafka/KafkaIOTest.java | 100 + .../KafkaReadSchemaTransformProviderTest.java | 41 +- .../WatchForKafkaTopicPartitionsTest.java | 48 +- .../apache/beam/sdk/io/mongodb/SSLUtils.java | 17 +- ...ingleStoreSchemaTransformReadProvider.java | 23 +- ...ngleStoreSchemaTransformWriteProvider.java | 23 +- .../SingleStoreIOSchemaTransformIT.java | 13 +- .../apache/beam/sdk/io/splunk/SplunkIO.java | 24 - sdks/java/transform-service/build.gradle | 12 +- .../transform-service/docker-compose/.env | 2 + .../docker-compose/docker-compose.yml | 5 +- .../transform-service/launcher/build.gradle | 61 + .../launcher/TransformServiceLauncher.java | 308 + .../launcher/package-info.java | 20 + sdks/python/apache_beam/coders/coders.py | 133 - sdks/python/apache_beam/coders/coders_test.py | 6 +- .../apache_beam/coders/coders_test_common.py | 53 +- sdks/python/apache_beam/coders/row_coder.py | 9 - .../apache_beam/coders/row_coder_test.py | 11 - .../apache_beam/dataframe/transforms_test.py | 12 +- .../apache_beam/examples/avro_bitcoin.py | 175 - .../apache_beam/examples/avro_nyc_trips.py | 290 + .../examples/avro_nyc_trips_it_test.py | 215 + .../examples/avro_nyc_trips_test.py | 151 + .../examples/complete/game/user_score.py | 2 +- .../examples/cookbook/bigtableio_it_test.py | 2 +- .../examples/cookbook/combiners_test.py | 12 - .../examples/cookbook/filters_test.py | 12 - .../cookbook/multiple_output_pardo.py | 2 +- .../anomaly_detection_pipeline/setup.py | 2 +- .../large_language_modeling/requirements.txt | 2 +- .../clustering_pipeline/setup.py | 2 +- .../runinference_metrics/pipeline/options.py | 1 - .../inference/runinference_metrics/setup.py | 2 +- .../sklearn_examples_requirements.txt | 4 +- .../vertex_ai_image_classification.py | 158 + .../ml_transform/ml_transform_basic.py | 180 + .../apache_beam/examples/snippets/snippets.py | 249 +- .../snippets_examples_wordcount_debugging.py | 133 + .../snippets_examples_wordcount_minimal.py | 118 + .../snippets_examples_wordcount_wordcount.py | 102 + .../examples/snippets/snippets_test.py | 23 +- .../transforms/aggregation/cogroupbykey.py | 23 + .../transforms/aggregation/combineglobally.py | 226 - .../aggregation/combineglobally_combinefn.py | 88 + .../aggregation/combineglobally_function.py | 65 + .../aggregation/combineglobally_lambda.py | 59 + .../combineglobally_multiple_arguments.py | 62 + .../combineglobally_side_inputs_dict.py | 56 + .../combineglobally_side_inputs_iter.py | 49 + .../combineglobally_side_inputs_singleton.py | 49 + .../aggregation/combineglobally_test.py | 32 +- .../transforms/aggregation/combineperkey.py | 259 - .../aggregation/combineperkey_combinefn.py | 84 + .../aggregation/combineperkey_function.py | 64 + .../aggregation/combineperkey_lambda.py | 61 + .../combineperkey_multiple_arguments.py | 61 + .../combineperkey_side_inputs_dict.py | 61 + .../combineperkey_side_inputs_iter.py | 58 + .../combineperkey_side_inputs_singleton.py | 50 + .../aggregation/combineperkey_simple.py | 60 + .../aggregation/combineperkey_test.py | 56 +- .../transforms/aggregation/combinevalues.py | 245 - .../aggregation/combinevalues_combinefn.py | 91 + .../aggregation/combinevalues_function.py | 61 + .../aggregation/combinevalues_lambda.py | 58 + .../combinevalues_multiple_arguments.py | 58 + .../combinevalues_side_inputs_dict.py | 73 + .../combinevalues_side_inputs_iter.py | 70 + .../combinevalues_side_inputs_singleton.py | 62 + .../aggregation/combinevalues_simple.py | 57 + .../aggregation/combinevalues_test.py | 48 +- .../transforms/aggregation/count_globally.py | 53 + .../aggregation/count_per_element.py | 53 + .../{count.py => count_per_key.py} | 46 +- .../transforms/aggregation/count_test.py | 20 +- .../transforms/aggregation/distinct.py | 19 + .../transforms/aggregation/groupby_attr.py | 65 + .../aggregation/groupby_attr_expr.py | 65 + .../transforms/aggregation/groupby_expr.py | 56 + .../aggregation/groupby_expr_aggregate.py | 67 + .../aggregation/groupby_global_aggregate.py | 69 + .../aggregation/groupby_simple_aggregate.py | 66 + .../transforms/aggregation/groupby_test.py | 286 +- .../aggregation/groupby_two_exprs.py | 56 + .../transforms/aggregation/groupbykey.py | 20 + .../aggregation/groupintobatches.py | 21 + .../transforms/aggregation/latest_globally.py | 76 + .../{latest.py => latest_per_key.py} | 55 +- .../transforms/aggregation/latest_test.py | 14 +- .../transforms/aggregation/max_globally.py | 53 + .../aggregation/{max.py => max_per_key.py} | 32 +- .../transforms/aggregation/max_test.py | 13 +- .../transforms/aggregation/mean_globally.py | 53 + .../aggregation/{mean.py => mean_per_key.py} | 32 +- .../transforms/aggregation/mean_test.py | 13 +- .../transforms/aggregation/min_globally.py | 53 + .../aggregation/{min.py => min_per_key.py} | 32 +- .../transforms/aggregation/min_test.py | 13 +- .../aggregation/sample_fixed_size_globally.py | 59 + ...sample.py => sample_fixed_size_per_key.py} | 38 +- .../transforms/aggregation/sample_test.py | 14 +- .../transforms/aggregation/sum_globally.py | 52 + .../aggregation/{sum.py => sum_per_key.py} | 31 +- .../transforms/aggregation/sum_test.py | 13 +- .../snippets/transforms/aggregation/top.py | 146 - .../transforms/aggregation/top_largest.py | 52 + .../aggregation/top_largest_per_key.py | 59 + .../snippets/transforms/aggregation/top_of.py | 63 + .../transforms/aggregation/top_per_key.py | 66 + .../transforms/aggregation/top_smallest.py | 52 + .../aggregation/top_smallest_per_key.py | 59 + .../transforms/aggregation/top_test.py | 38 +- .../snippets/transforms/elementwise/filter.py | 238 - .../transforms/elementwise/filter_function.py | 72 + .../transforms/elementwise/filter_lambda.py | 70 + .../elementwise/filter_multiple_arguments.py | 72 + .../elementwise/filter_side_inputs_dict.py | 79 + .../elementwise/filter_side_inputs_iter.py | 79 + .../filter_side_inputs_singleton.py | 75 + .../transforms/elementwise/filter_test.py | 38 +- .../transforms/elementwise/flatmap.py | 259 - .../elementwise/flatmap_function.py | 59 + .../elementwise/flatmap_generator.py | 60 + .../transforms/elementwise/flatmap_lambda.py | 56 + .../elementwise/flatmap_multiple_arguments.py | 59 + .../elementwise/flatmap_side_inputs_dict.py | 83 + .../elementwise/flatmap_side_inputs_iter.py | 83 + .../flatmap_side_inputs_singleton.py | 62 + .../transforms/elementwise/flatmap_simple.py | 56 + .../transforms/elementwise/flatmap_test.py | 56 +- .../transforms/elementwise/flatmap_tuple.py | 64 + .../snippets/transforms/elementwise/keys.py | 18 + .../snippets/transforms/elementwise/kvswap.py | 18 + .../snippets/transforms/elementwise/map.py | 229 - .../transforms/elementwise/map_function.py | 62 + .../transforms/elementwise/map_lambda.py | 59 + .../elementwise/map_multiple_arguments.py | 62 + .../elementwise/map_side_inputs_dict.py | 82 + .../elementwise/map_side_inputs_iter.py | 65 + .../elementwise/map_side_inputs_singleton.py | 65 + .../transforms/elementwise/map_simple.py | 59 + .../transforms/elementwise/map_test.py | 49 +- .../transforms/elementwise/map_tuple.py | 60 + .../transforms/elementwise/pardo_dofn.py | 63 + .../elementwise/pardo_dofn_methods.py | 77 + .../{pardo.py => pardo_dofn_params.py} | 80 +- .../transforms/elementwise/pardo_test.py | 17 +- .../transforms/elementwise/partition.py | 124 - .../elementwise/partition_function.py | 70 + .../elementwise/partition_lambda.py | 71 + .../partition_multiple_arguments.py | 74 + .../transforms/elementwise/partition_test.py | 20 +- .../snippets/transforms/elementwise/regex.py | 226 - .../elementwise/regex_all_matches.py | 63 + .../transforms/elementwise/regex_find.py | 61 + .../transforms/elementwise/regex_find_all.py | 61 + .../transforms/elementwise/regex_find_kv.py | 61 + .../transforms/elementwise/regex_matches.py | 63 + .../elementwise/regex_matches_kv.py | 63 + .../elementwise/regex_replace_all.py | 59 + .../elementwise/regex_replace_first.py | 59 + .../transforms/elementwise/regex_split.py | 59 + .../transforms/elementwise/regex_test.py | 56 +- .../transforms/elementwise/runinference.py | 56 - ...uninference_sklearn_keyed_model_handler.py | 69 + ...inference_sklearn_unkeyed_model_handler.py | 65 + .../elementwise/runinference_test.py | 14 +- .../elementwise/tostring_element.py | 59 + .../{tostring.py => tostring_iterables.py} | 61 +- .../transforms/elementwise/tostring_kvs.py | 59 + .../transforms/elementwise/tostring_test.py | 20 +- .../snippets/transforms/elementwise/values.py | 18 + .../transforms/elementwise/withtimestamps.py | 86 - .../elementwise/withtimestamps_event_time.py | 65 + .../withtimestamps_logical_clock.py | 66 + .../withtimestamps_processing_time.py | 66 + .../elementwise/withtimestamps_test.py | 20 +- .../snippets/transforms/other}/__init__.py | 0 .../snippets/transforms/other/create.py | 51 + .../snippets/transforms/other/create_test.py | 51 + .../snippets/transforms/other/flatten.py | 53 + .../snippets/transforms/other/flatten_test.py | 53 + .../snippets/transforms/other/window.py | 67 + .../snippets/transforms/other/window_test.py | 51 + .../examples/streaming_wordcount_it_test.py | 14 - sdks/python/apache_beam/examples/wordcount.py | 2 +- .../examples/wordcount_debugging.py | 4 +- .../apache_beam/examples/wordcount_minimal.py | 2 +- .../examples/wordcount_minimal_test.py | 13 - .../apache_beam/examples/wordcount_test.py | 15 +- .../internal/cloudpickle_pickler_test.py | 4 +- .../apache_beam/internal/pickler_test.py | 2 +- .../io/azure/integration_test/Dockerfile | 2 +- .../azure/integration_test/docker-compose.yml | 1 + .../native_io => io/components}/__init__.py | 0 .../adaptive_throttler.py | 2 +- .../adaptive_throttler_test.py | 2 +- sdks/python/apache_beam/io/components/util.py | 96 + .../io/external/xlang_parquetio_test.py | 2 +- sdks/python/apache_beam/io/filesystem_test.py | 7 +- .../gcp/big_query_query_to_table_it_test.py | 2 +- sdks/python/apache_beam/io/gcp/bigquery.py | 74 +- .../apache_beam/io/gcp/bigquery_file_loads.py | 21 +- .../io/gcp/bigquery_file_loads_test.py | 56 +- .../io/gcp/bigquery_read_it_test.py | 39 +- .../io/gcp/bigquery_schema_tools.py | 8 +- .../apache_beam/io/gcp/bigquery_test.py | 32 + .../apache_beam/io/gcp/bigquery_tools.py | 2 +- .../io/gcp/bigquery_write_it_test.py | 8 +- sdks/python/apache_beam/io/gcp/bigtableio.py | 256 +- .../apache_beam/io/gcp/bigtableio_it_test.py | 377 + .../apache_beam/io/gcp/bigtableio_test.py | 220 +- .../io/gcp/datastore/v1new/datastoreio.py | 2 +- .../gcp/datastore/v1new/datastoreio_test.py | 2 +- sdks/python/apache_beam/io/gcp/dicomclient.py | 111 +- sdks/python/apache_beam/io/gcp/dicomio.py | 563 +- sdks/python/apache_beam/io/gcp/gcsio.py | 8 +- sdks/python/apache_beam/io/gcp/gcsio_test.py | 5 +- .../apache_beam/io/gcp/healthcare/__init__.py | 26 +- .../io/gcp/healthcare/dicomclient.py | 123 + .../apache_beam/io/gcp/healthcare/dicomio.py | 577 + .../dicomio_integration_test.py | 6 +- .../io/gcp/{ => healthcare}/dicomio_test.py | 30 +- sdks/python/apache_beam/io/gcp/pubsub.py | 26 +- sdks/python/apache_beam/io/gcp/pubsub_test.py | 4 +- .../io/hdfs_integration_test/Dockerfile | 2 +- sdks/python/apache_beam/io/iobase.py | 43 +- sdks/python/apache_beam/io/range_trackers.py | 2 +- .../python/apache_beam/metrics/metric_test.py | 12 - .../ml/inference/sklearn_inference_it_test.py | 3 + .../ml/inference/tensorflow_inference.py | 11 +- .../inference/tensorflow_inference_it_test.py | 5 - .../ml/inference/tensorflow_inference_test.py | 6 + .../ml/inference/vertex_ai_inference.py | 208 + .../ml/inference/vertex_ai_inference_test.py | 39 + .../apache_beam/ml/transforms/__init__.py | 23 +- sdks/python/apache_beam/ml/transforms/base.py | 210 + .../apache_beam/ml/transforms/base_test.py | 246 + .../apache_beam/ml/transforms/handlers.py | 406 + .../ml/transforms/handlers_test.py | 347 + sdks/python/apache_beam/ml/transforms/tft.py | 547 + .../apache_beam/ml/transforms/tft_test.py | 557 + .../python/apache_beam/ml/transforms/utils.py | 57 + .../apache_beam/options/pipeline_options.py | 10 +- sdks/python/apache_beam/pipeline_test.py | 53 +- sdks/python/apache_beam/runners/common.pxd | 4 +- sdks/python/apache_beam/runners/common.py | 35 +- ...xercise_streaming_metrics_pipeline_test.py | 13 - .../runners/dataflow/dataflow_metrics_test.py | 1 - .../runners/dataflow/dataflow_runner.py | 831 +- .../runners/dataflow/dataflow_runner_test.py | 369 +- .../runners/dataflow/internal/apiclient.py | 97 +- .../dataflow/internal/apiclient_test.py | 16 +- .../runners/dataflow/internal/names.py | 89 +- .../runners/dataflow/native_io/iobase.py | 342 - .../runners/dataflow/native_io/iobase_test.py | 203 - .../runners/dataflow/ptransform_overrides.py | 126 - .../runners/direct/direct_runner.py | 17 +- .../runners/direct/sdf_direct_runner.py | 10 +- .../runners/direct/transform_evaluator.py | 82 +- .../yarn.lock | 24 +- .../portability/sdk_container_builder.py | 8 +- .../runners/worker/bundle_processor.py | 110 +- .../runners/worker/bundle_processor_test.py | 191 +- .../runners/worker/data_sampler.py | 272 +- .../runners/worker/data_sampler_test.py | 530 +- .../apache_beam/runners/worker/operations.pxd | 5 + .../apache_beam/runners/worker/operations.py | 86 +- .../apache_beam/runners/worker/sdk_worker.py | 14 +- .../runners/worker/sdk_worker_test.py | 37 +- .../runners/worker/worker_status.py | 46 +- .../runners/worker/worker_status_test.py | 26 +- .../testing/analyzers/constants.py | 8 +- .../testing/analyzers/github_issues_utils.py | 41 +- .../testing/analyzers/perf_analysis.py | 26 +- .../testing/analyzers/perf_analysis_test.py | 47 +- .../testing/analyzers/perf_analysis_utils.py | 6 +- .../testing/analyzers/tests_config.yaml | 87 +- .../testing/datatype_inference_test.py | 4 +- .../testing/extra_assertions_test.py | 8 +- .../transforms/combinefn_lifecycle_test.py | 24 - .../apache_beam/transforms/combiners_test.py | 44 + sdks/python/apache_beam/transforms/core.py | 111 +- .../apache_beam/transforms/display_test.py | 2 +- .../apache_beam/transforms/environments.py | 1 - .../transforms/environments_test.py | 2 +- .../python/apache_beam/transforms/external.py | 82 +- .../apache_beam/transforms/external_java.py | 2 +- .../apache_beam/transforms/external_test.py | 18 +- .../transforms/timestamped_value_type_test.py | 139 + .../apache_beam/transforms/trigger_test.py | 14 +- .../apache_beam/transforms/util_test.py | 14 + .../transforms/validate_runner_xlang_test.py | 2 +- sdks/python/apache_beam/transforms/window.py | 9 +- .../apache_beam/typehints/decorators_test.py | 8 +- .../typehints/native_type_compatibility.py | 5 +- sdks/python/apache_beam/typehints/schemas.py | 8 +- .../python/apache_beam/typehints/typecheck.py | 18 +- .../typehints/typed_pipeline_test.py | 14 +- .../apache_beam/utils/subprocess_server.py | 7 +- sdks/python/apache_beam/utils/timestamp.py | 25 +- .../apache_beam/utils/timestamp_test.py | 5 + .../utils/transform_service_launcher.py | 261 + sdks/python/apache_beam/version.py | 2 +- .../apache_beam/yaml/pipeline.schema.yaml | 117 +- sdks/python/apache_beam/yaml/readme_test.py | 42 +- sdks/python/apache_beam/yaml/yaml_mapping.md | 196 + sdks/python/apache_beam/yaml/yaml_mapping.py | 289 + .../apache_beam/yaml/yaml_mapping_test.py | 138 + sdks/python/apache_beam/yaml/yaml_provider.py | 58 +- .../python/apache_beam/yaml/yaml_transform.py | 122 +- .../apache_beam/yaml/yaml_transform_test.py | 375 +- sdks/python/build-requirements.txt | 4 +- sdks/python/build.gradle | 7 +- sdks/python/container/Dockerfile | 70 +- .../base_image_requirements_manual.txt | 2 +- sdks/python/container/build.gradle | 33 +- sdks/python/container/piputil.go | 10 +- .../py310/base_image_requirements.txt | 128 +- .../py311/base_image_requirements.txt | 124 +- .../py37/base_image_requirements.txt | 135 - .../py38/base_image_requirements.txt | 130 +- .../py39/base_image_requirements.txt | 132 +- .../container/run_validatescontainer.sh | 2 - .../expansion-service-container/Dockerfile | 3 +- sdks/python/mypy.ini | 2 +- sdks/python/scripts/generate_pydoc.sh | 2 +- sdks/python/scripts/run_dependency_check.sh | 34 - sdks/python/scripts/run_integration_test.sh | 27 - sdks/python/scripts/run_tox.sh | 6 +- sdks/python/setup.py | 17 +- .../tensor_rt.dockerfile | 5 +- sdks/python/test-suites/dataflow/build.gradle | 19 - .../python/test-suites/dataflow/common.gradle | 30 +- sdks/python/test-suites/direct/common.gradle | 2 +- sdks/python/test-suites/gradle.properties | 25 +- sdks/python/test-suites/tox/py37/build.gradle | 43 - sdks/python/test-suites/tox/py38/build.gradle | 20 +- .../test-suites/tox/pycommon/build.gradle | 4 +- sdks/python/tox.ini | 62 +- sdks/typescript/container/Dockerfile | 2 +- sdks/typescript/package-lock.json | 424 +- sdks/typescript/package.json | 9 +- sdks/typescript/src/apache_beam/index.ts | 1 + sdks/typescript/src/apache_beam/io/index.ts | 29 + .../src/apache_beam/transforms/index.ts | 1 + sdks/typescript/tsconfig.json | 1 + settings.gradle.kts | 20 +- start-build-env.sh | 2 +- website/Dockerfile | 2 +- .../{quotes-slider.js => sliders/quotes.js} | 30 +- .../www/site/assets/js/sliders/top-banners.js | 26 + website/www/site/assets/scss/_banner.sass | 21 +- website/www/site/assets/scss/_ctas.sass | 4 +- website/www/site/assets/scss/_header.sass | 4 + website/www/site/assets/scss/_playground.sass | 1 + website/www/site/config.toml | 2 +- .../www/site/content/en/blog/beam-2.47.0.md | 2 +- .../www/site/content/en/blog/beam-2.48.0.md | 9 +- .../www/site/content/en/blog/beam-2.49.0.md | 221 + website/www/site/content/en/blog/beamquest.md | 39 + .../managing-beam-dependencies-in-java.md | 122 + .../www/site/content/en/case-studies/hsbc.md | 236 + .../content/en/case-studies/projectShield.md | 231 + .../en/contribute/get-started-contributing.md | 2 +- .../content/en/contribute/release-guide.md | 70 +- .../io/built-in/google-bigquery.md | 30 +- .../content/en/documentation/io/connectors.md | 5 +- .../en/documentation/programming-guide.md | 35 +- .../content/en/documentation/runners/flink.md | 166 +- .../content/en/documentation/runners/spark.md | 2 +- .../en/documentation/runtime/environments.md | 2 +- .../java/aggregation/approximatequantiles.md | 5 + .../java/aggregation/cogroupbykey.md | 9 +- .../transforms/java/aggregation/combine.md | 9 + .../transforms/java/aggregation/count.md | 13 +- .../transforms/java/aggregation/distinct.md | 8 +- .../transforms/java/aggregation/groupbykey.md | 6 +- .../java/aggregation/groupintobatches.md | 5 +- .../transforms/java/aggregation/latest.md | 10 +- .../transforms/java/aggregation/max.md | 13 + .../transforms/java/aggregation/mean.md | 15 +- .../transforms/java/aggregation/min.md | 14 +- .../transforms/java/aggregation/sample.md | 5 +- .../transforms/java/aggregation/sum.md | 21 +- .../transforms/java/aggregation/top.md | 5 +- .../transforms/java/elementwise/filter.md | 7 + .../java/elementwise/flatmapelements.md | 5 +- .../transforms/java/elementwise/keys.md | 8 +- .../transforms/java/elementwise/kvswap.md | 8 +- .../java/elementwise/mapelements.md | 14 +- .../transforms/java/elementwise/pardo.md | 6 + .../transforms/java/elementwise/partition.md | 20 +- .../transforms/java/elementwise/regex.md | 5 +- .../transforms/java/elementwise/tostring.md | 5 +- .../transforms/java/elementwise/values.md | 8 +- .../transforms/java/elementwise/withkeys.md | 15 +- .../java/elementwise/withtimestamps.md | 5 +- .../transforms/java/other/create.md | 4 +- .../transforms/java/other/flatten.md | 12 +- .../transforms/java/other/view.md | 5 +- .../transforms/java/other/window.md | 5 +- .../python/aggregation/combineglobally.md | 56 +- .../python/aggregation/combineperkey.md | 70 +- .../python/aggregation/combinevalues.md | 70 +- .../transforms/python/aggregation/count.md | 42 +- .../transforms/python/aggregation/distinct.md | 14 +- .../transforms/python/aggregation/groupby.md | 107 +- .../python/aggregation/groupbykey.md | 8 +- .../python/aggregation/groupintobatches.md | 14 +- .../transforms/python/aggregation/latest.md | 28 +- .../transforms/python/aggregation/max.md | 28 +- .../transforms/python/aggregation/mean.md | 28 +- .../transforms/python/aggregation/min.md | 28 +- .../transforms/python/aggregation/sample.md | 28 +- .../transforms/python/aggregation/sum.md | 28 +- .../transforms/python/aggregation/top.md | 84 +- .../transforms/python/elementwise/filter.md | 89 +- .../transforms/python/elementwise/flatmap.md | 135 +- .../transforms/python/elementwise/keys.md | 15 +- .../transforms/python/elementwise/kvswap.md | 15 +- .../transforms/python/elementwise/map.md | 120 +- .../transforms/python/elementwise/pardo.md | 45 +- .../python/elementwise/partition.md | 45 +- .../transforms/python/elementwise/regex.md | 135 +- .../elementwise/runinference-sklearn.md | 8 +- .../python/elementwise/runinference.md | 6 +- .../transforms/python/elementwise/tostring.md | 45 +- .../transforms/python/elementwise/values.md | 15 +- .../python/elementwise/withtimestamps.md | 45 +- .../transforms/python/other/create.md | 5 +- .../transforms/python/other/flatten.md | 5 +- .../transforms/python/other/windowinto.md | 5 +- .../www/site/content/en/get-started/_index.md | 10 +- .../an-interactive-overview-of-beam.md | 96 + .../content/en/get-started/beam-overview.md | 2 +- .../site/content/en/get-started/downloads.md | 14 +- .../content/en/get-started/quickstart-go.md | 28 +- .../content/en/get-started/quickstart-py.md | 3 +- .../resources/learning-resources.md | 18 + .../content/en/get-started/tour-of-beam.md | 81 +- .../en/get-started/try-beam-playground.md | 73 +- .../en/get-started/wordcount-example.md | 55 +- website/www/site/data/authors.yml | 13 + website/www/site/data/en/quotes.yaml | 10 + website/www/site/i18n/home/en.yaml | 2 + website/www/site/layouts/index.html | 7 +- website/www/site/layouts/partials/header.html | 35 +- .../site/layouts/partials/hooks/body-end.html | 4 +- .../section-menu/en/documentation.html | 6 +- .../partials/section-menu/en/get-started.html | 6 +- .../flink_java_pipeline_options.html | 5 + .../flink_python_pipeline_options.html | 5 + .../machine-learning-desktop.jpg} | Bin .../machine-learning-mobile.jpg} | Bin .../tour-of-beam/tour-of-beam-desktop.png | Bin 0 -> 122733 bytes .../tour-of-beam/tour-of-beam-mobile.png | Bin 0 -> 86368 bytes .../images/blog/beam-badge-image-scaled.png | Bin 0 -> 53129 bytes .../case-study/hsbc/andrzej_golonka.jpg | Bin 0 -> 40744 bytes .../images/case-study/hsbc/chup_cheng.jpg | Bin 0 -> 114863 bytes .../images/case-study/hsbc/scheme-10.png | Bin 0 -> 150719 bytes .../images/case-study/hsbc/scheme-11.png | Bin 0 -> 34104 bytes .../images/case-study/hsbc/scheme-9.png | Bin 0 -> 39137 bytes .../apache_beam_streaming_log_analytics.png | Bin 0 -> 93797 bytes .../case-study/projectShield/chad_hansen.png | Bin 0 -> 386079 bytes .../case-study/projectShield/marc_howard.jpg | Bin 0 -> 136851 bytes .../project_shield_mechanism.png | Bin 0 -> 29786 bytes .../static/images/logos/powered-by/hsbc.png | Bin 0 -> 3391 bytes .../logos/powered-by/project_shield.png | Bin 0 -> 9908 bytes 1354 files changed, 117532 insertions(+), 20058 deletions(-) create mode 100644 .github/actions/rerun-job-action/action.yml create mode 100644 .github/gh-actions-self-hosted-runners/arc/images/Dockerfile create mode 100644 .github/gh-actions-self-hosted-runners/arc/images/README.md create mode 100644 .github/workflows/README.md create mode 100644 .github/workflows/beam_PreCommit_CommunityMetrics.yml create mode 100644 .github/workflows/beam_PreCommit_Java_Examples_Dataflow.yml create mode 100644 .github/workflows/beam_PreCommit_Java_Examples_Dataflow_Java11.yml create mode 100644 .github/workflows/beam_PreCommit_Java_Examples_Dataflow_Java17.yml create mode 100644 .github/workflows/beam_PreCommit_Java_Spark3_Versions.yml create mode 100644 .github/workflows/beam_PreCommit_PythonDocs.yml create mode 100644 .github/workflows/beam_PreCommit_Python_Integration.yml create mode 100644 .github/workflows/beam_PreCommit_RAT.yml create mode 100644 .github/workflows/beam_PreCommit_Typescript.yml create mode 100644 .github/workflows/beam_PreCommit_Website.yml create mode 100644 .github/workflows/beam_PreCommit_Whitespace.yml delete mode 100644 .github/workflows/build_playground_backend.yml delete mode 100644 .github/workflows/build_playground_frontend.yml create mode 100644 .github/workflows/build_runner_image.yml create mode 100644 .github/workflows/code_completion_plugin_tests.yml create mode 100644 .github/workflows/job_PreCommit_Python.yml create mode 100644 .github/workflows/job_PreCommit_PythonAutoformatter.yml create mode 100644 .github/workflows/job_PreCommit_PythonLint.yml create mode 100644 .github/workflows/job_PreCommit_Python_Coverage.yml create mode 100644 .github/workflows/job_PreCommit_Python_Dataframes.yml create mode 100644 .github/workflows/job_PreCommit_Python_DockerBuild.yml create mode 100644 .github/workflows/job_PreCommit_Python_Examples.yml create mode 100644 .github/workflows/job_PreCommit_Python_Runners.yml create mode 100644 .github/workflows/job_PreCommit_Python_Transforms.yml delete mode 100644 .github/workflows/playground_deploy_backend.yml delete mode 100644 .github/workflows/playground_deploy_examples.yml delete mode 100644 .github/workflows/playground_examples_cd_reusable.yml delete mode 100644 .github/workflows/playground_examples_ci.yml delete mode 100644 .github/workflows/playground_examples_ci_reusable.yml delete mode 100644 .github/workflows/tour_of_beam_examples_ci.yml delete mode 100644 .test-infra/jenkins/dependency_check/bigquery_client_utils.py delete mode 100644 .test-infra/jenkins/dependency_check/dependency_check_report_generator.py delete mode 100644 .test-infra/jenkins/dependency_check/dependency_check_report_generator_test.py delete mode 100755 .test-infra/jenkins/dependency_check/generate_report.sh delete mode 100644 .test-infra/jenkins/dependency_check/report_generator_config.py delete mode 100644 .test-infra/jenkins/dependency_check/version_comparer.py delete mode 100644 .test-infra/jenkins/dependency_check/version_comparer_test.py delete mode 100644 .test-infra/jenkins/job_Dependency_Check.groovy delete mode 100644 .test-infra/jenkins/job_PostCommit_Python_ValidatesRunner_Dataflow_V2.groovy delete mode 100644 .test-infra/jenkins/job_Release_Gradle_Build.groovy create mode 100644 .test-infra/pipelines/README.md create mode 100644 .test-infra/pipelines/build.gradle create mode 100644 .test-infra/pipelines/go.mod create mode 100644 .test-infra/pipelines/go.sum create mode 100644 .test-infra/pipelines/infrastructure/01.setup/.terraform.lock.hcl create mode 100644 .test-infra/pipelines/infrastructure/01.setup/README.md rename sdks/python/test-suites/dataflow/py37/build.gradle => .test-infra/pipelines/infrastructure/01.setup/apache-beam-testing.tfbackend (68%) create mode 100644 .test-infra/pipelines/infrastructure/01.setup/apache-beam-testing.tfvars create mode 100644 .test-infra/pipelines/infrastructure/01.setup/artifactregistry.tf create mode 100644 .test-infra/pipelines/infrastructure/01.setup/common.tfvars create mode 100644 .test-infra/pipelines/infrastructure/01.setup/iam.tf create mode 100644 .test-infra/pipelines/infrastructure/01.setup/provider.tf create mode 100644 .test-infra/pipelines/infrastructure/01.setup/services.tf create mode 100644 .test-infra/pipelines/infrastructure/01.setup/state.tf create mode 100644 .test-infra/pipelines/infrastructure/01.setup/storage.tf create mode 100644 .test-infra/pipelines/infrastructure/01.setup/variables.tf create mode 100644 .test-infra/pipelines/infrastructure/02.network/.terraform.lock.hcl create mode 100644 .test-infra/pipelines/infrastructure/02.network/README.md create mode 100644 .test-infra/pipelines/infrastructure/02.network/apache-beam-testing.tfbackend create mode 100644 .test-infra/pipelines/infrastructure/02.network/apache-beam-testing.tfvars create mode 100644 .test-infra/pipelines/infrastructure/02.network/common.tfvars create mode 100644 .test-infra/pipelines/infrastructure/02.network/data.tf create mode 100644 .test-infra/pipelines/infrastructure/02.network/network.tf rename sdks/python/container/py37/build.gradle => .test-infra/pipelines/infrastructure/02.network/provider.tf (71%) create mode 100644 .test-infra/pipelines/infrastructure/02.network/state.tf create mode 100644 .test-infra/pipelines/infrastructure/02.network/variables.tf create mode 100644 .test-infra/pipelines/infrastructure/03.io/README.md create mode 100644 .test-infra/pipelines/infrastructure/03.io/api-overuse-study/02.redis/README.md create mode 100644 .test-infra/pipelines/infrastructure/03.io/api-overuse-study/02.redis/common.tfvars create mode 100644 .test-infra/pipelines/infrastructure/03.io/api-overuse-study/02.redis/data.tf rename plugins/beam-code-completion-plugin/src/test/java/BeamCompletionContributorTestcase.java => .test-infra/pipelines/infrastructure/03.io/api-overuse-study/02.redis/provider.tf (76%) create mode 100644 .test-infra/pipelines/infrastructure/03.io/api-overuse-study/02.redis/redis.tf create mode 100644 .test-infra/pipelines/infrastructure/03.io/api-overuse-study/02.redis/variables.tf create mode 100644 .test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/.terraform.lock.hcl create mode 100644 .test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/README.md create mode 100644 .test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/apache-beam-testing.tfbackend create mode 100644 .test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/apache-beam-testing.tfvars create mode 100644 .test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/bigquery.tf create mode 100644 .test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/common.tfvars create mode 100644 .test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/data.tf create mode 100644 .test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/iam.tf create mode 100644 .test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/provider.tf create mode 100644 .test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/pubsub.tf create mode 100644 .test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/state.tf create mode 100644 .test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/variables.tf create mode 100644 .test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/workflow.tf create mode 100644 .test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/README.md create mode 100644 .test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/apache-beam-testing.tfvars create mode 100644 .test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/common.tfvars create mode 100644 .test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/data.tf create mode 100644 .test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/dataflow-template.json create mode 100644 .test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/output.tf create mode 100644 .test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/provider.tf create mode 100644 .test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/template.tf create mode 100644 .test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/variables.tf create mode 100644 .test-infra/pipelines/infrastructure/README.md create mode 100644 .test-infra/pipelines/src/main/go/internal/environment/variable.go create mode 100644 .test-infra/pipelines/src/main/go/internal/environment/variable_test.go create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/ReadDataflowApiWriteBigQuery.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/bigquery/BigQueryWriteOptions.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/bigquery/BigQueryWrites.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/bigquery/DatasetReferenceOptionValue.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/bigquery/package-info.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/conversions/ConversionError.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/conversions/EventarcConversions.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/conversions/JobsToRow.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/conversions/RowConversionResult.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/conversions/WithAppendedDetailsToRow.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/conversions/package-info.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowClientFactory.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowClientFactoryConfiguration.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowFilterEventarcJobs.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowGetJobExecutionDetails.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowGetJobMetrics.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowGetJobs.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowGetStageExecutionDetails.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowJobsOptions.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowReadResult.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowRequestError.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowRequests.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/JobMetricsWithAppendedDetails.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/StageSummaryWithAppendedDetails.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/Throttle.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/WorkerDetailsWithAppendedDetails.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/package-info.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/package-info.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/pubsub/PubsubReadOptions.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/pubsub/SubscriptionPathOptionValue.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/pubsub/package-info.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/schemas/DependencyDrivenDescriptorQueue.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/schemas/DescriptorSchemaRegistry.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/schemas/GeneratedMessageV3RowBuilder.java create mode 100644 .test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/schemas/package-info.java create mode 100644 .test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/conversions/EventarcConversionsTest.java create mode 100644 .test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/conversions/JobMetricsWithAppendedDetailsTest.java create mode 100644 .test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/conversions/StageSummaryWithAppendedDetailsTest.java create mode 100644 .test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/conversions/WithAppendedDetailsToRowTest.java create mode 100644 .test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/conversions/WorkerDetailsWithAppendedDetailsTest.java create mode 100644 .test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowFilterEventarcJobsTest.java create mode 100644 .test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/schemas/AbstractGeneratedMessageV3RowBuilderTest.java create mode 100644 .test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/schemas/DependencyDrivenDescriptorQueueTest.java create mode 100644 .test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/schemas/DescriptorSchemaRegistryTest.java create mode 100644 .test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/schemas/EnvironmentRowBuilderTest.java create mode 100644 .test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/schemas/ExecutionStageSummaryTest.java create mode 100644 .test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/schemas/TransformSummaryRowBuilderTest.java create mode 100644 .test-infra/pipelines/src/test/resources/eventarc_data/has_extra_data_payload_foo_property.json create mode 100644 .test-infra/pipelines/src/test/resources/eventarc_data/job_state_canceled_streaming.json create mode 100644 .test-infra/pipelines/src/test/resources/eventarc_data/job_state_canceling_streaming.json create mode 100644 .test-infra/pipelines/src/test/resources/eventarc_data/job_state_done_batch.json create mode 100644 .test-infra/pipelines/src/test/resources/eventarc_data/job_state_pending_batch.json create mode 100644 .test-infra/pipelines/src/test/resources/eventarc_data/job_state_pending_streaming.json create mode 100644 .test-infra/pipelines/src/test/resources/eventarc_data/job_state_queued_streaming.json create mode 100644 .test-infra/pipelines/src/test/resources/eventarc_data/job_state_running_batch.json create mode 100644 .test-infra/pipelines/src/test/resources/eventarc_data/job_state_running_streaming.json create mode 100644 examples/java/src/main/java/org/apache/beam/examples/ApproximateQuantilesExample.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/CoGroupByKeyExample.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/CombineExample.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/CountExample.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/CountPerKeyExample.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/CreateExample.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/DistinctExample.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/FlatMapElementsExample.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/GroupIntoBatchesExample.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/KafkaPassengerCountJson.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/KafkaStreaming.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/KeysExample.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/KvSwapExample.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/LatestExample.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/MapElementsExample.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/MaxExample.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/MaxPerKeyExample.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/MeanExample.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/MeanPerKeyExample.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/MinExample.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/MinPerKeyExample.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/PartitionExample.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/RegexExample.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/SampleExample.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/SumExample.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/SumPerKeyExample.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/ToStringExample.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/TopExample.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/ValuesExample.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/ViewExample.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/WindowExample.java create mode 100644 examples/java/src/main/java/org/apache/beam/examples/cookbook/MinimalBigQueryTornadoes.java create mode 100644 examples/java/src/test/java/org/apache/beam/examples/cookbook/MinimalBigQueryTornadoesTest.java create mode 100644 examples/notebooks/beam-ml/image_processing_tensorflow.ipynb create mode 100644 examples/notebooks/beam-ml/run_inference_generative_ai.ipynb rename examples/notebooks/{tour-of-beam => interactive-overview}/dataframes.ipynb (100%) rename examples/notebooks/{tour-of-beam => interactive-overview}/getting-started.ipynb (100%) rename examples/notebooks/{tour-of-beam => interactive-overview}/reading-and-writing-data.ipynb (100%) rename examples/notebooks/{tour-of-beam => interactive-overview}/windowing.ipynb (100%) create mode 100644 learning/beamdoc/CombinePerKeyExample.java create mode 100644 learning/beamdoc/FlattenExample.java create mode 100644 learning/beamdoc/GroupByKeyExample.java create mode 100644 learning/beamdoc/WithKeysExample.java create mode 100644 learning/tour-of-beam/frontend/lib/constants/links.dart rename sdks/python/test-suites/direct/py37/build.gradle => learning/tour-of-beam/frontend/lib/constants/params.dart (69%) create mode 100644 learning/tour-of-beam/learning-content/cross-language/module-info.yaml create mode 100644 learning/tour-of-beam/learning-content/cross-language/multi-pipeline/description.md create mode 100644 learning/tour-of-beam/learning-content/cross-language/multi-pipeline/java-example/Task.java create mode 100644 learning/tour-of-beam/learning-content/cross-language/multi-pipeline/python-example/input.txt create mode 100644 learning/tour-of-beam/learning-content/cross-language/multi-pipeline/python-example/output.log create mode 100644 learning/tour-of-beam/learning-content/cross-language/multi-pipeline/python-example/task.py create mode 100644 learning/tour-of-beam/learning-content/cross-language/multi-pipeline/unit-info.yaml create mode 100644 learning/tour-of-beam/learning-content/cross-language/sql-transform/description.md create mode 100644 learning/tour-of-beam/learning-content/cross-language/sql-transform/java-example/Task.java create mode 100644 learning/tour-of-beam/learning-content/cross-language/sql-transform/java-example/output.log create mode 100644 learning/tour-of-beam/learning-content/cross-language/sql-transform/python-example/output.log create mode 100644 learning/tour-of-beam/learning-content/cross-language/sql-transform/python-example/task.py create mode 100644 learning/tour-of-beam/learning-content/cross-language/sql-transform/unit-info.yaml create mode 100644 learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/description.md create mode 100644 learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/go-challenge/input.csv create mode 100644 learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/go-challenge/main.go create mode 100644 learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/go-solution/input.csv create mode 100644 learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/go-solution/main.go create mode 100644 learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/hint1.md create mode 100644 learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/java-challenge/Task.java create mode 100644 learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/java-challenge/input.csv create mode 100644 learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/java-solution/Task.java create mode 100644 learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/java-solution/input.csv create mode 100644 learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/python-challenge/input.csv create mode 100644 learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/python-challenge/task.py create mode 100644 learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/python-solution/input.csv create mode 100644 learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/python-solution/task.py create mode 100644 learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/unit-info.yaml create mode 100644 learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/description.md create mode 100644 learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/go-challenge/analysis.csv create mode 100644 learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/go-challenge/main.go create mode 100644 learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/go-solution/analysis.csv create mode 100644 learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/go-solution/main.go create mode 100644 learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/hint1.md create mode 100644 learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/java-challenge/Task.java create mode 100644 learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/java-challenge/analysis.csv create mode 100644 learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/java-solution/Task.java create mode 100644 learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/java-solution/analysis.csv create mode 100644 learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/python-challenge/analysis.csv create mode 100644 learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/python-challenge/task.py create mode 100644 learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/python-solution/analysis.csv create mode 100644 learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/python-solution/task.py create mode 100644 learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/unit-info.yaml create mode 100644 learning/tour-of-beam/learning-content/final-challenge/module-info.yaml create mode 100644 learning/tour-of-beam/learning-content/splittable-dofn/module-info.yaml create mode 100644 learning/tour-of-beam/learning-content/splittable-dofn/splittable/description.md create mode 100644 learning/tour-of-beam/learning-content/splittable-dofn/splittable/go-example/main.go create mode 100644 learning/tour-of-beam/learning-content/splittable-dofn/splittable/java-example/Task.java create mode 100644 learning/tour-of-beam/learning-content/splittable-dofn/splittable/python-example/task.py create mode 100644 learning/tour-of-beam/learning-content/splittable-dofn/splittable/unit-info.yaml delete mode 100644 playground/CI.md create mode 100644 playground/TASKS.md create mode 100644 playground/backend/SCHEMA.md create mode 100644 playground/backend/datasets/NYCTaxi1000Avro.avro create mode 100644 playground/backend/datasets/NYCTaxi1000Json.json create mode 100644 playground/backend/datasets/NYCTaxi1000_simpleAvro.avro create mode 100644 playground/backend/datasets/NYCTaxi1000_simpleJson.json create mode 100644 playground/doc/load_your_code/images/share-my-code.png create mode 100644 playground/doc/load_your_code/images/workflow.png create mode 100644 playground/frontend/playground_components/lib/src/exceptions/detailed_exception.dart rename learning/tour-of-beam/frontend/lib/pages/tour/widgets/content_tree_title.dart => playground/frontend/playground_components/lib/src/theme/transitions.dart (58%) create mode 100644 playground/frontend/playground_components/lib/src/widgets/iframe/iframe.dart create mode 100644 playground/frontend/playground_components/lib/src/widgets/iframe/iframe_non_web.dart create mode 100644 playground/frontend/playground_components/lib/src/widgets/iframe/iframe_web.dart rename plugins/beam-code-completion-plugin/src/main/java/BeamJavaSDKPattern.java => playground/frontend/playground_components_dev/lib/src/examples/java/content/example.java (64%) create mode 100644 playground/frontend/playground_components_dev/lib/src/examples/java/example.dart create mode 100644 playground/load_your_code.md mode change 100644 => 100755 plugins/beam-code-completion-plugin/gradlew create mode 100644 plugins/beam-code-completion-plugin/src/main/java/BeamCompletionConfidence.java create mode 100644 plugins/beam-code-completion-plugin/src/test/java/BeamCompletionContributorTestCase.java create mode 100644 plugins/beam-code-completion-plugin/src/test/testData/TestCompletions.java create mode 100644 runners/samza/OWNERS create mode 100644 runners/samza/src/main/java/org/apache/beam/runners/samza/runtime/PortableBundleManager.java create mode 100644 runners/samza/src/main/java/org/apache/beam/runners/samza/util/PortableConfigUtils.java create mode 100644 runners/samza/src/test/java/org/apache/beam/runners/samza/runtime/PortableBundleManagerTest.java create mode 100644 runners/samza/src/test/java/org/apache/beam/runners/samza/util/PortableConfigUtilsTest.java create mode 100644 sdks/go/cmd/prism/README.md create mode 100644 sdks/go/cmd/prism/prism.go create mode 100644 sdks/go/data/tweetwithnulls.avro create mode 100644 sdks/go/pkg/beam/runners/prism/internal/doc.go create mode 100644 sdks/go/pkg/beam/runners/prism/internal/jobservices/management_test.go create mode 100644 sdks/go/pkg/beam/runners/prism/internal/web/assets/style.css create mode 100644 sdks/go/pkg/beam/runners/prism/internal/web/index.html create mode 100644 sdks/go/pkg/beam/runners/prism/internal/web/jobdetails.html create mode 100644 sdks/go/pkg/beam/runners/prism/internal/web/web.go create mode 100644 sdks/java/container/java21/java21-security.properties create mode 100644 sdks/java/container/java21/option-java21-security.json create mode 100644 sdks/java/extensions/avro/src/main/java/org/apache/beam/sdk/extensions/avro/io/AvroDatumFactory.java create mode 100644 sdks/java/extensions/avro/src/main/java/org/apache/beam/sdk/extensions/avro/schemas/utils/AvroJavaTimeConversions.java create mode 100644 sdks/java/extensions/avro/src/main/java/org/apache/beam/sdk/extensions/avro/schemas/utils/AvroJodaTimeConversions.java create mode 100644 sdks/java/extensions/avro/src/test/java/org/apache/beam/sdk/extensions/avro/schemas/TestAvroConversionFactory.java create mode 100644 sdks/java/extensions/python/src/main/java/org/apache/beam/sdk/extensions/python/PythonExternalTransformOptions.java rename sdks/java/{io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/changestreams/estimator/ThroughputEstimator.java => extensions/python/src/main/java/org/apache/beam/sdk/extensions/python/PythonExternalTransformOptionsRegistrar.java} (51%) create mode 100644 sdks/java/harness/src/main/java/org/apache/beam/fn/harness/debug/ElementSample.java create mode 100644 sdks/java/harness/src/main/java/org/apache/beam/fn/harness/logging/QuotaEvent.java create mode 100644 sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/common/AsyncBatchWriteHandler.java delete mode 100644 sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/kinesis/AsyncPutRecordsHandler.java create mode 100644 sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/common/AsyncBatchWriteHandlerTest.java delete mode 100644 sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/kinesis/AsyncPutRecordsHandlerTest.java create mode 100644 sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/sqs/SqsIOWriteBatchesTest.java create mode 100644 sdks/java/io/azure-cosmos/build.gradle create mode 100644 sdks/java/io/azure-cosmos/src/main/java/org/apache/beam/sdk/io/azure/cosmos/CosmosIO.java create mode 100644 sdks/java/io/azure-cosmos/src/main/java/org/apache/beam/sdk/io/azure/cosmos/CosmosOptions.java create mode 100644 sdks/java/io/azure-cosmos/src/main/java/org/apache/beam/sdk/io/azure/cosmos/NormalizedRange.java create mode 100644 sdks/java/io/azure-cosmos/src/main/java/org/apache/beam/sdk/io/azure/cosmos/package-info.java create mode 100644 sdks/java/io/azure-cosmos/src/test/java/com/azure/cosmos/examples/common/Address.java create mode 100644 sdks/java/io/azure-cosmos/src/test/java/com/azure/cosmos/examples/common/Child.java create mode 100644 sdks/java/io/azure-cosmos/src/test/java/com/azure/cosmos/examples/common/Families.java create mode 100644 sdks/java/io/azure-cosmos/src/test/java/com/azure/cosmos/examples/common/Family.java create mode 100644 sdks/java/io/azure-cosmos/src/test/java/com/azure/cosmos/examples/common/Parent.java rename sdks/{python/test-suites/portable/py37/build.gradle => java/io/azure-cosmos/src/test/java/com/azure/cosmos/examples/common/Pet.java} (61%) create mode 100644 sdks/java/io/azure-cosmos/src/test/java/org/apache/beam/sdk/io/azure/cosmos/CosmosIOTest.java delete mode 100644 sdks/java/io/azure/README.md create mode 100644 sdks/java/io/azure/src/main/java/org/apache/beam/sdk/io/azure/options/AzureOptions.java create mode 100644 sdks/java/io/components/build.gradle create mode 100644 sdks/java/io/components/src/main/java/org/apache/beam/sdk/io/components/deadletterqueue/DLQRouter.java create mode 100644 sdks/java/io/components/src/main/java/org/apache/beam/sdk/io/components/deadletterqueue/sinks/ThrowingSink.java create mode 100644 sdks/java/io/components/src/test/java/org/apache/beam/sdk/io/components/deadletterqueue/DLQRouterTest.java create mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/RowMutation.java create mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/RowMutationInformation.java create mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/StorageApiCDC.java rename sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/{BigTableReadSchemaTransformProvider.java => BigtableReadSchemaTransformProvider.java} (60%) create mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableWriteSchemaTransformProvider.java create mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/changestreams/dofn/FilterForMutationDoFn.java create mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/changestreams/estimator/CoderSizeEstimator.java rename sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/changestreams/estimator/{NullThroughputEstimator.java => NullSizeEstimator.java} (59%) delete mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsub/PubsubSchemaTransformMessageToRowFactory.java create mode 100644 sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigquery/StorageApiSinkRowUpdateIT.java rename sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/{BigTableReadSchemaTransformProviderIT.java => BigtableReadSchemaTransformProviderIT.java} (63%) create mode 100644 sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableWriteSchemaTransformProviderIT.java create mode 100644 sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/changestreams/dofn/FilterForMutationDoFnTest.java rename sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/changestreams/estimator/{NullThroughputEstimatorTest.java => NullSizeEstimatorTest.java} (68%) delete mode 100644 sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsub/PubsubSchemaTransformMessageToRowFactoryTest.java delete mode 100644 sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsub/PubsubWriteSchemaTransformProviderIT.java delete mode 100644 sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsub/PubsubWriteSchemaTransformProviderTest.java create mode 100644 sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/spanner/changestreams/SpannerChangestreamsReadDlqTest.java create mode 100644 sdks/java/transform-service/launcher/build.gradle create mode 100644 sdks/java/transform-service/launcher/src/main/java/org/apache/beam/sdk/transformservice/launcher/TransformServiceLauncher.java create mode 100644 sdks/java/transform-service/launcher/src/main/java/org/apache/beam/sdk/transformservice/launcher/package-info.java delete mode 100644 sdks/python/apache_beam/examples/avro_bitcoin.py create mode 100644 sdks/python/apache_beam/examples/avro_nyc_trips.py create mode 100644 sdks/python/apache_beam/examples/avro_nyc_trips_it_test.py create mode 100644 sdks/python/apache_beam/examples/avro_nyc_trips_test.py create mode 100644 sdks/python/apache_beam/examples/inference/vertex_ai_image_classification.py create mode 100644 sdks/python/apache_beam/examples/ml_transform/ml_transform_basic.py create mode 100644 sdks/python/apache_beam/examples/snippets/snippets_examples_wordcount_debugging.py create mode 100644 sdks/python/apache_beam/examples/snippets/snippets_examples_wordcount_minimal.py create mode 100644 sdks/python/apache_beam/examples/snippets/snippets_examples_wordcount_wordcount.py delete mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally_combinefn.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally_function.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally_lambda.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally_multiple_arguments.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally_side_inputs_dict.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally_side_inputs_iter.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally_side_inputs_singleton.py delete mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey_combinefn.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey_function.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey_lambda.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey_multiple_arguments.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey_side_inputs_dict.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey_side_inputs_iter.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey_side_inputs_singleton.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey_simple.py delete mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues_combinefn.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues_function.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues_lambda.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues_multiple_arguments.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues_side_inputs_dict.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues_side_inputs_iter.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues_side_inputs_singleton.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues_simple.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/count_globally.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/count_per_element.py rename sdks/python/apache_beam/examples/snippets/transforms/aggregation/{count.py => count_per_key.py} (61%) create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_attr.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_attr_expr.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_expr.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_expr_aggregate.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_global_aggregate.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_simple_aggregate.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_two_exprs.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/latest_globally.py rename sdks/python/apache_beam/examples/snippets/transforms/aggregation/{latest.py => latest_per_key.py} (70%) create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/max_globally.py rename sdks/python/apache_beam/examples/snippets/transforms/aggregation/{max.py => max_per_key.py} (77%) create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/mean_globally.py rename sdks/python/apache_beam/examples/snippets/transforms/aggregation/{mean.py => mean_per_key.py} (78%) create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/min_globally.py rename sdks/python/apache_beam/examples/snippets/transforms/aggregation/{min.py => min_per_key.py} (77%) create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/sample_fixed_size_globally.py rename sdks/python/apache_beam/examples/snippets/transforms/aggregation/{sample.py => sample_fixed_size_per_key.py} (73%) create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/sum_globally.py rename sdks/python/apache_beam/examples/snippets/transforms/aggregation/{sum.py => sum_per_key.py} (77%) delete mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/top_largest.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/top_largest_per_key.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/top_of.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/top_per_key.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/top_smallest.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/aggregation/top_smallest_per_key.py delete mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter_function.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter_lambda.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter_multiple_arguments.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter_side_inputs_dict.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter_side_inputs_iter.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter_side_inputs_singleton.py delete mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap_function.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap_generator.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap_lambda.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap_multiple_arguments.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap_side_inputs_dict.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap_side_inputs_iter.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap_side_inputs_singleton.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap_simple.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap_tuple.py delete mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/map_function.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/map_lambda.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/map_multiple_arguments.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/map_side_inputs_dict.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/map_side_inputs_iter.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/map_side_inputs_singleton.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/map_simple.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/map_tuple.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/pardo_dofn.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/pardo_dofn_methods.py rename sdks/python/apache_beam/examples/snippets/transforms/elementwise/{pardo.py => pardo_dofn_params.py} (59%) delete mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/partition.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/partition_function.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/partition_lambda.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/partition_multiple_arguments.py delete mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex_all_matches.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex_find.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex_find_all.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex_find_kv.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex_matches.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex_matches_kv.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex_replace_all.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex_replace_first.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex_split.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/runinference_sklearn_keyed_model_handler.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/runinference_sklearn_unkeyed_model_handler.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/tostring_element.py rename sdks/python/apache_beam/examples/snippets/transforms/elementwise/{tostring.py => tostring_iterables.py} (56%) create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/tostring_kvs.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/withtimestamps_event_time.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/withtimestamps_logical_clock.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/elementwise/withtimestamps_processing_time.py rename {.test-infra/jenkins/dependency_check => sdks/python/apache_beam/examples/snippets/transforms/other}/__init__.py (100%) create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/other/create.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/other/create_test.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/other/flatten.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/other/flatten_test.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/other/window.py create mode 100644 sdks/python/apache_beam/examples/snippets/transforms/other/window_test.py rename sdks/python/apache_beam/{runners/dataflow/native_io => io/components}/__init__.py (100%) rename sdks/python/apache_beam/io/{gcp/datastore/v1new => components}/adaptive_throttler.py (98%) rename sdks/python/apache_beam/io/{gcp/datastore/v1new => components}/adaptive_throttler_test.py (97%) create mode 100644 sdks/python/apache_beam/io/components/util.py create mode 100644 sdks/python/apache_beam/io/gcp/bigtableio_it_test.py rename .github/workflows/playground_examples_cd.yml => sdks/python/apache_beam/io/gcp/healthcare/__init__.py (53%) create mode 100644 sdks/python/apache_beam/io/gcp/healthcare/dicomclient.py create mode 100644 sdks/python/apache_beam/io/gcp/healthcare/dicomio.py rename sdks/python/apache_beam/io/gcp/{ => healthcare}/dicomio_integration_test.py (97%) rename sdks/python/apache_beam/io/gcp/{ => healthcare}/dicomio_test.py (93%) create mode 100644 sdks/python/apache_beam/ml/inference/vertex_ai_inference.py create mode 100644 sdks/python/apache_beam/ml/inference/vertex_ai_inference_test.py rename .github/workflows/playground_deploy_infrastructure.yml => sdks/python/apache_beam/ml/transforms/__init__.py (53%) create mode 100644 sdks/python/apache_beam/ml/transforms/base.py create mode 100644 sdks/python/apache_beam/ml/transforms/base_test.py create mode 100644 sdks/python/apache_beam/ml/transforms/handlers.py create mode 100644 sdks/python/apache_beam/ml/transforms/handlers_test.py create mode 100644 sdks/python/apache_beam/ml/transforms/tft.py create mode 100644 sdks/python/apache_beam/ml/transforms/tft_test.py create mode 100644 sdks/python/apache_beam/ml/transforms/utils.py delete mode 100644 sdks/python/apache_beam/runners/dataflow/native_io/iobase.py delete mode 100644 sdks/python/apache_beam/runners/dataflow/native_io/iobase_test.py create mode 100644 sdks/python/apache_beam/transforms/timestamped_value_type_test.py create mode 100644 sdks/python/apache_beam/utils/transform_service_launcher.py create mode 100644 sdks/python/apache_beam/yaml/yaml_mapping.md create mode 100644 sdks/python/apache_beam/yaml/yaml_mapping.py create mode 100644 sdks/python/apache_beam/yaml/yaml_mapping_test.py delete mode 100644 sdks/python/container/py37/base_image_requirements.txt delete mode 100755 sdks/python/scripts/run_dependency_check.sh delete mode 100644 sdks/python/test-suites/tox/py37/build.gradle create mode 100644 sdks/typescript/src/apache_beam/io/index.ts rename website/www/site/assets/js/{quotes-slider.js => sliders/quotes.js} (93%) create mode 100644 website/www/site/assets/js/sliders/top-banners.js create mode 100644 website/www/site/content/en/blog/beam-2.49.0.md create mode 100644 website/www/site/content/en/blog/beamquest.md create mode 100644 website/www/site/content/en/blog/managing-beam-dependencies-in-java.md create mode 100644 website/www/site/content/en/case-studies/hsbc.md create mode 100644 website/www/site/content/en/case-studies/projectShield.md create mode 100644 website/www/site/content/en/get-started/an-interactive-overview-of-beam.md rename website/www/site/static/images/{banner_desktop.jpg => banners/machine-learning/machine-learning-desktop.jpg} (100%) rename website/www/site/static/images/{banner_mobile.jpg => banners/machine-learning/machine-learning-mobile.jpg} (100%) create mode 100644 website/www/site/static/images/banners/tour-of-beam/tour-of-beam-desktop.png create mode 100644 website/www/site/static/images/banners/tour-of-beam/tour-of-beam-mobile.png create mode 100644 website/www/site/static/images/blog/beam-badge-image-scaled.png create mode 100644 website/www/site/static/images/case-study/hsbc/andrzej_golonka.jpg create mode 100644 website/www/site/static/images/case-study/hsbc/chup_cheng.jpg create mode 100644 website/www/site/static/images/case-study/hsbc/scheme-10.png create mode 100644 website/www/site/static/images/case-study/hsbc/scheme-11.png create mode 100644 website/www/site/static/images/case-study/hsbc/scheme-9.png create mode 100644 website/www/site/static/images/case-study/projectShield/apache_beam_streaming_log_analytics.png create mode 100644 website/www/site/static/images/case-study/projectShield/chad_hansen.png create mode 100644 website/www/site/static/images/case-study/projectShield/marc_howard.jpg create mode 100644 website/www/site/static/images/case-study/projectShield/project_shield_mechanism.png create mode 100644 website/www/site/static/images/logos/powered-by/hsbc.png create mode 100644 website/www/site/static/images/logos/powered-by/project_shield.png diff --git a/.asf.yaml b/.asf.yaml index 848391d29d32..defb99e8c37f 100644 --- a/.asf.yaml +++ b/.asf.yaml @@ -46,6 +46,66 @@ github: merge: true rebase: false + protected_branches: + master: {} + release-2.49.0: {} + release-2.48.0: {} + release-2.47.0: {} + release-2.46.0: {} + release-2.45.0: {} + release-2.44.0: {} + release-2.43.0: {} + release-2.42.0: {} + release-2.41.0: {} + release-2.40.0: {} + release-2.39.0: {} + release-2.38.0: {} + release-2.37.0: {} + release-2.36.0: {} + release-2.35.0: {} + release-2.34.0: {} + release-2.33.0: {} + release-2.32.0: {} + release-2.31.0: {} + release-2.30.0: {} + release-2.29.0: {} + release-2.28.0: {} + release-2.27.0: {} + release-2.26.0: {} + release-2.25.0: {} + release-2.24.0: {} + release-2.23.0: {} + release-2.22.0: {} + release-2.21.0: {} + release-2.20.0: {} + release-2.19.0: {} + release-2.18.0: {} + release-2.17.0: {} + release-2.16.0: {} + release-2.15.0: {} + release-2.14.0: {} + release-2.13.0: {} + release-2.12.0: {} + release-2.11.0: {} + release-2.10.0: {} + release-2.8.0: {} + release-2.8.0: {} + release-2.7.0: {} + release-2.6.0: {} + release-2.5.0: {} + release-2.4.0: {} + release-2.3.0: {} + release-2.2.0: {} + release-2.1.1: {} + release-2.1.0: {} + release-0.6.0: {} + release-0.5.0: {} + release-0.4.0: {} + release-0.4.0-incubating: {} + release-0.3.0-incubating: {} + release-0.2.0-incubating: {} + release-0.1.0-incubating: {} + notifications: commits: commits@beam.apache.org issues: github@beam.apache.org diff --git a/.github/ACTIONS.md b/.github/ACTIONS.md index 7432a3d28b1c..9b6be30bf30c 100644 --- a/.github/ACTIONS.md +++ b/.github/ACTIONS.md @@ -98,3 +98,5 @@ Phrases self-assign, close, or manage labels on an issue: | `.add-labels` | Add comma separated labels to the issue (e.g. `add-labels l1, 'l2 with spaces'`) | | `.remove-labels` | Remove comma separated labels to the issue (e.g. `remove-labels l1, 'l2 with spaces'`) | | `.set-labels` | Sets comma separated labels to the issue and removes any other labels (e.g. `set-labels l1, 'l2 with spaces'`) | + +test \ No newline at end of file diff --git a/.github/actions/rerun-job-action/action.yml b/.github/actions/rerun-job-action/action.yml new file mode 100644 index 000000000000..73679aaaf819 --- /dev/null +++ b/.github/actions/rerun-job-action/action.yml @@ -0,0 +1,129 @@ +# 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. + + +#Action used to trigger a failed check re-run within a PR using a comment. Add this action to your workflow with an if condition +#to check if the comment is present +#If the check is failed this will trigger it again. If its not failed a new instance of workflow will run which will not show in the status box or checks tab in the PR and can be found in the actions tab https://github.com/apache/beam/actions + +name: "Rerun Job Action" +description: Re-runs a job that is attached to the PR as Check Run +inputs: + pull_request_url: + description: "The URL of the PR" + required: true + github_repository: + description: "The GitHub repository" + required: true + github_token: + description: "The GitHub token" + required: true + github_job: + description: "The GitHub job" + required: true + github_current_run_id: + description: "The GitHub current run id. Not the same that is fetched in this action" + required: true + + +runs: + using: composite + steps: + - name: Get Last Commit SHA + shell: bash + run: | + URL=${{inputs.pull_request_url}}/commits + PRSHA=$(curl \ + -H 'Authorization: Bearer ${{inputs.github_token}}' \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + -s $URL | jq -r '.[-1].sha' ) + echo prsha=$PRSHA >> $GITHUB_ENV + - name: Get Status and Conclusion for PR Job + shell: bash + run: | + JOB="${{inputs.github_job}}" + QUERY_JOB=${JOB// /+} + URL="${{github.api_url}}/repos/${{inputs.github_repository}}/commits/${{env.prsha}}/check-runs?check_name=$QUERY_JOB" + CHECK_RUN=$(curl \ + -H 'Authorization: Bearer ${{inputs.github_token}}' \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + -s $URL | jq -r '.check_runs | .[] | select(.name=="${{inputs.github_job}}")') + if [ -z "$CHECK_RUN" ]; then + echo "No check runs found for this job" + echo skip=true >> $GITHUB_ENV + exit 0 + fi + read -r STATUS CONCLUSION CHECK_SUITE_ID<<< $(echo $CHECK_RUN | jq -r '"\(.status) \(.conclusion) \(.check_suite.id)"') + echo status=$STATUS >> $GITHUB_ENV + echo conclusion=$CONCLUSION >> $GITHUB_ENV + echo check_suite_id=$CHECK_SUITE_ID >> $GITHUB_ENV + + + - name: Disable Rerun for Success or Skipped + if: ${{(env.status == 'completed' && (env.conclusion == 'success' || env.conclusion == 'skipped')) || env.skip == 'true'}} + shell: bash + run: echo rerun=false >> $GITHUB_ENV + + - name: Get Run ID + if: ${{env.rerun != 'false' }} + shell: bash + run: | + URL="${{github.api_url}}/repos/${{inputs.github_repository}}/actions/runs?check_suite_id=${{env.check_suite_id}}" + RUN_ID=$(curl \ + -H 'Authorization: Bearer ${{inputs.github_token}}' \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + -s $URL | jq -r '.workflow_runs | .[0] | .id') + echo run_id=$RUN_ID >> $GITHUB_ENV + - name: Get Job ID + if: ${{env.rerun != 'false' }} + shell: bash + run: | + URL="${{github.api_url}}/repos/${{inputs.github_repository}}/actions/runs/${{env.run_id}}/jobs" + JOB_ID=$(curl \ + -H 'Authorization: Bearer ${{inputs.github_token}}' \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + -s $URL | jq -r '.jobs | .[] | select(.name=="${{inputs.github_job}}") | .id ') + echo job_id=$JOB_ID >> $GITHUB_ENV + - name: Trigger Re-run + if: ${{env.rerun != 'false' }} + shell: bash + run: | + URL="${{github.api_url}}/repos/${{inputs.github_repository}}/actions/jobs/${{env.job_id}}/rerun" + curl -X POST \ + -H 'Authorization: Bearer ${{inputs.github_token}}' \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + -s $URL + - name: Install GH Cli + if: ${{env.rerun != 'false' }} + shell: bash + run: | + wget https://github.com/cli/cli/releases/download/v2.31.0/gh_2.31.0_linux_amd64.tar.gz + tar -xvf gh_2.31.0_linux_amd64.tar.gz + sudo mv gh_2.31.0_linux_amd64/bin/gh /usr/local/bin + - name: Exit rest of the run + if: ${{env.rerun != 'false' }} + shell: bash + run: | + gh run cancel ${{ inputs.github_current_run_id }} + gh run watch ${{ inputs.github_current_run_id }} + env: + GITHUB_TOKEN: ${{ inputs.github_token }} \ No newline at end of file diff --git a/.github/actions/setup-default-test-properties/test-properties.json b/.github/actions/setup-default-test-properties/test-properties.json index 32b449ea1ed9..c4ac53f7e873 100644 --- a/.github/actions/setup-default-test-properties/test-properties.json +++ b/.github/actions/setup-default-test-properties/test-properties.json @@ -1,14 +1,14 @@ { "PythonTestProperties": { - "ALL_SUPPORTED_VERSIONS": ["3.7", "3.8", "3.9", "3.10", "3.11"], - "LOWEST_SUPPORTED": ["3.7"], + "ALL_SUPPORTED_VERSIONS": ["3.8", "3.9", "3.10", "3.11"], + "LOWEST_SUPPORTED": ["3.8"], "HIGHEST_SUPPORTED": ["3.11"], - "ESSENTIAL_VERSIONS": ["3.7", "3.11"], - "CROSS_LANGUAGE_VALIDATES_RUNNER_PYTHON_VERSIONS": ["3.7", "3.11"], + "ESSENTIAL_VERSIONS": ["3.8", "3.11"], + "CROSS_LANGUAGE_VALIDATES_RUNNER_PYTHON_VERSIONS": ["3.8", "3.11"], "CROSS_LANGUAGE_VALIDATES_RUNNER_DATAFLOW_USING_SQL_PYTHON_VERSIONS": ["3.11"], - "VALIDATES_CONTAINER_DATAFLOW_PYTHON_VERSIONS": ["3.7", "3.8", "3.9", "3.10", "3.11" ] - "LOAD_TEST_PYTHON_VERSION": "3.7", - "CHICAGO_TAXI_EXAMPLE_FLINK_PYTHON_VERSION": "3.7", + "VALIDATES_CONTAINER_DATAFLOW_PYTHON_VERSIONS": ["3.8", "3.9", "3.10", "3.11" ] + "LOAD_TEST_PYTHON_VERSION": "3.8", + "CHICAGO_TAXI_EXAMPLE_FLINK_PYTHON_VERSION": "3.8", "DEFAULT_INTERPRETER": "python3.8", "TOX_ENV": ["Cloud", "Cython"] }, diff --git a/.github/actions/setup-self-hosted-action/action.yml b/.github/actions/setup-self-hosted-action/action.yml index 0e7cc8534e9e..9702b4450ec9 100644 --- a/.github/actions/setup-self-hosted-action/action.yml +++ b/.github/actions/setup-self-hosted-action/action.yml @@ -18,10 +18,6 @@ name: 'Setup environment for self-hosted runners' description: 'Setup action to run jobs in a self-hosted runner' inputs: - requires-py-37: - required: false - description: 'Set as false if does not require py37 setup' - default: 'true' requires-py-38: required: false description: 'Set as false if does not require py38 setup' @@ -42,11 +38,6 @@ inputs: runs: using: "composite" steps: - - name: Install python 3.7 - if: ${{ inputs.requires-py-37 == 'true' }} - uses: actions/setup-python@v4 - with: - python-version: "3.7" - name: Install python 3.8 if: ${{ inputs.requires-py-38 == 'true' }} uses: actions/setup-python@v4 diff --git a/.github/gh-actions-self-hosted-runners/arc/README.md b/.github/gh-actions-self-hosted-runners/arc/README.md index 5be4a93b43a3..e5055826d00c 100644 --- a/.github/gh-actions-self-hosted-runners/arc/README.md +++ b/.github/gh-actions-self-hosted-runners/arc/README.md @@ -38,8 +38,15 @@ All are created in the step before project_id = "PROJECT_ID" # google PROJECT_ID that you want to deploy in region = "gcp_region" # GCP region for the network zone = "europe-west3-c" # GCP zone for the nodes -min_main_node_count = "1" # Minimal and initial node count for main pool -max_main_node_count = "5" # Maximal node count for main pool +main_runner = { + name = "main-runner" # Main runner pool name + machine_type = "e2-standard-16" # Main runner pool machine type + min_node_count = "1" # Main runner pool minimal node count + max_node_count = "5" # Main runner pool maximal node count + min_replicas = "5" # Min number of runner PODs in the main pool . Do not confuse with Nodes + max_replicas = "20" # Max number of runner PODs in the main pool . Do not confuse with Nodes + webhook_scaling # Enable webhook scaling for main pool +} environment = "environment_name" # Name of the environment. Used as a prefix like dev- stag- anything- ingress_domain = "fqdn" # FQDN for webhook ingress organization = "org" # Github Organization to use runners in @@ -48,15 +55,40 @@ github_app_id_secret_name = "app_id_secret_name" # Google secret na github_app_install_id_secret_name = "install_id_secret_name" # Google secret name for install_id github_private_key_secret_name = "pem_file_secret_name" # Google secret name for pem file deploy_webhook = "false" # Terraform to deploy the scaling webhook -max_main_replicas = "2" # Max number of runner PODs . Do not confuse with Nodes -min_main_replicas = "1" # Min number of runner PODs . Do not confuse with Nodes -webhook_scaling = "false" # Enable webhook scaling. When disabled runner busy percentage is used #state_bucket_name = "state_bucket_name" # Not used by terraform. This is just to reference what bucket is used for others ``` +If you want to create additonal pools you can use the `additional_runner_pools` which is a list of objects. Example: +``` +additional_runner_pools = [ +{ +name = "test-runner" # Pool name +machine_type = "e2-standard-2" # Macihne type for the pool +min_node_count = 1 # Minimal node count +max_node_count = 2 # Maximal node count +min_replicas = 1 # Minimal replica count +min_replicas = 2 # Maximal replica count +webhook_scaling = true # Enable webhook based scaling +runner_image = "gcr.io/someimage:sometag" # Image to use +labels = ["self-hosted", "testrunner"] # Label set for runner pool. Used in `on` +enable_selector = "true" # Enables NodeSelector, forcing runners to this pool +enable_taint = "true" # Enables Taints. Prevents other runner pods to run in this pool. +requests = { # K8s cpu and memory requests + cpu = "500m" # + memory = "500mi"} # +limits = { # K8s cpu and memory limits + cpu = "2" # + memory = "2Gi"}}] # + +``` + + + 5. Make sure you set the bucket name in the comment in the environment file for documentation purposes -6. From this directory, init terraform with: +6. From this directory, login to your gcloud account that you created the bucket with and init terraform with: ``` +gcloud auth login +gcloud auth application-default login terraform init -backend-config="bucket=bucket_name" ``` 7. Terraform apply diff --git a/.github/gh-actions-self-hosted-runners/arc/config/arc_autoscaler.tpl b/.github/gh-actions-self-hosted-runners/arc/config/arc_autoscaler.tpl index 0de685c453bb..f6da0aff038a 100644 --- a/.github/gh-actions-self-hosted-runners/arc/config/arc_autoscaler.tpl +++ b/.github/gh-actions-self-hosted-runners/arc/config/arc_autoscaler.tpl @@ -19,12 +19,12 @@ apiVersion: actions.summerwind.dev/v1alpha1 kind: HorizontalRunnerAutoscaler metadata: - name: main-runners + name: ${name} spec: scaleDownDelaySecondsAfterScaleOut: 300 scaleTargetRef: kind: RunnerDeployment - name: main-runners + name: ${name} minReplicas: ${min_runners} maxReplicas: ${max_runners} %{~ if webhook_scaling == "true" ~} diff --git a/.github/gh-actions-self-hosted-runners/arc/config/arc_deployment.tpl b/.github/gh-actions-self-hosted-runners/arc/config/arc_deployment.tpl index 98eeb8544f78..9280e4b77b3a 100644 --- a/.github/gh-actions-self-hosted-runners/arc/config/arc_deployment.tpl +++ b/.github/gh-actions-self-hosted-runners/arc/config/arc_deployment.tpl @@ -19,21 +19,38 @@ apiVersion: actions.summerwind.dev/v1alpha1 kind: RunnerDeployment metadata: - name: main-runners + name: ${name} spec: template: spec: - image: summerwind/actions-runner:v2.304.0-ubuntu-20.04-30355f7 + %{~ if selector == true ~} + nodeSelector: + runner-pool: ${name} + %{~ endif ~} + %{~ if taint == true ~} + tolerations: + - key: "runner-pool" + operator: "Equal" + value: ${name} + effect: "NoSchedule" + %{~ endif ~} + image: ${image} organization: ${organization} group: "${group}" labels: - - "ubuntu-20.04" - - "self-hosted" + %{~ for label in labels ~} + - ${label} + %{~ endfor ~} env: [] resources: - limits: - cpu: "4.0" - memory: "8Gi" requests: - cpu: "500m" - memory: "500Mi" + cpu: ${requests.cpu} + memory: ${requests.memory} + limits: + %{~ if limits.cpu != "" ~} + cpu: ${limits.cpu} + %{~ if limits.memory != "" ~} + memory: ${limits.memory} + %{~ endif ~} + %{~ endif ~} + diff --git a/.github/gh-actions-self-hosted-runners/arc/environments/beam.env b/.github/gh-actions-self-hosted-runners/arc/environments/beam.env index e215e4c7bd2b..d99f6f3f20ab 100644 --- a/.github/gh-actions-self-hosted-runners/arc/environments/beam.env +++ b/.github/gh-actions-self-hosted-runners/arc/environments/beam.env @@ -18,20 +18,47 @@ # project_id = "apache-beam-testing" -region = "us-west1" -zone = "us-west1-b" -min_main_node_count = "1" -max_main_node_count = "5" +region = "us-central1" +zone = "us-central1-b" environment = "beam" -ingress_domain = "runners.example.com" +ingress_domain = "action.beam.apache.org" organization = "apache" repository = "beam" github_app_id_secret_name = "gh-app_id" github_app_install_id_secret_name = "gh-app_installation_id" github_private_key_secret_name = "gh-pem_key" -deploy_webhook = "false" -max_main_replicas = "40" -min_main_replicas = "5" -webhook_scaling = "false" +deploy_webhook = "true" runner_group = "beam" -machine_type = "e2-standard-16" \ No newline at end of file +main_runner = { + name = "main-runner" + runner_image = "us-central1-docker.pkg.dev/apache-beam-testing/beam-github-actions/beam-arc-runner:738c02cac4d6a88faa3dd02606d50f1d2efed5e7" + machine_type = "e2-standard-16" + min_node_count = "1" + max_node_count = "16" + min_replicas = "1" + max_replicas = "128" + webhook_scaling = true + disk_size_gb = 200 + requests = { + cpu = "2" + memory = "3Gi" + } +} +additional_runner_pools = [{ + name = "small-runner" + machine_type = "e2-standard-2" + runner_image = "us-central1-docker.pkg.dev/apache-beam-testing/beam-github-actions/beam-arc-runner:738c02cac4d6a88faa3dd02606d50f1d2efed5e7" + min_node_count = "1" + max_node_count = "10" + min_replicas = "1" + max_replicas = "10" + webhook_scaling = "true" + requests = { + cpu = "1500m" + memory = "5Gi" + } + labels = ["self-hosted", "ubuntu-20.04", "small"] + enable_selector = true + enable_taint = true +}] +#state_bucket_name = "beam-arc-state" diff --git a/.github/gh-actions-self-hosted-runners/arc/gke.tf b/.github/gh-actions-self-hosted-runners/arc/gke.tf index d4740b834eb1..bfb048885570 100644 --- a/.github/gh-actions-self-hosted-runners/arc/gke.tf +++ b/.github/gh-actions-self-hosted-runners/arc/gke.tf @@ -23,30 +23,72 @@ resource "google_container_cluster" "actions-runner-gke" { initial_node_count = 1 network = google_compute_network.actions-runner-network.id subnetwork = google_compute_subnetwork.actions-runner-subnetwork.id - remove_default_node_pool = true + remove_default_node_pool = true } -resource "google_container_node_pool" "actions-runner-pool" { +resource "google_container_node_pool" "main-actions-runner-pool" { name = "main-pool" cluster = google_container_cluster.actions-runner-gke.name location = google_container_cluster.actions-runner-gke.location autoscaling { - min_node_count = var.min_main_node_count - max_node_count = var.max_main_node_count + min_node_count = var.main_runner.min_node_count + max_node_count = var.main_runner.max_node_count } + initial_node_count = var.main_runner.min_node_count management { auto_repair = "true" auto_upgrade = "true" } node_config { - machine_type = var.machine_type - service_account = google_service_account.actions_service_account.email + disk_size_gb = var.main_runner.disk_size_gb + machine_type = var.main_runner.machine_type oauth_scopes = [ "https://www.googleapis.com/auth/cloud-platform" ] tags = ["actions-runner-pool"] } } + +resource "google_container_node_pool" "additional_runner_pools" { + for_each = { + for index, runner_pool in var.additional_runner_pools : runner_pool.name => runner_pool + } + + name = each.value.name + cluster = google_container_cluster.actions-runner-gke.name + location = google_container_cluster.actions-runner-gke.location + autoscaling { + min_node_count = each.value.min_node_count + max_node_count = each.value.max_node_count + } + initial_node_count = each.value.min_node_count + management { + auto_repair = "true" + auto_upgrade = "true" + } + node_config { + disk_size_gb = each.value.disk_size_gb + machine_type = each.value.machine_type + oauth_scopes = [ + "https://www.googleapis.com/auth/cloud-platform" + ] + tags = ["actions-runner-pool"] + labels = { + "runner-pool" = each.value.name + } + + dynamic "taint" { + for_each = each.value.enable_taint == true ? [1] : [] + content { + key = "runner-pool" + value = each.value.name + effect = "NO_SCHEDULE" + } + } + } + } + + resource "google_compute_global_address" "actions-runner-ip" { name = "${var.environment}-actions-runner-ip" } \ No newline at end of file diff --git a/.github/gh-actions-self-hosted-runners/arc/helm.tf b/.github/gh-actions-self-hosted-runners/arc/helm.tf index 8b7d528dcc1b..4c2badaf3239 100644 --- a/.github/gh-actions-self-hosted-runners/arc/helm.tf +++ b/.github/gh-actions-self-hosted-runners/arc/helm.tf @@ -30,7 +30,7 @@ resource "helm_release" "cert-manager" { name = "installCRDs" value = "true" } - depends_on = [ google_container_node_pool.actions-runner-pool ] + depends_on = [ google_container_node_pool.main-actions-runner-pool ] } resource "helm_release" "arc" { diff --git a/.github/gh-actions-self-hosted-runners/arc/iam.tf b/.github/gh-actions-self-hosted-runners/arc/iam.tf index 54f209e535b8..e6ba2be6545a 100644 --- a/.github/gh-actions-self-hosted-runners/arc/iam.tf +++ b/.github/gh-actions-self-hosted-runners/arc/iam.tf @@ -16,13 +16,6 @@ # specific language governing permissions and limitations # under the License. # - -resource "google_service_account" "actions_service_account" { - account_id = "${var.environment}-runner-gke-sa" - display_name = "${var.environment}-runner-gke-sa" -} - - data "google_client_config" "provider" {} data "google_client_openid_userinfo" "provider_identity" { diff --git a/.github/gh-actions-self-hosted-runners/arc/images/Dockerfile b/.github/gh-actions-self-hosted-runners/arc/images/Dockerfile new file mode 100644 index 000000000000..61f05ef649a6 --- /dev/null +++ b/.github/gh-actions-self-hosted-runners/arc/images/Dockerfile @@ -0,0 +1,68 @@ +# +# 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. +# + +FROM ghcr.io/actions-runner-controller/actions-runner-controller/actions-runner:ubuntu-20.04 +#install BuildX +COPY --from=docker/buildx-bin:0.11.1 /buildx /usr/libexec/docker/cli-plugins/docker-buildx +RUN docker buildx install && docker buildx version + + +USER root +#Install Node +RUN curl -OL https://nodejs.org/dist/v18.16.0/node-v18.16.0-linux-x64.tar.xz && \ + tar -C /usr/local -xf node-v18.16.0-linux-x64.tar.xz && \ + rm node-v18.16.0-linux-x64.tar.xz && \ + mv /usr/local/node-v18.16.0-linux-x64 /usr/local/node +ENV PATH="${PATH}:/usr/local/node/bin" +#Install Go +ARG go_version=1.20.5 +RUN curl -OL https://go.dev/dl/go${go_version}.linux-amd64.tar.gz && \ + tar -C /usr/local -xzf go${go_version}.linux-amd64.tar.gz && \ + rm go${go_version}.linux-amd64.tar.gz +ENV PATH="${PATH}:/usr/local/go/bin" +#Install Java +RUN curl -OL https://cdn.azul.com/zulu/bin/zulu8.70.0.23-ca-jdk8.0.372-linux_x64.tar.gz && \ + tar -C /usr/local -xzf zulu8.70.0.23-ca-jdk8.0.372-linux_x64.tar.gz && \ + rm zulu8.70.0.23-ca-jdk8.0.372-linux_x64.tar.gz && \ + mv /usr/local/zulu8.70.0.23-ca-jdk8.0.372-linux_x64 /usr/local/java +ENV PATH="${PATH}:/usr/local/java/bin" +#Install Gradle +RUN curl -OL https://services.gradle.org/distributions/gradle-7.3.3-bin.zip && \ + unzip gradle-7.3.3-bin.zip && \ + rm gradle-7.3.3-bin.zip && \ + mv gradle-7.3.3 /usr/local/gradle +ENV PATH="${PATH}:/usr/local/gradle/bin" +#Install GitHub CLI +RUN curl -OL https://github.com/cli/cli/releases/download/v2.31.0/gh_2.31.0_linux_amd64.tar.gz && \ + tar -xvf gh_2.31.0_linux_amd64.tar.gz && \ + rm gh_2.31.0_linux_amd64.tar.gz && \ + mv gh_2.31.0_linux_amd64/bin/gh /usr/local/bin +#Install GCloud CLI and Kubectl +RUN curl -OL https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-367.0.0-linux-x86_64.tar.gz && \ + tar -xvf google-cloud-sdk-367.0.0-linux-x86_64.tar.gz && \ + rm google-cloud-sdk-367.0.0-linux-x86_64.tar.gz && \ + mv google-cloud-sdk /usr/local/google-cloud-sdk && \ + /usr/local/google-cloud-sdk/install.sh --quiet && \ + /usr/local/google-cloud-sdk/bin/gcloud components install kubectl && \ + chown -R runner:runner /home/runner/.config/gcloud +ENV PATH="${PATH}:/usr/local/google-cloud-sdk/bin" + +# Needed to transfer path addtitions to runner environment +RUN echo PATH=$PATH >> /runnertmp/.env +USER runner diff --git a/.github/gh-actions-self-hosted-runners/arc/images/README.md b/.github/gh-actions-self-hosted-runners/arc/images/README.md new file mode 100644 index 000000000000..6db908d1bc48 --- /dev/null +++ b/.github/gh-actions-self-hosted-runners/arc/images/README.md @@ -0,0 +1,36 @@ + +# Manual build and push + +First set a tag you want to use: +``` +export RUNNER_IMAGE_TAG=some_tag +``` +After which you run the build command: +``` +docker build -t us-central1-docker.pkg.dev/apache-beam-testing/beam-github-actions/beam-arc-runner:$RUNNER_IMAGE_TAG -t us-central1-docker.pkg.dev/apache-beam-testing/beam-github-actions/beam-arc-runner:$(git rev-parse --short HEAD) . +``` +This builds and tags the image with both the Git SHA and desired tag set. + +Authenticate to the docker repository in GCP with: +``` +gcloud auth configure-docker us-central1-docker.pkg.dev +``` +docker push us-central1-docker.pkg.dev/apache-beam-testing/beam-github-actions/beam-arc-runner:$RUNNER_IMAGE_TAG +docker push us-central1-docker.pkg.dev/apache-beam-testing/beam-github-actions/beam-arc-runner:$(git rev-parse --short HEAD) +``` \ No newline at end of file diff --git a/.github/gh-actions-self-hosted-runners/arc/kubernetes.tf b/.github/gh-actions-self-hosted-runners/arc/kubernetes.tf index 9622a0cab116..bafb653896d7 100644 --- a/.github/gh-actions-self-hosted-runners/arc/kubernetes.tf +++ b/.github/gh-actions-self-hosted-runners/arc/kubernetes.tf @@ -17,17 +17,35 @@ # under the License. # resource "kubectl_manifest" "arc_deployment" { - yaml_body = templatefile("config/arc_deployment.tpl", { organization = var.organization , group = var.runner_group}) + yaml_body = templatefile("config/arc_deployment.tpl", { organization = var.organization, group = var.runner_group, name = var.main_runner.name, image = var.main_runner.runner_image, labels = var.main_runner.labels, selector = var.main_runner.enable_selector, taint = var.main_runner.enable_taint, requests = var.main_runner.requests, limits = var.main_runner.limits}) override_namespace = "arc" - depends_on = [ helm_release.arc ] + depends_on = [helm_release.arc] } resource "kubectl_manifest" "arc_autoscaler" { - yaml_body = templatefile("config/arc_autoscaler.tpl", { min_runners = var.min_main_replicas, max_runners = var.max_main_replicas , webhook_scaling = var.webhook_scaling}) + yaml_body = templatefile("config/arc_autoscaler.tpl", { name = var.main_runner.name, min_runners = var.main_runner.min_replicas, max_runners = var.main_runner.max_replicas, webhook_scaling = var.main_runner.webhook_scaling }) override_namespace = "arc" - depends_on = [ helm_release.arc ] + depends_on = [helm_release.arc] } resource "kubectl_manifest" "arc_webhook_certificate" { - yaml_body = templatefile("config/arc_certificate.tpl", { ingress_domain = var.ingress_domain }) + yaml_body = templatefile("config/arc_certificate.tpl", { ingress_domain = var.ingress_domain }) override_namespace = "arc" - depends_on = [ helm_release.arc ] + depends_on = [helm_release.arc] +} + + +resource "kubectl_manifest" "arc_deployment_additional" { + for_each = { + for index, runner_pool in var.additional_runner_pools : runner_pool.name => runner_pool + } + yaml_body = templatefile("config/arc_deployment.tpl", { organization = var.organization, group = var.runner_group, name = each.value.name, image = each.value.runner_image, labels = each.value.labels, selector = each.value.enable_selector, taint = each.value.enable_taint , requests = each.value.requests, limits = each.value.limits}) + override_namespace = "arc" + depends_on = [helm_release.arc] +} +resource "kubectl_manifest" "arc_autoscaler_additional" { + for_each = { + for index, runner_pool in var.additional_runner_pools : runner_pool.name => runner_pool + } + yaml_body = templatefile("config/arc_autoscaler.tpl", { name = each.value.name, min_runners = each.value.min_replicas, max_runners = each.value.max_replicas, webhook_scaling = each.value.webhook_scaling }) + override_namespace = "arc" + depends_on = [helm_release.arc] } diff --git a/.github/gh-actions-self-hosted-runners/arc/variables.tf b/.github/gh-actions-self-hosted-runners/arc/variables.tf index 81d6695e133f..43f51938b7d1 100644 --- a/.github/gh-actions-self-hosted-runners/arc/variables.tf +++ b/.github/gh-actions-self-hosted-runners/arc/variables.tf @@ -27,28 +27,6 @@ variable "region" { variable "zone" { description = "Google Zone to use for deployment" } -variable "min_main_node_count" { - description = "Minimal node count for GKE" - default = "1" -} -variable "max_main_node_count" { - description = "Maximal node count for GKE" - default = "2" -} -variable "max_main_replicas" { - description = "Maximal replicas for Action Runners" - default = "2" - -} -variable "min_main_replicas" { - description = "Minimal replicas for Action Runners" - default = "1" - -} -variable machine_type { - description = "Machine type to use for runner Node Pool" - default = "e2-standard-2" -} variable "environment" { description = "name of environment" default = "" @@ -84,8 +62,63 @@ variable "runner_group" { description = "value for the runner group label" default = "" } -variable "webhook_scaling" { - description = "Enable scaling of runners based on webhook events" - default = "false" - -} + +variable "main_runner" { + type = object({ + name = string + machine_type = optional(string, "e2-standard-2") + min_node_count = optional(number, 1) + max_node_count = optional(number, 1) + min_replicas = optional(number, 1) + max_replicas = optional(number, 1) + disk_size_gb = optional(number, 100) + webhook_scaling = optional(bool, false) + runner_image = optional(string, "summerwind/actions-runner:v2.304.0-ubuntu-20.04-30355f7") + labels = optional(list(string), ["self-hosted", "ubuntu-20.04","main"]) + enable_selector = optional(bool, false) + enable_taint = optional(bool, false) + requests = optional(object({ + cpu = string + memory = string + }), { cpu = "500m", + memory = "500Mi" + }) + limits = optional(object({ + cpu = optional(string) + memory = optional(string) + }), { + cpu = "", + memory = "" + }) + }) +} +variable "additional_runner_pools" { + type = list(object({ + name = string + machine_type = optional(string, "e2-standard-2") + min_node_count = optional(number, 1) + max_node_count = optional(number, 1) + min_replicas = optional(number, 1) + max_replicas = optional(number, 1) + disk_size_gb = optional(number, 100) + webhook_scaling = optional(bool, false) + runner_image = optional(string, "summerwind/actions-runner:v2.304.0-ubuntu-20.04-30355f7") + labels = optional(list(string), ["self-hosted", "ubuntu-20.04","changeme"]) + enable_selector = optional(bool, true) + enable_taint = optional(bool, true) + requests = optional(object({ + cpu = string + memory = string + }), { cpu = "500m", + memory = "500Mi" + }) + limits = optional(object({ + cpu = optional(string) + memory = optional(string) + }), { + cpu = "", + memory = "" + }) + })) + default = [] +} \ No newline at end of file diff --git a/.github/workflows/README.md b/.github/workflows/README.md new file mode 100644 index 000000000000..525cfcc52692 --- /dev/null +++ b/.github/workflows/README.md @@ -0,0 +1,35 @@ + +Please note that jobs with matrix need to have matrix element in the comment. Example: +```Run Python PreCommit (3.8)``` +| Workflow name | Matrix | Trigger Phrase | Cron Status | +|:-------------:|:------:|:--------------:|:-----------:| +| [ Go PreCommit ](https://github.com/apache/beam/actions/workflows/beam_PreCommit_Go.yml) | N/A |`Run Go PreCommit`| [![Go PreCommit](https://github.com/apache/beam/actions/workflows/beam_PreCommit_Go.yml/badge.svg?event=schedule)](https://github.com/apache/beam/actions/workflows/beam_PreCommit_Go.yml) | +| [ Python PreCommit Docker ](https://github.com/apache/beam/actions/workflows/job_PreCommit_Python_DockerBuild.yml) | ['3.8','3.9','3.10','3.11'] | `Run PythonDocker PreCommit (matrix_element)`| [![.github/workflows/job_PreCommit_Python_DockerBuild.yml](https://github.com/apache/beam/actions/workflows/job_PreCommit_Python_DockerBuild.yml/badge.svg?event=schedule)](https://github.com/apache/beam/actions/workflows/job_PreCommit_Python_DockerBuild.yml) | +| [ Python PreCommit Docs ](https://github.com/apache/beam/actions/workflows/beam_PreCommit_PythonDocs.yml) | N/A | `Run PythonDocs PreCommit`| [![.github/workflows/beam_PreCommit_PythonDocs.yml](https://github.com/apache/beam/actions/workflows/beam_PreCommit_PythonDocs.yml/badge.svg?event=schedule)](https://github.com/apache/beam/actions/workflows/beam_PreCommit_PythonDocs.yml) | +| [ Python PreCommit Formatter ](https://github.com/apache/beam/actions/workflows/job_PreCommit_PythonAutoformatter.yml) | N/A | `Run PythonFormatter PreCommit`| [![.github/workflows/job_PreCommit_PythonAutoformatter.yml](https://github.com/apache/beam/actions/workflows/job_PreCommit_PythonAutoformatter.yml/badge.svg?event=schedule)](https://github.com/apache/beam/actions/workflows/job_PreCommit_PythonAutoformatter.yml) | +| [ Python PreCommit Coverage ](https://github.com/apache/beam/actions/workflows/job_PreCommit_Python_Coverage.yml) | N/A | `Run Python_Coverage PreCommit`| [![.github/workflows/job_PreCommit_Python_Coverage.yml](https://github.com/apache/beam/actions/workflows/job_PreCommit_Python_Coverage.yml/badge.svg?event=schedule)](https://github.com/apache/beam/actions/workflows/job_PreCommit_Python_Coverage.yml) | +| [ Python PreCommit Dataframes ](https://github.com/apache/beam/actions/workflows/job_PreCommit_Python_Dataframes.yml) | ['3.8','3.9','3.10','3.11'] | `Run Python_Dataframes PreCommit (matrix_element)`| [![.github/workflows/job_PreCommit_Python_Dataframes.yml](https://github.com/apache/beam/actions/workflows/job_PreCommit_Python_Dataframes.yml/badge.svg?event=schedule)](https://github.com/apache/beam/actions/workflows/job_PreCommit_Python_Dataframes.yml) | +| [ Python PreCommit Examples ](https://github.com/apache/beam/actions/workflows/job_PreCommit_Python_Examples.yml) | ['3.8','3.9','3.10','3.11'] | `Run Python_Examples PreCommit (matrix_element)` | [![.github/workflows/job_PreCommit_Python_Examples.yml](https://github.com/apache/beam/actions/workflows/job_PreCommit_Python_Examples.yml/badge.svg?event=schedule)](https://github.com/apache/beam/actions/workflows/job_PreCommit_Python_Examples.yml) | +| [ Python PreCommit Runners ](https://github.com/apache/beam/actions/workflows/job_PreCommit_Python_Runners.yml) | ['3.8','3.9','3.10','3.11'] | `Run Python_Runners PreCommit (matrix_element)`| [![.github/workflows/job_PreCommit_Python_Runners.yml](https://github.com/apache/beam/actions/workflows/job_PreCommit_Python_Runners.yml/badge.svg?event=schedule)](https://github.com/apache/beam/actions/workflows/job_PreCommit_Python_Runners.yml) | +| [ Python PreCommit Lint ](https://github.com/apache/beam/actions/workflows/job_PreCommit_PythonLint.yml) | N/A | `Run PythonLint PreCommit` | [![.github/workflows/job_PreCommit_PythonLint.yml](https://github.com/apache/beam/actions/workflows/job_PreCommit_PythonLint.yml/badge.svg?event=schedule)](https://github.com/apache/beam/actions/workflows/job_PreCommit_PythonLint.yml) | +| [ Python PreCommit Transforms ](https://github.com/apache/beam/actions/workflows/job_PreCommit_Python_Transforms.yml) | ['3.8','3.9','3.10','3.11'] | `Run Python_Transforms PreCommit (matrix_element)`| [![.github/workflows/job_PreCommit_Python_Transforms.yml](https://github.com/apache/beam/actions/workflows/job_PreCommit_Python_Transforms.yml/badge.svg?event=schedule)](https://github.com/apache/beam/actions/workflows/job_PreCommit_Python_Transforms.yml) | +| [ Python PreCommit ](https://github.com/apache/beam/actions/workflows/job_PreCommit_Python.yml) | ['3.8','3.9','3.10','3.11'] | `Run Python PreCommit (matrix_element)` | [![.github/workflows/job_PreCommit_Python.yml](https://github.com/apache/beam/actions/workflows/job_PreCommit_Python.yml/badge.svg?event=schedule)](https://github.com/apache/beam/actions/workflows/job_PreCommit_Python.yml) | +| [ PreCommit Python Integration](https://github.com/apache/beam/actions/workflows/beam_PreCommit_Python_Integration.yml) | ['3.8','3.11'] | `Run Python_Integration PreCommit (matrix_element)` | [![.github/workflows/beam_PreCommit_Python_Integration.yml](https://github.com/apache/beam/actions/workflows/beam_PreCommit_Python_Integration.yml/badge.svg?event=schedule)](https://github.com/apache/beam/actions/workflows/beam_PreCommit_Python_Integration.yml) | +| [ RAT PreCommit ](https://github.com/apache/beam/actions/workflows/beam_PreCommit_RAT.yml) | N/A | `Run RAT PreCommit` | [![.github/workflows/beam_PreCommit_RAT.yml](https://github.com/apache/beam/actions/workflows/beam_PreCommit_RAT.yml/badge.svg?event=schedule)](https://github.com/apache/beam/actions/workflows/beam_PreCommit_RAT.yml) | + +test \ No newline at end of file diff --git a/.github/workflows/beam_PreCommit_CommunityMetrics.yml b/.github/workflows/beam_PreCommit_CommunityMetrics.yml new file mode 100644 index 000000000000..31d145a09163 --- /dev/null +++ b/.github/workflows/beam_PreCommit_CommunityMetrics.yml @@ -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. + +name: PreCommit Community Metrics + +on: + push: + tags: ['v*'] + branches: ['master', 'release-*'] + paths: ['.test-infra/metrics/**', '.github/workflows/beam_PreCommit_CommunityMetrics.yml'] + pull_request_target: + branches: ['master', 'release-*'] + paths: ['.test-infra/metrics/**'] + issue_comment: + types: [created] + schedule: + - cron: '* */6 * * *' + +#Setting explicit permissions for the action to avoid the default permissions which are `write-all` in case of pull_request_target event +permissions: + actions: write + pull-requests: read + checks: read + contents: read + deployments: read + id-token: none + issues: read + discussions: read + packages: read + pages: read + repository-projects: read + security-events: read + statuses: read + +jobs: + beam_PreCommit_CommunityMetrics: + name: beam_PreCommit_CommunityMetrics + runs-on: [self-hosted, ubuntu-20.04, main] + if: | + github.event_name == 'push' || + github.event_name == 'pull_request_target' || + github.event_name == 'schedule' || + github.event.comment.body == 'Run CommunityMetrics PreCommit' + steps: + - uses: actions/checkout@v3 + - name: Install Java + uses: actions/setup-java@v3.8.0 + with: + distribution: 'zulu' + java-version: '8' + - name: Setup Gradle + uses: gradle/gradle-build-action@v2 + with: + cache-read-only: false + - name: Rerun on comment + if: github.event.comment.body == 'Run CommunityMetrics PreCommit' + uses: ./.github/actions/rerun-job-action + with: + pull_request_url: ${{ github.event.issue.pull_request.url }} + github_repository: ${{ github.repository }} + github_token: ${{ secrets.GITHUB_TOKEN }} + github_job: ${{ github.job }} + github_current_run_id: ${{ github.run_id }} + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - name: Remove default github maven configuration + run: rm ~/.m2/settings.xml + - name: Install docker compose + run: | + sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose + sudo chmod +x /usr/local/bin/docker-compose + - name: Authenticate on GCP + uses: google-github-actions/setup-gcloud@v0 + with: + service_account_email: ${{ secrets.GCP_SA_EMAIL }} + service_account_key: ${{ secrets.GCP_SA_KEY }} + project_id: ${{ secrets.GCP_PROJECT_ID }} + - name: Install gcloud Kubectl + run: gcloud components install kubectl + - name: run Community Metrics PreCommit script + run: ./gradlew :communityMetricsPreCommit -PKUBE_CONFIG_PATH='$HOME/.kube/config' \ No newline at end of file diff --git a/.github/workflows/beam_PreCommit_Go.yml b/.github/workflows/beam_PreCommit_Go.yml index 77dbb393ecb6..0edae9c5696a 100644 --- a/.github/workflows/beam_PreCommit_Go.yml +++ b/.github/workflows/beam_PreCommit_Go.yml @@ -1,29 +1,72 @@ -name: beam_PreCommit_Go +name: Go PreCommit on: - pull_request: - branches: ['master'] + push: + tags: ['v*'] + branches: ['master', 'release-*'] + paths: ['model/**', 'sdks/go.**', 'release/**', '.github/workflows/beam_PreCommit_Go.yml'] + pull_request_target: + branches: ['master', 'release-*' ] paths: ['model/**', 'sdks/go.**', 'release/**'] + issue_comment: + types: [created] + schedule: + - cron: '* */6 * * *' +#Setting explicit permissions for the action to avoid the default permissions which are `write-all` in case of pull_request_target event +permissions: + actions: write + pull-requests: read + checks: read + contents: read + deployments: read + id-token: none + issues: read + discussions: read + packages: read + pages: read + repository-projects: read + security-events: read + statuses: read + +# This allows a subsequently queued workflow run to interrupt previous runs +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true jobs: beam_PreCommit_Go: - runs-on: [self-hosted, ubuntu-20.04] - name: beam_PreCommit_Go - steps: - - name: Git checkout - uses: actions/checkout@v3 - - name: Install Java - uses: actions/setup-java@v3.8.0 - with: - distribution: 'zulu' - java-version: '8' - - name: Install Go - uses: actions/setup-go@v3 - with: - go-version: '1.20' - - name: Setup Gradle - uses: gradle/gradle-build-action@v2 - with: - cache-read-only: false - - name: run goPreCommit script - run: ./gradlew :goPreCommit \ No newline at end of file + if: | + github.event_name == 'push' || + github.event_name == 'pull_request_target' || + github.event_name == 'schedule' || + github.event.comment.body == 'Run Go PreCommit' + runs-on: [self-hosted, ubuntu-20.04, main] + name: beam_PreCommit_Go + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + - name: Rerun on comment + if: github.event.comment.body == 'Run Go PreCommit' + uses: ./.github/actions/rerun-job-action + with: + pull_request_url: ${{ github.event.issue.pull_request.url }} + github_repository: ${{ github.repository }} + github_token: ${{ secrets.GITHUB_TOKEN }} + github_job: ${{ github.job }} + github_current_run_id: ${{ github.run_id }} + - name: Install Java + uses: actions/setup-java@v3.8.0 + with: + distribution: 'zulu' + java-version: '8' + - name: Install Go + uses: actions/setup-go@v4 + with: + go-version: '1.20' + - name: Setup Gradle + uses: gradle/gradle-build-action@v2 + with: + cache-read-only: false + - name: run goPreCommit script + run: ./gradlew :goPreCommit diff --git a/.github/workflows/beam_PreCommit_Java_Examples_Dataflow.yml b/.github/workflows/beam_PreCommit_Java_Examples_Dataflow.yml new file mode 100644 index 000000000000..af3b3106cc15 --- /dev/null +++ b/.github/workflows/beam_PreCommit_Java_Examples_Dataflow.yml @@ -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. + +name: PreCommit Java Examples Dataflow + +on: + push: + tags: ['v*'] + branches: ['master', 'release-*'] + paths: + - 'model/**' + - 'sdks/java/**' + - 'runners/google-cloud-dataflow-java/**' + - 'examples/java/**' + - 'examples/kotlin/**' + - 'release/**' + - '.github/workflows/beam_PreCommit_Java_Examples_Dataflow.yml' + pull_request_target: + branches: ['master', 'release-*'] + paths: + - 'model/**' + - 'sdks/java/**' + - 'runners/google-cloud-dataflow-java/**' + - 'examples/java/**' + - 'examples/kotlin/**' + - 'release/**' + issue_comment: + types: [created] + schedule: + - cron: '* */6 * * *' + +# This allows a subsequently queued workflow run to interrupt previous runs +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true + +#Setting explicit permissions for the action to avoid the default permissions which are `write-all` in case of pull_request_target event +permissions: + actions: write + pull-requests: read + checks: read + contents: read + deployments: read + id-token: none + issues: read + discussions: read + packages: read + pages: read + repository-projects: read + security-events: read + statuses: read +jobs: + beam_PreCommit_Java_Examples_Dataflow: + name: beam_PreCommit_Java_Examples_Dataflow + runs-on: [self-hosted, ubuntu-20.04, main] + if: | + github.event_name == 'push' || + github.event_name == 'pull_request_target' || + github.event_name == 'schedule' || + github.event.comment.body == 'Run Java_Examples_Dataflow PreCommit' + steps: + - name: Check out repository code + uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + - name: Rerun on comment + if: github.event.comment.body == 'Run Java_Examples_Dataflow PreCommit' + uses: ./.github/actions/rerun-job-action + with: + pull_request_url: ${{ github.event.issue.pull_request.url }} + github_repository: ${{ github.repository }} + github_token: ${{ secrets.GITHUB_TOKEN }} + github_job: ${{ github.job }} + github_current_run_id: ${{ github.run_id }} + - name: Setup self-hosted + uses: ./.github/actions/setup-self-hosted-action + with: + requires-py-38: false + requires-py-39: false + requires-go: false + - name: Setup Gradle + uses: gradle/gradle-build-action@v2 + with: + cache-read-only: false + - name: Authenticate on GCP + uses: google-github-actions/setup-gcloud@v0 + with: + service_account_email: ${{ secrets.GCP_SA_EMAIL }} + service_account_key: ${{ secrets.GCP_SA_KEY }} + project_id: ${{ secrets.GCP_PROJECT_ID }} + export_default_credentials: true + - name: run javaExamplesDataflowPrecommit script + run: ./gradlew :javaExamplesDataflowPrecommit + -PdisableSpotlessCheck=true + -PdisableCheckStyle=true + - name: Upload test report + uses: actions/upload-artifact@v3 + with: + name: java-code-coverage-report + path: "**/build/test-results/**/*.xml" \ No newline at end of file diff --git a/.github/workflows/beam_PreCommit_Java_Examples_Dataflow_Java11.yml b/.github/workflows/beam_PreCommit_Java_Examples_Dataflow_Java11.yml new file mode 100644 index 000000000000..8500bff387e6 --- /dev/null +++ b/.github/workflows/beam_PreCommit_Java_Examples_Dataflow_Java11.yml @@ -0,0 +1,116 @@ +# 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. + +name: PreCommit Java Examples Dataflow Java11 + +on: + push: + tags: ['v*'] + branches: ['master', 'release-*'] + paths: + - 'model/**' + - 'sdks/java/**' + - 'runners/google-cloud-dataflow-java/**' + - 'examples/java/**' + - 'examples/kotlin/**' + - 'release/**' + - '.github/workflows/beam_PreCommit_Java_Examples_Dataflow_Java11.yml' + pull_request_target: + branches: ['master', 'release-*'] + paths: + - 'model/**' + - 'sdks/java/**' + - 'runners/google-cloud-dataflow-java/**' + - 'examples/java/**' + - 'examples/kotlin/**' + - 'release/**' + issue_comment: + types: [created] + schedule: + - cron: '* */6 * * *' + +#Setting explicit permissions for the action to avoid the default permissions which are `write-all` in case of pull_request_target event +permissions: + actions: write + pull-requests: read + checks: read + contents: read + deployments: read + id-token: none + issues: read + discussions: read + packages: read + pages: read + repository-projects: read + security-events: read + statuses: read + +# This allows a subsequently queued workflow run to interrupt previous runs +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true + +jobs: + beam_PreCommit_Java_Examples_Dataflow_Java11: + name: beam_PreCommit_Java_Examples_Dataflow_Java11 + runs-on: [self-hosted, ubuntu-20.04, main] + if: | + github.event_name == 'push' || + github.event_name == 'pull_request_target' || + github.event_name == 'schedule' || + github.event.comment.body == 'Run Java_Examples_Dataflow_Java11 PreCommit' + steps: + - name: Check out repository code + uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + - name: Rerun on comment + if: github.event.comment.body == 'Run Java_Examples_Dataflow_Java11 PreCommit' + uses: ./.github/actions/rerun-job-action + with: + pull_request_url: ${{ github.event.issue.pull_request.url }} + github_repository: ${{ github.repository }} + github_token: ${{ secrets.GITHUB_TOKEN }} + github_job: ${{ github.job }} + github_current_run_id: ${{ github.run_id }} + - name: Authenticate on GCP + uses: google-github-actions/setup-gcloud@v0 + with: + service_account_email: ${{ secrets.GCP_SA_EMAIL }} + service_account_key: ${{ secrets.GCP_SA_KEY }} + project_id: ${{ secrets.GCP_PROJECT_ID }} + export_default_credentials: true + - name: Set up Java + uses: actions/setup-java@v3.8.0 + with: + distribution: 'temurin' + java-version: '11' + - name: run javaExamplesDataflowPrecommit script + uses: ./.github/actions/gradle-command-self-hosted-action + with: + gradle-command: :javaExamplesDataflowPrecommit + arguments: | + -PdisableSpotlessCheck=true \ + -PdisableCheckStyle=true \ + -PskipCheckerFramework \ + -PcompileAndRunTestsWithJava11 \ + -Pjava11Home=$JAVA_HOME_11_X64 \ + - name: Upload test report + uses: actions/upload-artifact@v3 + with: + name: java-code-coverage-report + path: "**/build/test-results/**/*.xml" \ No newline at end of file diff --git a/.github/workflows/beam_PreCommit_Java_Examples_Dataflow_Java17.yml b/.github/workflows/beam_PreCommit_Java_Examples_Dataflow_Java17.yml new file mode 100644 index 000000000000..e60785bcb31e --- /dev/null +++ b/.github/workflows/beam_PreCommit_Java_Examples_Dataflow_Java17.yml @@ -0,0 +1,116 @@ +# 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. + +name: PreCommit Java Examples Dataflow Java17 + +on: + push: + tags: ['v*'] + branches: ['master', 'release-*'] + paths: + - 'model/**' + - 'sdks/java/**' + - 'runners/google-cloud-dataflow-java/**' + - 'examples/java/**' + - 'examples/kotlin/**' + - 'release/**' + - '.github/workflows/beam_PreCommit_Java_Examples_Dataflow_Java17.yml' + pull_request_target: + branches: ['master', 'release-*'] + paths: + - 'model/**' + - 'sdks/java/**' + - 'runners/google-cloud-dataflow-java/**' + - 'examples/java/**' + - 'examples/kotlin/**' + - 'release/**' + issue_comment: + types: [created] + schedule: + - cron: '* */6 * * *' + +#Setting explicit permissions for the action to avoid the default permissions which are `write-all` in case of pull_request_target event +permissions: + actions: write + pull-requests: read + checks: read + contents: read + deployments: read + id-token: none + issues: read + discussions: read + packages: read + pages: read + repository-projects: read + security-events: read + statuses: read + +# This allows a subsequently queued workflow run to interrupt previous runs +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true + +jobs: + beam_PreCommit_Java_Examples_Dataflow_Java17: + name: beam_PreCommit_Java_Examples_Dataflow_Java17 + runs-on: [self-hosted, ubuntu-20.04, main] + if: | + github.event_name == 'push' || + github.event_name == 'pull_request_target' || + github.event_name == 'schedule' || + github.event.comment.body == 'Run Java_Examples_Dataflow_Java17 PreCommit' + steps: + - name: Check out repository code + uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + - name: Rerun on comment + if: github.event.comment.body == 'Run Java_Examples_Dataflow_Java17 PreCommit' + uses: ./.github/actions/rerun-job-action + with: + pull_request_url: ${{ github.event.issue.pull_request.url }} + github_repository: ${{ github.repository }} + github_token: ${{ secrets.GITHUB_TOKEN }} + github_job: ${{ github.job }} + github_current_run_id: ${{ github.run_id }} + - name: Authenticate on GCP + uses: google-github-actions/setup-gcloud@v0 + with: + service_account_email: ${{ secrets.GCP_SA_EMAIL }} + service_account_key: ${{ secrets.GCP_SA_KEY }} + project_id: ${{ secrets.GCP_PROJECT_ID }} + export_default_credentials: true + - name: Set up Java + uses: actions/setup-java@v3.8.0 + with: + distribution: 'temurin' + java-version: '17' + - name: run javaExamplesDataflowPrecommit script + uses: ./.github/actions/gradle-command-self-hosted-action + with: + gradle-command: :javaExamplesDataflowPrecommit + arguments: | + -PdisableSpotlessCheck=true \ + -PdisableCheckStyle=true \ + -PskipCheckerFramework \ + -PcompileAndRunTestsWithJava17 \ + -Pjava17Home=$JAVA_HOME_17_X64 \ + - name: Upload test report + uses: actions/upload-artifact@v3 + with: + name: java-code-coverage-report + path: "**/build/test-results/**/*.xml" \ No newline at end of file diff --git a/.github/workflows/beam_PreCommit_Java_Spark3_Versions.yml b/.github/workflows/beam_PreCommit_Java_Spark3_Versions.yml new file mode 100644 index 000000000000..0f21760394b3 --- /dev/null +++ b/.github/workflows/beam_PreCommit_Java_Spark3_Versions.yml @@ -0,0 +1,101 @@ +# 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. + +name: PreCommit Java Spark3 Versions + +on: + push: + tags: ['v*'] + branches: ['master', 'release-*'] + paths: + - 'runners/spark/**' + - '.github/workflows/beam_PreCommit_Java_Spark3_Versions.yml' + pull_request_target: + branches: ['master', 'release-*'] + paths: + - 'runners/spark/**' + issue_comment: + types: [created] + schedule: + - cron: '* */6 * * *' + +#Setting explicit permissions for the action to avoid the default permissions which are `write-all` in case of pull_request_target event +permissions: + actions: write + pull-requests: read + checks: read + contents: read + deployments: read + id-token: none + issues: read + discussions: read + packages: read + pages: read + repository-projects: read + security-events: read + statuses: read + +# This allows a subsequently queued workflow run to interrupt previous runs +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true + +jobs: + beam_PreCommit_Java_Spark3_Versions: + name: beam_PreCommit_Java_Spark3_Versions + runs-on: [self-hosted, ubuntu-20.04, main] + if: | + github.event_name == 'push' || + github.event_name == 'pull_request_target' || + github.event_name == 'schedule' || + github.event.comment.body == 'Run Java_Spark3_Versions PreCommit' + steps: + - name: Check out repository code + uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + - name: Rerun on comment + if: github.event.comment.body == 'Run Java_Spark3_Versions PreCommit' + uses: ./.github/actions/rerun-job-action + with: + pull_request_url: ${{ github.event.issue.pull_request.url }} + github_repository: ${{ github.repository }} + github_token: ${{ secrets.GITHUB_TOKEN }} + github_job: ${{ github.job }} + github_current_run_id: ${{ github.run_id }} + - name: Authenticate on GCP + uses: google-github-actions/setup-gcloud@v0 + with: + service_account_email: ${{ secrets.GCP_SA_EMAIL }} + service_account_key: ${{ secrets.GCP_SA_KEY }} + project_id: ${{ secrets.GCP_PROJECT_ID }} + export_default_credentials: true + - name: Install Java + uses: actions/setup-java@v3.8.0 + with: + distribution: 'zulu' + java-version: '8' + - name: run sparkVersionsTest script + uses: ./.github/actions/gradle-command-self-hosted-action + with: + gradle-command: :runners:spark:3:sparkVersionsTest + arguments: -PdisableSpotlessCheck=true + - name: Upload test report + uses: actions/upload-artifact@v3 + with: + name: java-code-coverage-report + path: "**/build/test-results/**/*.xml" \ No newline at end of file diff --git a/.github/workflows/beam_PreCommit_PythonDocs.yml b/.github/workflows/beam_PreCommit_PythonDocs.yml new file mode 100644 index 000000000000..2d7036fd5a24 --- /dev/null +++ b/.github/workflows/beam_PreCommit_PythonDocs.yml @@ -0,0 +1,83 @@ +# 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. + +name: Python PreCommit Docs + +on: + pull_request_target: + branches: [ "master", "release-*" ] + paths: ["sdks/python/**"] + issue_comment: + types: [created] + push: + tags: ['v*'] + branches: ['master', 'release-*'] + paths: ["sdks/python/**",".github/workflows/beam_PreCommit_PythonDocs.yml"] + schedule: + - cron: '* */6 * * *' +#Setting explicit permissions for the action to avoid the default permissions which are `write-all` in case of pull_request_target event +permissions: + actions: write + pull-requests: read + checks: read + contents: read + deployments: read + id-token: none + issues: read + discussions: read + packages: read + pages: read + repository-projects: read + security-events: read + statuses: read + +jobs: + beam_PreCommit_PythonDocs: + name: beam_PreCommit_PythonDocs + if: | + github.event_name == 'push' || + github.event_name == 'pull_request_target' || + github.event.comment.body == 'Run PythonDocs PreCommit' || + github.event_name == 'schedule' + runs-on: [self-hosted, ubuntu-20.04, main] + steps: + - name: Check out repository code + uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + - name: Rerun on comment + if: github.event.comment.body == 'Run PythonDocs PreCommit' + uses: ./.github/actions/rerun-job-action + with: + pull_request_url: ${{ github.event.issue.pull_request.url }} + github_repository: ${{ github.repository }} + github_token: ${{ secrets.GITHUB_TOKEN }} + github_job: ${{ github.job }} + github_current_run_id: ${{ github.run_id }} + - name: Install Java + uses: actions/setup-java@v3.8.0 + with: + distribution: 'zulu' + java-version: '8' + - name: Install Python + uses: actions/setup-python@v4 + with: + python-version: '3.8' + - name: Setup Gradle + uses: gradle/gradle-build-action@v2 + with: + cache-read-only: false + - name: run PythonDocsPrecommit script + run: ./gradlew :pythonDocsPreCommit diff --git a/.github/workflows/beam_PreCommit_Python_Integration.yml b/.github/workflows/beam_PreCommit_Python_Integration.yml new file mode 100644 index 000000000000..4316192349b4 --- /dev/null +++ b/.github/workflows/beam_PreCommit_Python_Integration.yml @@ -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. + +name: PreCommit Python Integration + +on: + pull_request_target: + branches: [ "master", "release-*" ] + paths: ["model/**", "sdks/python/**", "release/**"] + issue_comment: + types: [created] + push: + tags: ['v*'] + branches: ['master', 'release-*'] + paths: ["model/**", "sdks/python/**", "release/**", ".github/workflows/beam_PreCommit_Python_Integration.yml"] + schedule: + - cron: '* */6 * * *' + +#Setting explicit permissions for the action to avoid the default permissions which are `write-all` in case of pull_request_target event +permissions: + actions: write + pull-requests: read + checks: read + contents: read + deployments: read + id-token: none + issues: read + discussions: read + packages: read + pages: read + repository-projects: read + security-events: read + statuses: read + +# This allows a subsequently queued workflow run to interrupt previous runs +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true + +jobs: + beam_PreCommit_Python_Integration: + name: beam_PreCommit_Python_Integration + strategy: + fail-fast: false + matrix: + python_version: ['3.8', '3.11'] + if: | + github.event_name == 'push' || + github.event_name == 'pull_request_target' || + startsWith(github.event.comment.body, 'Run Python_Integration PreCommit') || + github.event_name == 'schedule' + runs-on: [self-hosted, ubuntu-20.04, main] + steps: + - name: Check out repository code + uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + - name: Set comment body with matrix + id: set_comment_body + run: | + echo "comment_body=Run Python_Integration PreCommit (${{ matrix.python_version }})" >> $GITHUB_OUTPUT + - name: Rerun on comment + if: github.event.comment.body == steps.set_comment_body.outputs.comment_body + uses: ./.github/actions/rerun-job-action + with: + pull_request_url: ${{ github.event.issue.pull_request.url }} + github_repository: ${{ github.repository }} + github_token: ${{ secrets.GITHUB_TOKEN }} + github_job: "${{ github.job }} (${{ matrix.python_version }})" + github_current_run_id: ${{ github.run_id }} + - name: Install Python + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python_version }} + - name: Install Java + uses: actions/setup-java@v3.8.0 + with: + distribution: 'zulu' + java-version: '8' + - name: Setup Gradle + uses: gradle/gradle-build-action@v2 + with: + cache-read-only: false + - name: run Python Integration PreCommit batch script + run: | + PY_VER=${{ matrix.python_version }} + ./gradlew :sdks:python:test-suites:dataflow:py${PY_VER//.}:preCommitIT_batch -PuseWheelDistribution -PpythonVersion=${PY_VER} + - name: run Python Integration PreCommit streaming script + run: | + PY_VER=${{ matrix.python_version }} + ./gradlew :sdks:python:test-suites:dataflow:py${PY_VER//.}:preCommitIT_streaming -PuseWheelDistribution -PpythonVersion=${PY_VER} + - name: Archive code coverage results + uses: actions/upload-artifact@v3 + with: + name: python-code-coverage-report + path: "**/pytest*.xml" diff --git a/.github/workflows/beam_PreCommit_RAT.yml b/.github/workflows/beam_PreCommit_RAT.yml new file mode 100644 index 000000000000..d513c01ceb03 --- /dev/null +++ b/.github/workflows/beam_PreCommit_RAT.yml @@ -0,0 +1,77 @@ +# 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. + +name: Beam PreCommit RAT + +on: + push: + tags: ['v*'] + branches: ['master', 'release-*'] + pull_request_target: + branches: ['master', 'release-*'] + issue_comment: + types: [created] + schedule: + - cron: '* */6 * * *' +#Setting explicit permissions for the action to avoid the default permissions which are `write-all` in case of pull_request_target event +permissions: + actions: write + pull-requests: read + checks: read + contents: read + deployments: read + id-token: none + issues: read + discussions: read + packages: read + pages: read + repository-projects: read + security-events: read + statuses: read + +jobs: + beam_PreCommit_RAT: + if: | + github.event_name == 'push' || + github.event_name == 'pull_request_target' || + github.event.comment.body == 'Run RAT PreCommit' || + github.event_name == 'schedule' + runs-on: [self-hosted, ubuntu-20.04] + name: beam_PreCommit_RAT + steps: + - name: Check out repository code + uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + - name: Rerun on comment + if: github.event.comment.body == 'Run RAT PreCommit' + uses: ./.github/actions/rerun-job-action + with: + pull_request_url: ${{ github.event.issue.pull_request.url }} + github_repository: ${{ github.repository }} + github_token: ${{ secrets.GITHUB_TOKEN }} + github_job: ${{ github.job }} + github_current_run_id: ${{ github.run_id }} + - name: Install Java + uses: actions/setup-java@v3.8.0 + with: + distribution: 'zulu' + java-version: '8' + - name: Setup Gradle + uses: gradle/gradle-build-action@v2 + with: + cache-read-only: false + - name: run RAT script + run: ./gradlew :rat \ No newline at end of file diff --git a/.github/workflows/beam_PreCommit_Typescript.yml b/.github/workflows/beam_PreCommit_Typescript.yml new file mode 100644 index 000000000000..45e41c55295a --- /dev/null +++ b/.github/workflows/beam_PreCommit_Typescript.yml @@ -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. + +name: PreCommit Typescript + +on: + push: + tags: ['v*'] + branches: ['master', 'release-*'] + paths: ['sdks/python/apache_beam/runners/interactive/extensions/**', '.github/workflows/beam_PreCommit_Typescript.yml'] + pull_request_target: + branches: ['master', 'release-*'] + paths: ['sdks/python/apache_beam/runners/interactive/extensions/**'] + issue_comment: + types: [created] + schedule: + - cron: '* */6 * * *' + + # This allows a subsequently queued workflow run to interrupt previous runs +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true + +#Setting explicit permissions for the action to avoid the default permissions which are `write-all` in case of pull_request_target event +permissions: + actions: write + pull-requests: read + checks: read + contents: read + deployments: read + id-token: none + issues: read + discussions: read + packages: read + pages: read + repository-projects: read + security-events: read + statuses: read +jobs: + beam_PreCommit_Typescript: + name: beam_PreCommit_Typescript + runs-on: [self-hosted, ubuntu-20.04, main] + if: | + github.event_name == 'push' || + github.event_name == 'pull_request_target' || + github.event_name == 'schedule' || + github.event.comment.body == 'Run Typescript PreCommit' + steps: + - name: Check out repository code + uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + - name: Rerun on comment + if: github.event.comment.body == 'Run Typescript PreCommit' + uses: ./.github/actions/rerun-job-action + with: + pull_request_url: ${{ github.event.issue.pull_request.url }} + github_repository: ${{ github.repository }} + github_token: ${{ secrets.GITHUB_TOKEN }} + github_job: ${{ github.job }} + github_current_run_id: ${{ github.run_id }} + - name: Setup self-hosted + uses: ./.github/actions/setup-self-hosted-action + with: + requires-py-39: false + requires-go: false + - name: Setup Gradle + uses: gradle/gradle-build-action@v2 + with: + cache-read-only: false + - name: run typescriptPreCommit script + run: ./gradlew :typescriptPreCommit diff --git a/.github/workflows/beam_PreCommit_Website.yml b/.github/workflows/beam_PreCommit_Website.yml new file mode 100644 index 000000000000..88441fcb1b4d --- /dev/null +++ b/.github/workflows/beam_PreCommit_Website.yml @@ -0,0 +1,83 @@ +# 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. + +name: Website PreCommit + +on: + push: + tags: ['v*'] + branches: ['master', 'release-*'] + paths: ['website/**','.github/workflows/beam_PreCommit_Website.yml'] + pull_request_target: + branches: ['master', 'release-*'] + paths: ['website/**'] + issue_comment: + types: [created] + schedule: + - cron: '* */6 * * *' +#Setting explicit permissions for the action to avoid the default permissions which are `write-all` in case of pull_request_target event +permissions: + actions: write + pull-requests: read + checks: read + contents: read + deployments: read + id-token: none + issues: read + discussions: read + packages: read + pages: read + repository-projects: read + security-events: read + statuses: read + +# This allows a subsequently queued workflow run to interrupt previous runs +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true + +jobs: + beam_PreCommit_Website: + if: | + github.event_name == 'push' || + github.event_name == 'pull_request_target' || + github.event.comment.body == 'Run Website PreCommit' || + github.event_name == 'schedule' + runs-on: [self-hosted, ubuntu-20.04, small] + name: beam_PreCommit_Website + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + - name: Rerun on comment + if: github.event.comment.body == 'Run Python_Coverage PreCommit' + uses: ./.github/actions/rerun-job-action + with: + pull_request_url: ${{ github.event.issue.pull_request.url }} + github_repository: ${{ github.repository }} + github_token: ${{ secrets.GITHUB_TOKEN }} + github_job: ${{ github.job }} + github_current_run_id: ${{ github.run_id }} + - name: Install Java + uses: actions/setup-java@v3.8.0 + with: + distribution: 'zulu' + java-version: '8' + - name: Setup Gradle + uses: gradle/gradle-build-action@v2 + with: + cache-read-only: false + - name: run websitePreCommit script + run: ./gradlew :websitePreCommit \ No newline at end of file diff --git a/.github/workflows/beam_PreCommit_Whitespace.yml b/.github/workflows/beam_PreCommit_Whitespace.yml new file mode 100644 index 000000000000..1d85fd64cf3b --- /dev/null +++ b/.github/workflows/beam_PreCommit_Whitespace.yml @@ -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. + +name: Whitespace PreCommit + +on: + push: + tags: ['v*'] + branches: ['master', 'release-*'] + paths: ['*.md', '*.build.gradle','.github/workflows/beam_PreCommit_Whitespace.yml'] + pull_request_target: + branches: ['master', 'release-*'] + paths: ['*.md', '*.build.gradle'] + issue_comment: + types: [created] + schedule: + - cron: '* */6 * * *' +permissions: + actions: write + pull-requests: read + checks: read + contents: read + deployments: read + id-token: none + issues: read + discussions: read + packages: read + pages: read + repository-projects: read + security-events: read + statuses: read + +# This allows a subsequently queued workflow run to interrupt previous runs +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true + +jobs: + beam_PreCommit_Whitespace: + if: | + github.event_name == 'push' || + github.event_name == 'pull_request_target' || + github.event_name == 'schedule' || + github.event.comment.body == 'Run Whitespace PreCommit' + runs-on: [self-hosted, ubuntu-20.04, main] + name: beam_PreCommit_Whitespace + steps: + - name: Git checkout + uses: actions/checkout@v3 + - name: Rerun on comment + if: github.event.comment.body == 'Run Whitespace PreCommit' + uses: ./.github/actions/rerun-job-action + with: + pull_request_url: ${{ github.event.issue.pull_request.url }} + github_repository: ${{ github.repository }} + github_token: ${{ secrets.GITHUB_TOKEN }} + github_job: ${{ github.job }} + github_current_run_id: ${{ github.run_id }} + - name: Install Java + uses: actions/setup-java@v3.8.0 + with: + distribution: 'zulu' + java-version: '8' + - name: Install Python + uses: actions/setup-python@v4 + with: + python-version: '3.8' + - name: Setup Gradle + uses: gradle/gradle-build-action@v2 + with: + cache-read-only: false + - name: run whitespacePreCommit script + run: ./gradlew :whitespacePreCommit \ No newline at end of file diff --git a/.github/workflows/build_playground_backend.yml b/.github/workflows/build_playground_backend.yml deleted file mode 100644 index 137fe3cf6aba..000000000000 --- a/.github/workflows/build_playground_backend.yml +++ /dev/null @@ -1,98 +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. - -name: Build And Deploy Playground Backend Application - -on: - push: - tags: ['v*'] - branches: ['master', 'release-*'] - pull_request: - paths: ['playground/backend/**'] - branches: ['playground-staging'] - workflow_dispatch: -# This allows a subsequently queued workflow run to interrupt previous runs -concurrency: - group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' - cancel-in-progress: true - -jobs: - build_playground_backend_docker_image: - name: Build Playground Backend App - runs-on: [self-hosted, ubuntu-20.04] - env: - GO_VERSION: 1.19.3 - BEAM_VERSION: 2.40.0 - TERRAFORM_VERSION: 1.0.9 - STAND_SUFFIX: '' - DATASTORE_EMULATOR_HOST: 127.0.0.1:8888 - steps: - - name: Check out the repo - uses: actions/checkout@v3 - - name: Set up Java - uses: actions/setup-java@v3.8.0 - with: - distribution: 'zulu' - java-version: '8' - - uses: actions/setup-go@v3 - with: - go-version: '${{ env.GO_VERSION }}' - - name: Install dependencies - run: sudo apt update && sudo apt install libsnmp-dev -y - - name: Remove default github maven configuration - # This step is a workaround to avoid a decryption issue - run: rm ~/.m2/settings.xml - - name: Install sbt for running SCIO tests - run: | - echo "deb https://repo.scala-sbt.org/scalasbt/debian all main" | sudo tee /etc/apt/sources.list.d/sbt.list &&\ - echo "deb https://repo.scala-sbt.org/scalasbt/debian /" | sudo tee /etc/apt/sources.list.d/sbt_old.list &&\ - curl -sL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x2EE0EA64E40A89B84B2DF73499E82A75642AC823" | sudo apt-key add - sudo apt-get update && sudo apt-get install -y sbt - - name: Set up Cloud SDK and its components - uses: google-github-actions/setup-gcloud@v0 - with: - install_components: 'beta,cloud-datastore-emulator' - version: '389.0.0' - - - name: Run PreCommit - run: ./gradlew playground:backend:precommit - - uses: hashicorp/setup-terraform@v1 - with: - terraform_version: ${{ env.TERRAFORM_VERSION }} - if: startsWith(github.ref, 'refs/tags/') - - name: Set Docker Tag - run: echo "DOCKERTAG=${GITHUB_SHA}" >> $GITHUB_ENV - - name: Set Docker Tag If Github Tag was trigger - run: echo "DOCKERTAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV - if: startsWith(github.ref, 'refs/tags/') - - name: Setup GCP account - run: | - echo "${{ secrets.GCP_PLAYGROUND_SA_KEY }}" | base64 -d > /tmp/gcp_access.json - if: startsWith(github.ref, 'refs/tags/') - - name: Login to Docker Registry - run: cat /tmp/gcp_access.json | docker login -u _json_key --password-stdin https://${{ secrets.PLAYGROUND_REGISTRY_NAME }} - if: startsWith(github.ref, 'refs/tags/') - - name: Deploy Backend Applications - env: - GOOGLE_APPLICATION_CREDENTIALS: /tmp/gcp_access.json - run: ./gradlew playground:terraform:deployBackend -Pdocker-tag=${{env.DOCKERTAG}} -Pproject_id=${{ secrets.GCP_PLAYGROUND_PROJECT_ID }} -Pproject_environment='beta' -Pdocker-repository-root='${{ secrets.PLAYGROUND_REGISTRY_NAME}}/${{ secrets.GCP_PLAYGROUND_PROJECT_ID }}/playground-repository' - if: startsWith(github.ref, 'refs/tags/') - - name: DB Index creation - run: | - gcloud auth activate-service-account --project=${{ secrets.GCP_PLAYGROUND_PROJECT_ID }} --key-file=/tmp/gcp_access.json - gcloud app deploy playground/index.yaml --project=${{ secrets.GCP_PLAYGROUND_PROJECT_ID }} - if: startsWith(github.ref, 'refs/tags/') - env: - GOOGLE_APPLICATION_CREDENTIALS: /tmp/gcp_access.json \ No newline at end of file diff --git a/.github/workflows/build_playground_frontend.yml b/.github/workflows/build_playground_frontend.yml deleted file mode 100644 index 27f998ae224b..000000000000 --- a/.github/workflows/build_playground_frontend.yml +++ /dev/null @@ -1,92 +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. - -name: Build And Deploy Playground Frontend Application - -on: - push: - tags: ['v*'] - branches: ['master', 'release-*'] - pull_request: - paths: ['playground/backend/**'] - branches: ['playground-staging'] - workflow_dispatch: - -# This allows a subsequently queued workflow run to interrupt previous runs -concurrency: - group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' - cancel-in-progress: true - -jobs: - build_playground_frontend_docker_image: - name: Build Playground Frontend App - runs-on: [self-hosted, ubuntu-20.04] - env: - GO_VERSION: 1.19.6 - BEAM_VERSION: 2.40.0 - TERRAFORM_VERSION: 1.0.9 - FLUTTER_VERSION: 3.10.2 - STAND_SUFFIX: '' - GOOGLE_DOMAIN: '-dot-apache-beam-testing.appspot.com' - steps: - - name: Check out the repo - uses: actions/checkout@v3 - - name: Set up Java - uses: actions/setup-java@v3.8.0 - with: - distribution: 'zulu' - java-version: '8' - - name: Install Flutter - run: | - wget https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_$FLUTTER_VERSION-stable.tar.xz &&\ - tar -xf flutter_linux_$FLUTTER_VERSION-stable.tar.xz &&\ - sudo mv flutter /opt/ &&\ - sudo ln -s /opt/flutter/bin/flutter /usr/local/bin/flutter &&\ - sudo ln -s /opt/flutter/bin/dart /usr/local/bin/dart &&\ - sudo dart pub global activate protoc_plugin &&\ - sudo ln -s /root/.pub-cache/bin/protoc-gen-dart /usr/local/bin/ - - name: Remove default github maven configuration - # This step is a workaround to avoid a decryption issue - run: sudo rm ~/.m2/settings.xml - - name: install npm - uses: actions/setup-node@v3 - with: - node-version: '14' - - name: install docker linter - run: npm install -g dockerlint - - name: lint dockerfile - run: dockerlint Dockerfile - working-directory: playground/frontend - - uses: hashicorp/setup-terraform@v1 - with: - terraform_version: ${{ env.TERRAFORM_VERSION }} - if: startsWith(github.ref, 'ref/tags/') - - name: Set Docker Tag - run: echo "DOCKERTAG=${GITHUB_SHA}" >> $GITHUB_ENV - - name: Set Docker Tag If Github Tag was trigger - run: echo "DOCKERTAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV - if: startsWith(github.ref, 'refs/tags/') - - name: Setup GCP account - run: | - echo "${{ secrets.GCP_PLAYGROUND_SA_KEY }}" | base64 -d > /tmp/gcp_access.json - if: startsWith(github.ref, 'ref/tags/') - - name: Login to Docker Registry - run: cat /tmp/gcp_access.json | docker login -u _json_key --password-stdin https://${{ secrets.PLAYGROUND_REGISTRY_NAME }} - if: startsWith(github.ref, 'ref/tags/') - - name: Deploy Frontend Application - env: - GOOGLE_APPLICATION_CREDENTIALS: /tmp/gcp_access.json - run: ./gradlew playground:terraform:deployFrontend -Pdocker-tag=${{env.DOCKERTAG}} -Pproject_id=${{ secrets.GCP_PLAYGROUND_PROJECT_ID }} -Pproject_environment='beta' - if: startsWith(github.ref, 'refs/tags/') \ No newline at end of file diff --git a/.github/workflows/build_release_candidate.yml b/.github/workflows/build_release_candidate.yml index 5a05c1a098cb..462b3e2bdade 100644 --- a/.github/workflows/build_release_candidate.yml +++ b/.github/workflows/build_release_candidate.yml @@ -27,6 +27,10 @@ on: description: Whether to stage the java source into https://dist.apache.org/repos/dist/dev/beam/ required: true default: 'no' + STAGE_DOCKER_ARTIFACTS: + description: Whether to stage SDK docker images to docker hub Apache organization + required: true + default: 'no' jobs: publish_java_artifacts: @@ -105,7 +109,7 @@ jobs: RC_ZIP="${RC_DIR}.zip" RELEASE_DIR="beam-${{ github.event.inputs.RELEASE }}" RC_TAG="v${{ github.event.inputs.RELEASE }}-RC${{ github.event.inputs.RC }}" - SOURCE_RELEASE_ZIP="apache-beam-${RELEASE}-source-release.zip" + SOURCE_RELEASE_ZIP="apache-beam-${{ github.event.inputs.RELEASE }}-source-release.zip" # Check whether there is an existing dist dir if (svn ls "${SOURCE_RELEASE_ZIP}"); then echo "Removing existing ${SOURCE_RELEASE_ZIP}." @@ -122,7 +126,7 @@ jobs: rm -r "$RELEASE_DIR" echo "----Signing Source Release ${SOURCE_RELEASE_ZIP}-----" - gpg --local-user "${{steps.import_gpg.outputs.name}}" --armor --detach-sig "${SOURCE_RELEASE_ZIP}" + gpg --local-user "${{steps.import_gpg.outputs.name}}" --armor --batch --yes --detach-sig "${SOURCE_RELEASE_ZIP}" echo "----Creating Hash Value for ${SOURCE_RELEASE_ZIP}----" sha512sum ${SOURCE_RELEASE_ZIP} > ${SOURCE_RELEASE_ZIP}.sha512 @@ -130,3 +134,44 @@ jobs: svn add --force . svn status svn commit -m "Staging Java artifacts for Apache Beam ${{ github.event.inputs.RELEASE }} RC${{ github.event.inputs.RC }}" --non-interactive --username ${{ github.event.inputs.APACHE_ID }} --password ${{ github.event.inputs.APACHE_PASSWORD }} + + + stage_docker: + if: ${{github.event.inputs.STAGE_DOCKER_ARTIFACTS == 'yes'}} + # Note: if this ever changes to self-hosted, remove the "Remove default github maven configuration" step + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + ref: "v${{ github.event.inputs.RELEASE }}-RC${{ github.event.inputs.RC }}" + repository: apache/beam + - name: Install Java 11 + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: '11' + - name: Install Python 3.8 + uses: actions/setup-python@v4 + with: + python-version: '3.8' + - run: echo $JAVA_HOME + - run: echo "JAVA11_HOME=${JAVA_HOME}" >> "$GITHUB_OUTPUT" + id: export-java11 + - name: Install Java 8 + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: '8' + - name: Remove default github maven configuration + # This step is a workaround to avoid a decryption issue of Beam's + # net.linguica.gradle.maven.settings plugin and github's provided maven + # settings.xml file + run: rm ~/.m2/settings.xml || true + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USER }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Push docker images + run: ./gradlew :pushAllDockerImages -PisRelease -Pdocker-pull-licenses -Pprune-images -Pdocker-tag=${{ github.event.inputs.RELEASE }}rc${{ github.event.inputs.RC }} -Pjava11Home=${{steps.export-java11.outputs.JAVA11_HOME}} --no-daemon --no-parallel diff --git a/.github/workflows/build_runner_image.yml b/.github/workflows/build_runner_image.yml new file mode 100644 index 000000000000..f64ada281d72 --- /dev/null +++ b/.github/workflows/build_runner_image.yml @@ -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. +# +name: Build and Version Runner Docker Image + +on: + push: + branches: ['master'] + paths: ['.github/gh-actions-self-hosted-runners/arc/images/**','.github/workflows/build_runner_image.yml'] + pull_request_target: + branches: ['master'] + paths: ['.github/gh-actions-self-hosted-runners/arc/images/**'] +env: + docker_registry: us-central1-docker.pkg.dev + docker_repo: apache-beam-testing/beam-github-actions/beam-arc-runner +jobs: + build-and-version-runner: + env: + working-directory: .github/gh-actions-self-hosted-runners/arc/images/ + runs-on: [self-hosted, ubuntu-20.04] + + steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + - name: Authenticate on GCP + uses: google-github-actions/setup-gcloud@v0 + with: + service_account_email: ${{ secrets.GCP_SA_EMAIL }} + service_account_key: ${{ secrets.GCP_SA_KEY }} + project_id: ${{ secrets.GCP_PROJECT_ID }} + export_default_credentials: true + - name: GCloud Docker credential helper + run: | + gcloud auth configure-docker ${{env.docker_registry}} + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + - name: Build and Load to docker + uses: docker/build-push-action@v4 + with: + context: ${{ env.working-directory }} + load: true + tags: | + ${{env.docker_registry}}/${{env.docker_repo}}:latest + ${{env.docker_registry}}/${{env.docker_repo}}:${{ github.sha }} + - name: Push Docker image + if: github.event_name == 'push' + id: docker_build + uses: docker/build-push-action@v4 + with: + context: ${{ env.working-directory }} + push: true + tags: | + ${{env.docker_registry}}/${{env.docker_repo}}:latest + ${{env.docker_registry}}/${{env.docker_repo}}:${{ github.sha }} diff --git a/.github/workflows/build_wheels.yml b/.github/workflows/build_wheels.yml index ead302975d68..3df0281059f7 100644 --- a/.github/workflows/build_wheels.yml +++ b/.github/workflows/build_wheels.yml @@ -48,7 +48,7 @@ jobs: runs-on: ubuntu-latest env: EVENT_NAME: ${{ github.event_name }} - PY_VERSIONS_FULL: "cp37-* cp38-* cp39-* cp310-* cp311-*" + PY_VERSIONS_FULL: "cp38-* cp39-* cp310-* cp311-*" outputs: gcp-variables-set: ${{ steps.check_gcp_variables.outputs.gcp-variables-set }} py-versions-full: ${{ steps.set-py-versions.outputs.py-versions-full }} @@ -91,7 +91,7 @@ jobs: - name: Install python uses: actions/setup-python@v4 with: - python-version: 3.7 + python-version: 3.8 - name: Get build dependencies working-directory: ./sdks/python run: python -m pip install -r build-requirements.txt @@ -255,7 +255,7 @@ jobs: - name: Install Python uses: actions/setup-python@v4 with: - python-version: 3.7 + python-version: 3.8 - uses: docker/setup-qemu-action@v1 if: ${{matrix.arch == 'aarch64'}} name: Set up QEMU @@ -269,7 +269,7 @@ jobs: # TODO: https://github.com/apache/beam/issues/23048 CIBW_SKIP: "*-musllinux_*" CIBW_ENVIRONMENT: "SETUPTOOLS_USE_DISTUTILS=stdlib" - CIBW_BEFORE_BUILD: pip install cython numpy && pip install --upgrade setuptools + CIBW_BEFORE_BUILD: pip install cython==0.29.36 numpy && pip install --upgrade setuptools run: cibuildwheel --print-build-identifiers && cibuildwheel --output-dir wheelhouse shell: bash - name: install sha512sum on MacOS @@ -295,7 +295,7 @@ jobs: # TODO: https://github.com/apache/beam/issues/23048 CIBW_SKIP: "*-musllinux_*" CIBW_ENVIRONMENT: "SETUPTOOLS_USE_DISTUTILS=stdlib" - CIBW_BEFORE_BUILD: pip install cython numpy && pip install --upgrade setuptools + CIBW_BEFORE_BUILD: pip install cython==0.29.36 numpy && pip install --upgrade setuptools run: cibuildwheel --print-build-identifiers && cibuildwheel --output-dir wheelhouse shell: bash - name: Add RC checksums diff --git a/.github/workflows/code_completion_plugin_tests.yml b/.github/workflows/code_completion_plugin_tests.yml new file mode 100644 index 000000000000..3c2611c09193 --- /dev/null +++ b/.github/workflows/code_completion_plugin_tests.yml @@ -0,0 +1,112 @@ +# 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. + + +# The workflow is triggered on the following events: +# - pull requests that contain changes in plugins/beam-code-completion-plugin/ directory +# - pushes to any branch except master. the push must contain changes in plugins/beam-code-completion-plugin/ directory + +# To learn more about GitHub Actions in Apache Beam check the CI.md + +name: Code Completion Plugin Tests +on: + push: + branches-ignore: + - 'master' + paths: + - 'plugins/beam-code-completion-plugin/**' + - '.github/workflows/code_completion_plugin_tests.yml' + pull_request: + paths: + - 'plugins/beam-code-completion-plugin/**' + - '.github/workflows/code_completion_plugin_tests.yml' +env: + INTELLIJ_IDEA_SOURCES: /home/runner/work/beam/beam/intellij +jobs: + # Run Gradle Wrapper Validation Action to verify the wrapper's checksum + # Run verifyPlugin, IntelliJ Plugin Verifier, and test Gradle tasks + # Build plugin and provide the artifact for the next workflow jobs + test: + name: Build and run model-level tests + runs-on: ubuntu-latest + steps: + # Free GitHub Actions Environment Disk Space + - name: Maximize Build Space + run: | + sudo rm -rf /usr/share/dotnet + sudo rm -rf /usr/local/lib/android + sudo rm -rf /opt/ghc + + # Check out beam repository + - name: Fetch beam Sources + uses: actions/checkout@v3 + with: + path: main + + # Check out intellij community repository for tests + - name: Fetch intellij-community Sources + uses: actions/checkout@v3 + with: + repository: JetBrains/intellij-community + path: intellij + + # Validate wrapper + - name: Gradle Wrapper Validation + uses: gradle/wrapper-validation-action@v1.0.6 + + # Setup Java environment for the next steps + - name: Setup Java + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: '11' + + # Set environment variables + - name: Export Properties + id: properties + shell: bash + run: | + pwd + cd main/plugins/beam-code-completion-plugin/ + pwd + PROPERTIES="$(./gradlew properties --console=plain -q)" + VERSION="$(echo "$PROPERTIES" | grep "^version:" | cut -f2- -d ' ')" + NAME="$(echo "$PROPERTIES" | grep "^name:" | cut -f2- -d ' ')" + + echo "version=$VERSION" >> $GITHUB_OUTPUT + echo "name=$NAME" >> $GITHUB_OUTPUT + echo "pluginVerifierHomeDir=~/.pluginVerifier" >> $GITHUB_OUTPUT + + echo "changelog<> $GITHUB_OUTPUT + echo "$CHANGELOG" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + + # Run tests + - name: Run Tests + run: | + pwd + cd main/plugins/beam-code-completion-plugin/ + pwd + ./gradlew test --info + + # Collect Tests Result of failed tests + - name: Collect Tests Result + if: ${{ failure() }} + uses: actions/upload-artifact@v3 + with: + name: tests-result + path: ${{ github.workspace }}/build/reports/tests diff --git a/.github/workflows/cut_release_branch.yml b/.github/workflows/cut_release_branch.yml index f026c41ca9c3..4e104d78a445 100644 --- a/.github/workflows/cut_release_branch.yml +++ b/.github/workflows/cut_release_branch.yml @@ -100,6 +100,7 @@ jobs: MASTER_BRANCH: master NEXT_RELEASE: ${{ github.event.inputs.NEXT_VERSION }} SCRIPT_DIR: ./release/src/main/scripts + RELEASE: ${{ github.event.inputs.RELEASE_VERSION }} steps: - name: Mask Jenkins token run: | @@ -146,10 +147,13 @@ jobs: fi done - cat /tmp/result | sort | uniq | grep -i -E 'precommit|postcommit|validates|vr|example|test|gradle build' | grep -v -i -E 'load|perf|website' >> release/src/main/scripts/jenkins_jobs.txt + cat /tmp/result | sort | uniq | grep -i -E 'precommit|postcommit|validates|vr|example|test' | grep -v -i -E 'load|perf|website' >> release/src/main/scripts/jenkins_jobs.txt env: JENKINS_USERNAME: ${{ github.event.inputs.JENKINS_USERNAME }} JENKINS_TOKEN: ${{ github.event.inputs.JENKINS_TOKEN }} + - name: Update .asf.yaml to protect new release branch from force push + run: | + sed -i -e "s/master: {}/master: {}\n release-${RELEASE}: {}/g" .asf.yaml - name: Update master branch run: | bash "${SCRIPT_DIR}/set_version.sh" "${NEXT_VERSION_IN_BASE_BRANCH}" @@ -159,6 +163,7 @@ jobs: - name: Commit and Push to master branch files with Next Version run: | git add * + git add .asf.yaml git commit -m "Moving to ${NEXT_VERSION_IN_BASE_BRANCH}-SNAPSHOT on master branch." git push origin ${MASTER_BRANCH} @@ -170,6 +175,7 @@ jobs: REMOTE_NAME: remote_repo REMOTE_URL: ${{ github.server_url }}/${{ github.repository }} BRANCH_NAME: snapshot_build-${{ github.event.inputs.RELEASE_VERSION }} + RELEASE_BRANCH: release-${{ github.event.inputs.RELEASE_VERSION }} steps: - name: Install Hub run: | @@ -187,7 +193,7 @@ jobs: run: | git remote add ${REMOTE_NAME} ${REMOTE_URL} git checkout -b ${BRANCH_NAME} - touch empty_file.txt + touch empty_file.json git add -A git commit -m "Add empty file in order to create PR" git push -f ${REMOTE_NAME} @@ -195,7 +201,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - hub pull-request -F- <<<"[DO NOT MERGE]Start snapshot build for release process + hub pull-request -b apache:${RELEASE_BRANCH} -F- <<<"[DO NOT MERGE]Start snapshot build for release process Run Gradle Publish" diff --git a/.github/workflows/dask_runner_tests.yml b/.github/workflows/dask_runner_tests.yml index 33d0575e2c8c..655c09dc1503 100644 --- a/.github/workflows/dask_runner_tests.yml +++ b/.github/workflows/dask_runner_tests.yml @@ -43,7 +43,7 @@ jobs: - name: Install python uses: actions/setup-python@v4 with: - python-version: 3.7 + python-version: 3.8 - name: Get build dependencies working-directory: ./sdks/python run: pip install pip setuptools --upgrade && pip install -r build-requirements.txt @@ -67,7 +67,6 @@ jobs: matrix: os: [ubuntu-latest, macos-latest, windows-latest] params: [ - {"py_ver": "3.7", "tox_env": "py37"}, {"py_ver": "3.8", "tox_env": "py38"}, {"py_ver": "3.9", "tox_env": "py39"}, {"py_ver": "3.10", "tox_env": "py310" }, diff --git a/.github/workflows/go_tests.yml b/.github/workflows/go_tests.yml index dce4bb3a7f34..6ea03675a1e9 100644 --- a/.github/workflows/go_tests.yml +++ b/.github/workflows/go_tests.yml @@ -42,7 +42,7 @@ jobs: uses: actions/checkout@v3 with: fetch-depth: 2 - - uses: actions/setup-go@v3 + - uses: actions/setup-go@v4 with: go-version: '1.20' - name: Delete old coverage diff --git a/.github/workflows/job_PreCommit_Python.yml b/.github/workflows/job_PreCommit_Python.yml new file mode 100644 index 000000000000..7e2c4a914ac8 --- /dev/null +++ b/.github/workflows/job_PreCommit_Python.yml @@ -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. + +name: Python PreCommit +on: + pull_request_target: + branches: [ "master", "release-*" ] + paths: [ "model/**","sdks/python/**","release/**"] + issue_comment: + types: [created] + push: + tags: ['v*'] + branches: ['master', 'release-*'] + paths: [ "model/**","sdks/python/**","release/**",".github/workflows/job_PreCommit_Python.yml"] + schedule: + - cron: '* */6 * * *' +#Setting explicit permissions for the action to avoid the default permissions which are `write-all` in case of pull_request_target event +permissions: + actions: write + pull-requests: read + checks: read + contents: read + deployments: read + id-token: none + issues: read + discussions: read + packages: read + pages: read + repository-projects: read + security-events: read + statuses: read + +# This allows a subsequently queued workflow run to interrupt previous runs +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true + +jobs: + beam_PreCommit_Python: + strategy: + fail-fast: false + matrix: + python_version: ['3.8','3.9','3.10','3.11'] + if: | + github.event_name == 'push' || + github.event_name == 'pull_request_target' || + github.event.comment.body == 'Run Python PreCommit' || + startsWith(github.event.comment.body, 'Run Python PreCommit') || + github.event_name == 'schedule' + runs-on: [self-hosted, ubuntu-20.04, main] + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + - name: Set comment body with matrix + id: set_comment_body + run: | + echo "comment_body=Run Python PreCommit (${{ matrix.python_version }})" >> $GITHUB_OUTPUT + - name: Rerun on comment + if: github.event.comment.body == steps.set_comment_body.outputs.comment_body + uses: ./.github/actions/rerun-job-action + with: + pull_request_url: ${{ github.event.issue.pull_request.url }} + github_repository: ${{ github.repository }} + github_token: ${{ secrets.GITHUB_TOKEN }} + github_job: "${{ github.job }} (${{ matrix.python_version }})" + github_current_run_id: ${{ github.run_id }} + - uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python_version }} + - name: Install Java + uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: '8' + - name: Setup Gradle + uses: gradle/gradle-build-action@v2 + with: + cache-read-only: false + - name: Run pythonPreCommit + run: | + PY_VER=${{ matrix.python_version }} + ./gradlew :sdks:python:test-suites:tox:py${PY_VER//.}:preCommitPy${PY_VER//.} -Pposargs="--ignore=apache_beam/dataframe/ --ignore=apache_beam/examples/ --ignore=apache_beam/runners/ --ignore=apache_beam/transforms/" -PpythonVersion=${PY_VER} + - name: Archive code coverage results + uses: actions/upload-artifact@v3 + with: + name: python-code-coverage-report + path: "**/pytest*.xml" \ No newline at end of file diff --git a/.github/workflows/job_PreCommit_PythonAutoformatter.yml b/.github/workflows/job_PreCommit_PythonAutoformatter.yml new file mode 100644 index 000000000000..73c5a2202b21 --- /dev/null +++ b/.github/workflows/job_PreCommit_PythonAutoformatter.yml @@ -0,0 +1,83 @@ +# 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. +name: Python PreCommit Formatter +on: + pull_request_target: + branches: [ "master", "release-*" ] + paths: [ "sdks/python/apache_beam/**"] + issue_comment: + types: [created] + push: + tags: ['v*'] + branches: ['master', 'release-*'] + paths: [ "sdks/python/apache_beam/**",".github/workflows/job_PreCommit_PythonAutoformatter.yml"] + schedule: + - cron: '* */6 * * *' +#Setting explicit permissions for the action to avoid the default permissions which are `write-all` in case of pull_request_target event +permissions: + actions: write + pull-requests: read + checks: read + contents: read + deployments: read + id-token: none + issues: read + discussions: read + packages: read + pages: read + repository-projects: read + security-events: read + statuses: read + +# This allows a subsequently queued workflow run to interrupt previous runs +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true + +jobs: + beam_PreCommit_PythonFormatter: + if: | + github.event_name == 'push' || + github.event_name == 'pull_request_target' || + github.event.comment.body == 'Run PythonFormatter PreCommit' || + github.event_name == 'schedule' + runs-on: [self-hosted, ubuntu-20.04, main] + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + - name: Rerun on comment + if: github.event.comment.body == 'Run PythonFormatter PreCommit' + uses: ./.github/actions/rerun-job-action + with: + pull_request_url: ${{ github.event.issue.pull_request.url }} + github_repository: ${{ github.repository }} + github_token: ${{ secrets.GITHUB_TOKEN }} + github_job: ${{ github.job }} + github_current_run_id: ${{ github.run_id }} + - name: Install Java + uses: actions/setup-java@v3.8.0 + with: + distribution: 'zulu' + java-version: '8' + - uses: actions/setup-python@v4 + with: + python-version: '3.8' + - name: Setup Gradle + uses: gradle/gradle-build-action@v2 + with: + cache-read-only: false + - name: run PythonDockerPreCommit script + run: ./gradlew :pythonFormatterPreCommit diff --git a/.github/workflows/job_PreCommit_PythonLint.yml b/.github/workflows/job_PreCommit_PythonLint.yml new file mode 100644 index 000000000000..2b3586bd37ba --- /dev/null +++ b/.github/workflows/job_PreCommit_PythonLint.yml @@ -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. +name: Python PreCommit Lint +on: + pull_request_target: + branches: [ "master", "release-*" ] + paths: ["sdks/python/**","release/**"] + issue_comment: + types: [created] + push: + tags: ['v*'] + branches: ['master', 'release-*'] + paths: ["sdks/python/**","release/**",".github/workflows/job_PreCommit_PythonLint.yml"] + schedule: + - cron: '* */6 * * *' +#Setting explicit permissions for the action to avoid the default permissions which are `write-all` in case of pull_request_target event +permissions: + actions: write + pull-requests: read + checks: read + contents: read + deployments: read + id-token: none + issues: read + discussions: read + packages: read + pages: read + repository-projects: read + security-events: read + statuses: read + +# This allows a subsequently queued workflow run to interrupt previous runs +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true + +jobs: + beam_PreCommit_PythonLint: + if: | + github.event_name == 'push' || + github.event_name == 'pull_request_target' || + github.event.comment.body == 'Run PythonLint PreCommit' || + github.event_name == 'schedule' + runs-on: [self-hosted, ubuntu-20.04, main] + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + - name: Rerun on comment + if: github.event.comment.body == 'Run PythonLint PreCommit' + uses: ./.github/actions/rerun-job-action + with: + pull_request_url: ${{ github.event.issue.pull_request.url }} + github_repository: ${{ github.repository }} + github_token: ${{ secrets.GITHUB_TOKEN }} + github_job: ${{ github.job }} + github_current_run_id: ${{ github.run_id }} + - name: Install Java + uses: actions/setup-java@v3.8.0 + with: + distribution: 'zulu' + java-version: '8' + - uses: actions/setup-go@v4 + with: + go-version: '1.16' + - uses: actions/setup-python@v4 + with: + python-version: '3.8' + - name: Setup Gradle + uses: gradle/gradle-build-action@v2 + with: + cache-read-only: false + - name: run PythonLintPreCommit script + run: ./gradlew :pythonLintPreCommit diff --git a/.github/workflows/job_PreCommit_Python_Coverage.yml b/.github/workflows/job_PreCommit_Python_Coverage.yml new file mode 100644 index 000000000000..8f4448cb79fc --- /dev/null +++ b/.github/workflows/job_PreCommit_Python_Coverage.yml @@ -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. + +name: Python PreCommit Coverage +on: + pull_request_target: + branches: [ "master", "release-*" ] + paths: [ "model/**","sdks/python/**","release/**"] + issue_comment: + types: [created] + push: + tags: ['v*'] + branches: ['master', 'release-*'] + paths: [ "model/**","sdks/python/**","release/**", ".github/workflows/job_PreCommit_Python_Coverage.yml"] + schedule: + - cron: '* */6 * * *' +#Setting explicit permissions for the action to avoid the default permissions which are `write-all` in case of pull_request_target event +permissions: + actions: write + pull-requests: read + checks: read + contents: read + deployments: read + id-token: none + issues: read + discussions: read + packages: read + pages: read + repository-projects: read + security-events: read + statuses: read + +# This allows a subsequently queued workflow run to interrupt previous runs +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true + +jobs: + beam_PreCommit_Python_Coverage: + if: | + github.event_name == 'push' || + github.event_name == 'pull_request_target' || + github.event.comment.body == 'Run Python_Coverage PreCommit' || + github.event_name == 'schedule' + runs-on: [self-hosted, ubuntu-20.04, main] + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + - name: Rerun on comment + if: github.event.comment.body == 'Run Python_Coverage PreCommit' + uses: ./.github/actions/rerun-job-action + with: + pull_request_url: ${{ github.event.issue.pull_request.url }} + github_repository: ${{ github.repository }} + github_token: ${{ secrets.GITHUB_TOKEN }} + github_job: ${{ github.job }} + github_current_run_id: ${{ github.run_id }} + - uses: actions/setup-python@v4 + with: + python-version: '3.8' + - name: Install Java + uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: '8' + - name: Setup Gradle + uses: gradle/gradle-build-action@v2 + with: + cache-read-only: false + - name: Run preCommitPyCoverage + run: ./gradlew :sdks:python:test-suites:tox:py38:preCommitPyCoverage + - name: Archive code coverage results + uses: actions/upload-artifact@v3 + with: + name: python-code-coverage-report + path: "**/pytest*.xml" \ No newline at end of file diff --git a/.github/workflows/job_PreCommit_Python_Dataframes.yml b/.github/workflows/job_PreCommit_Python_Dataframes.yml new file mode 100644 index 000000000000..d33294148446 --- /dev/null +++ b/.github/workflows/job_PreCommit_Python_Dataframes.yml @@ -0,0 +1,98 @@ +# 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. +name: Python PreCommit Dataframes +on: + pull_request_target: + branches: [ "master", "release-*" ] + paths: [ "model/**","sdks/python/**","release/**"] + issue_comment: + types: [created] + push: + tags: ['v*'] + branches: ['master', 'release-*'] + paths: [ "model/**","sdks/python/**","release/**",".github/workflows/job_PreCommit_Python_Dataframes.yml"] + schedule: + - cron: '* */6 * * *' +#Setting explicit permissions for the action to avoid the default permissions which are `write-all` in case of pull_request_target event +permissions: + actions: write + pull-requests: read + checks: read + contents: read + deployments: read + id-token: none + issues: read + discussions: read + packages: read + pages: read + repository-projects: read + security-events: read + statuses: read + +# This allows a subsequently queued workflow run to interrupt previous runs +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true + +jobs: + beam_PreCommit_Python_Dataframes: + strategy: + fail-fast: false + matrix: + python_version: ['3.8','3.9','3.10','3.11'] + if: | + github.event_name == 'push' || + github.event_name == 'pull_request_target' || + startsWith(github.event.comment.body, 'Run Python_Dataframes PreCommit') || + github.event_name == 'schedule' + runs-on: [self-hosted, ubuntu-20.04, main] + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + - name: Set comment body with matrix + id: set_comment_body + run: | + echo "comment_body=Run Python_Dataframes PreCommit (${{ matrix.python_version }})" >> $GITHUB_OUTPUT + - name: Rerun on comment + if: github.event.comment.body == steps.set_comment_body.outputs.comment_body + uses: ./.github/actions/rerun-job-action + with: + pull_request_url: ${{ github.event.issue.pull_request.url }} + github_repository: ${{ github.repository }} + github_token: ${{ secrets.GITHUB_TOKEN }} + github_job: "${{ github.job }} (${{ matrix.python_version }})" + github_current_run_id: ${{ github.run_id }} + - uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python_version }} + - name: Install Java + uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: '8' + - name: Setup Gradle + uses: gradle/gradle-build-action@v2 + with: + cache-read-only: false + - name: Run pythonPreCommit + run: | + PY_VER=${{ matrix.python_version }} + ./gradlew :sdks:python:test-suites:tox:py${PY_VER//.}:preCommitPy${PY_VER//.} -Pposargs=apache_beam/dataframe/ -PpythonVersion=${PY_VER} + - name: Archive code coverage results + uses: actions/upload-artifact@v3 + with: + name: python-code-coverage-report + path: "**/pytest*.xml" \ No newline at end of file diff --git a/.github/workflows/job_PreCommit_Python_DockerBuild.yml b/.github/workflows/job_PreCommit_Python_DockerBuild.yml new file mode 100644 index 000000000000..beaf9a8dfd98 --- /dev/null +++ b/.github/workflows/job_PreCommit_Python_DockerBuild.yml @@ -0,0 +1,99 @@ +# 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. +name: Python PreCommit Docker +on: + pull_request_target: + branches: [ "master", "release-*" ] + paths: [ "model/**","sdks/python/**","release/**"] + issue_comment: + types: [created] + push: + tags: ['v*'] + branches: ['master', 'release-*'] + paths: [ "model/**","sdks/python/**","release/**",".github/workflows/job_PreCommit_Python_DockerBuild.yml"] + schedule: + - cron: '* */6 * * *' +#Setting explicit permissions for the action to avoid the default permissions which are `write-all` in case of pull_request_target event +permissions: + actions: write + pull-requests: read + checks: read + contents: read + deployments: read + id-token: none + issues: read + discussions: read + packages: read + pages: read + repository-projects: read + security-events: read + statuses: read + +# This allows a subsequently queued workflow run to interrupt previous runs +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true + +jobs: + beam_PreCommit_PythonDocker: + strategy: + fail-fast: false + matrix: + python_version: ['3.8','3.9','3.10','3.11'] + if: | + github.event_name == 'push' || + github.event_name == 'pull_request_target' || + startsWith(github.event.comment.body, 'Run PythonDocker PreCommit') || + github.event_name == 'schedule' + runs-on: [self-hosted, ubuntu-20.04, main] + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + - name: Set comment body with matrix + id: set_comment_body + run: | + echo "comment_body=Run PythonDocker PreCommit (${{ matrix.python_version }})" >> $GITHUB_OUTPUT + - name: Rerun on comment + if: github.event.comment.body == steps.set_comment_body.outputs.comment_body + uses: ./.github/actions/rerun-job-action + with: + pull_request_url: ${{ github.event.issue.pull_request.url }} + github_repository: ${{ github.repository }} + github_token: ${{ secrets.GITHUB_TOKEN }} + github_job: "${{ github.job }} (${{ matrix.python_version }})" + github_current_run_id: ${{ github.run_id }} + - name: Install Java + uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: '8' + - uses: actions/setup-go@v4 + with: + go-version: '1.16' + - uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python_version }} + - name: Setup Gradle + uses: gradle/gradle-build-action@v2 + with: + cache-read-only: false + - name: Setup Buildx + uses: docker/setup-buildx-action@v1 + - name: Run pythonDockerBuildPreCommit + run: | + PY_VER=${{ matrix.python_version }} + ./gradlew :sdks:python:container:py${PY_VER//.}:docker -Pposargs=apache_beam/dataframe/ -PpythonVersion=${PY_VER} + diff --git a/.github/workflows/job_PreCommit_Python_Examples.yml b/.github/workflows/job_PreCommit_Python_Examples.yml new file mode 100644 index 000000000000..8cce583cfecb --- /dev/null +++ b/.github/workflows/job_PreCommit_Python_Examples.yml @@ -0,0 +1,99 @@ +# 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. +name: Python PreCommit Examples +on: + pull_request_target: + branches: [ "master", "release-*" ] + paths: [ "model/**","sdks/python/**","release/**"] + issue_comment: + types: [created] + push: + tags: ['v*'] + branches: ['master', 'release-*'] + paths: [ "model/**","sdks/python/**","release/**",".github/workflows/job_PreCommit_Python_Examples.yml"] + schedule: + - cron: '* */6 * * *' +#Setting explicit permissions for the action to avoid the default permissions which are `write-all` in case of pull_request_target event +permissions: + actions: write + pull-requests: read + checks: read + contents: read + deployments: read + id-token: none + issues: read + discussions: read + packages: read + pages: read + repository-projects: read + security-events: read + statuses: read + +# This allows a subsequently queued workflow run to interrupt previous runs +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true + +jobs: + beam_PreCommit_Python_Examples: + strategy: + fail-fast: false + matrix: + python_version: ['3.8','3.9','3.10','3.11'] + if: | + github.event_name == 'push' || + github.event_name == 'pull_request_target' || + startsWith(github.event.comment.body, 'Run Python_Examples PreCommit') || + github.event_name == 'schedule' + runs-on: [self-hosted, ubuntu-20.04, main] + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + - name: Set comment body with matrix + id: set_comment_body + run: | + echo "comment_body=Run Python_Dataframes PreCommit (${{ matrix.python_version }})" >> $GITHUB_OUTPUT + + - name: Rerun on comment + if: github.event.comment.body == steps.set_comment_body.outputs.comment_body + uses: ./.github/actions/rerun-job-action + with: + pull_request_url: ${{ github.event.issue.pull_request.url }} + github_repository: ${{ github.repository }} + github_token: ${{ secrets.GITHUB_TOKEN }} + github_job: "${{ github.job }} (${{ matrix.python_version }})" + github_current_run_id: ${{ github.run_id }} + - uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python_version }} + - name: Install Java + uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: '8' + - name: Setup Gradle + uses: gradle/gradle-build-action@v2 + with: + cache-read-only: false + - name: Run pythonPreCommit + run: | + PY_VER=${{ matrix.python_version }} + ./gradlew :sdks:python:test-suites:tox:py${PY_VER//.}:preCommitPy${PY_VER//.} -Pposargs=apache_beam/examples/ -PpythonVersion=${PY_VER} + - name: Archive code coverage results + uses: actions/upload-artifact@v3 + with: + name: python-code-coverage-report + path: "**/pytest*.xml" \ No newline at end of file diff --git a/.github/workflows/job_PreCommit_Python_Runners.yml b/.github/workflows/job_PreCommit_Python_Runners.yml new file mode 100644 index 000000000000..394b9bf092c1 --- /dev/null +++ b/.github/workflows/job_PreCommit_Python_Runners.yml @@ -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. + +name: Python PreCommit Runners +on: + pull_request_target: + branches: [ "master", "release-*" ] + paths: [ "model/**","sdks/python/**","release/**"] + issue_comment: + types: [created] + push: + tags: ['v*'] + branches: ['master', 'release-*'] + paths: [ "model/**","sdks/python/**","release/**",".github/workflows/job_PreCommit_Python_Runners.yml"] + schedule: + - cron: '* */6 * * *' +#Setting explicit permissions for the action to avoid the default permissions which are `write-all` in case of pull_request_target event +permissions: + actions: write + pull-requests: read + checks: read + contents: read + deployments: read + id-token: none + issues: read + discussions: read + packages: read + pages: read + repository-projects: read + security-events: read + statuses: read + +# This allows a subsequently queued workflow run to interrupt previous runs +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true + +jobs: + beam_PreCommit_Python_Runners: + strategy: + fail-fast: false + matrix: + python_version: ['3.8','3.9','3.10','3.11'] + if: | + github.event_name == 'push' || + github.event_name == 'pull_request_target' || + startsWith(github.event.comment.body, 'Run Python_Runners PreCommit') || + github.event_name == 'schedule' + runs-on: [self-hosted, ubuntu-20.04, main] + + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + - name: Set comment body with matrix + id: set_comment_body + run: | + echo "comment_body=Run Python_Runners PreCommit (${{ matrix.python_version }})" >> $GITHUB_OUTPUT + - name: Rerun on comment + if: github.event.comment.body == steps.set_comment_body.outputs.comment_body + uses: ./.github/actions/rerun-job-action + with: + pull_request_url: ${{ github.event.issue.pull_request.url }} + github_repository: ${{ github.repository }} + github_token: ${{ secrets.GITHUB_TOKEN }} + github_job: "${{ github.job }} (${{ matrix.python_version }})" + github_current_run_id: ${{ github.run_id }} + - uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python_version }} + - name: Install Java + uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: '8' + - name: Setup Gradle + uses: gradle/gradle-build-action@v2 + with: + cache-read-only: false + - name: Run pythonPreCommit + run: | + PY_VER=${{ matrix.python_version }} + ./gradlew :sdks:python:test-suites:tox:py${PY_VER//.}:preCommitPy${PY_VER//.} -Pposargs=apache_beam/runners/ -PpythonVersion=${PY_VER} + - name: Archive code coverage results + uses: actions/upload-artifact@v3 + with: + name: python-code-coverage-report + path: "**/pytest*.xml" \ No newline at end of file diff --git a/.github/workflows/job_PreCommit_Python_Transforms.yml b/.github/workflows/job_PreCommit_Python_Transforms.yml new file mode 100644 index 000000000000..893d8a9a730b --- /dev/null +++ b/.github/workflows/job_PreCommit_Python_Transforms.yml @@ -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. + +name: Python PreCommit Transforms +on: + pull_request_target: + branches: [ "master", "release-*" ] + paths: [ "model/**","sdks/python/**","release/**"] + issue_comment: + types: [created] + push: + tags: ['v*'] + branches: ['master', 'release-*'] + paths: [ "model/**","sdks/python/**","release/**",".github/workflows/job_PreCommit_Python_Transforms.yml"] + schedule: + - cron: '* */6 * * *' +#Setting explicit permissions for the action to avoid the default permissions which are `write-all` in case of pull_request_target event +permissions: + actions: write + pull-requests: read + checks: read + contents: read + deployments: read + id-token: none + issues: read + discussions: read + packages: read + pages: read + repository-projects: read + security-events: read + statuses: read + +# This allows a subsequently queued workflow run to interrupt previous runs +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true + +jobs: + beam_PreCommit_Python_Transforms: + strategy: + fail-fast: false + matrix: + python_version: ['3.8','3.9','3.10','3.11'] + if: | + github.event_name == 'push' || + github.event_name == 'pull_request_target' || + startsWith(github.event.comment.body, 'Run Python_Transforms PreCommit') || + github.event_name == 'schedule' + runs-on: [self-hosted, ubuntu-20.04, main] + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + - name: Set comment body with matrix + id: set_comment_body + run: | + echo "comment_body=Run Python_Transforms PreCommit (${{ matrix.python_version }})" >> $GITHUB_OUTPUT + - name: Rerun on comment + if: github.event.comment.body == steps.set_comment_body.outputs.comment_body + uses: ./.github/actions/rerun-job-action + with: + pull_request_url: ${{ github.event.issue.pull_request.url }} + github_repository: ${{ github.repository }} + github_token: ${{ secrets.GITHUB_TOKEN }} + github_job: "${{ github.job }} (${{ matrix.python_version }})" + github_current_run_id: ${{ github.run_id }} + - uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python_version }} + - name: Install Java + uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: '8' + - name: Setup Gradle + uses: gradle/gradle-build-action@v2 + with: + cache-read-only: false + - name: Run pythonPreCommit + run: | + PY_VER=${{ matrix.python_version }} + ./gradlew :sdks:python:test-suites:tox:py${PY_VER//.}:preCommitPy${PY_VER//.} -Pposargs=apache_beam/transforms/ -PpythonVersion=${PY_VER} + - name: Archive code coverage results + uses: actions/upload-artifact@v3 + with: + name: python-code-coverage-report + path: "**/pytest*.xml" + diff --git a/.github/workflows/local_env_tests.yml b/.github/workflows/local_env_tests.yml index ffc6946334f1..a9c974119408 100644 --- a/.github/workflows/local_env_tests.yml +++ b/.github/workflows/local_env_tests.yml @@ -41,7 +41,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: actions/setup-go@v3 + - uses: actions/setup-go@v4 with: go-version: '1.20' - uses: actions/setup-python@v4 @@ -59,7 +59,7 @@ jobs: runs-on: macos-latest steps: - uses: actions/checkout@v3 - - uses: actions/setup-go@v3 + - uses: actions/setup-go@v4 with: go-version: '1.20' - uses: actions/setup-python@v4 diff --git a/.github/workflows/playground_deploy_backend.yml b/.github/workflows/playground_deploy_backend.yml deleted file mode 100644 index 02a4c7992613..000000000000 --- a/.github/workflows/playground_deploy_backend.yml +++ /dev/null @@ -1,91 +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. - -name: Build And Deploy Playground Backend Application - -on: - push: - tags: 'v*' - branches: ['master', 'release-*'] - pull_request: - paths: ['playground/backend/**'] - branches: ['playground-staging'] - workflow_dispatch: - -# This allows a subsequently queued workflow run to interrupt previous runs -concurrency: - group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' - cancel-in-progress: true - -jobs: - build_playground_backend_docker_image: - name: Build Playground Backend App - runs-on: ubuntu-latest - env: - GO_VERSION: 1.19.6 - BEAM_VERSION: 2.40.0 - TERRAFORM_VERSION: 1.0.9 - STAND_SUFFIX: '' - DATASTORE_EMULATOR_HOST: 127.0.0.1:8888 - steps: - - name: Check out the repo - uses: actions/checkout@v3 - - uses: actions/setup-java@v3.8.0 - with: - distribution: 'zulu' - java-version: '8' - - uses: actions/setup-go@v3 - with: - go-version: '${{ env.GO_VERSION }}' - - name: Remove default github maven configuration - # This step is a workaround to avoid a decryption issue - run: rm ~/.m2/settings.xml - - - name: Set up Cloud SDK and its components - uses: google-github-actions/setup-gcloud@v0 - with: - install_components: 'beta,cloud-datastore-emulator' - version: '389.0.0' - - - name: Run PreCommit - run: ./gradlew playground:backend:precommit - - uses: hashicorp/setup-terraform@v1 - with: - terraform_version: ${{ env.TERRAFORM_VERSION }} - if: startsWith(github.ref, 'refs/tags/') - - name: Set Docker Tag - run: echo "DOCKERTAG=${GITHUB_SHA}" >> $GITHUB_ENV - - name: Set Docker Tag If Github Tag was trigger - run: echo "DOCKERTAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV - if: startsWith(github.ref, 'refs/tags/') - - name: Setup GCP account - run: | - echo "${{ secrets.GCP_PLAYGROUND_SA_KEY }}" | base64 -d > /tmp/gcp_access.json - if: startsWith(github.ref, 'refs/tags/') - - name: Login to Docker Registry - run: cat /tmp/gcp_access.json | docker login -u _json_key --password-stdin https://${{ secrets.PLAYGROUND_REGISTRY_NAME }} - if: startsWith(github.ref, 'refs/tags/') - - name: Deploy Backend Applications - env: - GOOGLE_APPLICATION_CREDENTIALS: /tmp/gcp_access.json - run: ./gradlew playground:terraform:deployBackend -Pdocker-tag=${{env.DOCKERTAG}} -Pproject_id=${{ secrets.GCP_PLAYGROUND_PROJECT_ID }} -Pproject_environment='beta' -Pdocker-repository-root='${{ secrets.PLAYGROUND_REGISTRY_NAME}}/${{ secrets.GCP_PLAYGROUND_PROJECT_ID }}/playground-repository' - if: startsWith(github.ref, 'refs/tags/') - - name: DB Index creation - run: | - gcloud auth activate-service-account --project=${{ secrets.GCP_PLAYGROUND_PROJECT_ID }} --key-file=/tmp/gcp_access.json - gcloud app deploy playground/index.yaml --project=${{ secrets.GCP_PLAYGROUND_PROJECT_ID }} - if: startsWith(github.ref, 'refs/tags/') - env: - GOOGLE_APPLICATION_CREDENTIALS: /tmp/gcp_access.json diff --git a/.github/workflows/playground_deploy_examples.yml b/.github/workflows/playground_deploy_examples.yml deleted file mode 100644 index cede42c8f886..000000000000 --- a/.github/workflows/playground_deploy_examples.yml +++ /dev/null @@ -1,198 +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. - -name: Collect And Deploy Playground Examples - -on: - workflow_dispatch: -env: - BEAM_ROOT_DIR: "../../" - SDK_CONFIG: "../../playground/sdks.yaml" - BEAM_EXAMPLE_CATEGORIES: "../categories.yaml" - BEAM_VERSION: 2.40.0 - K8S_NAMESPACE: playground-backend - HELM_APP_NAME: playground-backend - SUBDIRS: "./learning/katas ./examples ./sdks" - ORIGIN: PG_EXAMPLES -jobs: - check_examples: - name: Check examples - runs-on: ubuntu-latest - outputs: - example_has_changed: ${{ steps.check_has_example.outputs.example_has_changed }} - steps: - - name: Check out the repo - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - uses: actions/setup-python@v4 - with: - python-version: '3.8' - - name: install deps - run: pip install -r requirements.txt - working-directory: playground/infrastructure - - name: get Difference - id: check_file_changed - run: | - set -xeu - # define the base ref - BASE_REF=$GITHUB_BASE_REF - if [ -z "$BASE_REF" ] || [ "$BASE_REF" == "master" ]; then - BASE_REF=origin/master - fi - DIFF=$(git diff --name-only $BASE_REF $GITHUB_SHA -- $SUBDIRS) - echo "example_diff=$DIFF" >> $GITHUB_OUTPUT - - name: has Examples - run: | - output=$(python3 checker.py ${{ steps.check_file_changed.outputs.example_diff }}) - echo "example_has_changed=$output" >> $GITHUB_OUTPUT - id: check_has_example - working-directory: playground/infrastructure - - name: Print has_example - run: echo "${{ steps.check_has_example.outputs.example_has_changed }}" - deploy_examples: - name: Deploy examples - runs-on: ubuntu-latest - needs: [ check_examples ] - if: needs.check_examples.outputs.example_has_changed == 'True' - env: - GOOGLE_APPLICATION_CREDENTIALS: /tmp/gcp_access.json - GOOGLE_CLOUD_PROJECT: ${{ secrets.GCP_PLAYGROUND_PROJECT_ID }} - SA_KEY_CONTENT: ${{ secrets.GCP_PLAYGROUND_SA_KEY }} - REGION: us-central1 - steps: - - name: Check out the repo - uses: actions/checkout@v3 - - uses: actions/setup-python@v4 - with: - python-version: '3.8' - - uses: actions/setup-java@v3.8.0 - with: - distribution: 'zulu' - java-version: '8' - - name: Install kubectl - run: | - curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" &&\ - chmod +x kubectl &&\ - mv kubectl /usr/local/bin/ - - name: Install helm - run: | - curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 &&\ - chmod 700 get_helm.sh &&\ - ./get_helm.sh - - name: Set up Cloud SDK - uses: google-github-actions/setup-gcloud@v0 - with: - install_components: 'gke-gcloud-auth-plugin' - - name: install deps - run: pip install -r requirements.txt - working-directory: playground/infrastructure - - name: Remove default github maven configuration - # This step is a workaround to avoid a decryption issue - run: rm ~/.m2/settings.xml - - name: Setup GCP account - run: | - echo "$SA_KEY_CONTENT" | base64 -d > $GOOGLE_APPLICATION_CREDENTIALS - which gcloud - gcloud auth activate-service-account --project=$GOOGLE_CLOUD_PROJECT \ - --key-file=$GOOGLE_APPLICATION_CREDENTIALS - - name: Set Docker Tag - run: echo "DOCKERTAG=${GITHUB_SHA}" >> $GITHUB_ENV - - name: Set Docker Tag If Github Tag was trigger - run: echo "DOCKERTAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV - if: startsWith(github.ref, 'refs/tags/') - - name: Set Docker Registry env - run: echo "DOCKER_REGISTRY=$DOCKER_REGISTRY" >> $GITHUB_ENV - env: - DOCKER_REGISTRY: ${{ env.REGION }}-docker.pkg.dev/${{ env.GOOGLE_CLOUD_PROJECT }}/playground-repository - - - name: Get K8s Config - run: gcloud container clusters get-credentials --region us-central1-a playground-examples - - name: Login to Docker Registry - run: cat $GOOGLE_APPLICATION_CREDENTIALS | docker login -u _json_key --password-stdin "$PLAYGROUND_REGISTRY_URL" - env: - PLAYGROUND_REGISTRY_URL: https://${{ env.REGION }}-docker.pkg.dev - - name: Build And Push Java Backend - run: | - ./gradlew playground:backend:containers:java:dockerTagPush \ - -Pdocker-repository-root="$DOCKER_REGISTRY" \ - -Pbase-image="apache/beam_java8_sdk:$BEAM_VERSION" \ - -Pdocker-tag="$DOCKERTAG" - - name: Build And Push Go Backend - run: | - ./gradlew playground:backend:containers:go:dockerTagPush \ - -Pdocker-repository-root="$DOCKER_REGISTRY" \ - -Pdocker-tag="$DOCKERTAG" - - name: Build And Push Python Backend - run: | - ./gradlew playground:backend:containers:python:dockerTagPush \ - -Pdocker-repository-root="$DOCKER_REGISTRY" \ - -Pdocker-tag="$DOCKERTAG" - - name: Clean All Build directories - run: ./gradlew clean - - name: Install helm chart - run: | - kubectl create namespace $K8S_NAMESPACE --dry-run=client -o yaml | kubectl apply -f - &&\ - helm install --namespace $K8S_NAMESPACE $HELM_APP_NAME . \ - --set global.registry="$DOCKER_REGISTRY" \ - --set global.tag="$DOCKERTAG" &&\ - sleep 120 - working-directory: playground/infrastructure/helm - - - name: Run Python Examples CI - run: | - K8S_SERVER_ADDRESS=$(kubectl get svc -n $K8S_NAMESPACE -l "app=service-python" -o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}') - echo $K8S_SERVER_ADDRESS - export SERVER_ADDRESS="$K8S_SERVER_ADDRESS:8081" - python3 ci_cd.py --datastore-project $GOOGLE_CLOUD_PROJECT --step CI --sdk SDK_PYTHON --origin $ORIGIN --subdirs $SUBDIRS - working-directory: playground/infrastructure - - - name: Run Python Examples CD - run: | - K8S_SERVER_ADDRESS=$(kubectl get svc -n $K8S_NAMESPACE -l "app=service-python" -o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}') - export SERVER_ADDRESS="$K8S_SERVER_ADDRESS:8081" - python3 ci_cd.py --datastore-project $GOOGLE_CLOUD_PROJECT --step CD --sdk SDK_PYTHON --origin $ORIGIN --subdirs $SUBDIRS - working-directory: playground/infrastructure - - - name: Run Go Examples CI - run: | - K8S_SERVER_ADDRESS=$(kubectl get svc -n $K8S_NAMESPACE -l "app=service-go" -o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}') - export SERVER_ADDRESS="$K8S_SERVER_ADDRESS:8082" - python3 ci_cd.py --datastore-project $GOOGLE_CLOUD_PROJECT --step CI --sdk SDK_GO --origin $ORIGIN --subdirs $SUBDIRS - working-directory: playground/infrastructure - - - name: Run Go Examples CD - run: | - K8S_SERVER_ADDRESS=$(kubectl get svc -n $K8S_NAMESPACE -l "app=service-go" -o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}') - export SERVER_ADDRESS="$K8S_SERVER_ADDRESS:8082" - python3 ci_cd.py --datastore-project $GOOGLE_CLOUD_PROJECT --step CD --sdk SDK_GO --origin $ORIGIN --subdirs $SUBDIRS - working-directory: playground/infrastructure - - - name: Run Java Examples CI - run: | - K8S_SERVER_ADDRESS=$(kubectl get svc -n $K8S_NAMESPACE -l "app=service-java" -o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}') - export SERVER_ADDRESS="$K8S_SERVER_ADDRESS:8080" - python3 ci_cd.py --datastore-project $GOOGLE_CLOUD_PROJECT --step CI --sdk SDK_JAVA --origin $ORIGIN --subdirs $SUBDIRS - working-directory: playground/infrastructure - - name: Run Java Examples CD - run: | - K8S_SERVER_ADDRESS=$(kubectl get svc -n $K8S_NAMESPACE -l "app=service-java" -o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}') - export SERVER_ADDRESS="$K8S_SERVER_ADDRESS:8080" - python3 ci_cd.py --datastore-project $GOOGLE_CLOUD_PROJECT --step CD --sdk SDK_JAVA --origin $ORIGIN --subdirs $SUBDIRS - working-directory: playground/infrastructure - - name: Delete Helm Chart - if: always() - run: | - helm del --namespace $K8S_NAMESPACE $HELM_APP_NAME \ No newline at end of file diff --git a/.github/workflows/playground_examples_cd_reusable.yml b/.github/workflows/playground_examples_cd_reusable.yml deleted file mode 100644 index 4c5b42e70e29..000000000000 --- a/.github/workflows/playground_examples_cd_reusable.yml +++ /dev/null @@ -1,77 +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. - -name: Playground Examples CD for a given SDK and origin - -on: - workflow_call: - inputs: - sdk: - type: string - required: true - subdirs: - type: string - required: true - origin: - type: string - required: true - secrets: - project_id: - required: true - sa_key_content: - required: true - -jobs: - cd: - name: CD ${{ inputs.sdk }} ${{ inputs.origin }} - runs-on: ubuntu-latest - env: - ORIGIN: ${{ inputs.origin }} - SDK: ${{ inputs.sdk }} - STEP: CD - SUBDIRS: ${{ inputs.subdirs }} - - GOOGLE_APPLICATION_CREDENTIALS: /tmp/gcp_access.json - GOOGLE_CLOUD_PROJECT: ${{ secrets.project_id }} - SA_KEY_CONTENT: ${{ secrets.sa_key_content }} - steps: - - name: Check out the repo - uses: actions/checkout@v3 - - uses: actions/setup-python@v4 - with: - python-version: '3.8' - - name: install deps - run: pip install -r requirements.txt - working-directory: playground/infrastructure - - name: Decode GCP credentials - run: | - echo "$SA_KEY_CONTENT" | base64 -d > $GOOGLE_APPLICATION_CREDENTIALS - - - name: Run ci_cd.py - run: | - python3 ci_cd.py \ - --datastore-project $GOOGLE_CLOUD_PROJECT \ - --step $STEP \ - --sdk SDK_${SDK^^} \ - --origin $ORIGIN \ - --subdirs $SUBDIRS - working-directory: playground/infrastructure - env: - BEAM_ROOT_DIR: "../../" - SDK_CONFIG: "../../playground/sdks.yaml" - BEAM_EXAMPLE_CATEGORIES: "../categories.yaml" - SERVER_ADDRESS: https://backend-${{ env.SDK }}-beta-dot-apache-beam-testing.appspot.com - BEAM_USE_WEBGRPC: yes - BEAM_CONCURRENCY: 4 diff --git a/.github/workflows/playground_examples_ci.yml b/.github/workflows/playground_examples_ci.yml deleted file mode 100644 index 2dbd6a8835bf..000000000000 --- a/.github/workflows/playground_examples_ci.yml +++ /dev/null @@ -1,51 +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. - -name: Playground Examples CI - -on: - workflow_dispatch: - pull_request: - paths: - - .github/workflows/playground_examples_ci_reusable.yml - - .github/workflows/playground_examples_ci.yml - - playground/backend/** - - playground/infrastructure/** - - learning/katas/** - - examples/** - - sdks/** -# This allows a subsequently queued workflow run to interrupt previous runs -concurrency: - group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' - cancel-in-progress: true -jobs: - check: - strategy: - matrix: - sdk: ["java", "python", "go"] - # run sequentially - max-parallel: 1 - uses: ./.github/workflows/playground_examples_ci_reusable.yml - with: - sdk: ${{ matrix.sdk }} - step: CI - origin: PG_EXAMPLES - subdirs: ./learning/katas ./examples ./sdks - # unfortunately, there's no input type for list - allowlist: | - .github/workflows/playground_examples_ci_reusable.yml \ - .github/workflows/playground_examples_ci.yml \ - playground/backend \ - playground/infrastructure \ diff --git a/.github/workflows/playground_examples_ci_reusable.yml b/.github/workflows/playground_examples_ci_reusable.yml deleted file mode 100644 index 702d89e1fe21..000000000000 --- a/.github/workflows/playground_examples_ci_reusable.yml +++ /dev/null @@ -1,201 +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. - -name: Playground Examples CI/CD for a given SDK and origin - -on: - workflow_call: - inputs: - step: - type: string - required: true - sdk: - type: string - required: true - subdirs: - type: string - required: true - allowlist: - type: string - required: true - origin: - type: string - required: true -env: - BEAM_VERSION: 2.44.0 -jobs: - check_has_examples: - name: pre-check - runs-on: ubuntu-latest - outputs: - example_has_changed: ${{ steps.check_has_example.outputs.example_has_changed }} - env: - SDK: ${{ inputs.sdk }} - steps: - - name: Check out the repo - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - uses: actions/setup-python@v4 - with: - python-version: '3.8' - - name: install deps - run: pip install -r requirements.txt - working-directory: playground/infrastructure - - name: pytest - run: pytest - working-directory: playground/infrastructure - - - name: get Difference - id: check_file_changed - run: | - set -xeu - # define the base ref - BASE_REF=$GITHUB_BASE_REF - if [ -z "$BASE_REF" ] || [ "$BASE_REF" == "master" ]; then - BASE_REF=origin/master - fi - DIFF=$(git diff --name-only $BASE_REF $GITHUB_SHA | tr '\n' ' ') - echo "example_diff=$DIFF" >> $GITHUB_OUTPUT - - id: check_has_example - name: has Examples - run: | - # don't quit on errors, check unbound vars, and show commands - set +e -ux - python3 checker.py \ - --verbose \ - --sdk SDK_${SDK^^} \ - --allowlist ${{ inputs.allowlist }} \ - --paths ${{ steps.check_file_changed.outputs.example_diff }} - CODE=$? - if [ $CODE -eq 0 ]; then - echo "example_has_changed=True" >> $GITHUB_OUTPUT - elif [ $CODE -eq 11 ]; then - echo "example_has_changed=False" >> $GITHUB_OUTPUT - else - echo "checker is broken" - exit 1 - fi - working-directory: playground/infrastructure - env: - BEAM_ROOT_DIR: "../.." - BEAM_EXAMPLE_CATEGORIES: "../categories.yaml" - - ci_cd: - name: ${{ inputs.step }} ${{ inputs.sdk }} ${{ inputs.origin }} - needs: [ check_has_examples ] - if: needs.check_has_examples.outputs.example_has_changed == 'True' - runs-on: ubuntu-latest - env: - ORIGIN: ${{ inputs.origin }} - SDK: ${{ inputs.sdk }} - STEP: ${{ inputs.step }} - SUBDIRS: ${{ inputs.subdirs }} - steps: - - name: Check out the repo - uses: actions/checkout@v3 - - - uses: actions/setup-python@v4 - with: - python-version: '3.8' - - uses: actions/setup-java@v3.8.0 - with: - distribution: 'zulu' - java-version: '11' - - - name: install deps - run: pip install -r requirements.txt - working-directory: playground/infrastructure - - - name: Remove default github maven configuration - # This step is a workaround to avoid a decryption issue - run: rm ~/.m2/settings.xml - - - name: Set Docker Tag - run: echo "DOCKERTAG=${GITHUB_SHA}" >> $GITHUB_ENV - - name: Set Docker Tag If Github Tag was trigger - run: echo "DOCKERTAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV - if: startsWith(github.ref, 'refs/tags/') - - - name: Setup Gradle - uses: gradle/gradle-build-action@v2 - with: - cache-read-only: false - - - name: Build an SDK runner base image and set SDK_TAG if needed - run: | - set -uex - # TODO make this a part of playground:backend:containers:python:docker task - if [ "$SDK" == "python" ]; then - # builds apache/beam_python3.10_sdk:$DOCKERTAG image - ./gradlew -i :sdks:python:container:py310:docker -Pdocker-tag="$DOCKERTAG" -Pdocker-pull-licenses=true - # and set SDK_TAG to DOCKERTAG so that the next step would find it - echo "SDK_TAG=${DOCKERTAG}" >> $GITHUB_ENV - fi - - - name: Build SDK Backend Docker image - run: | - set -ex - opts=" -Pdocker-tag=$DOCKERTAG" - if [ -n "$SDK_TAG" ]; then - opts="$opts -Psdk-tag=$SDK_TAG" - fi - if [ "$SDK" == "java" ]; then - # Java uses a fixed BEAM_VERSION - opts="$opts -Psdk-tag=$BEAM_VERSION" - fi - - # by default (w/o -Psdk-tag) runner uses BEAM from local ./sdks - # TODO Java SDK doesn't, it uses 2.44.0, fix this - ./gradlew -i playground:backend:containers:$SDK:docker $opts - - - name: Set docker image - run: echo "IMAGE_TAG=apache/beam_playground-backend-$SDK:$DOCKERTAG" >> $GITHUB_ENV - - - name: Start SDK runner in background - run: | - set -uex - NAME=$(docker run -d --rm -p 8080:8080 -e PROTOCOL_TYPE=TCP $IMAGE_TAG) - echo "NAME=$NAME" >> $GITHUB_ENV - - - name: Run ci_cd.py - run: | - python3 ci_cd.py \ - --step $STEP \ - --sdk SDK_${SDK^^} \ - --origin $ORIGIN \ - --subdirs $SUBDIRS - working-directory: playground/infrastructure - env: - BEAM_ROOT_DIR: "../../" - SDK_CONFIG: "../../playground/sdks.yaml" - BEAM_EXAMPLE_CATEGORIES: "../categories.yaml" - SERVER_ADDRESS: localhost:8080 - BEAM_CONCURRENCY: 4 - - - name: Get SDK runner logs - if: ${{ always() }} - run: | - [ -n "$NAME" ] && docker logs $NAME - - - name: Stop/remove SDK runner - if: ${{ always() }} - run: | - [ -n "$NAME" ] && docker rm -f $NAME - - - name: Delete Docker image - if: ${{ always() }} - run: | - docker image rm -f $IMAGE_TAG diff --git a/.github/workflows/playground_frontend_test.yml b/.github/workflows/playground_frontend_test.yml index 3a09148c06c2..7d5287ea5a11 100644 --- a/.github/workflows/playground_frontend_test.yml +++ b/.github/workflows/playground_frontend_test.yml @@ -37,7 +37,7 @@ jobs: runs-on: ubuntu-latest env: - FLUTTER_VERSION: '3.10.2' + FLUTTER_VERSION: '3.10.4' steps: - uses: actions/checkout@v3 diff --git a/.github/workflows/python_dependency_tests.yml b/.github/workflows/python_dependency_tests.yml index daf30b4bae9c..809a422c9e87 100644 --- a/.github/workflows/python_dependency_tests.yml +++ b/.github/workflows/python_dependency_tests.yml @@ -26,7 +26,6 @@ jobs: matrix: os: [ubuntu-latest] params: [ - {"py_ver": "3.7", "py_env": "py37"}, {"py_ver": "3.8", "py_env": "py38"}, {"py_ver": "3.9", "py_env": "py39"}, {"py_ver": "3.10", "py_env": "py310" }, diff --git a/.github/workflows/python_tests.yml b/.github/workflows/python_tests.yml index 819330d394ad..0ce07c9e68f6 100644 --- a/.github/workflows/python_tests.yml +++ b/.github/workflows/python_tests.yml @@ -77,7 +77,7 @@ jobs: - name: Install python uses: actions/setup-python@v4 with: - python-version: 3.7 + python-version: 3.8 - name: Get build dependencies working-directory: ./sdks/python run: pip install pip setuptools --upgrade && pip install -r build-requirements.txt @@ -101,7 +101,6 @@ jobs: matrix: os: [ubuntu-latest, macos-latest, windows-latest] params: [ - {"py_ver": "3.7", "tox_env": "py37"}, {"py_ver": "3.8", "tox_env": "py38"}, {"py_ver": "3.9", "tox_env": "py39"}, {"py_ver": "3.10", "tox_env": "py310" }, @@ -141,7 +140,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] - python: ["3.7", "3.8", "3.9", "3.10", "3.11"] + python: ["3.8", "3.9", "3.10", "3.11"] steps: - name: Checkout code uses: actions/checkout@v3 @@ -169,7 +168,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] - python: ["3.7", "3.8", "3.9", "3.10", "3.11"] + python: ["3.8", "3.9", "3.10", "3.11"] steps: - name: Checkout code uses: actions/checkout@v3 @@ -178,7 +177,7 @@ jobs: with: python-version: ${{ matrix.python }} - name: Install go - uses: actions/setup-go@v3 + uses: actions/setup-go@v4 with: go-version: '1.20' - name: Download source from artifacts diff --git a/.github/workflows/run_perf_alert_tool.yml b/.github/workflows/run_perf_alert_tool.yml index 510db83f8690..1cdcd858e61a 100644 --- a/.github/workflows/run_perf_alert_tool.yml +++ b/.github/workflows/run_perf_alert_tool.yml @@ -23,6 +23,10 @@ on: workflow_dispatch: schedule: - cron: '5 22 * * *' + pull_request: + branches: ['master'] + tags: 'v*' + paths: ['sdks/python/apache_beam/testing/**'] jobs: python_run_change_point_analysis: name: Run Change Point Analysis. @@ -37,6 +41,7 @@ jobs: with: python-version: 3.8 - name: Authenticate on GCP + if: github.event_name != 'pull_request' uses: google-github-actions/setup-gcloud@v0 with: service_account_key: ${{ secrets.GCP_SA_KEY }} @@ -55,6 +60,7 @@ jobs: working-directory: ./sdks/python/apache_beam/testing/analyzers shell: bash run: python perf_analysis.py + if: github.event_name != 'pull_request' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Run change point analysis tests. diff --git a/.github/workflows/run_rc_validation.yml b/.github/workflows/run_rc_validation.yml index 7a98942eed1f..720150b57450 100644 --- a/.github/workflows/run_rc_validation.yml +++ b/.github/workflows/run_rc_validation.yml @@ -92,8 +92,8 @@ jobs: - name: Create Pull Request run: | git checkout -b ${{env.WORKING_BRANCH}} ${{ env.RC_TAG }} --quiet - touch empty_file.txt - git add empty_file.txt + touch empty_file.json + git add empty_file.json git commit -m "Add empty file in order to create PR" --quiet git push origin ${{env.WORKING_BRANCH}} --quiet GITHUB_PR_URL=$(gh pr create -B ${{env.RELEASE_BRANCH}} -H ${{env.WORKING_BRANCH}} -t"[DO NOT MERGE] Run Python RC Validation Tests" -b "PR to run Python ReleaseCandidate Jenkins Job.") diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 487eee650885..959b2009aa4a 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -28,7 +28,7 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/stale@v6 + - uses: actions/stale@v8 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-pr-message: 'This pull request has been marked as stale due to 60 days of inactivity. It will be closed in 1 week if no further activity occurs. If you think that’s incorrect or this pull request requires a review, please simply write any comment. If closed, you can revive the PR at any time and @mention a reviewer or discuss it on the dev@beam.apache.org list. Thank you for your contributions.' diff --git a/.github/workflows/tour_of_beam_backend.yml b/.github/workflows/tour_of_beam_backend.yml index c87f962cc394..f54277318cd4 100644 --- a/.github/workflows/tour_of_beam_backend.yml +++ b/.github/workflows/tour_of_beam_backend.yml @@ -42,7 +42,7 @@ jobs: working-directory: ./learning/tour-of-beam/backend steps: - uses: actions/checkout@v3 - - uses: actions/setup-go@v3 + - uses: actions/setup-go@v4 with: # pin to the biggest Go version supported by Cloud Functions runtime go-version: '1.16' diff --git a/.github/workflows/tour_of_beam_backend_integration.yml b/.github/workflows/tour_of_beam_backend_integration.yml index d43af660221c..a566cb2aa52b 100644 --- a/.github/workflows/tour_of_beam_backend_integration.yml +++ b/.github/workflows/tour_of_beam_backend_integration.yml @@ -70,7 +70,7 @@ jobs: working-directory: ./learning/tour-of-beam/backend steps: - uses: actions/checkout@v3 - - uses: actions/setup-go@v3 + - uses: actions/setup-go@v4 with: # pin to the biggest Go version supported by Cloud Functions runtime go-version: '1.16' diff --git a/.github/workflows/tour_of_beam_examples_ci.yml b/.github/workflows/tour_of_beam_examples_ci.yml deleted file mode 100644 index 5494eb3cfe4d..000000000000 --- a/.github/workflows/tour_of_beam_examples_ci.yml +++ /dev/null @@ -1,47 +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. - -name: Tour Of Beam Examples CI - -on: - pull_request: - paths: - - .github/workflows/playground_examples_ci_reusable.yml - - .github/workflows/tour_of_beam_examples_ci.yml - - playground/backend/** - - playground/infrastructure/** - - learning/tour-of-beam/learning-content/** -# This allows a subsequently queued workflow run to interrupt previous runs -concurrency: - group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' - cancel-in-progress: true -jobs: - check_examples: - strategy: - matrix: - sdk: ["python", "go", "java"] - # run sequentially - max-parallel: 1 - uses: ./.github/workflows/playground_examples_ci_reusable.yml - with: - sdk: ${{ matrix.sdk }} - step: CI - origin: TB_EXAMPLES - subdirs: "./learning/tour-of-beam/learning-content" - allowlist: | - .github/workflows/playground_examples_ci_reusable.yml \ - .github/workflows/tour_of_beam_examples_ci.yml \ - playground/backend \ - playground/infrastructure \ diff --git a/.github/workflows/tour_of_beam_frontend_test.yml b/.github/workflows/tour_of_beam_frontend_test.yml index ab6f9bc9c8b7..1bd416e89e4c 100644 --- a/.github/workflows/tour_of_beam_frontend_test.yml +++ b/.github/workflows/tour_of_beam_frontend_test.yml @@ -35,11 +35,11 @@ concurrency: jobs: tour_of_beam_test: - name: Tour of Beam Test + name: Tour of Beam Frontend Test runs-on: ubuntu-latest env: - FLUTTER_VERSION: '3.10.2' + FLUTTER_VERSION: '3.10.4' steps: - uses: actions/checkout@v3 diff --git a/.gitignore b/.gitignore index 5046b64fb4bf..d69995de84ec 100644 --- a/.gitignore +++ b/.gitignore @@ -140,3 +140,6 @@ playground/cloudfunction.zip # Ignore Katas auto-generated files **/*-remote-info.yaml + +# Exception to .gitignore .test-infra/pipelines related files +!.test-infra/pipelines/**/apache-beam-testing.tfvars diff --git a/.test-infra/jenkins/CommonJobProperties.groovy b/.test-infra/jenkins/CommonJobProperties.groovy index 36481715cb8f..93c81ff9af30 100644 --- a/.test-infra/jenkins/CommonJobProperties.groovy +++ b/.test-infra/jenkins/CommonJobProperties.groovy @@ -108,7 +108,7 @@ class CommonJobProperties { credentialsBinding { string("CODECOV_TOKEN", "beam-codecov-token") string("COVERALLS_REPO_TOKEN", "beam-coveralls-token") - string("GRADLE_ENTERPRISE_ACCESS_KEY", "GE_ACCESS_TOKEN") + usernamePassword("GRADLE_ENTERPRISE_CACHE_USERNAME", "GRADLE_ENTERPRISE_CACHE_PASSWORD", "beam_cache_node_credentials") } timestamps() colorizeOutput() diff --git a/.test-infra/jenkins/PythonTestProperties.groovy b/.test-infra/jenkins/PythonTestProperties.groovy index 1ebf7cc84a87..98257a6e1c28 100644 --- a/.test-infra/jenkins/PythonTestProperties.groovy +++ b/.test-infra/jenkins/PythonTestProperties.groovy @@ -20,7 +20,6 @@ class PythonTestProperties { // Indicates all supported Python versions. // This must be sorted in ascending order. final static List ALL_SUPPORTED_VERSIONS = [ - '3.7', '3.8', '3.9', '3.10', @@ -38,9 +37,9 @@ class PythonTestProperties { final static List CROSS_LANGUAGE_VALIDATES_RUNNER_PYTHON_VERSIONS = ESSENTIAL_VERSIONS final static List CROSS_LANGUAGE_VALIDATES_RUNNER_DATAFLOW_USING_SQL_PYTHON_VERSIONS = [HIGHEST_SUPPORTED] final static List VALIDATES_CONTAINER_DATAFLOW_PYTHON_VERSIONS = ALL_SUPPORTED_VERSIONS - final static String LOAD_TEST_PYTHON_VERSION = '3.7' + final static String LOAD_TEST_PYTHON_VERSION = '3.8' final static String RUN_INFERENCE_TEST_PYTHON_VERSION = '3.8' - final static String CHICAGO_TAXI_EXAMPLE_FLINK_PYTHON_VERSION = '3.7' + final static String CHICAGO_TAXI_EXAMPLE_FLINK_PYTHON_VERSION = '3.8' // Use for various shell scripts triggered by Jenkins. // Gradle scripts should use project.ext.pythonVersion defined by PythonNature/BeamModulePlugin. final static String DEFAULT_INTERPRETER = 'python3.8' diff --git a/.test-infra/jenkins/README.md b/.test-infra/jenkins/README.md index bdd3f2577ae1..02cddfdc65c7 100644 --- a/.test-infra/jenkins/README.md +++ b/.test-infra/jenkins/README.md @@ -148,7 +148,6 @@ Beam Jenkins overview page: [link](https://ci-beam.apache.org/) | beam_PostCommit_PortableJar_Spark | [cron](https://ci-beam.apache.org/view/PostCommit/job/beam_PostCommit_PortableJar_Spark/), [phrase](https://ci-beam.apache.org/view/PostCommit/job/beam_PostCommit_PortableJar_Spark_PR/) | `Run PortableJar_Spark PostCommit` | [![Build Status](https://ci-beam.apache.org/view/PostCommit/job/beam_PostCommit_PortableJar_Spark/badge/icon)](https://ci-beam.apache.org/view/PostCommit/job/beam_PostCommit_PortableJar_Spark/) | | beam_PostCommit_Java_Sickbay | [cron](https://ci-beam.apache.org/view/PostCommit/job/beam_PostCommit_Java_Sickbay/), [phrase](https://ci-beam.apache.org/view/PostCommit/job/beam_PostCommit_Java_Sickbay_PR/) | `Run Java Sickbay` | [![Build Status](https://ci-beam.apache.org/view/PostCommit/job/beam_PostCommit_Java_Sickbay/badge/icon)](https://ci-beam.apache.org/view/PostCommit/job/beam_PostCommit_Java_Sickbay/) | | beam_PostCommit_Py_VR_Dataflow | [cron](https://ci-beam.apache.org/job/beam_PostCommit_Py_VR_Dataflow/), [phrase](https://ci-beam.apache.org/job/beam_PostCommit_Py_VR_Dataflow_PR/) | `Run Python Dataflow ValidatesRunner` | [![Build Status](https://ci-beam.apache.org/job/beam_PostCommit_Py_VR_Dataflow/badge/icon)](https://ci-beam.apache.org/job/beam_PostCommit_Py_VR_Dataflow) | -| beam_PostCommit_Py_VR_Dataflow_V2 | [cron](https://ci-beam.apache.org/job/beam_PostCommit_Py_VR_Dataflow_V2/), [phrase](https://ci-beam.apache.org/job/beam_PostCommit_Py_VR_Dataflow_V2_PR/) | `Run Python Dataflow V2 ValidatesRunner` | [![Build Status](https://ci-beam.apache.org/job/beam_PostCommit_Py_VR_Dataflow_V2/badge/icon)](https://ci-beam.apache.org/job/beam_PostCommit_Py_VR_Dataflow_V2) | | beam_PostCommit_Py_ValCont | [cron](https://ci-beam.apache.org/job/beam_PostCommit_Py_ValCont/), [phrase](https://ci-beam.apache.org/job/beam_PostCommit_Py_ValCont_PR/) | `Run Python Dataflow ValidatesContainer` | [![Build Status](https://ci-beam.apache.org/job/beam_PostCommit_Py_ValCont/badge/icon)](https://ci-beam.apache.org/job/beam_PostCommit_Py_ValCont) | | beam_PostCommit_Python_VR_Flink | [cron](https://ci-beam.apache.org/job/beam_PostCommit_Python_VR_Flink/), [phrase](https://ci-beam.apache.org/job/beam_PostCommit_Python_VR_Flink_PR/) | `Run Python Flink ValidatesRunner` | [![Build Status](https://ci-beam.apache.org/job/beam_PostCommit_Python_VR_Flink/badge/icon)](https://ci-beam.apache.org/job/beam_PostCommit_Python_VR_Flink) | | beam_PostCommit_Python_VR_Samza | [cron](https://ci-beam.apache.org/job/beam_PostCommit_Python_VR_Samza/), [phrase](https://ci-beam.apache.org/job/beam_PostCommit_Python_VR_Samza_PR/) | `Run Python Samza ValidatesRunner` | [![Build Status](https://ci-beam.apache.org/job/beam_PostCommit_Python_VR_Samza/badge/icon)](https://ci-beam.apache.org/job/beam_PostCommit_Python_VR_Samza) | @@ -163,12 +162,10 @@ Beam Jenkins overview page: [link](https://ci-beam.apache.org/) | beam_PostCommit_Python_VR_Spark | [cron](https://ci-beam.apache.org/job/beam_PostCommit_Python_VR_Spark/), [phrase](https://ci-beam.apache.org/job/beam_PostCommit_Python_VR_Spark/) | `Run Python Spark ValidatesRunner` | [![Build Status](https://ci-beam.apache.org/job/beam_PostCommit_Python_VR_Spark/badge/icon)](https://ci-beam.apache.org/job/beam_PostCommit_Python_VR_Spark) | | beam_PostCommit_Python_Xlang_Gcp_Direct | [cron](https://ci-beam.apache.org/job/beam_PostCommit_Python_Xlang_Gcp_Direct/), [phrase](https://ci-beam.apache.org/job/beam_PostCommit_Python_Xlang_Gcp_Direct_PR/) | `Run Python_Xlang_Gcp_Direct PostCommit` | [![Build Status](https://ci-beam.apache.org/job/beam_PostCommit_Python_Xlang_Gcp_Direct/badge/icon)](https://ci-beam.apache.org/job/beam_PostCommit_Python_Xlang_Gcp_Direct/) | | beam_PostCommit_Python_Xlang_Gcp_Dataflow | [cron](https://ci-beam.apache.org/job/beam_PostCommit_Python_Xlang_Gcp_Dataflow/), [phrase](https://ci-beam.apache.org/job/beam_PostCommit_Python_Xlang_Gcp_Dataflow_PR/) | `Run Python_Xlang_Gcp_Dataflow PostCommit` | [![Build Status](https://ci-beam.apache.org/job/beam_PostCommit_Python_Xlang_Gcp_Dataflow/badge/icon)](https://ci-beam.apache.org/job/beam_PostCommit_Python_Xlang_Gcp_Dataflow/) | -| beam_PostCommit_Python37 | [cron](https://ci-beam.apache.org/job/beam_PostCommit_Python37), [phrase](https://ci-beam.apache.org/job/beam_PostCommit_Python37_PR/) | `Run Python 3.7 PostCommit` | [![Build Status](https://ci-beam.apache.org/job/beam_PostCommit_Python37/badge/icon)](https://ci-beam.apache.org/job/beam_PostCommit_Python37) | | beam_PostCommit_Python38 | [cron](https://ci-beam.apache.org/job/beam_PostCommit_Python38), [phrase](https://ci-beam.apache.org/job/beam_PostCommit_Python38_PR/) | `Run Python 3.8 PostCommit` | [![Build Status](https://ci-beam.apache.org/job/beam_PostCommit_Python38/badge/icon)](https://ci-beam.apache.org/job/beam_PostCommit_Python38) | | beam_PostCommit_Python39 | [cron](https://ci-beam.apache.org/job/beam_PostCommit_Python39), [phrase](https://ci-beam.apache.org/job/beam_PostCommit_Python39_PR/) | `Run Python 3.9 PostCommit` | [![Build Status](https://ci-beam.apache.org/job/beam_PostCommit_Python39/badge/icon)](https://ci-beam.apache.org/job/beam_PostCommit_Python39) | | beam_PostCommit_Python310 | [cron](https://ci-beam.apache.org/job/beam_PostCommit_Python310), [phrase](https://ci-beam.apache.org/job/beam_PostCommit_Python310_PR/) | `Run Python 3.10 PostCommit` | [![Build Status](https://ci-beam.apache.org/job/beam_PostCommit_Python310/badge/icon)](https://ci-beam.apache.org/job/beam_PostCommit_Python310) | | beam_PostCommit_Python311 | [cron](https://ci-beam.apache.org/job/beam_PostCommit_Python311), [phrase](https://ci-beam.apache.org/job/beam_PostCommit_Python311_PR/) | `Run Python 3.11 PostCommit` | [![Build Status](https://ci-beam.apache.org/job/beam_PostCommit_Python311/badge/icon)](https://ci-beam.apache.org/job/beam_PostCommit_Python311) | -| beam_PostCommit_Sickbay_Python37 | [cron](https://ci-beam.apache.org/job/beam_PostCommit_Sickbay_Python37), [phrase](https://ci-beam.apache.org/job/beam_PostCommit_SickBay_Python37_PR/) | `Run Python 3.7 PostCommit Sickbay tests` | [![Build Status](https://ci-beam.apache.org/job/beam_PostCommit_Sickbay_Python37/badge/icon)](https://ci-beam.apache.org/job/beam_PostCommit_Sickbay_Python37) | | beam_PostCommit_Sickbay_Python38 | [cron](https://ci-beam.apache.org/job/beam_PostCommit_Sickbay_Python38), [phrase](https://ci-beam.apache.org/job/beam_PostCommit_SickBay_Python38_PR/) | `Run Python 3.8 PostCommit Sickbay tests` | [![Build Status](https://ci-beam.apache.org/job/beam_PostCommit_Sickbay_Python38/badge/icon)](https://ci-beam.apache.org/job/beam_PostCommit_Sickbay_Python38) | | beam_PostCommit_Sickbay_Python39 | [cron](https://ci-beam.apache.org/job/beam_PostCommit_Sickbay_Python39), [phrase](https://ci-beam.apache.org/job/beam_PostCommit_SickBay_Python39_PR/) | `Run Python 3.9 PostCommit Sickbay tests` | [![Build Status](https://ci-beam.apache.org/job/beam_PostCommit_Sickbay_Python39/badge/icon)](https://ci-beam.apache.org/job/beam_PostCommit_Sickbay_Python39) | | beam_PostCommit_Sickbay_Python310 | [cron](https://ci-beam.apache.org/job/beam_PostCommit_Sickbay_Python310), [phrase](https://ci-beam.apache.org/job/beam_PostCommit_SickBay_Python310_PR/) | `Run Python 3.10 PostCommit Sickbay tests` | [![Build Status](https://ci-beam.apache.org/job/beam_PostCommit_Sickbay_Python310/badge/icon)](https://ci-beam.apache.org/job/beam_PostCommit_Sickbay_Python310) | @@ -202,7 +199,7 @@ Beam Jenkins overview page: [link](https://ci-beam.apache.org/) | beam_PerformanceTests_SparkReceiver_IO | [cron](https://ci-beam.apache.org/job/beam_PerformanceTests_SparkReceiver_IO/) | `Run Java SparkReceiverIO Performance Test` | [![Build Status](https://ci-beam.apache.org/job/beam_PerformanceTests_SparkReceiver_IO/badge/icon)](https://ci-beam.apache.org/job/beam_PerformanceTests_SparkReceiver_IO) | | beam_PerformanceTests_TFRecordIOIT | [cron](https://ci-beam.apache.org/job/beam_PerformanceTests_TFRecordIOIT/) | `Run Java TFRecordIO Performance Test` | [![Build Status](https://ci-beam.apache.org/job/beam_PerformanceTests_TFRecordIOIT/badge/icon)](https://ci-beam.apache.org/job/beam_PerformanceTests_TFRecordIOIT) | | beam_PerformanceTests_TextIOIT | [cron](https://ci-beam.apache.org/job/beam_PerformanceTests_TextIOIT/), [hdfs_cron](https://ci-beam.apache.org/job/beam_PerformanceTests_TextIOIT_HDFS/) | `Run Java TextIO Performance Test` | [![Build Status](https://ci-beam.apache.org/job/beam_PerformanceTests_TextIOIT/badge/icon)](https://ci-beam.apache.org/job/beam_PerformanceTests_TextIOIT) [![Build Status](https://ci-beam.apache.org/job/beam_PerformanceTests_TextIOIT_HDFS/badge/icon)](https://ci-beam.apache.org/job/beam_PerformanceTests_TextIOIT_HDFS) | -| beam_PerformanceTests_WordCountIT_Py37 | [cron](https://ci-beam.apache.org/job/beam_PerformanceTests_WordCountIT_Py37/) | `Run Python37 WordCountIT Performance Test` | [![Build Status](https://ci-beam.apache.org/job/beam_PerformanceTests_WordCountIT_Py37/badge/icon)](https://ci-beam.apache.org/job/beam_PerformanceTests_WordCountIT_Py37) | +| beam_PerformanceTests_WordCountIT_Py38 | [cron](https://ci-beam.apache.org/job/beam_PerformanceTests_WordCountIT_Py38/) | `Run Python38 WordCountIT Performance Test` | [![Build Status](https://ci-beam.apache.org/job/beam_PerformanceTests_WordCountIT_Py38/badge/icon)](https://ci-beam.apache.org/job/beam_PerformanceTests_WordCountIT_Py38) | | beam_PerformanceTests_XmlIOIT | [cron](https://ci-beam.apache.org/job/beam_PerformanceTests_XmlIOIT/), [hdfs_cron](https://ci-beam.apache.org/job/beam_PerformanceTests_XmlIOIT_HDFS/) | `Run Java XmlIO Performance Test` | [![Build Status](https://ci-beam.apache.org/job/beam_PerformanceTests_XmlIOIT/badge/icon)](https://ci-beam.apache.org/job/beam_PerformanceTests_XmlIOIT) [![Build Status](https://ci-beam.apache.org/job/beam_PerformanceTests_XmlIOIT_HDFS/badge/icon)](https://ci-beam.apache.org/job/beam_PerformanceTests_XmlIOIT_HDFS) | | beam_PerformanceTests_SQLBigQueryIO_Batch_Java | [cron](https://ci-beam.apache.org/job/beam_PerformanceTests_SQLBigQueryIO_Batch_Java/) | `Run SQLBigQueryIO Batch Performance Test Java` | [![Build Status](https://ci-beam.apache.org/job/beam_PerformanceTests_SQLBigQueryIO_Batch_Java/badge/icon)](https://ci-beam.apache.org/job/beam_PerformanceTests_SQLBigQueryIO_Batch_Java/) | | beam_Java_JMH | [cron](https://ci-beam.apache.org/job/beam_Java_JMH/) | | [![Build Status](https://ci-beam.apache.org/job/beam_Java_JMH/badge/icon)](https://ci-beam.apache.org/job/beam_Java_JMH/) | @@ -285,7 +282,6 @@ Beam Jenkins overview page: [link](https://ci-beam.apache.org/) | Name | Link | PR Trigger Phrase | Cron Status | |------|------|-------------------|-------------| -| beam_Dependency_Check | [cron](https://ci-beam.apache.org/job/beam_Dependency_Check/) | `Run Dependency Check` | [![Build Status](https://ci-beam.apache.org/job/beam_Dependency_Check/badge/icon)](https://ci-beam.apache.org/job/beam_Dependency_Check) | | beam_Metrics_Report | [cron](https://ci-beam.apache.org/job/beam_Metrics_Report/) | `Run Metrics Report` | [![Build Status](https://ci-beam.apache.org/job/beam_Metrics_Report/badge/icon)](https://ci-beam.apache.org/job/beam_Metrics_Report) | | beam_Release_NightlySnapshot | [cron](https://ci-beam.apache.org/job/beam_Release_NightlySnapshot/) | `Run Gradle Publish` | [![Build Status](https://ci-beam.apache.org/job/beam_Release_NightlySnapshot/badge/icon)](https://ci-beam.apache.org/job/beam_Release_NightlySnapshot) | | beam_Release_Python_NightlySnapshot | [cron](https://ci-beam.apache.org/job/beam_Release_Python_NightlySnapshot/) | `Run Python Publish` | [![Build Status](https://ci-beam.apache.org/job/beam_Release_Python_NightlySnapshot/badge/icon)](https://ci-beam.apache.org/job/beam_Release_Python_NightlySnapshot) | @@ -299,7 +295,6 @@ Beam Jenkins overview page: [link](https://ci-beam.apache.org/) | beam_Publish_Beam_SDK_Snapshots | [cron](https://ci-beam.apache.org/job/beam_Publish_Beam_SDK_Snapshots/)| N/A | [![Build Status](https://ci-beam.apache.org/job/beam_Publish_Beam_SDK_Snapshots/badge/icon)](https://ci-beam.apache.org/job/beam_Publish_Beam_SDK_Snapshots/) | | beam_Publish_Docker_Snapshots | [cron](https://ci-beam.apache.org/job/beam_Publish_Docker_Snapshots/)| N/A | [![Build Status](https://ci-beam.apache.org/job/beam_Publish_Docker_Snapshots/badge/icon)](https://ci-beam.apache.org/job/beam_Publish_Docker_Snapshots/) | | beam_PostRelease_Python_Candidate | [cron](https://ci-beam.apache.org/job/beam_PostRelease_Python_Candidate/)| `Run Python ReleaseCandidate` | [![Build Status](https://ci-beam.apache.org/job/beam_PostRelease_Python_Candidate/badge/icon)](https://ci-beam.apache.org/job/beam_PostRelease_Python_Candidate/) | -| beam_Release_Gradle_Build | [cron](https://ci-beam.apache.org/job/beam_Release_Gradle_Build/) | `Run Release Gradle Build` | [![Build Status](https://ci-beam.apache.org/job/beam_Release_Gradle_Build/badge/icon)](https://ci-beam.apache.org/job/beam_Release_Gradle_Build/) ### Notes: @@ -309,4 +304,4 @@ Beam Jenkins overview page: [link](https://ci-beam.apache.org/) retest this please ``` -* Last update (mm/dd/yyyy): 04/04/2022 +* Last update (mm/dd/yyyy): 06/20/2022 diff --git a/.test-infra/jenkins/dependency_check/bigquery_client_utils.py b/.test-infra/jenkins/dependency_check/bigquery_client_utils.py deleted file mode 100644 index f7cd0fe24b9e..000000000000 --- a/.test-infra/jenkins/dependency_check/bigquery_client_utils.py +++ /dev/null @@ -1,149 +0,0 @@ -from __future__ import print_function -# -# 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. -# - -import datetime -import logging -from google.cloud import bigquery - -logging.getLogger().setLevel(logging.INFO) - -class BigQueryClientUtils: - - def __init__(self, project_id, dataset_id, table_id): - self.project_id = project_id - self.dataset_id = dataset_id - self.table_id = table_id - self.bigquery_client = bigquery.Client(project_id) - self.table_ref = self.bigquery_client.dataset(dataset_id).table(table_id) - self.table = self.bigquery_client.get_table(self.table_ref) - - - def query_dep_info_by_version(self, dep, version): - """ - Query for dependency information of a specific version - Args: - dep, version - Return: - release_date, is_currently_used - """ - query = """SELECT release_date, is_currently_used - FROM `{0}.{1}.{2}` - WHERE package_name=\'{3}\' AND version=\'{4}\'""".format(self.project_id, - self.dataset_id, - self.table_id, - dep.strip(), - version.strip()) - - query_job = self.bigquery_client.query(query) - rows = list(query_job) - if len(rows) == 0: - logging.info("Did not find record of dependency {0} with version {1}.".format(dep, version)) - return None, False - assert len(rows) == 1 - logging.info("""Found record of dependency {0} with version {1}: - release date: {2}; is_currently_used: {3}.""".format(dep, version, rows[0]['release_date'], rows[0]['is_currently_used'])) - return rows[0]['release_date'], rows[0]['is_currently_used'] - - - def query_currently_used_dep_info_in_db(self, dep): - """ - Query for the info of the currently used version of a specific dependency - Args: - dep - Return: - version, release_date - """ - query = """SELECT version, release_date - FROM `{0}.{1}.{2}` - WHERE package_name=\'{3}\' AND is_currently_used=True""".format(self.project_id, - self.dataset_id, - self.table_id, - dep.strip()) - - query_job = self.bigquery_client.query(query) - rows = list(query_job) - if len(rows) == 0: - return None, None - assert len(rows) == 1 - return rows[0]['version'], rows[0]['release_date'] - - - def insert_dep_to_table(self, dep, version, release_date, is_currently_used=False): - """ - Add a dependency with version and release date into bigquery table - Args: - dep, version, is_currently_used (default False) - """ - query = """INSERT - `{0}.{1}.{2}` (package_name, version, release_date, is_currently_used) - VALUES (\'{3}\', \'{4}\', \'{5}\', {6})""".format(self.project_id, - self.dataset_id, - self.table_id, - dep.strip(), - version.strip(), - release_date, - is_currently_used) - logging.info("Inserting dep to table: \n {0}".format(query)) - try: - query_job = self.bigquery_client.query(query) - if not query_job.done(): - print(query_job.result()) - except: - raise - - - def delete_dep_from_table(self, dep, version): - """ - Remove a dependency record from the table. - Args: - dep, version - """ - query = """DELETE - FROM `{0}.{1}.{2}` - WHERE package_name=\'{3}\' AND version=\'{4}\'""".format(self.project_id, - self.dataset_id, - self.table_id, - dep.strip(), - version.strip()) - logging.info("Deleting dep from table: \n {0}".format(query)) - try: - query_job = self.bigquery_client.query(query) - if not query_job.done(): - print(query_job.result()) - except: - raise - - - def clean_stale_records_from_table(self): - """ - Remove stale records from the table. A record is stale if it is not currently used and the release date is behind 3 - years. - """ - query = """DELETE - FROM `{0}.{1}.{2}` - WHERE release_date < '{3}'""".format(self.project_id, - self.dataset_id, - self.table_id, - datetime.datetime.today().date() - datetime.timedelta(3*365)) - logging.info("Clean Up Starts") - try: - query_job = self.bigquery_client.query(query) - if not query_job.done(): - logging.error(query_job.result()) - except: - raise diff --git a/.test-infra/jenkins/dependency_check/dependency_check_report_generator.py b/.test-infra/jenkins/dependency_check/dependency_check_report_generator.py deleted file mode 100644 index a7f6035e4e2b..000000000000 --- a/.test-infra/jenkins/dependency_check/dependency_check_report_generator.py +++ /dev/null @@ -1,350 +0,0 @@ -#!/usr/bin/env python -# -# 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. -# - -import dependency_check.version_comparer as version_comparer -import logging -import os.path -import re -import requests -import sys -import traceback - -from datetime import datetime -from dependency_check.bigquery_client_utils import BigQueryClientUtils -from dependency_check.report_generator_config import ReportGeneratorConfig -from requests.adapters import HTTPAdapter -from requests.packages.urllib3.util.retry import Retry - - -logging.getLogger().setLevel(logging.INFO) - -class InvalidFormatError(Exception): - def __init__(self, message): - super(InvalidFormatError, self).__init__(message) - - -def extract_results(file_path): - """ - Extract the Java/Python dependency reports and return a collection of out-of-date dependencies. - Args: - file_path: the path of the raw reports - Return: - outdated_deps: a collection of dependencies that has updates - """ - outdated_deps = [] - try: - with open(file_path) as raw_report: - see_oudated_deps = False - for line in raw_report: - if see_oudated_deps: - outdated_deps.append(line) - if line.startswith('The following dependencies have later '): - see_oudated_deps = True - raw_report.close() - return outdated_deps - except: - raise - - -def extract_single_dep(dep): - """ - Extract a single dependency check record from Java and Python reports. - Args: - dep: e.g " - org.assertj:assertj-core [2.5.0 -> 3.10.0]". - Return: - dependency name, current version, latest version. - """ - pattern = " - ([\s\S]*)\[([\s\S]*) -> ([\s\S]*)\]" - match = re.match(pattern, dep) - if match is None: - raise InvalidFormatError("Failed to extract the dependency information: {}".format(dep)) - return match.group(1).strip(), match.group(2).strip(), match.group(3).strip() - - -def prioritize_dependencies(deps, sdk_type): - """ - Extracts and analyze dependency versions and release dates. - Returns a collection of dependencies which is "high priority" in html format: - 1. dependency has major release. e.g org.assertj:assertj-core [2.5.0 -> 3.10.0] - 2. dependency is 3 sub-versions behind the newest one. e.g org.tukaani:xz [1.5 -> 1.8] - 3. dependency has not been updated for more than 6 months. - - Args: - deps: A collection of outdated dependencies. - Return: - high_priority_deps: A collection of dependencies which need to be taken care of before next release. - """ - - project_id = ReportGeneratorConfig.GCLOUD_PROJECT_ID - dataset_id = ReportGeneratorConfig.DATASET_ID - table_id = ReportGeneratorConfig.get_bigquery_table_id(sdk_type) - high_priority_deps = [] - bigquery_client = BigQueryClientUtils(project_id, dataset_id, table_id) - - for dep in deps: - try: - if re.match(r'https?://', dep.lstrip()): - # Gradle-version-plugin's output contains URLs of the libraries - continue - logging.info("\n\nStart processing: " + dep) - dep_name, curr_ver, latest_ver = extract_single_dep(dep) - curr_release_date = None - latest_release_date = None - group_id = None - - if sdk_type == 'Java': - # extract the groupid and artifactid - group_id, artifact_id = dep_name.split(":") - dep_details_url = "{0}/{1}/{2}".format(ReportGeneratorConfig.MAVEN_CENTRAL_URL, group_id, artifact_id) - curr_release_date = find_release_time_from_maven_central(group_id, artifact_id, curr_ver) - latest_release_date = find_release_time_from_maven_central(group_id, artifact_id, latest_ver) - else: - dep_details_url = ReportGeneratorConfig.PYPI_URL + dep_name - curr_release_date = find_release_time_from_python_compatibility_checking_service(dep_name, curr_ver) - latest_release_date = find_release_time_from_python_compatibility_checking_service(dep_name, latest_ver) - - if not curr_release_date or not latest_release_date: - curr_release_date, latest_release_date = query_dependency_release_dates_from_bigquery(bigquery_client, - dep_name, - curr_ver, - latest_ver) - dep_info = """ - {1} - {2} - {3} - {4} - {5}""".format(dep_details_url, - dep_name, - curr_ver, - latest_ver, - curr_release_date, - latest_release_date) - if (version_comparer.compare_dependency_versions(curr_ver, latest_ver) or - compare_dependency_release_dates(curr_release_date, latest_release_date)): - high_priority_deps.append(dep_info) - - except: - traceback.print_exc() - continue - - bigquery_client.clean_stale_records_from_table() - return high_priority_deps - - -def find_release_time_from_maven_central(group_id, artifact_id, version): - """ - Find release dates from Maven Central REST API. - Args: - group_id: - artifact_id: - version: - Return: - release date - """ - url = "http://search.maven.org/solrsearch/select?q=g:{0}+AND+a:{1}+AND+v:{2}".format( - group_id, - artifact_id, - version - ) - logging.info('Finding release date of {0}:{1} {2} from the Maven Central'.format( - group_id, - artifact_id, - version - )) - try: - response = request_session_with_retries().get(url) - if not response.ok: - logging.error("""Failed finding the release date of {0}:{1} {2}. - The response status code is not ok: {3}""".format(group_id, - artifact_id, - version, - str(response.status_code))) - return None - response_data = response.json() - release_timestamp_mills = response_data['response']['docs'][0]['timestamp'] - release_date = datetime.fromtimestamp(release_timestamp_mills/1000).date() - return release_date - except Exception as e: - logging.error("Errors while extracting the release date: " + str(e)) - return None - - -def find_release_time_from_python_compatibility_checking_service(dep_name, version): - """ - Query release dates by using Python compatibility checking service. - Args: - dep_name: - version: - Return: - release date - """ - url = 'http://104.197.8.72/?package={0}=={1}&python-version=2'.format( - dep_name, - version - ) - logging.info('Finding release time of {0} {1} from the python compatibility checking service.'.format( - dep_name, - version - )) - try: - response = request_session_with_retries().get(url) - if not response.ok: - logging.error("""Failed finding the release date of {0} {1}. - The response status code is not ok: {2}""".format(dep_name, - version, - str(response.status_code))) - return None - response_data = response.json() - release_datetime = response_data['dependency_info'][dep_name]['installed_version_time'] - release_date = datetime.strptime(release_datetime, '%Y-%m-%dT%H:%M:%S').date() - return release_date - except Exception as e: - logging.error("Errors while extracting the release date: " + str(e)) - return None - - -def request_session_with_retries(): - """ - Create an http session with retries - """ - session = requests.Session() - retries = Retry(total=3) - session.mount('http://', HTTPAdapter(max_retries=retries)) - session.mount('https://', HTTPAdapter(max_retries=retries)) - return session - - -def query_dependency_release_dates_from_bigquery(bigquery_client, dep_name, curr_ver_in_beam, latest_ver): - """ - Query release dates of current version and the latest version from BQ tables. - Args: - bigquery_client: a bq client object that bundle configurations for API requests - dep_name: dependency name - curr_ver_in_beam: the current version used in beam - latest_ver: the later version - Return: - A tuple that contains `curr_release_date` and `latest_release_date`. - """ - try: - curr_release_date, is_currently_used_bool = bigquery_client.query_dep_info_by_version(dep_name, curr_ver_in_beam) - latest_release_date, _ = bigquery_client.query_dep_info_by_version(dep_name, latest_ver) - date_today = datetime.today().date() - - # sync to the bigquery table on the dependency status of the currently used version. - if not is_currently_used_bool: - currently_used_version_in_db, currently_used_release_date_in_db = bigquery_client.query_currently_used_dep_info_in_db(dep_name) - if currently_used_version_in_db is not None: - bigquery_client.delete_dep_from_table(dep_name, currently_used_version_in_db) - bigquery_client.insert_dep_to_table(dep_name, currently_used_version_in_db, currently_used_release_date_in_db, is_currently_used=False) - if curr_release_date is None: - bigquery_client.insert_dep_to_table(dep_name, curr_ver_in_beam, date_today, is_currently_used=True) - else: - bigquery_client.delete_dep_from_table(dep_name, curr_ver_in_beam) - bigquery_client.insert_dep_to_table(dep_name, curr_ver_in_beam, curr_release_date, is_currently_used=True) - # sync to the bigquery table on the dependency status of the latest version. - if latest_release_date is None: - bigquery_client.insert_dep_to_table(dep_name, latest_ver, date_today, is_currently_used=False) - latest_release_date = date_today - except Exception: - raise - return curr_release_date, latest_release_date - - -def compare_dependency_release_dates(curr_release_date, latest_release_date): - """ - Compare release dates of current using version and the latest version. - Return true if the current version is behind over 60 days. - Args: - curr_release_date - latest_release_date - Return: - boolean - """ - if not curr_release_date or not latest_release_date: - return False - else: - if (latest_release_date - curr_release_date).days >= ReportGeneratorConfig.MAX_STALE_DAYS: - return True - return False - - -def generate_report(sdk_type): - """ - Write SDK dependency check results into a html report. - Args: - sdk_type: String [Java, Python, TODO: Go] - """ - report_name = ReportGeneratorConfig.FINAL_REPORT - raw_report = ReportGeneratorConfig.get_raw_report(sdk_type) - - if os.path.exists(report_name): - append_write = 'a' - else: - append_write = 'w' - - try: - # Extract dependency check results from build/dependencyUpdate - report = open(report_name, append_write) - if os.path.isfile(raw_report): - outdated_deps = extract_results(raw_report) - else: - report.write("Did not find the raw report of dependency check: {}".format(raw_report)) - report.close() - return - - # Prioritize dependencies by comparing versions and release dates. - high_priority_deps = prioritize_dependencies(outdated_deps, sdk_type) - - # Write results to a report - subtitle = "

High Priority Dependency Updates Of Beam {} SDK:

\n".format(sdk_type) - table_fields = """ - {0} - {1} - {2} - {3} - {4} - """.format("Dependency Name", - "Current Version", - "Latest Version", - "Release Date Of the Current Used Version", - "Release Date Of The Latest Release") - report.write(subtitle) - report.write("\n") - report.write(table_fields) - for dep in high_priority_deps: - report.write("%s" % dep) - report.write("
\n") - except Exception as e: - traceback.print_exc() - logging.error("Failed generate the dependency report. " + str(e)) - report.write('

{0}

'.format(str(e))) - - report.close() - logging.info("Dependency check on {0} SDK complete. The report is created.".format(sdk_type)) - -def main(args): - """ - Main method. - Args: - args[0]: type of the check [Java, Python] - """ - generate_report(args[0]) - - -if __name__ == '__main__': - main(sys.argv[1:]) diff --git a/.test-infra/jenkins/dependency_check/dependency_check_report_generator_test.py b/.test-infra/jenkins/dependency_check/dependency_check_report_generator_test.py deleted file mode 100644 index b7b2ec092a4c..000000000000 --- a/.test-infra/jenkins/dependency_check/dependency_check_report_generator_test.py +++ /dev/null @@ -1,134 +0,0 @@ -#!/usr/bin/env python -# -# -# 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 performs testing of scenarios from verify_performance_test_results.py -# - -from __future__ import print_function -import unittest -from mock import patch, mock_open -from datetime import datetime -from .dependency_check_report_generator import prioritize_dependencies - - -_PROJECT_ID = 'mock-apache-beam-testing' -_DATASET_ID = 'mock-beam_dependency_states' -_TABLE_ID = 'mock-java_dependency_states' -_SDK_TYPE = 'Java' - -# initialize current/latest version release dates for low-priority (LP) and high-priority (HP) dependencies -_LP_CURR_VERSION_DATE = datetime.strptime('2000-01-01', '%Y-%m-%d') -_LATEST_VERSION_DATE = datetime.strptime('2000-01-02', '%Y-%m-%d') -_HP_CURR_VERSION_DATE = datetime.strptime('1999-01-01', '%Y-%m-%d') -_MOCKED_OWNERS_FILE = "deps: " - - -@patch('google.cloud.bigquery.Client') -@patch('dependency_check.bigquery_client_utils.BigQueryClientUtils.clean_stale_records_from_table') -class DependencyCheckReportGeneratorTest(unittest.TestCase): - """Tests for `dependency_check_report_generator.py`.""" - - def setUp(self): - print("\n\nTest : " + self._testMethodName) - - - @patch('dependency_check.bigquery_client_utils.BigQueryClientUtils') - def test_empty_dep_input(self, *args): - """ - Test on empty outdated dependencies. - Expect: empty report - """ - with patch('builtins.open', mock_open(read_data=_MOCKED_OWNERS_FILE)): - report = prioritize_dependencies([], _SDK_TYPE) - self.assertEqual(len(report), 0) - - - @patch('dependency_check.dependency_check_report_generator.find_release_time_from_maven_central', - side_effect = [_LP_CURR_VERSION_DATE, _LATEST_VERSION_DATE, - _LP_CURR_VERSION_DATE, _LATEST_VERSION_DATE, - _HP_CURR_VERSION_DATE, _LATEST_VERSION_DATE, - _LP_CURR_VERSION_DATE, _LATEST_VERSION_DATE,]) - def test_normal_dep_input(self, *args): - """ - Test on a normal outdated dependencies set. - Expect: group1:artifact1, group2:artifact2, and group3:artifact3 - """ - deps = [ - " - group1:artifact1 [1.0.0 -> 3.0.0]", - " - group2:artifact2 [1.0.0 -> 1.3.0]", - " - group3:artifact3 [1.0.0 -> 1.1.0]", - " - group4:artifact4 [1.0.0 -> 1.1.0]" - ] - with patch('builtins.open', mock_open(read_data=_MOCKED_OWNERS_FILE)): - report = prioritize_dependencies(deps, _SDK_TYPE) - self.assertEqual(len(report), 3) - self.assertIn('group1:artifact1', report[0]) - self.assertIn('group2:artifact2', report[1]) - self.assertIn('group3:artifact3', report[2]) - - - @patch('dependency_check.dependency_check_report_generator.find_release_time_from_maven_central', - side_effect = [_LP_CURR_VERSION_DATE, - _LATEST_VERSION_DATE,]) - def test_dep_with_nondigit_major_versions(self, *args): - """ - Test on a outdated dependency with non-digit major number. - Expect: group1:artifact1 - """ - deps = [" - group1:artifact1 [Release1-123 -> Release2-456]"] - with patch('builtins.open', mock_open(read_data=_MOCKED_OWNERS_FILE)): - report = prioritize_dependencies(deps, _SDK_TYPE) - self.assertEqual(len(report), 1) - self.assertIn('group1:artifact1', report[0]) - - - @patch('dependency_check.dependency_check_report_generator.find_release_time_from_maven_central', - side_effect = [_LP_CURR_VERSION_DATE, - _LATEST_VERSION_DATE,]) - def test_dep_with_nondigit_minor_versions(self, *args): - """ - Test on a outdated dependency with non-digit minor number. - Expect: group1:artifact1 - """ - deps = [" - group1:artifact1 [0.rc1.0 -> 0.rc2.0]"] - with patch('builtins.open', mock_open(read_data=_MOCKED_OWNERS_FILE)): - report = prioritize_dependencies(deps, _SDK_TYPE) - self.assertEqual(len(report), 1) - self.assertIn('group1:artifact1', report[0]) - - - @patch('dependency_check.dependency_check_report_generator.find_release_time_from_maven_central', - side_effect = [_HP_CURR_VERSION_DATE,_LATEST_VERSION_DATE,]) - def test_invalid_dep_input(self, *args): - """ - Test on a invalid outdated dependencies format. - Expect: Exception through out. And group2:artifact2 is picked. - """ - deps = [ - "- group1:artifact1 (1.0.0, 2.0.0)", - " - group2:artifact2 [1.0.0 -> 2.0.0]" - ] - with patch('builtins.open', mock_open(read_data=_MOCKED_OWNERS_FILE)): - report = prioritize_dependencies(deps, _SDK_TYPE) - self.assertEqual(len(report), 1) - self.assertIn('group2:artifact2', report[0]) - - -if __name__ == '__main__': - unittest.main() - diff --git a/.test-infra/jenkins/dependency_check/generate_report.sh b/.test-infra/jenkins/dependency_check/generate_report.sh deleted file mode 100755 index cfb66ec95199..000000000000 --- a/.test-infra/jenkins/dependency_check/generate_report.sh +++ /dev/null @@ -1,64 +0,0 @@ -#!/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 will be run by Jenkins as a Python dependency test. - -set -e -set -v - -# Get currently used Python version from args or assume a default. -PYTHON=${1:-python3} - -REPORT_DESCRIPTION=" -

A dependency update is high priority if it satisfies one of following criteria:

-
    -
  • It has major versions update available, e.g. org.assertj:assertj-core 2.5.0 -> 3.10.0;
  • -
-
    -
  • It is over 3 minor versions behind the latest version, e.g. org.tukaani:xz 1.5 -> 1.8;
  • -
-
    -
  • The current version is behind the later version for over 180 days, e.g. com.google.auto.service:auto-service 2014-10-24 -> 2017-12-11.
  • -
-

In Beam, we make a best-effort attempt at keeping all dependencies up-to-date. - In the future, issues will be filed and tracked for these automatically, - but in the meantime you can search for existing issues or open a new one. -

-

For more information: Beam Dependency Guide

" - - -# Virtualenv for the rest of the script to run setup -$PYTHON -m venv dependency/check - -. ./dependency/check/bin/activate -pip install --upgrade pip setuptools wheel -pip install --upgrade google-cloud-bigquery google-cloud-bigtable google-cloud-core -rm -f build/dependencyUpdates/beam-dependency-check-report.txt - -# Install packages and run the unit tests of the report generator -pip install mock pyyaml -cd $WORKSPACE/src/.test-infra/jenkins -$PYTHON -m dependency_check.dependency_check_report_generator_test -$PYTHON -m dependency_check.version_comparer_test - -echo "" > $WORKSPACE/src/build/dependencyUpdates/beam-dependency-check-report.html - -$PYTHON -m dependency_check.dependency_check_report_generator Python - -$PYTHON -m dependency_check.dependency_check_report_generator Java - -echo "$REPORT_DESCRIPTION " >> $WORKSPACE/src/build/dependencyUpdates/beam-dependency-check-report.html diff --git a/.test-infra/jenkins/dependency_check/report_generator_config.py b/.test-infra/jenkins/dependency_check/report_generator_config.py deleted file mode 100644 index 18396ee43f8f..000000000000 --- a/.test-infra/jenkins/dependency_check/report_generator_config.py +++ /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. -# -# Defines constants and helper methods used by the dependency_report_generator - -import os - -class ReportGeneratorConfig: - - # Jenkins Working Space - WORKING_SPACE = os.environ['WORKSPACE'] - - # Constants for dependency prioritization - GCLOUD_PROJECT_ID = 'apache-beam-testing' - DATASET_ID = 'beam_dependency_states' - PYTHON_DEP_TABLE_ID = 'python_dependency_states' - JAVA_DEP_TABLE_ID = 'java_dependency_states' - PYTHON_DEP_RAW_REPORT = WORKING_SPACE + '/src/build/dependencyUpdates/python_dependency_report.txt' - JAVA_DEP_RAW_REPORT = WORKING_SPACE + '/src/build/dependencyUpdates/report.txt' - FINAL_REPORT = WORKING_SPACE + '/src/build/dependencyUpdates/beam-dependency-check-report.html' - MAX_STALE_DAYS = 360 - MAX_MINOR_VERSION_DIFF = 3 - PYPI_URL = "https://pypi.org/project/" - MAVEN_CENTRAL_URL = "https://mvnrepository.com/artifact" - - # Dependency Owners - JAVA_DEP_OWNERS = WORKING_SPACE + '/src/ownership/JAVA_DEPENDENCY_OWNERS.yaml' - PYTHON_DEP_OWNERS = WORKING_SPACE + '/src/ownership/PYTHON_DEPENDENCY_OWNERS.yaml' - - - @classmethod - def get_bigquery_table_id(cls, sdk_type): - if sdk_type.lower() == 'java': - return cls.JAVA_DEP_TABLE_ID - elif sdk_type.lower() == 'python': - return cls.PYTHON_DEP_TABLE_ID - else: - raise UndefinedSDKTypeException("""Undefined SDK Type: {0}. - Could not find the BigQuery table for {1} dependencies.""".format(sdk_type, sdk_type)) - - - @classmethod - def get_raw_report(cls, sdk_type): - if sdk_type.lower() == 'java': - return cls.JAVA_DEP_RAW_REPORT - elif sdk_type.lower() == 'python': - return cls.PYTHON_DEP_RAW_REPORT - else: - raise UndefinedSDKTypeException("""Undefined SDK Type: {0}. - Could not find the dependency reports for the {1} SDK.""".format(sdk_type, sdk_type)) - - - @classmethod - def get_owners_file(cls, sdk_type): - if sdk_type.lower() == 'java': - return cls.JAVA_DEP_OWNERS - elif sdk_type.lower() == 'python': - return cls.PYTHON_DEP_OWNERS - else: - raise UndefinedSDKTypeException("""Undefined SDK Type: {0}. - Could not find the Owners file for the {1} SDK.""".format(sdk_type, sdk_type)) - - -class UndefinedSDKTypeException(Exception): - """Indicates an error has occurred in while reading constants.""" - - def __init__(self, msg): - super(UndefinedSDKTypeException, self).__init__(msg) diff --git a/.test-infra/jenkins/dependency_check/version_comparer.py b/.test-infra/jenkins/dependency_check/version_comparer.py deleted file mode 100644 index d8134ecf11d4..000000000000 --- a/.test-infra/jenkins/dependency_check/version_comparer.py +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env python -# -# 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. -# - -from dependency_check.report_generator_config import ReportGeneratorConfig - -def compare_dependency_versions(curr_ver, latest_ver): - """ - Compare the current using version and the latest version. - Return true if a major version change was found, or 3 minor versions that the current version is behind. - Args: - curr_ver - latest_ver - Return: - boolean - """ - if curr_ver is None or latest_ver is None: - return True - else: - curr_ver_splitted = curr_ver.split('.') - latest_ver_splitted = latest_ver.split('.') - curr_major_ver = curr_ver_splitted[0] - latest_major_ver = latest_ver_splitted[0] - # compare major versions - if curr_major_ver != latest_major_ver: - return True - # compare minor versions - else: - curr_minor_ver = curr_ver_splitted[1] if len(curr_ver_splitted) > 1 else None - latest_minor_ver = latest_ver_splitted[1] if len(latest_ver_splitted) > 1 else None - if curr_minor_ver is not None and latest_minor_ver is not None: - if (not curr_minor_ver.isdigit() or not latest_minor_ver.isdigit()) and curr_minor_ver != latest_minor_ver: - return True - elif int(curr_minor_ver) + ReportGeneratorConfig.MAX_MINOR_VERSION_DIFF <= int(latest_minor_ver): - return True - # TODO: Comparing patch versions if needed. - return False diff --git a/.test-infra/jenkins/dependency_check/version_comparer_test.py b/.test-infra/jenkins/dependency_check/version_comparer_test.py deleted file mode 100644 index b37fb5f607a7..000000000000 --- a/.test-infra/jenkins/dependency_check/version_comparer_test.py +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env python -# -# 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. -# - -from . import version_comparer -import unittest - -class VersionComparerTest(unittest.TestCase): - """Tests for `version_comparer.py`.""" - - def setUp(self): - print("\n\nTest : " + self._testMethodName) - - def test_compare_major_verison_true(self): - curr_ver = '1.0.0' - latest_ver = '2.0.0' - self.assertTrue(version_comparer.compare_dependency_versions(curr_ver, latest_ver)) - - def test_compare_minor_version_true(self): - curr_ver = '1.0.0' - latest_ver = '1.3.0' - self.assertTrue(version_comparer.compare_dependency_versions(curr_ver, latest_ver)) - - def test_compare_non_semantic_version_true(self): - curr_ver = '1.rc1' - latest_ver = '1.rc2' - self.assertTrue(version_comparer.compare_dependency_versions(curr_ver, latest_ver)) - - def test_compare_minor_version_false(self): - curr_ver = '1.0.0' - latest_ver = '1.2.0' - self.assertFalse(version_comparer.compare_dependency_versions(curr_ver, latest_ver)) - - def test_compare_same_version_false(self): - curr_ver = '1.0.0' - latest_ver = '1.0.0' - self.assertFalse(version_comparer.compare_dependency_versions(curr_ver, latest_ver)) - -if __name__ == '__main__': - unittest.main() diff --git a/.test-infra/jenkins/job_Dependency_Check.groovy b/.test-infra/jenkins/job_Dependency_Check.groovy deleted file mode 100644 index b80f2610314d..000000000000 --- a/.test-infra/jenkins/job_Dependency_Check.groovy +++ /dev/null @@ -1,73 +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. - */ - -import CommonJobProperties as commonJobProperties - -job('beam_Dependency_Check') { - description('Runs Beam dependency check.') - - // Set common parameters. - commonJobProperties.setTopLevelMainJobProperties( - delegate, 'master', 100, true, 'beam', false) - - // Allows triggering this build against pull requests. - commonJobProperties.enablePhraseTriggeringFromPullRequest( - delegate, - 'Beam Dependency Check', - 'Run Dependency Check', - false - ) - - commonJobProperties.setAutoJob( - delegate, - '@weekly') - - steps { - gradle { - rootBuildScriptDir(commonJobProperties.checkoutDir) - tasks('runBeamDependencyCheck') - commonJobProperties.setGradleSwitches(delegate) - switches('-Drevision=release') - } - - shell('cd ' + commonJobProperties.checkoutDir + - ' && bash .test-infra/jenkins/dependency_check/generate_report.sh ' + - commonJobProperties.PYTHON) - } - - def date = new Date().format('yyyy-MM-dd') - publishers { - extendedEmail { - triggers { - always { - recipientList('dev@beam.apache.org') - contentType('text/html') - subject("Beam Dependency Check Report (${date})") - content('''${FILE, path="src/build/dependencyUpdates/beam-dependency-check-report.html"}''') - } - } - } - archiveArtifacts { - pattern('src/build/dependencyUpdates/beam-dependency-check-report.html') - onlyIfSuccessful() - } - wsCleanup { - excludePattern('src/build/dependencyUpdates/beam-dependency-check-report.html') - } - } -} diff --git a/.test-infra/jenkins/job_PerformanceTests_Python.groovy b/.test-infra/jenkins/job_PerformanceTests_Python.groovy index a2544a098cd4..04c8fc999530 100644 --- a/.test-infra/jenkins/job_PerformanceTests_Python.groovy +++ b/.test-infra/jenkins/job_PerformanceTests_Python.groovy @@ -30,7 +30,7 @@ def dataflowPipelineArgs = [ ] testConfigurations = [] -pythonVersions = ['37'] +pythonVersions = ['38'] for (pythonVersion in pythonVersions) { testConfigurations.add([ diff --git a/.test-infra/jenkins/job_PostCommit_PortableJar_Flink.groovy b/.test-infra/jenkins/job_PostCommit_PortableJar_Flink.groovy index 1332b61ccb04..0c6f51f8be54 100644 --- a/.test-infra/jenkins/job_PostCommit_PortableJar_Flink.groovy +++ b/.test-infra/jenkins/job_PostCommit_PortableJar_Flink.groovy @@ -31,7 +31,7 @@ PostcommitJobBuilder.postCommitJob('beam_PostCommit_PortableJar_Flink', steps { gradle { rootBuildScriptDir(commonJobProperties.checkoutDir) - tasks(':sdks:python:test-suites:portable:py37:testPipelineJarFlinkRunner') + tasks(':sdks:python:test-suites:portable:py38:testPipelineJarFlinkRunner') commonJobProperties.setGradleSwitches(delegate) } } diff --git a/.test-infra/jenkins/job_PostCommit_PortableJar_Spark.groovy b/.test-infra/jenkins/job_PostCommit_PortableJar_Spark.groovy index 93e58af8979a..1f1963a9b2e4 100644 --- a/.test-infra/jenkins/job_PostCommit_PortableJar_Spark.groovy +++ b/.test-infra/jenkins/job_PostCommit_PortableJar_Spark.groovy @@ -31,7 +31,7 @@ PostcommitJobBuilder.postCommitJob('beam_PostCommit_PortableJar_Spark', steps { gradle { rootBuildScriptDir(commonJobProperties.checkoutDir) - tasks(':sdks:python:test-suites:portable:py37:testPipelineJarSparkRunner') + tasks(':sdks:python:test-suites:portable:py38:testPipelineJarSparkRunner') commonJobProperties.setGradleSwitches(delegate) } } diff --git a/.test-infra/jenkins/job_PostCommit_Python_CrossLanguage_Gcp_Dataflow.groovy b/.test-infra/jenkins/job_PostCommit_Python_CrossLanguage_Gcp_Dataflow.groovy index d1676fcae46c..d1ee27088c72 100644 --- a/.test-infra/jenkins/job_PostCommit_Python_CrossLanguage_Gcp_Dataflow.groovy +++ b/.test-infra/jenkins/job_PostCommit_Python_CrossLanguage_Gcp_Dataflow.groovy @@ -32,7 +32,7 @@ PostcommitJobBuilder.postCommitJob('beam_PostCommit_Python_Xlang_Gcp_Dataflow', // Set common parameters. - commonJobProperties.setTopLevelMainJobProperties(delegate) + commonJobProperties.setTopLevelMainJobProperties(delegate, 'master', 180) // Publish all test results to Jenkins diff --git a/.test-infra/jenkins/job_PostCommit_Python_ValidatesRunner_Dataflow.groovy b/.test-infra/jenkins/job_PostCommit_Python_ValidatesRunner_Dataflow.groovy index d93a2fb0984c..db052a0046ce 100644 --- a/.test-infra/jenkins/job_PostCommit_Python_ValidatesRunner_Dataflow.groovy +++ b/.test-infra/jenkins/job_PostCommit_Python_ValidatesRunner_Dataflow.groovy @@ -20,7 +20,7 @@ import CommonJobProperties as commonJobProperties import PostcommitJobBuilder // This job runs the suite of Python ValidatesRunner tests against the -// Dataflow runner. +// Dataflow runner V2. PostcommitJobBuilder.postCommitJob('beam_PostCommit_Py_VR_Dataflow', 'Run Python Dataflow ValidatesRunner', 'Google Cloud Dataflow Runner Python ValidatesRunner Tests', this) { description('Runs Python ValidatesRunner suite on the Dataflow runner.') @@ -37,7 +37,8 @@ PostcommitJobBuilder.postCommitJob('beam_PostCommit_Py_VR_Dataflow', 'Run Python gradle { rootBuildScriptDir(commonJobProperties.checkoutDir) tasks(':sdks:python:test-suites:dataflow:validatesRunnerBatchTests') - switches('-Pdisable_runner_v2_until_v2.50') + tasks(':sdks:python:test-suites:dataflow:validatesRunnerStreamingTests') + switches('-PuseWheelDistribution') commonJobProperties.setGradleSwitches(delegate) } } diff --git a/.test-infra/jenkins/job_PostCommit_Python_ValidatesRunner_Dataflow_V2.groovy b/.test-infra/jenkins/job_PostCommit_Python_ValidatesRunner_Dataflow_V2.groovy deleted file mode 100644 index b4667b908084..000000000000 --- a/.test-infra/jenkins/job_PostCommit_Python_ValidatesRunner_Dataflow_V2.groovy +++ /dev/null @@ -1,46 +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. - */ - -import CommonJobProperties as commonJobProperties -import PostcommitJobBuilder - -// This job runs the suite of Python ValidatesRunner tests against the -// Dataflow runner V2. -PostcommitJobBuilder.postCommitJob('beam_PostCommit_Py_VR_Dataflow_V2', 'Run Python Dataflow V2 ValidatesRunner', - 'Google Cloud Dataflow Runner V2 Python ValidatesRunner Tests', this) { - description('Runs Python ValidatesRunner suite on the Dataflow runner v2.') - - // Set common parameters. - commonJobProperties.setTopLevelMainJobProperties(delegate, 'master', 200) - - publishers { - archiveJunit('**/pytest*.xml') - } - - // Execute gradle task to test Python SDK. - steps { - gradle { - rootBuildScriptDir(commonJobProperties.checkoutDir) - tasks(':sdks:python:test-suites:dataflow:validatesRunnerBatchTestsV2') - tasks(':sdks:python:test-suites:dataflow:validatesRunnerStreamingTestsV2') - switches('-PuseRunnerV2') - switches('-PuseWheelDistribution') - commonJobProperties.setGradleSwitches(delegate) - } - } - } diff --git a/.test-infra/jenkins/job_PreCommit_Whitespace.groovy b/.test-infra/jenkins/job_PreCommit_Whitespace.groovy index 1b8341395a68..0221cf72917d 100644 --- a/.test-infra/jenkins/job_PreCommit_Whitespace.groovy +++ b/.test-infra/jenkins/job_PreCommit_Whitespace.groovy @@ -25,6 +25,7 @@ PrecommitJobBuilder builder = new PrecommitJobBuilder( triggerPathPatterns: [ '.*\\.md$', '.*build\\.gradle$', + '.*build\\.gradle.kts$', ] ) builder.build() diff --git a/.test-infra/jenkins/job_Release_Gradle_Build.groovy b/.test-infra/jenkins/job_Release_Gradle_Build.groovy deleted file mode 100644 index ba3efeca85fe..000000000000 --- a/.test-infra/jenkins/job_Release_Gradle_Build.groovy +++ /dev/null @@ -1,49 +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. - */ - -import CommonJobProperties as commonJobProperties - -// This job runs complete cycle of Gradle build against the official release -// version. Release manager should use this job to verify a release branch -// after cut. -job('beam_Release_Gradle_Build') { - description('Verify Gradle build against the official release version.') - - // Set common parameters. - commonJobProperties - .setTopLevelMainJobProperties( - delegate, - defaultBranch='master', - defaultTimeout=300) - - // Allows triggering this build against pull requests. - commonJobProperties.enablePhraseTriggeringFromPullRequest( - delegate, - 'Release_Build ("Run Release Gradle Build")', - 'Run Release Gradle Build') - - steps { - gradle { - rootBuildScriptDir(commonJobProperties.checkoutDir) - tasks('build') - commonJobProperties.setGradleSwitches(delegate) - switches('-PisRelease') - switches('--stacktrace') - } - } -} diff --git a/.test-infra/metrics/build.gradle b/.test-infra/metrics/build.gradle index 679ecd35735d..ad7dbdb5fd96 100644 --- a/.test-infra/metrics/build.gradle +++ b/.test-infra/metrics/build.gradle @@ -27,7 +27,7 @@ ext { cluster = 'metrics' zone='us-central1-a' projectName='apache-beam-testing' - kubeConfigPath='/home/jenkins/.kube/config' + kubeConfigPath = project.properties['KUBE_CONFIG_PATH'] ?: '/home/jenkins/.kube/config' } applyGroovyNature() diff --git a/.test-infra/metrics/grafana/dashboards/perftests_metrics/Python_WordCount_IT_Benchmarks.json b/.test-infra/metrics/grafana/dashboards/perftests_metrics/Python_WordCount_IT_Benchmarks.json index ef4985531453..02e707b68bdf 100644 --- a/.test-infra/metrics/grafana/dashboards/perftests_metrics/Python_WordCount_IT_Benchmarks.json +++ b/.test-infra/metrics/grafana/dashboards/perftests_metrics/Python_WordCount_IT_Benchmarks.json @@ -224,7 +224,7 @@ "timeFrom": null, "timeRegions": [], "timeShift": null, - "title": "WordCountIT Batch 1Gb Files - py37", + "title": "WordCountIT Batch 1Gb Files - py38", "tooltip": { "shared": true, "sort": 0, diff --git a/.test-infra/metrics/src/test/groovy/ProberTests.groovy b/.test-infra/metrics/src/test/groovy/ProberTests.groovy index 4f6cce7f49da..5a44d4410a93 100644 --- a/.test-infra/metrics/src/test/groovy/ProberTests.groovy +++ b/.test-infra/metrics/src/test/groovy/ProberTests.groovy @@ -27,7 +27,7 @@ import static groovy.test.GroovyAssert.shouldFail */ class ProberTests { // TODO: Make this configurable - def grafanaEndpoint = 'http://104.154.241.245' + def grafanaEndpoint = 'http://35.193.202.176' @Test void PingGrafanaHttpApi() { diff --git a/.test-infra/metrics/sync/jenkins/syncjenkins.py b/.test-infra/metrics/sync/jenkins/syncjenkins.py index d421094c0456..32bbf1fff2e9 100644 --- a/.test-infra/metrics/sync/jenkins/syncjenkins.py +++ b/.test-infra/metrics/sync/jenkins/syncjenkins.py @@ -62,7 +62,7 @@ def fetchJobs(): url = ('https://ci-beam.apache.org/api/json' '?tree=jobs[name,url,lastCompletedBuild[id]]&depth=1') r = requests.get(url) - jobs = r.json()[u'jobs'] + jobs = r.json()['jobs'] result = map(lambda x: (x['name'], int(x['lastCompletedBuild']['id']) if x['lastCompletedBuild'] is not None @@ -122,31 +122,31 @@ def fetchBuildsForJob(jobUrl): f'estimatedDuration,fullDisplayName,actions[{durFields}]') url = f'{jobUrl}api/json?depth=1&tree=builds[{fields}]' r = requests.get(url) - return r.json()[u'builds'] + return r.json()['builds'] def buildRowValuesArray(jobName, build): timings = next((x - for x in build[u'actions'] - if (u'_class' in x) - and (x[u'_class'] == u'jenkins.metrics.impl.TimeInQueueAction')), + for x in build['actions'] + if ('_class' in x) + and (x['_class'] == 'jenkins.metrics.impl.TimeInQueueAction')), None) values = [jobName, - int(build[u'id']), - build[u'url'], - build[u'result'], - datetime.fromtimestamp(build[u'timestamp'] / 1000), - build[u'builtOn'], - build[u'duration'], - build[u'estimatedDuration'], - build[u'fullDisplayName'], - timings[u'blockedDurationMillis'] if timings is not None else -1, - timings[u'buildableDurationMillis'] if timings is not None else -1, - timings[u'buildingDurationMillis'] if timings is not None else -1, - timings[u'executingTimeMillis'] if timings is not None else -1, - timings[u'queuingDurationMillis'] if timings is not None else -1, - timings[u'totalDurationMillis'] if timings is not None else -1, - timings[u'waitingDurationMillis'] if timings is not None else -1] + int(build['id']), + build['url'], + build['result'], + datetime.fromtimestamp(build['timestamp'] / 1000), + build['builtOn'], + build['duration'], + build['estimatedDuration'], + build['fullDisplayName'], + timings['blockedDurationMillis'] if timings is not None else -1, + timings['buildableDurationMillis'] if timings is not None else -1, + timings['buildingDurationMillis'] if timings is not None else -1, + timings['executingTimeMillis'] if timings is not None else -1, + timings['queuingDurationMillis'] if timings is not None else -1, + timings['totalDurationMillis'] if timings is not None else -1, + timings['waitingDurationMillis'] if timings is not None else -1] return values @@ -168,16 +168,16 @@ def fetchNewData(): syncedJobId = syncedJobs[newJobName] if newJobName in syncedJobs else -1 if newJobLastBuildId > syncedJobId: builds = fetchBuildsForJob(newJobUrl) - builds = [x for x in builds if int(x[u'id']) > syncedJobId] + builds = [x for x in builds if int(x['id']) > syncedJobId] connection = initConnection() cursor = connection.cursor() for build in builds: - if build[u'building']: + if build['building']: continue; rowValues = buildRowValuesArray(newJobName, build) - print("inserting", newJobName, build[u'id']) + print("inserting", newJobName, build['id']) insertRow(cursor, rowValues) cursor.close() diff --git a/.test-infra/pipelines/README.md b/.test-infra/pipelines/README.md new file mode 100644 index 000000000000..e2512e6fec65 --- /dev/null +++ b/.test-infra/pipelines/README.md @@ -0,0 +1,34 @@ + + +# Overview + +This directory holds pipelines that support testing infrastructure and are meant for internal use. + +# Infrastructure + +Some pipelines require provisioning of resources prior to execution. See +[infrastructure](infrastructure) for details. + +# Usage + +Pipelines depend on +[Dataflow Flex Templates](https://cloud.google.com/dataflow/docs/guides/templates/using-flex-templates) +for execution. See [infrastructure/04.templates](infrastructure/04.templates) +for details. diff --git a/.test-infra/pipelines/build.gradle b/.test-infra/pipelines/build.gradle new file mode 100644 index 000000000000..84b41b642615 --- /dev/null +++ b/.test-infra/pipelines/build.gradle @@ -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. + */ + +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar + +plugins { + id 'org.apache.beam.module' +} + +applyJavaNature( + exportJavadoc: false, + publish: false, + // ShadowJar has a naming dependency with: + // .test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/template.tf + validateShadowJar: false, + shadowClosure: { + // TODO: determine how to create separate shadowJar tasks for each pipeline + manifest { + attributes 'Main-Class': 'org.apache.beam.testinfra.pipelines.ReadDataflowApiWriteBigQuery' + } + mergeServiceFiles() + archiveVersion = 'latest' + } +) + +description = "Apache Beam :: Test Infra :: Pipelines" +ext.summary = "Various Beam pipelines to support testing" + +def googleCloudEventsVersion = "0.8.1" +def grpcDataflowProtoVersion = "0.17.0" +def ioGrpcApiVersion = "1.53.0" +def jupiterVersion = "5.9.3" +def nettyVersion = "1.53.0" + +dependencies { + implementation enforcedPlatform(library.java.google_cloud_platform_libraries_bom) + implementation library.java.google_api_services_bigquery + implementation library.java.jackson_annotations + implementation library.java.jackson_core + implementation library.java.jackson_databind + implementation library.java.vendored_guava_26_0_jre + implementation library.java.google_auth_library_credentials + implementation library.java.grpc_auth + implementation library.java.protobuf_java + implementation library.java.protobuf_java_util + implementation library.java.joda_time + implementation library.java.slf4j_api + implementation "com.google.api.grpc:proto-google-cloud-dataflow-v1beta3:${grpcDataflowProtoVersion}" + implementation "io.grpc:grpc-api:${ioGrpcApiVersion}" + implementation "io.grpc:grpc-netty:${nettyVersion}" + implementation "com.google.cloud:google-cloudevent-types:${googleCloudEventsVersion}" + implementation 'com.google.api.grpc:grpc-google-cloud-dataflow-v1beta3' + implementation project(":sdks:java:io:google-cloud-platform") + implementation project(":sdks:java:extensions:google-cloud-platform-core") + implementation project(path: ":sdks:java:core", configuration: "shadow") + runtimeOnly project(":runners:google-cloud-dataflow-java") + runtimeOnly project(path: ":runners:direct-java", configuration: "shadow") + + testImplementation(platform("org.junit:junit-bom:${jupiterVersion}")) + testImplementation('org.junit.jupiter:junit-jupiter') + testImplementation project(":sdks:java:extensions:google-cloud-platform-core") + testImplementation library.java.commons_lang3 +} + +test { + useJUnitPlatform() + testLogging { + events "passed", "skipped", "failed" + } +} diff --git a/.test-infra/pipelines/go.mod b/.test-infra/pipelines/go.mod new file mode 100644 index 000000000000..0204d037a4cc --- /dev/null +++ b/.test-infra/pipelines/go.mod @@ -0,0 +1,21 @@ +// 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 module contains all Go code for internal use by .test-infra pipelines. +module github.com/apache/beam/test-infra/pipelines + +go 1.20 + +require github.com/google/go-cmp v0.5.9 // indirect diff --git a/.test-infra/pipelines/go.sum b/.test-infra/pipelines/go.sum new file mode 100644 index 000000000000..62841cdb151d --- /dev/null +++ b/.test-infra/pipelines/go.sum @@ -0,0 +1,2 @@ +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= diff --git a/.test-infra/pipelines/infrastructure/01.setup/.terraform.lock.hcl b/.test-infra/pipelines/infrastructure/01.setup/.terraform.lock.hcl new file mode 100644 index 000000000000..48c94d2fa44b --- /dev/null +++ b/.test-infra/pipelines/infrastructure/01.setup/.terraform.lock.hcl @@ -0,0 +1,40 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/google" { + version = "4.66.0" + hashes = [ + "h1:ykmsArGX1/JTEbqMMUXA9s1H+IdtXnKanl5dh4YsaXo=", + "zh:141cddc714dec246957a47cb4103b34302222fc93a87b64de88116b22ebb0ea1", + "zh:276ebd75cb7c265d12b2c611a5f8d38fd6b892ef3edec1b845a934721db794e5", + "zh:574ae7b4808c1560b5a55a75ca2ad5d8ff6b5fb9dad6dffce3fae7ff8ccf78a9", + "zh:65309953f79827c23cc800fc093619a1e0e51a53e2429e9b04e537a11012f989", + "zh:6d67d3edea47767a873c38f1ff519d4450d8e1189a971bda7b0ffde9c9c65a86", + "zh:7fb116be869e30ee155c27f122d415f34d1d5de735d1fa9c4280cac71a42e8f4", + "zh:8a95ed92bb4547f4a40c953a6bd1db659b739f67adcacd798b11fafaec55ee67", + "zh:94f0179e84eb74823d8be4781b0a15f7f34ee39a7b158075504c882459f1ab23", + "zh:a58a7c5ace957cb4395f4b3bb11687e3a5c79362a744107f16623118cffc9370", + "zh:ab38b66f3c5c00df64c86fb4e47caef8cf451d5ed1f76845fd8b2c59628dc18a", + "zh:cc6bb1799e38912affc2a5b6f1c52b08f286d3751206532c04482b5ca0418eb6", + "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c", + ] +} + +provider "registry.terraform.io/hashicorp/random" { + version = "3.5.1" + hashes = [ + "h1:VSnd9ZIPyfKHOObuQCaKfnjIHRtR7qTw19Rz8tJxm+k=", + "zh:04e3fbd610cb52c1017d282531364b9c53ef72b6bc533acb2a90671957324a64", + "zh:119197103301ebaf7efb91df8f0b6e0dd31e6ff943d231af35ee1831c599188d", + "zh:4d2b219d09abf3b1bb4df93d399ed156cadd61f44ad3baf5cf2954df2fba0831", + "zh:6130bdde527587bbe2dcaa7150363e96dbc5250ea20154176d82bc69df5d4ce3", + "zh:6cc326cd4000f724d3086ee05587e7710f032f94fc9af35e96a386a1c6f2214f", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:b6d88e1d28cf2dfa24e9fdcc3efc77adcdc1c3c3b5c7ce503a423efbdd6de57b", + "zh:ba74c592622ecbcef9dc2a4d81ed321c4e44cddf7da799faa324da9bf52a22b2", + "zh:c7c5cde98fe4ef1143bd1b3ec5dc04baf0d4cc3ca2c5c7d40d17c0e9b2076865", + "zh:dac4bad52c940cd0dfc27893507c1e92393846b024c5a9db159a93c534a3da03", + "zh:de8febe2a2acd9ac454b844a4106ed295ae9520ef54dc8ed2faf29f12716b602", + "zh:eab0d0495e7e711cca367f7d4df6e322e6c562fc52151ec931176115b83ed014", + ] +} diff --git a/.test-infra/pipelines/infrastructure/01.setup/README.md b/.test-infra/pipelines/infrastructure/01.setup/README.md new file mode 100644 index 000000000000..1f11e154cb4a --- /dev/null +++ b/.test-infra/pipelines/infrastructure/01.setup/README.md @@ -0,0 +1,83 @@ + + +# Overview + +This directory sets up the Google Cloud project environment for Dataflow usage. + +# List of all provision GCP resources + +The following table lists all provisioned resources and their rationale. + +| Resource | Reason | +|---------------------------------|--------------------------------------------| +| API services | Required by GCP to provision resources | +| Dataflow Worker Service Account | Use GCP service account other than default | +| Worker IAM Roles | Follow principle of least privilege | +| Artifact Registry Repository | Required to store template artifacts | +| Google Cloud Storage bucket | Required for various storage needs | + +# Usage + +Follow terraform workflow convention to apply this module. It assumes the +working directory is at +[.test-infra/pipelines](../..). + +## Terraform Init + +This module uses a Google Cloud Storage bucket backend. + +Initialize the terraform workspace for the `apache-beam-testing` project: + +``` +DIR=infrastructure/01.setup +terraform -chdir=$DIR init -backend-config=apache-beam-testing.tfbackend +``` + +or for your own Google Cloud project: + +``` +DIR=infrastructure/01.setup +terraform -chdir=$DIR init -backend-config=path/to/your/backend-config-file.tfbackend +``` + +where your `backend-config-file.tfbackend` contains: + +``` +bucket = +``` + +## Terraform Apply + +Notice the `-var-file` flag referencing [common.tfvars](common.tfvars) that +provides opinionated variable defaults. + +For `apache-beam-testing`: + +``` +DIR=infrastructure/01.setup +terraform -chdir=$DIR apply -var-file=common.tfvars -var-file=apache-beam-testing.tfvars +``` + +or for your own Google Cloud project: + +``` +DIR=infrastructure/01.setup +terraform -chdir=$DIR apply -var-file=common.tfvars +``` diff --git a/sdks/python/test-suites/dataflow/py37/build.gradle b/.test-infra/pipelines/infrastructure/01.setup/apache-beam-testing.tfbackend similarity index 68% rename from sdks/python/test-suites/dataflow/py37/build.gradle rename to .test-infra/pipelines/infrastructure/01.setup/apache-beam-testing.tfbackend index 9f89c61e0a20..76be44de6453 100644 --- a/sdks/python/test-suites/dataflow/py37/build.gradle +++ b/.test-infra/pipelines/infrastructure/01.setup/apache-beam-testing.tfbackend @@ -4,21 +4,16 @@ * 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 + * "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, + * 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. */ -apply plugin: org.apache.beam.gradle.BeamModulePlugin -applyPythonNature() - -// Required to setup a Python 3 virtualenv and task names. -pythonVersion = '3.7' -apply from: "../common.gradle" +bucket = "b507e468-52e9-4e72-83e5-ecbf563eda12" diff --git a/.test-infra/pipelines/infrastructure/01.setup/apache-beam-testing.tfvars b/.test-infra/pipelines/infrastructure/01.setup/apache-beam-testing.tfvars new file mode 100644 index 000000000000..ee56a64480c1 --- /dev/null +++ b/.test-infra/pipelines/infrastructure/01.setup/apache-beam-testing.tfvars @@ -0,0 +1,19 @@ +/* + * 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. + */ + +project = "apache-beam-testing" diff --git a/.test-infra/pipelines/infrastructure/01.setup/artifactregistry.tf b/.test-infra/pipelines/infrastructure/01.setup/artifactregistry.tf new file mode 100644 index 000000000000..0fe0644f383d --- /dev/null +++ b/.test-infra/pipelines/infrastructure/01.setup/artifactregistry.tf @@ -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. + */ + +resource "google_artifact_registry_repository" "default" { + description = "Stores artifacts related to github.com/apache/beam/.test-infra/pipelines" + format = "DOCKER" + repository_id = var.artifact_registry_id + location = var.region +} + +resource "google_artifact_registry_repository_iam_member" "dataflow_worker" { + member = "serviceAccount:${google_service_account.dataflow_worker.email}" + repository = google_artifact_registry_repository.default.id + role = "roles/artifactregistry.reader" +} \ No newline at end of file diff --git a/.test-infra/pipelines/infrastructure/01.setup/common.tfvars b/.test-infra/pipelines/infrastructure/01.setup/common.tfvars new file mode 100644 index 000000000000..51a45e7a6cb9 --- /dev/null +++ b/.test-infra/pipelines/infrastructure/01.setup/common.tfvars @@ -0,0 +1,21 @@ +/* + * 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. + */ + +artifact_registry_id = "infra-pipelines" +region = "us-central1" +dataflow_worker_service_account_id = "infra-pipelines-worker" \ No newline at end of file diff --git a/.test-infra/pipelines/infrastructure/01.setup/iam.tf b/.test-infra/pipelines/infrastructure/01.setup/iam.tf new file mode 100644 index 000000000000..23d1e90b8cdc --- /dev/null +++ b/.test-infra/pipelines/infrastructure/01.setup/iam.tf @@ -0,0 +1,37 @@ +/* + * 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. + */ + +// Provision a service account that will be bound to the Dataflow pipeline +resource "google_service_account" "dataflow_worker" { + depends_on = [google_project_service.required_services] + account_id = var.dataflow_worker_service_account_id + display_name = var.dataflow_worker_service_account_id + description = "The service account bound to the compute engine instance provisioned to run Dataflow Jobs" +} + +// Provision IAM roles for the Dataflow runner service account +resource "google_project_iam_member" "dataflow_worker_service_account_roles" { + depends_on = [google_project_service.required_services] + for_each = toset([ + "roles/dataflow.worker", + "roles/dataflow.viewer" + ]) + role = each.key + member = "serviceAccount:${google_service_account.dataflow_worker.email}" + project = var.project +} diff --git a/.test-infra/pipelines/infrastructure/01.setup/provider.tf b/.test-infra/pipelines/infrastructure/01.setup/provider.tf new file mode 100644 index 000000000000..eca4e05b72d2 --- /dev/null +++ b/.test-infra/pipelines/infrastructure/01.setup/provider.tf @@ -0,0 +1,22 @@ +/* + * 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. + */ + +// Setup Google Cloud provider +provider "google" { + project = var.project +} \ No newline at end of file diff --git a/.test-infra/pipelines/infrastructure/01.setup/services.tf b/.test-infra/pipelines/infrastructure/01.setup/services.tf new file mode 100644 index 000000000000..cc303dcac9ec --- /dev/null +++ b/.test-infra/pipelines/infrastructure/01.setup/services.tf @@ -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. + */ + +// Provision the required Google Cloud services +resource "google_project_service" "required_services" { + for_each = toset([ + "artifactregistry", + "bigquery", + "cloudbuild", + "compute", + "dataflow", + "eventarc", + "iam", + "pubsub", + "workflows", + ]) + + service = "${each.key}.googleapis.com" + disable_on_destroy = false +} diff --git a/.test-infra/pipelines/infrastructure/01.setup/state.tf b/.test-infra/pipelines/infrastructure/01.setup/state.tf new file mode 100644 index 000000000000..e09cf6b345c3 --- /dev/null +++ b/.test-infra/pipelines/infrastructure/01.setup/state.tf @@ -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. + */ + +// Partial GCS based terraform backend configuration meant for use with a +// tfbackend file. +terraform { + backend "gcs" { + # bucket configured in *.tfbackend file + prefix = "terraform/state/github.com/apache/beam/.test-infra/pipelines/infrastructure/01.setup" + } +} diff --git a/.test-infra/pipelines/infrastructure/01.setup/storage.tf b/.test-infra/pipelines/infrastructure/01.setup/storage.tf new file mode 100644 index 000000000000..82eb201736af --- /dev/null +++ b/.test-infra/pipelines/infrastructure/01.setup/storage.tf @@ -0,0 +1,43 @@ +/* + * 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. + */ + +// Generate random string to name Storage bucket +resource "random_string" "default" { + length = 8 + special = false + upper = false + lower = true + numeric = true +} + +// Provision Storage Bucket for use by Dataflow Worker as temporary storage +resource "google_storage_bucket" "default" { + location = var.region + name = "infra-pipelines-${random_string.default.result}" + labels = { + purpose = "infra-pipelines" + } + uniform_bucket_level_access = true +} + +// Enable Dataflow Worker Service Account to manage objects in temporary storage +resource "google_storage_bucket_iam_member" "default" { + bucket = google_storage_bucket.default.id + member = "serviceAccount:${google_service_account.dataflow_worker.email}" + role = "roles/storage.objectAdmin" +} diff --git a/.test-infra/pipelines/infrastructure/01.setup/variables.tf b/.test-infra/pipelines/infrastructure/01.setup/variables.tf new file mode 100644 index 000000000000..05d910159b2f --- /dev/null +++ b/.test-infra/pipelines/infrastructure/01.setup/variables.tf @@ -0,0 +1,37 @@ +/* + * 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. + */ + +variable "project" { + type = string + description = "The Google Cloud Platform (GCP) project within which resources are provisioned" +} + +variable "region" { + type = string + description = "The Google Cloud Platform (GCP) region in which to provision resources" +} + +variable "dataflow_worker_service_account_id" { + type = string + description = "The Dataflow Worker Service Account ID" +} + +variable "artifact_registry_id" { + type = string + description = "The ID of the artifact registry repository" +} diff --git a/.test-infra/pipelines/infrastructure/02.network/.terraform.lock.hcl b/.test-infra/pipelines/infrastructure/02.network/.terraform.lock.hcl new file mode 100644 index 000000000000..aa3d8d0039ea --- /dev/null +++ b/.test-infra/pipelines/infrastructure/02.network/.terraform.lock.hcl @@ -0,0 +1,22 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/google" { + version = "4.64.0" + hashes = [ + "h1:e9YVOqH5JQTR0LbT+VkOlJb1pDoZEvzXkqaA0Xsn5Mo=", + "h1:oT2shsj9Mb4dGGwzlbWQPMTGSex6yDtJZcF5xQJ7rdE=", + "zh:097fcb0a45fa41c2476deeb7a9adeadf5142e35e4d1a9eeb7b1720900a06807c", + "zh:177e6e34f10efb5cec16b4106af5aef5240f20c33d91d40f3ea73fdc6ce9a24a", + "zh:3331b0f62f900f8f1447e654a7318f3db03723739ac5dcdc446f1a1b1bf5fd0b", + "zh:39e5a19693f8d598d35968660837d1b55ca82d7c314cd433fd957d1c2a5b6616", + "zh:44d09cb871e7ec242610d84f93367755d0c532f744e5871a032cdba430e39ec7", + "zh:77769c0f8ace0be3f85b702b7d4cc0fd43d89bfbea1493166c4f288338222f0a", + "zh:a83ca3e204a85d1d04ee7a6432fdabc7b7e2ef7f46513b6309d8e30ea9e855a3", + "zh:bbf1e983d24877a690886aacd48085b37c8c61dc65e128707f36b7ae6de11abf", + "zh:c359fcf8694af0ec490a1784575eeb355d6e5a922b225f49d5307a06e9715ad0", + "zh:f0df551e19cf8cc9a021a4148518a610b856a50a55938710837fa55b4fbd252f", + "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c", + "zh:fb171d37178d46d711f3e09107492343f8356c1237bc6df23114920dc23c4528", + ] +} diff --git a/.test-infra/pipelines/infrastructure/02.network/README.md b/.test-infra/pipelines/infrastructure/02.network/README.md new file mode 100644 index 000000000000..56977d6cb014 --- /dev/null +++ b/.test-infra/pipelines/infrastructure/02.network/README.md @@ -0,0 +1,81 @@ + + +# Overview + +This directory provisions Google Cloud project networking for Dataflow usage. + +# List of all provision GCP resources + +The following table lists all provisioned resources and their rationale. + +| resource | reason | +|----------------|---------------------------------------------| +| Network | Run workload in its isolated GCP VPC | +| Subnetwork | Worker needs at least one subnetwork | +| Firewall Rules | Limit traffic to Worker service account VMS | + +# Usage + +Follow terraform workflow convention to apply this module. It assumes the +working directory is at +[.test-infra/pipelines](../..) + +## Terraform Init + +This module uses a Google Cloud Storage bucket backend. + +Initialize the terraform workspace for the `apache-beam-testing` project: + +``` +DIR=infrastructure/02.network +terraform -chdir=$DIR init -backend-config=apache-beam-testing.tfbackend +``` + +or for your own Google Cloud project: + +``` +DIR=infrastructure/02.network +terraform init -backend-config=path/to/your/backend-config-file.tfbackend +``` + +where your `backend-config-file.tfbackend` contains: + +``` +bucket = +``` + +## Terraform Apply + +Notice the `-var-file` flag referencing [common.tfvars](common.tfvars) that +provides opinionated variable defaults. + +For `apache-beam-testing`: + +``` +DIR=infrastructure/02.network +terraform -chdir=$DIR apply -var-file=common.tfvars -var-file=apache-beam-testing.tfvars +``` + +or for your own Google Cloud project: + +``` +DIR=infrastructure/02.network +terraform -chdir=$DIR apply -var-file=common.tfvars +``` diff --git a/.test-infra/pipelines/infrastructure/02.network/apache-beam-testing.tfbackend b/.test-infra/pipelines/infrastructure/02.network/apache-beam-testing.tfbackend new file mode 100644 index 000000000000..76be44de6453 --- /dev/null +++ b/.test-infra/pipelines/infrastructure/02.network/apache-beam-testing.tfbackend @@ -0,0 +1,19 @@ +/* + * 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. + */ + +bucket = "b507e468-52e9-4e72-83e5-ecbf563eda12" diff --git a/.test-infra/pipelines/infrastructure/02.network/apache-beam-testing.tfvars b/.test-infra/pipelines/infrastructure/02.network/apache-beam-testing.tfvars new file mode 100644 index 000000000000..ee56a64480c1 --- /dev/null +++ b/.test-infra/pipelines/infrastructure/02.network/apache-beam-testing.tfvars @@ -0,0 +1,19 @@ +/* + * 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. + */ + +project = "apache-beam-testing" diff --git a/.test-infra/pipelines/infrastructure/02.network/common.tfvars b/.test-infra/pipelines/infrastructure/02.network/common.tfvars new file mode 100644 index 000000000000..5263bd82abfa --- /dev/null +++ b/.test-infra/pipelines/infrastructure/02.network/common.tfvars @@ -0,0 +1,22 @@ +/* + * 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. + */ + +region = "us-central1" +dataflow_worker_service_account_id = "infra-pipelines-worker" +network_name_base = "infra-pipelines" +subnetwork_cidr_range = "10.0.0.0/24" diff --git a/.test-infra/pipelines/infrastructure/02.network/data.tf b/.test-infra/pipelines/infrastructure/02.network/data.tf new file mode 100644 index 000000000000..8cb074ab2981 --- /dev/null +++ b/.test-infra/pipelines/infrastructure/02.network/data.tf @@ -0,0 +1,22 @@ +/* + * 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. + */ + +// Query the Dataflow Worker Service Account +data "google_service_account" "dataflow_worker" { + account_id = var.dataflow_worker_service_account_id +} diff --git a/.test-infra/pipelines/infrastructure/02.network/network.tf b/.test-infra/pipelines/infrastructure/02.network/network.tf new file mode 100644 index 000000000000..8abd62aa2afa --- /dev/null +++ b/.test-infra/pipelines/infrastructure/02.network/network.tf @@ -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. + */ + +// Provision virtual custom network +resource "google_compute_network" "default" { + name = var.network_name_base + auto_create_subnetworks = false +} + +// Provision subnetwork of the virtual custom network +resource "google_compute_subnetwork" "default" { + name = var.network_name_base + ip_cidr_range = var.subnetwork_cidr_range + network = google_compute_network.default.name + private_ip_google_access = true + region = var.region +} + +// Provision firewall rule for internal network traffic. +resource "google_compute_firewall" "default" { + name = "allow-data-pipelines-internal" + network = google_compute_network.default.name + + allow { + protocol = "tcp" + } + + source_service_accounts = [ + data.google_service_account.dataflow_worker.email + ] +} diff --git a/sdks/python/container/py37/build.gradle b/.test-infra/pipelines/infrastructure/02.network/provider.tf similarity index 71% rename from sdks/python/container/py37/build.gradle rename to .test-infra/pipelines/infrastructure/02.network/provider.tf index 547163a3514e..e070d8408d96 100644 --- a/sdks/python/container/py37/build.gradle +++ b/.test-infra/pipelines/infrastructure/02.network/provider.tf @@ -4,25 +4,19 @@ * 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 + * "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, + * 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 'base' - id 'org.apache.beam.module' +// Setup Google Cloud provider +provider "google" { + project = var.project } -applyDockerNature() -applyPythonNature() - -pythonVersion = '3.7' - -apply from: "../common.gradle" diff --git a/.test-infra/pipelines/infrastructure/02.network/state.tf b/.test-infra/pipelines/infrastructure/02.network/state.tf new file mode 100644 index 000000000000..cffe530cf903 --- /dev/null +++ b/.test-infra/pipelines/infrastructure/02.network/state.tf @@ -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. + */ + +// Partial GCS based terraform backend configuration meant for use with a +// tfbackend file. +terraform { + backend "gcs" { + # bucket configured in *.tfbackend file + prefix = "terraform/state/github.com/apache/beam/.test-infra/pipelines/infrastructure/02.network" + } +} diff --git a/.test-infra/pipelines/infrastructure/02.network/variables.tf b/.test-infra/pipelines/infrastructure/02.network/variables.tf new file mode 100644 index 000000000000..de53c845dc65 --- /dev/null +++ b/.test-infra/pipelines/infrastructure/02.network/variables.tf @@ -0,0 +1,42 @@ +/* + * 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. + */ + +variable "project" { + type = string + description = "The Google Cloud Platform (GCP) project within which resources are provisioned" +} + +variable "region" { + type = string + description = "The Google Cloud Platform (GCP) region in which to provision resources" +} + +variable "dataflow_worker_service_account_id" { + type = string + description = "The Dataflow Worker Service Account ID" +} + +variable "network_name_base" { + type = string + description = "The name of the Google Cloud Platform (GCP) name basis from which we name network related resources" +} + +variable "subnetwork_cidr_range" { + type = string + description = "The address range for this subnet, in CIDR notation. Use a standard private VPC network address range: for example, 10.0.0.0/9." +} diff --git a/.test-infra/pipelines/infrastructure/03.io/README.md b/.test-infra/pipelines/infrastructure/03.io/README.md new file mode 100644 index 000000000000..f72fe07c1bbf --- /dev/null +++ b/.test-infra/pipelines/infrastructure/03.io/README.md @@ -0,0 +1,24 @@ + + +# Overview + +This directory holds different terraform modules to provision resources required +for different pipeline needs. +See subdirectories for more details. diff --git a/.test-infra/pipelines/infrastructure/03.io/api-overuse-study/02.redis/README.md b/.test-infra/pipelines/infrastructure/03.io/api-overuse-study/02.redis/README.md new file mode 100644 index 000000000000..9ea3a98ee777 --- /dev/null +++ b/.test-infra/pipelines/infrastructure/03.io/api-overuse-study/02.redis/README.md @@ -0,0 +1,46 @@ + + +# Overview + +This directory provisions a redis cluster in Kubernetes. + +# Usage + +Follow terraform workflow convention to apply this module. It assumes the +working directory is at +[.test-infra/pipelines/infrastructure/03.io/api-overuse-study](..). + +## Terraform Init + +Initialize the terraform workspace. + +``` +DIR=02.redis +terraform -chdir=$DIR init +``` + +## Terraform Apply + +Apply the terraform module. + +``` +DIR=02.redis +terraform -chdir=$DIR apply -var-file=common.tfvars +``` \ No newline at end of file diff --git a/.test-infra/pipelines/infrastructure/03.io/api-overuse-study/02.redis/common.tfvars b/.test-infra/pipelines/infrastructure/03.io/api-overuse-study/02.redis/common.tfvars new file mode 100644 index 000000000000..f71b496b5a20 --- /dev/null +++ b/.test-infra/pipelines/infrastructure/03.io/api-overuse-study/02.redis/common.tfvars @@ -0,0 +1,19 @@ +/* + * 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. + */ + +namespace = "api-overuse-study" \ No newline at end of file diff --git a/.test-infra/pipelines/infrastructure/03.io/api-overuse-study/02.redis/data.tf b/.test-infra/pipelines/infrastructure/03.io/api-overuse-study/02.redis/data.tf new file mode 100644 index 000000000000..32cb7434d300 --- /dev/null +++ b/.test-infra/pipelines/infrastructure/03.io/api-overuse-study/02.redis/data.tf @@ -0,0 +1,24 @@ +/* + * 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. + */ + +// Query the Kubernetes namespace to verify existence. +data "kubernetes_namespace" "default" { + metadata { + name = var.namespace + } +} \ No newline at end of file diff --git a/plugins/beam-code-completion-plugin/src/test/java/BeamCompletionContributorTestcase.java b/.test-infra/pipelines/infrastructure/03.io/api-overuse-study/02.redis/provider.tf similarity index 76% rename from plugins/beam-code-completion-plugin/src/test/java/BeamCompletionContributorTestcase.java rename to .test-infra/pipelines/infrastructure/03.io/api-overuse-study/02.redis/provider.tf index 630ed795caa2..20bdbac74ea2 100644 --- a/plugins/beam-code-completion-plugin/src/test/java/BeamCompletionContributorTestcase.java +++ b/.test-infra/pipelines/infrastructure/03.io/api-overuse-study/02.redis/provider.tf @@ -16,12 +16,12 @@ * limitations under the License. */ - -import com.intellij.testFramework.fixtures.BasePlatformTestCase; -import org.junit.Assert; - -public class BeamCompletionContributorTestcase extends BasePlatformTestCase { - public void testAutoPopupCompletions() { - Assert.assertEquals(2,2); - } +provider "kubernetes" { + config_path = "~/.kube/config" } + +provider "helm" { + kubernetes { + config_path = "~/.kube/config" + } +} \ No newline at end of file diff --git a/.test-infra/pipelines/infrastructure/03.io/api-overuse-study/02.redis/redis.tf b/.test-infra/pipelines/infrastructure/03.io/api-overuse-study/02.redis/redis.tf new file mode 100644 index 000000000000..93b74a28782e --- /dev/null +++ b/.test-infra/pipelines/infrastructure/03.io/api-overuse-study/02.redis/redis.tf @@ -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. + */ + +// Spin up a Redis cluster within the Kubernetes cluster using the bitami +// helm chart. +resource "helm_release" "redis" { + wait = false + repository = "https://charts.bitnami.com/bitnami" + chart = "redis" + name = "redis" + namespace = data.kubernetes_namespace.default.metadata[0].name + set { + name = "auth.enabled" + value = false + } + set { + name = "auth.sentinel" + value = false + } +} \ No newline at end of file diff --git a/.test-infra/pipelines/infrastructure/03.io/api-overuse-study/02.redis/variables.tf b/.test-infra/pipelines/infrastructure/03.io/api-overuse-study/02.redis/variables.tf new file mode 100644 index 000000000000..b55ce279654a --- /dev/null +++ b/.test-infra/pipelines/infrastructure/03.io/api-overuse-study/02.redis/variables.tf @@ -0,0 +1,22 @@ +/* + * 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. + */ + +variable "namespace" { + type = string + description = "The Kubernetes namespace" +} \ No newline at end of file diff --git a/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/.terraform.lock.hcl b/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/.terraform.lock.hcl new file mode 100644 index 000000000000..b427fc0d2a5d --- /dev/null +++ b/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/.terraform.lock.hcl @@ -0,0 +1,21 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/google" { + version = "4.65.2" + hashes = [ + "h1:cnZqZeDJdQzW+JvJ+yCzM5h2dAyZt85Srugts7ymqzc=", + "zh:00152f7b8882ed26502965d60a7c1fc897f59db43ee483b4fbdf1bc3387ea2ea", + "zh:4db0f1ed8df34628808de27ea3f2747323ddac3d1919c6e1a9a54a437a93f809", + "zh:5f34a52fa2708350f4b31a325cf2a231327d0d54002bb62f689d3d095927ae9f", + "zh:804d2c73dd09362f6218075a8729c0bab2250f78b24638d683e8a292c076eccc", + "zh:91a4fa7b890d99e5b5a285028c8707c57d6562c3d14230d3ce426a5087a1099a", + "zh:a3eee907fd007348d518074670a894a656fdb2e7f3c27d7a00d2350eea9cbae6", + "zh:c4c32d40cffc780aa3ff1f996110462eca594186f8acd7ca0238b7990d8e7508", + "zh:ccd072f8f9c74d0e18baf8a09d64660924bb34c5f071e8480d1d91440ce3e434", + "zh:dcadca9ab46f8202d8a76b65ab4f5c8167c43bdeb6f149586a67718c3bef6185", + "zh:e38514a5ba4f5acb0e95b6babd953ca5192616c9f9fbe2da4cdf83c3a07468d3", + "zh:edbe487cfb51a9605c097eab47000f9cc92b9dbdeec55b3fbb048b714cf26031", + "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c", + ] +} diff --git a/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/README.md b/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/README.md new file mode 100644 index 000000000000..612a164399c6 --- /dev/null +++ b/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/README.md @@ -0,0 +1,86 @@ + + +# Overview + +This directory holds terraform code to provision resources that +[org.apache.beam.testinfra.pipelines.ReadDataflowApiWriteBigQuery](../../../src/main/java/org/apache/beam/testinfra/pipelines/ReadDataflowApiWriteBigQuery.java) +reads from and writes to. + +# List of all provision GCP resources + +The following lists all provisioned resources and their rationale +categorized by GCP service. + +| resource | reason | +|-----------------------------|-------------------------------------------------------| +| Eventarc Workflow | Intended for listening to Dataflow Status Changes | +| Pub/Sub topic | Required for Eventarc Workflow | +| Pub/Sub subscription | Intended as a source; subscribes to Eventarc Workflow | +| Google Cloud Storage Bucket | Intended for temporary storage | +| BigQuery Datasets | Intended as sink | + +# Usage + +Follow terraform workflow convention to apply this module. It assumes the +working directory is at +[.test-infra/pipelines](../../..) + +## Terraform Init + +This module uses a Google Cloud Storage bucket backend. + +Initialize the terraform workspace for the `apache-beam-testing` project: + +``` +DIR=infrastructure/03.io/dataflow-to-bigquery +terraform -chdir=$DIR init -backend-config=apache-beam-testing.tfbackend +``` + +or for your own Google Cloud project: + +``` +DIR=infrastructure/03.io/dataflow-to-bigquery +terraform init -backend-config=path/to/your/backend-config-file.tfbackend +``` + +where your `backend-config-file.tfbackend` contains: + +``` +bucket = +``` + +## Terraform Apply + +Notice the `-var-file` flag referencing [common.tfvars](common.tfvars) that +provides opinionated variable defaults. + +For `apache-beam-testing`: + +``` +DIR=infrastructure/03.io/dataflow-to-bigquery +terraform -chdir=$DIR apply -var-file=common.tfvars -var-file=apache-beam-testing.tfvars +``` + +or for your own Google Cloud project: + +``` +DIR=infrastructure/03.io/dataflow-to-bigquery +terraform -chdir=$DIR apply -var-file=common.tfvars +``` diff --git a/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/apache-beam-testing.tfbackend b/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/apache-beam-testing.tfbackend new file mode 100644 index 000000000000..76be44de6453 --- /dev/null +++ b/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/apache-beam-testing.tfbackend @@ -0,0 +1,19 @@ +/* + * 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. + */ + +bucket = "b507e468-52e9-4e72-83e5-ecbf563eda12" diff --git a/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/apache-beam-testing.tfvars b/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/apache-beam-testing.tfvars new file mode 100644 index 000000000000..ee56a64480c1 --- /dev/null +++ b/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/apache-beam-testing.tfvars @@ -0,0 +1,19 @@ +/* + * 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. + */ + +project = "apache-beam-testing" diff --git a/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/bigquery.tf b/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/bigquery.tf new file mode 100644 index 000000000000..1b11ab799281 --- /dev/null +++ b/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/bigquery.tf @@ -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. + */ + +// Provision BigQuery dataset sink to store Dataflow API Job data +resource "google_bigquery_dataset" "sink" { + dataset_id = replace(var.workflow_resource_name_base, "-", "_") + description = "Stores Dataflow API Jobs data" +} + +// Provision IAM roles to write to BigQuery sink +resource "google_bigquery_dataset_iam_member" "dataflow_worker_roles" { + dataset_id = google_bigquery_dataset.sink.dataset_id + member = "serviceAccount:${data.google_service_account.dataflow_worker.email}" + role = "roles/bigquery.dataEditor" +} diff --git a/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/common.tfvars b/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/common.tfvars new file mode 100644 index 000000000000..1f6b731240f1 --- /dev/null +++ b/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/common.tfvars @@ -0,0 +1,22 @@ +/* + * 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. + */ + +region = "us-central1" +eventarc_workflow_service_account_id = "eventarc-workflow-sa" +dataflow_worker_service_account_id = "infra-pipelines-worker" +workflow_resource_name_base = "dataflow-job-v1beta3-status-changed" diff --git a/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/data.tf b/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/data.tf new file mode 100644 index 000000000000..19b50a00aa49 --- /dev/null +++ b/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/data.tf @@ -0,0 +1,27 @@ +/* + * 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. + */ + +// Query the Dataflow Worker service account +data "google_service_account" "dataflow_worker" { + account_id = var.dataflow_worker_service_account_id +} + +// Query the GCP project. Needed to acquire the project number. +data "google_project" "default" { + project_id = var.project +} diff --git a/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/iam.tf b/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/iam.tf new file mode 100644 index 000000000000..199ccde1cdb6 --- /dev/null +++ b/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/iam.tf @@ -0,0 +1,41 @@ +/* + * 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. + */ + +// Provision Eventarc and Workflow service account +resource "google_service_account" "default" { + account_id = var.eventarc_workflow_service_account_id + description = "Executes and processes Eventarc and Workflows" +} + +// Add IAM roles to Eventarc and Workflow service account +resource "google_project_iam_member" "default" { + for_each = toset([ + "roles/pubsub.publisher", + "roles/workflows.invoker", + "roles/eventarc.eventReceiver", + ]) + member = "serviceAccount:${google_service_account.default.email}" + role = each.key + project = var.project +} + +resource "google_project_iam_member" "gcp-sa-pubsub" { + member = "serviceAccount:service-${data.google_project.default.number}@gcp-sa-pubsub.iam.gserviceaccount.com" + project = var.project + role = "roles/iam.serviceAccountTokenCreator" +} diff --git a/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/provider.tf b/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/provider.tf new file mode 100644 index 000000000000..bbbdd5d5f9e6 --- /dev/null +++ b/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/provider.tf @@ -0,0 +1,21 @@ +/* + * 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. + */ + +provider "google" { + project = var.project +} \ No newline at end of file diff --git a/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/pubsub.tf b/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/pubsub.tf new file mode 100644 index 000000000000..dad4af934abf --- /dev/null +++ b/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/pubsub.tf @@ -0,0 +1,39 @@ +/* + * 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. + */ + +// Provision a Pub/Sub topic to forward Eventarc Workflow event payloads +resource "google_pubsub_topic" "workflow_topic" { + name = var.workflow_resource_name_base +} + +// Provision a Pub/Sub subscription to the Eventarc Workflow event topic +resource "google_pubsub_subscription" "source" { + name = "${var.workflow_resource_name_base}-sub" + topic = google_pubsub_topic.workflow_topic.name +} + +// Allow Dataflow Worker Service Account to subscribe to Pub/Sub subscription +resource "google_pubsub_subscription_iam_member" "source" { + for_each = toset([ + "roles/pubsub.viewer", + "roles/pubsub.subscriber", + ]) + member = "serviceAccount:${data.google_service_account.dataflow_worker.email}" + role = each.key + subscription = google_pubsub_subscription.source.id +} diff --git a/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/state.tf b/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/state.tf new file mode 100644 index 000000000000..ad0b0d1d4bab --- /dev/null +++ b/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/state.tf @@ -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. + */ + +// Partial GCS based terraform backend configuration meant for use with a +// tfbackend file. +terraform { + backend "gcs" { + # bucket configured in *.tfbackend file + prefix = "terraform/state/github.com/apache/beam/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery" + } +} diff --git a/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/variables.tf b/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/variables.tf new file mode 100644 index 000000000000..f1937f95ec45 --- /dev/null +++ b/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/variables.tf @@ -0,0 +1,42 @@ +/* + * 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. + */ + +variable "project" { + type = string + description = "The Google Cloud Platform (GCP) project within which resources are provisioned" +} + +variable "region" { + type = string + description = "The Google Cloud Platform (GCP) region in which to provision resources" +} + +variable "workflow_resource_name_base" { + type = string + description = "The basis to derive of GCP Workflow related resource names such as Pub/Sub and the Workflow itself" +} + +variable "eventarc_workflow_service_account_id" { + type = string + description = "The Eventarc Workflow Service Account ID" +} + +variable "dataflow_worker_service_account_id" { + type = string + description = "The Dataflow Worker Service Account ID" +} diff --git a/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/workflow.tf b/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/workflow.tf new file mode 100644 index 000000000000..4b3b214fa38b --- /dev/null +++ b/.test-infra/pipelines/infrastructure/03.io/dataflow-to-bigquery/workflow.tf @@ -0,0 +1,67 @@ +/* + * 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. + */ + +// Creates a GCP Eventarc trigger matching Dataflow Job Status Changed events +// See the following resources for more details: +// https://cloud.google.com/eventarc +// https://cloud.google.com/eventarc/docs/reference/supported-events +resource "google_eventarc_trigger" "default" { + depends_on = [google_project_iam_member.default] + location = var.region + name = var.workflow_resource_name_base + service_account = google_service_account.default.email + + matching_criteria { + attribute = "type" + // matches 'type' property of the following command's output: + // gcloud eventarc providers describe dataflow.googleapis.com --location=us-central1 + value = "google.cloud.dataflow.job.v1beta3.statusChanged" + } + + destination { + workflow = google_workflows_workflow.default.id + } +} + +// Provisions a Workflow to which Dataflow Job Status Eventarc events are sent +// Forwards event payload to PubSub. See the following for the expected schema: +// https://github.com/googleapis/google-cloudevents/tree/main/proto/google/events/cloud/dataflow +resource "google_workflows_workflow" "default" { + depends_on = [google_project_iam_member.default] + name = var.workflow_resource_name_base + description = "Consumes Dataflow Job Status Eventarc events and publishes to Pub/Sub" + region = var.region + service_account = google_service_account.default.email + source_contents = < + +# Overview + +This directory holds terraform code to build the +[org.apache.beam.testinfra.pipelines.ReadDataflowApiWriteBigQuery](../../../src/main/java/org/apache/beam/testinfra/pipelines/ReadDataflowApiWriteBigQuery.java) +pipeline for use as a [Dataflow Flex Template](https://cloud.google.com/dataflow/docs/guides/templates/using-flex-templates). + +# Why terraform? + +As of this README's writing, there is no resource block for the Google Cloud +terraform provider to provision Dataflow Templates. Therefore, this solution +makes use of the +[null_resource](https://registry.terraform.io/providers/hashicorp/null/latest/docs/resources/resource) +along with the +[local-exec](https://developer.hashicorp.com/terraform/language/resources/provisioners/local-exec) +provisioner. + +The benefit of using terraform is that it provides clean resource lookups, +within its workflow, known to make submitting the Dataflow job +cumbersome through other means, such as through a gradle command, bash script, +etc. + +# Usage + +Follow terraform workflow convention to apply this module. It assumes the +working directory is at +[.test-infra/pipelines](../../..) + +This module does not use a state backend. + +Notice the `-var-file` flag referencing [common.tfvars](common.tfvars) that +provides opinionated variable defaults. + +For `apache-beam-testing`: + +``` +DIR=infrastructure/04.template/dataflow-to-bigquery +terraform -chdir=$DIR init +terraform -chdir=$DIR apply -var-file=common.tfvars -var-file=apache-beam-testing.tfvars +``` + +or for your own Google Cloud project: + +``` +DIR=infrastructure/04.template/dataflow-to-bigquery +terraform -chdir=$DIR init +terraform -chdir=$DIR apply -var-file=common.tfvars +``` diff --git a/.test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/apache-beam-testing.tfvars b/.test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/apache-beam-testing.tfvars new file mode 100644 index 000000000000..289150180c01 --- /dev/null +++ b/.test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/apache-beam-testing.tfvars @@ -0,0 +1,20 @@ +/* + * 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. + */ + +project = "apache-beam-testing" +storage_bucket_name = "infra-pipelines-19brjqq5" diff --git a/.test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/common.tfvars b/.test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/common.tfvars new file mode 100644 index 000000000000..a3ea620c47bc --- /dev/null +++ b/.test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/common.tfvars @@ -0,0 +1,24 @@ +/* + * 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. + */ + +artifact_registry_id = "infra-pipelines" +dataflow_worker_service_account_id = "infra-pipelines-worker" +gradle_project = ":beam-test-infra-pipelines" +network_name_base = "infra-pipelines" +region = "us-central1" +template_image_prefix = "dataflow-to-bigquery" diff --git a/.test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/data.tf b/.test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/data.tf new file mode 100644 index 000000000000..9df9b360e316 --- /dev/null +++ b/.test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/data.tf @@ -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. + */ + +// Query the Artifact Registry repository. +data "google_artifact_registry_repository" "default" { + location = var.region + repository_id = var.artifact_registry_id +} + +// Query the Dataflow Worker service account. +data "google_service_account" "dataflow_worker" { + account_id = var.dataflow_worker_service_account_id +} + +// Query the GCP project. +data "google_project" "default" { + project_id = var.project +} + +// Query the GCP Network. +data "google_compute_network" "default" { + name = var.network_name_base +} + +// Query the GCP Subnetwork. +data "google_compute_subnetwork" "default" { + region = var.region + name = var.network_name_base +} + +// Query the Storage bucket. +data "google_storage_bucket" "default" { + name = var.storage_bucket_name +} + +locals { + template_file_gcs_path = "gs://${data.google_storage_bucket.default.name}/templates/dataflow-to-bigquery.json" +} diff --git a/.test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/dataflow-template.json b/.test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/dataflow-template.json new file mode 100644 index 000000000000..8d9e7ab64e06 --- /dev/null +++ b/.test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/dataflow-template.json @@ -0,0 +1,20 @@ +{ + "description": "Reads from Dataflow Eventarc Pub/Sub Channel and writes to Big/Query", + "name": "Dataflow Jobs data to Big/Query", + "parameters": [ + { + "name": "subscription", + "helpText": "Format: projects/project/subscriptions/subscription. The source Pub/Sub subscription to receive Eventarc events.", + "isOptional": false, + "label": "Pub/Sub Eventarc Subscription", + "paramType": "TEXT" + }, + { + "name": "dataset", + "helpText": "Format: project.dataset. The BigQuery dataset to which to write Dataflow Jobs data.", + "isOptional": false, + "label": "BigQuery Dataset", + "paramType": "TEXT" + } + ] +} \ No newline at end of file diff --git a/.test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/output.tf b/.test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/output.tf new file mode 100644 index 000000000000..1ad90b21d31a --- /dev/null +++ b/.test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/output.tf @@ -0,0 +1,22 @@ +/* + * 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. + */ + +// Output the path to the generated Dataflow Template File GCS path. +output "template_file_gcs_path" { + value = local.template_file_gcs_path +} diff --git a/.test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/provider.tf b/.test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/provider.tf new file mode 100644 index 000000000000..208d543f1ee8 --- /dev/null +++ b/.test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/provider.tf @@ -0,0 +1,21 @@ +/* + * 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. + */ + +provider "google" { + project = var.project +} diff --git a/.test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/template.tf b/.test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/template.tf new file mode 100644 index 000000000000..9a1296091c57 --- /dev/null +++ b/.test-infra/pipelines/infrastructure/04.template/dataflow-to-bigquery/template.tf @@ -0,0 +1,58 @@ +/* + * 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. + */ + +locals { + beam_root = "${path.module}/../../../../.." +} + +// Builds the Shadow jar via the gradle command. +resource "null_resource" "shadowjar" { + triggers = { + id = uuid() + } + provisioner "local-exec" { + working_dir = local.beam_root + command = "./gradlew ${var.gradle_project}:shadowJar" + } +} + +// Builds the Dataflow Flex template by invoking the gcloud command. +resource "null_resource" "build_template" { + triggers = { + id = uuid() + } + depends_on = [null_resource.shadowjar] + provisioner "local-exec" { + command = < + +# Overview + +This directory holds all the terraform modules for setting up the Google Cloud +(GCP) resources necessary to executing [:beam-test-infra-pipelines](../) +pipelines using the Dataflow runner. + +# Code organization + +Folders are named according to recommended order of execution. For example, +[01.setup](01.setup) is intended to be used prior to [02.network](02.network). + +# Common Terraform Modules + +The following terraform modules apply to all executable +[:beam-test-infra-pipelines](../) pipelines. + +| Path | Purpose | +|--------------------------|-------------------| +| [01.setup](01.setup) | Setup GCP project | +| [02.network](02.network) | Provision network | + +# Specific Terraform Modules + +The following modules apply to specific pipelines. When creating a new +executable pipeline and its supported terraform, please consider updating this +documentation. + +## org.apache.beam.testinfra.pipelines.ReadDataflowApiWriteBigQuery + +The following modules provision resources related to +[`org.apache.beam.testinfra.pipelines.ReadDataflowApiWriteBigQuery`](../src/main/java/org/apache/beam/testinfra/pipelines/ReadDataflowApiWriteBigQuery.java). + +| Path | Purpose | Required/Optional | +|----------------------------------------------------------------------|--------------------------------------------------------------------------|-------------------| +| [03.io/dataflow-to-bigquery](03.io/dataflow-to-bigquery) | Provisions resources to read from the Dataflow API and write to BigQuery | required | +| [04.template/dataflow-to-bigquery](04.template/dataflow-to-bigquery) | Builds a Dataflow Flex Template that executes the pipelines | optional | + +Therefore, to run +[`org.apache.beam.testinfra.pipelines.ReadDataflowApiWriteBigQuery`](../src/main/java/org/apache/beam/testinfra/pipelines/ReadDataflowApiWriteBigQuery.java), +apply the following recommended order of terraform modules. See their respective +READMEs for more details. + +1. [01.setup](01.setup) +2. [02.network](02.network) +3. [03.io/dataflow-to-bigquery](03.io/dataflow-to-bigquery) +4. [04.template/dataflow-to-bigquery](04.template/dataflow-to-bigquery) (_if you want to use Dataflow Flex Templates_) diff --git a/.test-infra/pipelines/src/main/go/internal/environment/variable.go b/.test-infra/pipelines/src/main/go/internal/environment/variable.go new file mode 100644 index 000000000000..1e81a2e2ce83 --- /dev/null +++ b/.test-infra/pipelines/src/main/go/internal/environment/variable.go @@ -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 environment provides helpers for interacting with environment variables. +package environment + +import ( + "fmt" + "os" + "strings" +) + +// Variable defines an environment variable via a string type alias. +// Variable's string defaultValue assigns the system environment variable key. +type Variable string + +// Default a defaultValue to the system environment. +func (v Variable) Default(value string) error { + if v.Missing() { + return os.Setenv((string)(v), value) + } + return nil +} + +// Missing reports whether the system environment variable is an empty string. +func (v Variable) Missing() bool { + return v.Value() == "" +} + +// Key returns the system environment variable key. +func (v Variable) Key() string { + return (string)(v) +} + +// Value returns the system environment variable defaultValue. +func (v Variable) Value() string { + return os.Getenv((string)(v)) +} + +// KeyValue returns a concatenated string of the system environment variable's +// =. +func (v Variable) KeyValue() string { + return fmt.Sprintf("%s=%s", (string)(v), v.Value()) +} + +// Missing reports as an error listing all Variable among vars that are +// not assigned in the system environment. +func Missing(vars ...Variable) error { + var missing []string + for _, v := range vars { + if v.Missing() { + missing = append(missing, v.KeyValue()) + } + } + if len(missing) > 0 { + return fmt.Errorf("variables empty but expected from environment: %s", strings.Join(missing, "; ")) + } + return nil +} + +// Map converts a slice of Variable into a map. +// Its usage is for logging purposes. +func Map(vars ...Variable) map[string]interface{} { + result := map[string]interface{}{} + for _, v := range vars { + result[(string)(v)] = v.Value() + } + return result +} diff --git a/.test-infra/pipelines/src/main/go/internal/environment/variable_test.go b/.test-infra/pipelines/src/main/go/internal/environment/variable_test.go new file mode 100644 index 000000000000..6675b39ab26c --- /dev/null +++ b/.test-infra/pipelines/src/main/go/internal/environment/variable_test.go @@ -0,0 +1,358 @@ +// 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 environment + +import ( + "errors" + "github.com/google/go-cmp/cmp" + "os" + "testing" +) + +func TestMap(t *testing.T) { + type args struct { + vars []Variable + values []string + } + tests := []struct { + name string + args args + want map[string]interface{} + }{ + { + name: "{}", + args: args{}, + want: map[string]interface{}{}, + }, + { + name: "{A=1; B=2; C=3}", + args: args{ + vars: []Variable{ + "A", + "B", + "C", + }, + values: []string{ + "1", + "2", + "3", + }, + }, + want: map[string]interface{}{ + "A": "1", + "B": "2", + "C": "3", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + clear(tt.args.vars...) + set(t, tt.args.vars, tt.args.values) + got := Map(tt.args.vars...) + if diff := cmp.Diff(got, tt.want); diff != "" { + t.Errorf("Map() = %v, want %v, diff:\n%v", got, tt.want, diff) + } + }) + } +} + +func TestMissing(t *testing.T) { + type args struct { + vars []Variable + values []string + } + tests := []struct { + name string + args args + want error + }{ + { + name: "{}", + args: args{}, + }, + { + name: "{A=}", + args: args{ + vars: []Variable{ + "A", + }, + values: []string{ + "", + }, + }, + want: errors.New("variables empty but expected from environment: A="), + }, + { + name: "{A=1}", + args: args{ + vars: []Variable{ + "A", + }, + values: []string{ + "1", + }, + }, + want: nil, + }, + { + name: "{A=; B=}", + args: args{ + vars: []Variable{ + "A", + "B", + }, + values: []string{ + "", + "", + }, + }, + want: errors.New("variables empty but expected from environment: A=; B="), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var got, want string + clear(tt.args.vars...) + set(t, tt.args.vars, tt.args.values) + err := Missing(tt.args.vars...) + if err != nil { + got = err.Error() + } + if tt.want != nil { + want = tt.want.Error() + } + if diff := cmp.Diff(got, want); diff != "" { + t.Errorf("Missing() error = %v, want %v, diff:\n%s", err, tt.want, diff) + } + }) + } +} + +func TestVariable_Default(t *testing.T) { + type args struct { + setValue string + defaultValue string + } + tests := []struct { + name string + v Variable + args args + want string + }{ + { + name: "environment variable not set", + v: "A", + args: args{ + defaultValue: "1", + }, + want: "1", + }, + { + name: "environment variable default is overridden by set value", + v: "A", + args: args{ + setValue: "2", + defaultValue: "1", + }, + want: "2", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + clear(tt.v) + if tt.args.setValue != "" { + set(t, []Variable{tt.v}, []string{tt.args.setValue}) + } + if err := tt.v.Default(tt.args.defaultValue); err != nil { + t.Fatalf("could not set default environment variable value during test execution: %v", err) + } + got := os.Getenv(tt.v.Key()) + if diff := cmp.Diff(got, tt.want); diff != "" { + t.Errorf("Default() = %s, want %s, diff:\n%s", got, tt.want, diff) + } + }) + } +} + +func TestVariable_KeyValue(t *testing.T) { + tests := []struct { + name string + v Variable + value string + want string + }{ + { + name: "environment variable not set", + v: "A", + want: "A=", + }, + { + name: "environment variable is set", + v: "A", + value: "1", + want: "A=1", + }, + } + for _, tt := range tests { + clear(tt.v) + t.Run(tt.name, func(t *testing.T) { + set(t, []Variable{tt.v}, []string{tt.value}) + got := tt.v.KeyValue() + if diff := cmp.Diff(got, tt.want); diff != "" { + t.Errorf("KeyValue() = %v, want %v, diff:\n%s", got, tt.want, diff) + } + }) + } +} + +func TestVariable_Missing(t *testing.T) { + type args struct { + setValue string + defaultValue string + } + tests := []struct { + name string + args args + v Variable + want bool + }{ + { + name: "no default and not set", + args: args{}, + v: "A", + want: true, + }, + { + name: "has default but not set", + args: args{ + defaultValue: "1", + }, + v: "A", + want: false, + }, + { + name: "no default but set", + args: args{ + setValue: "1", + }, + v: "A", + want: false, + }, + { + name: "has default and set", + args: args{ + setValue: "2", + defaultValue: "1", + }, + v: "A", + want: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + clear(tt.v) + if tt.args.defaultValue != "" { + if err := tt.v.Default(tt.args.defaultValue); err != nil { + t.Fatalf("could not set default environment variable value during test execution: %v", err) + } + } + if tt.args.setValue != "" { + set(t, []Variable{tt.v}, []string{tt.args.setValue}) + } + if got := tt.v.Missing(); got != tt.want { + t.Errorf("Missing() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestVariable_Value(t *testing.T) { + type args struct { + setValue string + defaultValue string + } + tests := []struct { + name string + args args + v Variable + want string + }{ + { + name: "no default and not set", + args: args{}, + v: "A", + want: "", + }, + { + name: "has default but not set", + args: args{ + defaultValue: "1", + }, + v: "A", + want: "1", + }, + { + name: "no default but set", + args: args{ + setValue: "1", + }, + v: "A", + want: "1", + }, + { + name: "has default and set", + args: args{ + setValue: "2", + defaultValue: "1", + }, + v: "A", + want: "2", + }, + } + for _, tt := range tests { + clear(tt.v) + if tt.args.defaultValue != "" { + if err := tt.v.Default(tt.args.defaultValue); err != nil { + t.Fatalf("could not set default environment variable value during test execution: %v", err) + } + } + if tt.args.setValue != "" { + set(t, []Variable{tt.v}, []string{tt.args.setValue}) + } + t.Run(tt.name, func(t *testing.T) { + if got := tt.v.Value(); got != tt.want { + t.Errorf("Value() = %v, want %v", got, tt.want) + } + }) + } +} + +func clear(vars ...Variable) { + for _, k := range vars { + _ = os.Setenv(k.Key(), "") + } +} + +func set(t *testing.T, vars []Variable, values []string) { + if len(vars) != len(values) { + t.Fatalf("test cases should be configured with matching args.vars and args.values: len(tt.args.vars): %v != len(tt.args.values): %v", len(vars), len(values)) + } + for i := range vars { + key := vars[i].Key() + value := values[i] + _ = os.Setenv(key, value) + } +} diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/ReadDataflowApiWriteBigQuery.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/ReadDataflowApiWriteBigQuery.java new file mode 100644 index 000000000000..f12f285ec473 --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/ReadDataflowApiWriteBigQuery.java @@ -0,0 +1,362 @@ +/* + * 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.testinfra.pipelines; + +import static org.apache.beam.sdk.values.TypeDescriptors.rows; + +import com.google.dataflow.v1beta3.GetJobExecutionDetailsRequest; +import com.google.dataflow.v1beta3.GetJobMetricsRequest; +import com.google.dataflow.v1beta3.GetJobRequest; +import com.google.dataflow.v1beta3.Job; +import com.google.events.cloud.dataflow.v1beta3.JobState; +import com.google.events.cloud.dataflow.v1beta3.JobType; +import com.google.protobuf.GeneratedMessageV3; +import java.util.Arrays; +import java.util.stream.Collectors; +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.annotations.Internal; +import org.apache.beam.sdk.io.gcp.bigquery.WriteResult; +import org.apache.beam.sdk.io.gcp.pubsub.PubsubIO; +import org.apache.beam.sdk.metrics.Counter; +import org.apache.beam.sdk.metrics.Metrics; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +import org.apache.beam.sdk.transforms.DoFn; +import org.apache.beam.sdk.transforms.Flatten; +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.transforms.WithFailures; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.PCollectionList; +import org.apache.beam.sdk.values.Row; +import org.apache.beam.testinfra.pipelines.bigquery.BigQueryWriteOptions; +import org.apache.beam.testinfra.pipelines.bigquery.BigQueryWrites; +import org.apache.beam.testinfra.pipelines.conversions.ConversionError; +import org.apache.beam.testinfra.pipelines.conversions.EventarcConversions; +import org.apache.beam.testinfra.pipelines.conversions.JobsToRow; +import org.apache.beam.testinfra.pipelines.conversions.RowConversionResult; +import org.apache.beam.testinfra.pipelines.conversions.WithAppendedDetailsToRow; +import org.apache.beam.testinfra.pipelines.dataflow.DataflowClientFactoryConfiguration; +import org.apache.beam.testinfra.pipelines.dataflow.DataflowFilterEventarcJobs; +import org.apache.beam.testinfra.pipelines.dataflow.DataflowGetJobExecutionDetails; +import org.apache.beam.testinfra.pipelines.dataflow.DataflowGetJobMetrics; +import org.apache.beam.testinfra.pipelines.dataflow.DataflowGetJobs; +import org.apache.beam.testinfra.pipelines.dataflow.DataflowJobsOptions; +import org.apache.beam.testinfra.pipelines.dataflow.DataflowReadResult; +import org.apache.beam.testinfra.pipelines.dataflow.DataflowRequestError; +import org.apache.beam.testinfra.pipelines.dataflow.DataflowRequests; +import org.apache.beam.testinfra.pipelines.dataflow.JobMetricsWithAppendedDetails; +import org.apache.beam.testinfra.pipelines.dataflow.StageSummaryWithAppendedDetails; +import org.apache.beam.testinfra.pipelines.pubsub.PubsubReadOptions; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableList; +import org.checkerframework.checker.nullness.qual.NonNull; + +/** + * Constructs and executes a {@link Pipeline} that reads from the Dataflow API and writes to + * BigQuery. For internal use only. + */ +@Internal +public class ReadDataflowApiWriteBigQuery { + + public interface Options extends DataflowJobsOptions, PubsubReadOptions, BigQueryWriteOptions {} + + public static void main(String[] args) { + Options options = PipelineOptionsFactory.fromArgs(args).withValidation().as(Options.class); + Pipeline pipeline = Pipeline.create(options); + DataflowClientFactoryConfiguration configuration = + DataflowClientFactoryConfiguration.builder(options).build(); + + // Retrieve Jobs calling the JobsV1Beta3.GetJob rpc. + PCollection jobs = readEvents(options, pipeline); + + // Retrieve JobMetrics calling the MetricsV1Beta3.GetJobMetrics rpc. + readDetailsFromDataflowJobs( + options, + BigQueryWrites.JOB_METRICS_ERRORS, + GetJobMetricsRequest.class, + JobMetricsWithAppendedDetails.class, + jobs, + DataflowGetJobMetrics.create(configuration), + WithAppendedDetailsToRow.jobMetricsWithAppendedDetailsToRow(), + BigQueryWrites.dataflowJobMetrics(options)); + + // Retrieve StageSummary entries (from JobExecutionDetails) calling the + // MetricsV1Beta3.GetJobExecutionDetails rpc. + readDetailsFromDataflowJobs( + options, + BigQueryWrites.JOB_EXECUTION_DETAILS_ERRORS, + GetJobExecutionDetailsRequest.class, + StageSummaryWithAppendedDetails.class, + jobs, + DataflowGetJobExecutionDetails.create(configuration), + WithAppendedDetailsToRow.stageSummaryWithAppendedDetailsToRow(), + BigQueryWrites.dataflowJobExecutionDetails(options)); + + // Retrieve WorkerDetails (from StageExecutionDetails) calling the + // MetricsV1Beta3.GetStageExecutionDetails rpc. + // Not working at this time and left commented out to revisit in the future. + // jobDetails( + // options, + // BigQueryWrites.STAGE_EXECUTION_DETAILS_ERRORS, + // GetStageExecutionDetailsRequest.class, + // WorkerDetailsWithAppendedDetails.class, + // jobs, + // DataflowGetStageExecutionDetails.create(configuration), + // WithAppendedDetailsToRow.workerDetailsWithAppendedDetailsToRow(), + // BigQueryWrites.dataflowStageExecutionDetails(options)); + + pipeline.run(); + } + + private static void writeErrors( + Options options, + String requestErrorTableIdPrefix, + Class requestTClass, + Class responseTClass, + PCollection requestErrors, + PCollection responseConversionErrors) { + + // Write Dataflow API errors to BigQuery. + PCollection requestErrorRows = + requestErrors + .apply( + tagOf(ConversionError.class, DataflowRequestError.class, requestTClass), + MapElements.into(rows()).via(DataflowRequestError.TO_ROW_FN)) + .setRowSchema(DataflowRequestError.SCHEMA); + + requestErrorRows.apply( + tagOf(BigQueryWrites.class, requestTClass.getSimpleName(), "errors"), + BigQueryWrites.writeDataflowRequestErrors(options, requestErrorTableIdPrefix)); + + // Write conversion errors to BigQuery. + PCollection conversionErrors = + responseConversionErrors + .apply( + tagOf(ConversionError.class, responseTClass), + MapElements.into(rows()).via(ConversionError.TO_ROW_FN)) + .setRowSchema(ConversionError.SCHEMA); + + conversionErrors.apply( + tagOf(BigQueryWrites.class, responseTClass.getSimpleName(), "errors"), + BigQueryWrites.writeConversionErrors(options)); + } + + private static PCollection readEvents(Options options, Pipeline pipeline) { + + // Read from Eventarc published Pub/Sub events. + PCollection json = + pipeline.apply( + tagOf(PubsubIO.Read.class, "Eventarc"), + PubsubIO.readStrings() + .fromSubscription(options.getSubscription().getValue().getPath())); + + json.apply( + "Count Pub/Sub messages", ParDo.of(countFn(PubsubIO.Read.class, "pulled_pubsub_messages"))); + + // Encode Eventarc JSON payloads into Eventarc Dataflow Jobs. + WithFailures.Result< + @NonNull PCollection, ConversionError> + events = + json.apply( + tagOf(EventarcConversions.class, "fromJson"), EventarcConversions.fromJson()); + + events + .output() + .apply( + "Count Encoded Events", + ParDo.of(countFn(EventarcConversions.class, "encode_events_success"))); + events + .failures() + .apply( + "Count Encoded Failures", + ParDo.of(countFn(EventarcConversions.class, "encoded_events_failure"))); + + // Write Eventarc encoding errors to BigQuery. + PCollection eventConversionErrorRows = + events + .failures() + .apply( + "Event Conversion Errors To Row", + MapElements.into(rows()).via(ConversionError.TO_ROW_FN)) + .setRowSchema(ConversionError.SCHEMA); + + eventConversionErrorRows.apply( + tagOf(BigQueryWrites.class, com.google.events.cloud.dataflow.v1beta3.Job.class.getName()), + BigQueryWrites.writeConversionErrors(options)); + + return readDataflowJobsFromEvents(options, events.output()); + } + + private static PCollection readDataflowJobsFromEvents( + Options options, PCollection events) { + DataflowClientFactoryConfiguration configuration = + DataflowClientFactoryConfiguration.builder(options).build(); + + // Filter Done Batch Jobs. + PCollection getBatchJobRequests = + events + .apply( + tagOf(DataflowFilterEventarcJobs.class, "Done Batch Jobs"), + DataflowFilterEventarcJobs.builder() + .setIncludeJobStates(ImmutableList.of(JobState.JOB_STATE_DONE)) + .setIncludeJobType(JobType.JOB_TYPE_BATCH) + .build()) + .apply( + tagOf(DataflowRequests.class, "Batch GetJobRequests"), + DataflowRequests.jobRequestsFromEventsViewAll()); + + getBatchJobRequests.apply( + "Count Done Batch Jobs", ParDo.of(countFn(GetJobRequest.class, "done_batch_jobs"))); + + // Filter Canceled Streaming Jobs. + PCollection getStreamCanceledJobRequests = + events + .apply( + tagOf(DataflowFilterEventarcJobs.class, "Canceled Streaming Jobs"), + DataflowFilterEventarcJobs.builder() + .setIncludeJobStates(ImmutableList.of(JobState.JOB_STATE_CANCELLED)) + .setIncludeJobType(JobType.JOB_TYPE_STREAMING) + .build()) + .apply( + tagOf(DataflowRequests.class, "Canceled Stream GetJobRequests"), + DataflowRequests.jobRequestsFromEventsViewAll()); + + getStreamCanceledJobRequests.apply( + "Count Canceled Streaming Jobs", + ParDo.of(countFn(GetJobRequest.class, "canceled_streaming_jobs"))); + + // Filter Drained Streaming Jobs. + PCollection getStreamDrainedJobRequests = + events + .apply( + tagOf(DataflowFilterEventarcJobs.class, "Drained Streaming Jobs"), + DataflowFilterEventarcJobs.builder() + .setIncludeJobStates(ImmutableList.of(JobState.JOB_STATE_DRAINED)) + .setIncludeJobType(JobType.JOB_TYPE_STREAMING) + .build()) + .apply( + tagOf(DataflowRequests.class, "Drained Stream GetJobRequests"), + DataflowRequests.jobRequestsFromEventsViewAll()); + + getStreamDrainedJobRequests.apply( + "Count Drained Streaming Jobs", + ParDo.of(countFn(GetJobRequest.class, "drained_streaming_jobs"))); + + // Merge Batch and Streaming Jobs. + PCollectionList getJobRequestList = + PCollectionList.of(getBatchJobRequests) + .and(getStreamCanceledJobRequests) + .and(getStreamDrainedJobRequests); + PCollection getJobRequests = + getJobRequestList.apply("Merge Batch and Streaming Jobs", Flatten.pCollections()); + + // Call the Dataflow GetJobs endpoint. + DataflowReadResult getJobsResult = + getJobRequests.apply( + tagOf(DataflowGetJobs.class, "Read"), DataflowGetJobs.create(configuration)); + + // Convert Jobs to Rows. + RowConversionResult jobsToRowResult = + getJobsResult.getSuccess().apply(tagOf(JobsToRow.class, "Job"), JobsToRow.create()); + + jobsToRowResult + .getSuccess() + .apply( + "Count JobsToRow Success", ParDo.of(countFn(JobsToRow.class, "jobs_to_row_success"))); + jobsToRowResult + .getFailure() + .apply( + "Count JobsToRow Failure", ParDo.of(countFn(JobsToRow.class, "jobs_to_row_failure"))); + + // Write Job Rows to BigQuery. + jobsToRowResult + .getSuccess() + .apply(tagOf(BigQueryWrites.class, "Job"), BigQueryWrites.dataflowJobs(options)); + + writeErrors( + options, + BigQueryWrites.JOB_ERRORS, + GetJobRequest.class, + Job.class, + getJobsResult.getFailure(), + jobsToRowResult.getFailure()); + + return getJobsResult.getSuccess(); + } + + private static void readDetailsFromDataflowJobs( + Options options, + String requestErrorTableIdPrefix, + Class requestTClass, + Class responseTClass, + PCollection jobs, + PTransform, DataflowReadResult> + callAPITransform, + PTransform, RowConversionResult> + detailsToRowTransform, + PTransform<@NonNull PCollection, @NonNull WriteResult> bigQueryWriteTransform) { + + // Call the Dataflow API to get more Job details. + DataflowReadResult readResult = + jobs.apply(tagOf(callAPITransform.getClass(), responseTClass), callAPITransform); + + // Convert the Job details result to Beam Rows. + RowConversionResult toRowResult = + readResult + .getSuccess() + .apply(tagOf(detailsToRowTransform.getClass(), responseTClass), detailsToRowTransform); + + // Write result to BigQuery. + toRowResult + .getSuccess() + .apply(tagOf(bigQueryWriteTransform.getClass(), responseTClass), bigQueryWriteTransform); + + // Write errors to BigQuery. + writeErrors( + options, + requestErrorTableIdPrefix, + requestTClass, + responseTClass, + readResult.getFailure(), + toRowResult.getFailure()); + } + + private static String tagOf(Class clazz, String... addl) { + return clazz.getSimpleName() + " " + String.join(" ", addl); + } + + private static String tagOf(Class clazz, Class... addl) { + return String.join( + " ", + ImmutableList.builder() + .add(clazz.getSimpleName()) + .addAll(Arrays.stream(addl).map(Class::getSimpleName).collect(Collectors.toList())) + .build()); + } + + private static DoFn countFn(Class clazz, String name) { + return new DoFn() { + final Counter counter = Metrics.counter(clazz, name); + + @ProcessElement + public void process(@Element T ignored) { + counter.inc(); + } + }; + } +} diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/bigquery/BigQueryWriteOptions.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/bigquery/BigQueryWriteOptions.java new file mode 100644 index 000000000000..e76bceaeba68 --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/bigquery/BigQueryWriteOptions.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.testinfra.pipelines.bigquery; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import org.apache.beam.sdk.annotations.Internal; +import org.apache.beam.sdk.options.Description; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.Validation.Required; + +/** Options for writing to BigQuery. */ +@Internal +public interface BigQueryWriteOptions extends PipelineOptions { + @Description("BigQuery Dataset") + @Required + @JsonIgnore + DatasetReferenceOptionValue getDataset(); + + void setDataset(DatasetReferenceOptionValue value); +} diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/bigquery/BigQueryWrites.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/bigquery/BigQueryWrites.java new file mode 100644 index 000000000000..37dcb99f8bdd --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/bigquery/BigQueryWrites.java @@ -0,0 +1,166 @@ +/* + * 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.testinfra.pipelines.bigquery; + +import com.google.api.services.bigquery.model.Clustering; +import com.google.api.services.bigquery.model.DatasetReference; +import com.google.api.services.bigquery.model.TableReference; +import com.google.api.services.bigquery.model.TimePartitioning; +import com.google.dataflow.v1beta3.Job; +import java.time.Instant; +import org.apache.beam.sdk.annotations.Internal; +import org.apache.beam.sdk.io.gcp.bigquery.BigQueryIO; +import org.apache.beam.sdk.io.gcp.bigquery.WriteResult; +import org.apache.beam.sdk.transforms.PTransform; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.Row; +import org.apache.beam.testinfra.pipelines.conversions.ConversionError; +import org.apache.beam.testinfra.pipelines.dataflow.DataflowRequestError; +import org.apache.beam.testinfra.pipelines.dataflow.JobMetricsWithAppendedDetails; +import org.apache.beam.testinfra.pipelines.dataflow.StageSummaryWithAppendedDetails; +import org.apache.beam.testinfra.pipelines.dataflow.WorkerDetailsWithAppendedDetails; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableList; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; + +/** Convenience methods for {@link BigQueryIO.Write}s. */ +@Internal +public class BigQueryWrites { + + public static final String JOB_EXECUTION_DETAILS_ERRORS = "errors_job_execution_details_requests"; + + public static final String JOB_ERRORS = "errors_jobs_requests"; + + public static final String JOB_METRICS_ERRORS = "errors_job_metrics_requests"; + + private static final TimePartitioning JOB_TIME_PARTITIONING = + new TimePartitioning().setType("HOUR").setField("create_time"); + + private static final TimePartitioning ENRICHED_TIME_PARTITIONING = + new TimePartitioning().setType("HOUR").setField("job_create_time"); + + private static final TimePartitioning OBSERVED_TIME_PARTITIONING = + new TimePartitioning().setType("HOUR").setField("observed_time"); + + private static final Clustering JOB_CLUSTERING = + new Clustering().setFields(ImmutableList.of("type", "location")); + + private static final String CONVERSION_ERRORS_TABLE_ID_PREFIX = "errors_conversions"; + + private static final String JOB_EXECUTION_DETAILS = "job_execution_details"; + + private static final String JOB_METRICS = "job_metrics"; + + private static final String JOBS = "jobs"; + + private static final String STAGE_EXECUTION_DETAILS = "stage_execution_details"; + + /** Write {@link Row}s of {@link ConversionError}s with {@link #OBSERVED_TIME_PARTITIONING}. */ + public static PTransform<@NonNull PCollection, @NonNull WriteResult> writeConversionErrors( + BigQueryWriteOptions options) { + return withPartitioning( + options, tableIdFrom(CONVERSION_ERRORS_TABLE_ID_PREFIX), OBSERVED_TIME_PARTITIONING); + } + + /** + * Write {@link Row}s of {@link StageSummaryWithAppendedDetails} with {@link + * #ENRICHED_TIME_PARTITIONING}. + */ + public static PTransform<@NonNull PCollection, @NonNull WriteResult> + dataflowJobExecutionDetails(BigQueryWriteOptions options) { + return withPartitioning( + options, tableIdFrom(JOB_EXECUTION_DETAILS), ENRICHED_TIME_PARTITIONING); + } + + /** + * Write {@link Row}s of {@link JobMetricsWithAppendedDetails} with {@link + * #ENRICHED_TIME_PARTITIONING}. + */ + public static PTransform<@NonNull PCollection, @NonNull WriteResult> dataflowJobMetrics( + BigQueryWriteOptions options) { + return withPartitioning(options, tableIdFrom(JOB_METRICS), ENRICHED_TIME_PARTITIONING); + } + + /** + * Write {@link Row}s of {@link Job}s with {@link #JOB_TIME_PARTITIONING} clustered by {@link + * #JOB_CLUSTERING}. + */ + public static PTransform<@NonNull PCollection, @NonNull WriteResult> dataflowJobs( + BigQueryWriteOptions options) { + return withPartitioningAndOptionalClustering( + options, tableIdFrom(JOBS), JOB_TIME_PARTITIONING, JOB_CLUSTERING); + } + + /** + * Write {@link Row}s of {@link WorkerDetailsWithAppendedDetails} with {@link + * #ENRICHED_TIME_PARTITIONING}. + */ + public static PTransform<@NonNull PCollection, @NonNull WriteResult> + dataflowStageExecutionDetails(BigQueryWriteOptions options) { + return withPartitioning( + options, tableIdFrom(STAGE_EXECUTION_DETAILS), ENRICHED_TIME_PARTITIONING); + } + + /** + * Write {@link Row}s of {@link DataflowRequestError}s with {@link #OBSERVED_TIME_PARTITIONING}. + */ + public static PTransform<@NonNull PCollection, @NonNull WriteResult> + writeDataflowRequestErrors(BigQueryWriteOptions options, String tableIdPrefix) { + return withPartitioning(options, tableIdFrom(tableIdPrefix), OBSERVED_TIME_PARTITIONING); + } + + private static String tableIdFrom(String prefix) { + return String.format("%s_%s", prefix, Instant.now().getEpochSecond()); + } + + private static PTransform<@NonNull PCollection, @NonNull WriteResult> withPartitioning( + BigQueryWriteOptions options, String tableId, TimePartitioning timePartitioning) { + return withPartitioningAndOptionalClustering(options, tableId, timePartitioning, null); + } + + private static + PTransform<@NonNull PCollection, @NonNull WriteResult> + withPartitioningAndOptionalClustering( + BigQueryWriteOptions options, + String tableId, + TimePartitioning timePartitioning, + @Nullable Clustering clustering) { + + DatasetReference datasetReference = options.getDataset().getValue(); + TableReference tableReference = + new TableReference() + .setProjectId(datasetReference.getProjectId()) + .setDatasetId(datasetReference.getDatasetId()) + .setTableId(tableId); + + BigQueryIO.Write write = + BigQueryIO.write() + .to(tableReference) + .useBeamSchema() + .withTimePartitioning(timePartitioning) + .withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_IF_NEEDED) + .withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_APPEND) + .withMethod(BigQueryIO.Write.Method.STREAMING_INSERTS); + + if (clustering != null) { + write = write.withClustering(clustering); + } + + return write; + } +} diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/bigquery/DatasetReferenceOptionValue.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/bigquery/DatasetReferenceOptionValue.java new file mode 100644 index 000000000000..855dcef769a2 --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/bigquery/DatasetReferenceOptionValue.java @@ -0,0 +1,58 @@ +/* + * 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.testinfra.pipelines.bigquery; + +import static org.apache.beam.sdk.util.Preconditions.checkStateNotNull; +import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkArgument; + +import com.google.api.services.bigquery.model.DatasetReference; +import java.io.Serializable; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.apache.beam.sdk.annotations.Internal; + +/** Parses Pipeline option value into a {@link DatasetReference}. */ +@Internal +public class DatasetReferenceOptionValue implements Serializable { + + // For parsing the format used to parse a String into a dataset reference. + // "{project_id}:{dataset_id}" or + // "{project_id}.{dataset_id}" + private static final Pattern DATASET_PATTERN = + Pattern.compile("^(?[^\\.:]+)[\\.:](?[^\\.:]+)$"); + + private final String project; + + private final String dataset; + + DatasetReferenceOptionValue(String input) { + Matcher m = DATASET_PATTERN.matcher(input); + checkArgument( + m.matches(), + "input does not match BigQuery dataset pattern, " + + "expected 'project_id.dataset_id' or 'project_id:dataset_id, got: %s", + input); + this.project = checkStateNotNull(m.group("PROJECT"), "PROJECT not found in %s", input); + this.dataset = checkStateNotNull(m.group("DATASET"), "DATASET not found in %s", input); + } + + /** Get the parsed String as a {@link DatasetReference}. */ + public DatasetReference getValue() { + return new DatasetReference().setProjectId(this.project).setDatasetId(this.dataset); + } +} diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/bigquery/package-info.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/bigquery/package-info.java new file mode 100644 index 000000000000..1298cbd4d690 --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/bigquery/package-info.java @@ -0,0 +1,20 @@ +/* + * 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. + */ + +/** Defines how testinfra pipelines write to BigQuery. */ +package org.apache.beam.testinfra.pipelines.bigquery; diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/conversions/ConversionError.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/conversions/ConversionError.java new file mode 100644 index 000000000000..353d06678801 --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/conversions/ConversionError.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.testinfra.pipelines.conversions; + +import static org.apache.beam.sdk.util.Preconditions.checkStateNotNull; + +import com.google.auto.value.AutoValue; +import java.io.Serializable; +import org.apache.beam.sdk.annotations.Internal; +import org.apache.beam.sdk.schemas.AutoValueSchema; +import org.apache.beam.sdk.schemas.Schema; +import org.apache.beam.sdk.schemas.annotations.DefaultSchema; +import org.apache.beam.sdk.schemas.annotations.SchemaCaseFormat; +import org.apache.beam.sdk.transforms.SerializableFunction; +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.CaseFormat; +import org.joda.time.Instant; + +/** Stores errors related to conversions. */ +@Internal +@DefaultSchema(AutoValueSchema.class) +@AutoValue +@SchemaCaseFormat(CaseFormat.LOWER_UNDERSCORE) +public abstract class ConversionError implements Serializable { + + private static final AutoValueSchema SCHEMA_PROVIDER = new AutoValueSchema(); + + private static final TypeDescriptor TYPE = + TypeDescriptor.of(ConversionError.class); + + public static final Schema SCHEMA = checkStateNotNull(SCHEMA_PROVIDER.schemaFor(TYPE)); + + public static final SerializableFunction TO_ROW_FN = + SCHEMA_PROVIDER.toRowFunction(TYPE); + + public static Builder builder() { + return new AutoValue_ConversionError.Builder(); + } + + public abstract Instant getObservedTime(); + + public abstract String getMessage(); + + public abstract String getStackTrace(); + + @AutoValue.Builder + public abstract static class Builder { + + public abstract Builder setObservedTime(Instant value); + + public abstract Builder setMessage(String value); + + public abstract Builder setStackTrace(String value); + + public abstract ConversionError build(); + } +} diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/conversions/EventarcConversions.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/conversions/EventarcConversions.java new file mode 100644 index 000000000000..f5191af60395 --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/conversions/EventarcConversions.java @@ -0,0 +1,116 @@ +/* + * 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.testinfra.pipelines.conversions; + +import static org.apache.beam.sdk.util.Preconditions.checkStateNotNull; +import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkState; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.events.cloud.dataflow.v1beta3.Job; +import com.google.protobuf.InvalidProtocolBufferException; +import com.google.protobuf.util.JsonFormat; +import java.util.Optional; +import org.apache.beam.sdk.annotations.Internal; +import org.apache.beam.sdk.transforms.MapElements; +import org.apache.beam.sdk.transforms.SerializableFunction; +import org.apache.beam.sdk.values.TypeDescriptor; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Throwables; +import org.joda.time.Instant; + +/** Methods for converting from Eventarc JSON payloads. */ +@Internal +public final class EventarcConversions { + + private static final String DATA_NODE_KEY = "data"; + private static final String TYPE_NODE_KEY = "@type"; + private static final String JOB_EVENT_DATA_TYPE = + "type.googleapis.com/google.events.cloud.dataflow.v1beta3.JobEventData"; + private static final String PAYLOAD_NODE_KEY = "payload"; + + /** Parses Eventarc JSON strings to {@link Job}s. */ + public static MapElements.MapWithFailures fromJson() { + return MapElements.into(TypeDescriptor.of(Job.class)) + .via(new JsonToJobFn()) + .exceptionsInto(new TypeDescriptor() {}) + .exceptionsVia( + exceptionElement -> + ConversionError.builder() + .setObservedTime(Instant.now()) + .setMessage( + Optional.ofNullable(exceptionElement.exception().getMessage()).orElse("")) + .setStackTrace(Throwables.getStackTraceAsString(exceptionElement.exception())) + .build()); + } + + /** {@link SerializableFunction} that parses an Eventarc JSON string into a {@link Job}. */ + static class JsonToJobFn implements SerializableFunction { + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + + @Override + public Job apply(String json) { + + String safeJson = checkStateNotNull(json, "null json string input for %s", JsonToJobFn.class); + + Job.Builder builder = Job.newBuilder(); + + try { + + JsonNode eventNode = + checkStateNotNull( + OBJECT_MAPPER.readTree(safeJson), + "could not parse json input into %s", + JsonNode.class); + + JsonNode dataNode = + checkStateNotNull( + eventNode.get(DATA_NODE_KEY), "json input missing path: $.%s", DATA_NODE_KEY); + + JsonNode typeNode = + checkStateNotNull( + dataNode.get(TYPE_NODE_KEY), + "json input missing path: $.%s.%s", + DATA_NODE_KEY, + TYPE_NODE_KEY); + + JsonNode payloadNode = + checkStateNotNull( + dataNode.get(PAYLOAD_NODE_KEY), + "json input missing path: $.%s.%s", + DATA_NODE_KEY, + PAYLOAD_NODE_KEY); + + checkState( + typeNode.asText().equals(JOB_EVENT_DATA_TYPE), + "expected %s=%s at json path: $.%s.%s, got: %s", + TYPE_NODE_KEY, + JOB_EVENT_DATA_TYPE, + DATA_NODE_KEY, + TYPE_NODE_KEY, + typeNode.asText()); + + JsonFormat.parser().merge(payloadNode.toString(), builder); + return builder.build(); + + } catch (InvalidProtocolBufferException | JsonProcessingException e) { + throw new IllegalStateException(e); + } + } + } +} diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/conversions/JobsToRow.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/conversions/JobsToRow.java new file mode 100644 index 000000000000..0fcbfdc96edf --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/conversions/JobsToRow.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.testinfra.pipelines.conversions; + +import static org.apache.beam.sdk.values.TypeDescriptors.rows; + +import com.google.dataflow.v1beta3.Job; +import java.util.Optional; +import org.apache.beam.sdk.annotations.Internal; +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.SerializableFunction; +import org.apache.beam.sdk.transforms.WithFailures.Result; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.PCollectionTuple; +import org.apache.beam.sdk.values.Row; +import org.apache.beam.sdk.values.TupleTag; +import org.apache.beam.sdk.values.TypeDescriptor; +import org.apache.beam.testinfra.pipelines.schemas.DescriptorSchemaRegistry; +import org.apache.beam.testinfra.pipelines.schemas.GeneratedMessageV3RowBuilder; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Throwables; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.joda.time.Instant; + +/** {@link PTransform} that converts {@link Job}s to {@link Row}s. */ +@Internal +public class JobsToRow + extends PTransform< + @NonNull PCollection, @NonNull RowConversionResult> { + + public static JobsToRow create() { + return new JobsToRow(); + } + + private static final DescriptorSchemaRegistry SCHEMA_REGISTRY = DescriptorSchemaRegistry.INSTANCE; + + static { + SCHEMA_REGISTRY.build(Job.getDescriptor()); + } + + @Override + public @NonNull RowConversionResult expand( + @NonNull PCollection input) { + TupleTag success = new TupleTag() {}; + TupleTag failure = new TupleTag() {}; + Schema successSchema = SCHEMA_REGISTRY.getOrBuild(Job.getDescriptor()); + Result<@NonNull PCollection, ConversionError> result = + input.apply( + "Jobs To Row", + MapElements.into(rows()) + .via(jobsToRowFn()) + .exceptionsInto(new TypeDescriptor() {}) + .exceptionsVia( + error -> + ConversionError.builder() + .setObservedTime(Instant.now()) + .setMessage( + Optional.ofNullable(error.exception().getMessage()).orElse("")) + .setStackTrace(Throwables.getStackTraceAsString(error.exception())) + .build())); + + PCollectionTuple pct = + PCollectionTuple.of(success, result.output()).and(failure, result.failures()); + return new RowConversionResult<>(successSchema, success, failure, pct); + } + + private static SerializableFunction jobsToRowFn() { + return job -> { + GeneratedMessageV3RowBuilder builder = GeneratedMessageV3RowBuilder.of(job); + return builder.build(); + }; + } +} diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/conversions/RowConversionResult.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/conversions/RowConversionResult.java new file mode 100644 index 000000000000..32c2d0307a9b --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/conversions/RowConversionResult.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.testinfra.pipelines.conversions; + +import java.util.Map; +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.annotations.Internal; +import org.apache.beam.sdk.schemas.Schema; +import org.apache.beam.sdk.transforms.PTransform; +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.Row; +import org.apache.beam.sdk.values.TupleTag; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableMap; + +/** Convenience class for bundling {@link Row} conversion successes and failures. */ +@Internal +public class RowConversionResult implements POutput { + + private final Pipeline pipeline; + + private final TupleTag successTag; + private final PCollection success; + + private final TupleTag failureTag; + private final PCollection failure; + + RowConversionResult( + Schema successRowSchema, + TupleTag successTag, + TupleTag failureTag, + PCollectionTuple pct) { + this.pipeline = pct.getPipeline(); + this.successTag = successTag; + this.success = pct.get(successTag).setRowSchema(successRowSchema); + this.failureTag = failureTag; + this.failure = pct.get(failureTag); + } + + public PCollection getSuccess() { + return success; + } + + public PCollection getFailure() { + return failure; + } + + @Override + public Pipeline getPipeline() { + return pipeline; + } + + @Override + public Map, PValue> expand() { + return ImmutableMap.of( + successTag, success, + failureTag, failure); + } + + @Override + public void finishSpecifyingOutput( + String transformName, PInput input, PTransform transform) {} +} diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/conversions/WithAppendedDetailsToRow.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/conversions/WithAppendedDetailsToRow.java new file mode 100644 index 000000000000..4be29db2057b --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/conversions/WithAppendedDetailsToRow.java @@ -0,0 +1,265 @@ +/* + * 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.testinfra.pipelines.conversions; + +import static org.apache.beam.sdk.util.Preconditions.checkStateNotNull; + +import com.google.dataflow.v1beta3.JobMetrics; +import com.google.dataflow.v1beta3.StageSummary; +import com.google.dataflow.v1beta3.WorkerDetails; +import com.google.protobuf.Descriptors.Descriptor; +import com.google.protobuf.GeneratedMessageV3; +import java.util.Optional; +import org.apache.beam.sdk.annotations.Internal; +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.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.values.PCollection; +import org.apache.beam.sdk.values.PCollectionTuple; +import org.apache.beam.sdk.values.Row; +import org.apache.beam.sdk.values.TupleTag; +import org.apache.beam.sdk.values.TupleTagList; +import org.apache.beam.testinfra.pipelines.dataflow.JobMetricsWithAppendedDetails; +import org.apache.beam.testinfra.pipelines.dataflow.StageSummaryWithAppendedDetails; +import org.apache.beam.testinfra.pipelines.dataflow.WorkerDetailsWithAppendedDetails; +import org.apache.beam.testinfra.pipelines.schemas.DescriptorSchemaRegistry; +import org.apache.beam.testinfra.pipelines.schemas.GeneratedMessageV3RowBuilder; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Throwables; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.joda.time.Instant; + +/** + * Convenience methods for converted enriched types such as {@link JobMetricsWithAppendedDetails} + * and {@link StageSummaryWithAppendedDetails} into {@link Row}s. + */ +@Internal +public class WithAppendedDetailsToRow + extends PTransform< + PCollection, RowConversionResult> { + + public static WithAppendedDetailsToRow + jobMetricsWithAppendedDetailsToRow() { + return new WithAppendedDetailsToRow<>( + JobMetricsWithAppendedDetails.class, + JobMetrics.class, + new TupleTag() {}, + "job_metrics", + clazz -> JobMetrics.getDescriptor(), + element -> + checkStateNotNull( + element, + "%s element null for jobId supplier in %s", + JobMetricsWithAppendedDetails.class, + WithAppendedDetailsToRow.class) + .getJobId(), + element -> + checkStateNotNull( + element, + "%s element null for jobCreateTime supplier in %s", + JobMetricsWithAppendedDetails.class, + WithAppendedDetailsToRow.class) + .getJobCreateTime(), + element -> + checkStateNotNull( + element, + "%s element null for %s supplier in %s", + JobMetricsWithAppendedDetails.class, + JobMetrics.class, + WithAppendedDetailsToRow.class) + .getJobMetrics()); + } + + public static WithAppendedDetailsToRow + stageSummaryWithAppendedDetailsToRow() { + return new WithAppendedDetailsToRow<>( + StageSummaryWithAppendedDetails.class, + StageSummary.class, + new TupleTag() {}, + "stage_summary", + clazz -> StageSummary.getDescriptor(), + element -> + checkStateNotNull( + element, + "%s element null for jobId supplier in %s", + StageSummaryWithAppendedDetails.class, + WithAppendedDetailsToRow.class) + .getJobId(), + element -> + checkStateNotNull( + element, + "%s element null for jobCreateTime supplier in %s", + StageSummaryWithAppendedDetails.class, + WithAppendedDetailsToRow.class) + .getJobCreateTime(), + element -> + checkStateNotNull( + element, + "%s element null for %s supplier in %s", + StageSummaryWithAppendedDetails.class, + StageSummary.class, + WithAppendedDetailsToRow.class) + .getStageSummary()); + } + + public static WithAppendedDetailsToRow + workerDetailsWithAppendedDetailsToRow() { + return new WithAppendedDetailsToRow<>( + WorkerDetailsWithAppendedDetails.class, + WorkerDetails.class, + new TupleTag() {}, + "worker_details", + clazz -> WorkerDetails.getDescriptor(), + element -> + checkStateNotNull( + element, + "%s element null for jobId supplier in %s", + WorkerDetailsWithAppendedDetails.class, + WithAppendedDetailsToRow.class) + .getJobId(), + element -> + checkStateNotNull( + element, + "%s element null for jobCreateTime supplier in %s", + WorkerDetailsWithAppendedDetails.class, + WithAppendedDetailsToRow.class) + .getJobCreateTime(), + element -> + checkStateNotNull( + element, + "%s element null for %s supplier in %s", + WorkerDetailsWithAppendedDetails.class, + WorkerDetails.class, + WithAppendedDetailsToRow.class) + .getWorkerDetails()); + } + + private static final TupleTag SUCCESS = new TupleTag() {}; + + static final Field JOB_ID_FIELD = Field.of("job_id", FieldType.STRING); + + static final Field JOB_CREATE_TIME = Field.of("job_create_time", FieldType.DATETIME); + + private final Class containerClass; + + private final Class embeddedTClass; + + private final TupleTag failureTag; + + private final String embeddedFieldName; + + private final SerializableFunction<@NonNull Class, @NonNull Descriptor> + descriptorSupplier; + + private final SerializableFunction<@NonNull AppendedDetailsT, @NonNull String> jobIdSupplier; + + private final SerializableFunction<@NonNull AppendedDetailsT, @NonNull Instant> + jobCreateTimeSupplier; + + private final SerializableFunction<@NonNull AppendedDetailsT, @NonNull EmbeddedT> + embeddedInstanceSupplier; + + private WithAppendedDetailsToRow( + Class containerClass, + Class embeddedTClass, + TupleTag failureTag, + String embeddedFieldName, + SerializableFunction<@NonNull Class, @NonNull Descriptor> descriptorSupplier, + SerializableFunction<@NonNull AppendedDetailsT, @NonNull String> jobIdSupplier, + SerializableFunction<@NonNull AppendedDetailsT, @NonNull Instant> jobCreateTimeSupplier, + SerializableFunction<@NonNull AppendedDetailsT, @NonNull EmbeddedT> + embeddedInstanceSupplier) { + this.containerClass = containerClass; + this.embeddedTClass = embeddedTClass; + this.failureTag = failureTag; + this.embeddedFieldName = embeddedFieldName; + this.descriptorSupplier = descriptorSupplier; + this.jobIdSupplier = jobIdSupplier; + this.jobCreateTimeSupplier = jobCreateTimeSupplier; + this.embeddedInstanceSupplier = embeddedInstanceSupplier; + } + + @Override + public RowConversionResult expand( + PCollection input) { + Descriptor descriptor = descriptorSupplier.apply(embeddedTClass); + Schema embeddedSchema = + checkStateNotNull( + DescriptorSchemaRegistry.INSTANCE.getOrBuild(descriptor), + "%s null from %s: %s", + Schema.class, + Descriptor.class, + descriptor.getFullName()); + FieldType embeddedType = FieldType.row(embeddedSchema); + Field embeddedField = Field.of(embeddedFieldName, embeddedType); + Schema schema = Schema.of(JOB_ID_FIELD, JOB_CREATE_TIME, embeddedField); + + PCollectionTuple pct = + input.apply( + containerClass.getSimpleName() + " ToRowFn", + ParDo.of(new ToRowFn<>(schema, this)) + .withOutputTags(SUCCESS, TupleTagList.of(failureTag))); + + return new RowConversionResult<>(schema, SUCCESS, failureTag, pct); + } + + private static class ToRowFn + extends DoFn { + private final @NonNull Schema schema; + private final WithAppendedDetailsToRow spec; + + private ToRowFn( + @NonNull Schema schema, WithAppendedDetailsToRow spec) { + this.schema = schema; + this.spec = spec; + } + + @ProcessElement + public void process(@Element @NonNull AppendedDetailsT element, MultiOutputReceiver receiver) { + String id = spec.jobIdSupplier.apply(element); + Instant createTime = spec.jobCreateTimeSupplier.apply(element); + EmbeddedT embeddedInstance = spec.embeddedInstanceSupplier.apply(element); + GeneratedMessageV3RowBuilder builder = + GeneratedMessageV3RowBuilder.of(embeddedInstance); + try { + Row embeddedRow = + checkStateNotNull( + builder.build(), "null Row from build of %s type", embeddedInstance.getClass()); + Row result = + Row.withSchema(schema) + .withFieldValue(JOB_ID_FIELD.getName(), id) + .withFieldValue(JOB_CREATE_TIME.getName(), createTime) + .withFieldValue(spec.embeddedFieldName, embeddedRow) + .build(); + receiver.get(SUCCESS).output(result); + } catch (IllegalStateException e) { + receiver + .get(spec.failureTag) + .output( + ConversionError.builder() + .setObservedTime(Instant.now()) + .setMessage(Optional.ofNullable(e.getMessage()).orElse("")) + .setStackTrace(Throwables.getStackTraceAsString(e)) + .build()); + } + } + } +} diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/conversions/package-info.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/conversions/package-info.java new file mode 100644 index 000000000000..bc8605d322dc --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/conversions/package-info.java @@ -0,0 +1,20 @@ +/* + * 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. + */ + +/** Defines procedures for converting between various types. */ +package org.apache.beam.testinfra.pipelines.conversions; diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowClientFactory.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowClientFactory.java new file mode 100644 index 000000000000..fcda6190cde1 --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowClientFactory.java @@ -0,0 +1,102 @@ +/* + * 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.testinfra.pipelines.dataflow; + +import com.google.dataflow.v1beta3.JobsV1Beta3Grpc; +import com.google.dataflow.v1beta3.MetricsV1Beta3Grpc; +import io.grpc.ManagedChannel; +import io.grpc.auth.MoreCallCredentials; +import io.grpc.netty.NettyChannelBuilder; +import java.util.concurrent.TimeUnit; +import org.apache.beam.sdk.annotations.Internal; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; + +/** Produces and caches blocking stub gRPC clients for the Dataflow API. */ +@SuppressWarnings("ForbidNonVendoredGrpcProtobuf") +@Internal +final class DataflowClientFactory { + + static final DataflowClientFactory INSTANCE = new DataflowClientFactory(); + + private DataflowClientFactory() { + Thread closeChannelsHook = new Thread(this::closeAllChannels); + Runtime.getRuntime().addShutdownHook(closeChannelsHook); + } + + private JobsV1Beta3Grpc.@Nullable JobsV1Beta3BlockingStub cachedJobsClient; + private @Nullable ManagedChannel cachedJobsClientChannel; + private MetricsV1Beta3Grpc.@Nullable MetricsV1Beta3BlockingStub cachedMetricsClient; + private @Nullable ManagedChannel cachedMetricsClientChannel; + + JobsV1Beta3Grpc.JobsV1Beta3BlockingStub getOrCreateJobsClient( + DataflowClientFactoryConfiguration configuration) { + if (cachedJobsClient == null) { + cachedJobsClient = + JobsV1Beta3Grpc.newBlockingStub(getOrCreateJobsClientChannel(configuration)) + .withCallCredentials(MoreCallCredentials.from(configuration.getCredentials())); + } + return cachedJobsClient; + } + + MetricsV1Beta3Grpc.MetricsV1Beta3BlockingStub getOrCreateMetricsClient( + DataflowClientFactoryConfiguration configuration) { + if (cachedMetricsClient == null) { + cachedMetricsClient = + MetricsV1Beta3Grpc.newBlockingStub(getOrCreateMetricsClientChannel(configuration)) + .withCallCredentials(MoreCallCredentials.from(configuration.getCredentials())); + } + return cachedMetricsClient; + } + + private @NonNull ManagedChannel getOrCreateJobsClientChannel( + DataflowClientFactoryConfiguration configuration) { + if (cachedJobsClientChannel == null) { + cachedJobsClientChannel = channel(configuration); + } + return cachedJobsClientChannel; + } + + private @NonNull ManagedChannel getOrCreateMetricsClientChannel( + DataflowClientFactoryConfiguration configuration) { + if (cachedMetricsClientChannel == null) { + cachedMetricsClientChannel = channel(configuration); + } + return cachedMetricsClientChannel; + } + + private static ManagedChannel channel(DataflowClientFactoryConfiguration configuration) { + return NettyChannelBuilder.forTarget(configuration.getDataflowTarget()).build(); + } + + void closeAllChannels() { + close(INSTANCE.cachedJobsClientChannel); + close(INSTANCE.cachedMetricsClientChannel); + } + + private static void close(@Nullable ManagedChannel channel) { + if (channel == null) { + return; + } + channel.shutdown(); + try { + boolean ignored = channel.awaitTermination(1L, TimeUnit.SECONDS); + } catch (InterruptedException ignored) { + } + } +} diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowClientFactoryConfiguration.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowClientFactoryConfiguration.java new file mode 100644 index 000000000000..c8aebb16c527 --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowClientFactoryConfiguration.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.testinfra.pipelines.dataflow; + +import com.google.auth.Credentials; +import com.google.auto.value.AutoValue; +import java.io.Serializable; +import org.apache.beam.sdk.annotations.Internal; +import org.apache.beam.sdk.extensions.gcp.options.GcpOptions; + +/** Configures the Dataflow API client. */ +@Internal +@AutoValue +public abstract class DataflowClientFactoryConfiguration implements Serializable { + + public static Builder builder(DataflowJobsOptions options) { + Credentials credentials = credentialsFrom(options); + return new AutoValue_DataflowClientFactoryConfiguration.Builder() + .setCredentials(credentials) + .setDataflowTarget(options.getDataflowTarget()); + } + + static Credentials credentialsFrom(DataflowJobsOptions options) { + return options.as(GcpOptions.class).getGcpCredential(); + } + + abstract Credentials getCredentials(); + + abstract String getDataflowTarget(); + + @AutoValue.Builder + public abstract static class Builder { + abstract Builder setCredentials(Credentials newCredentials); + + abstract Builder setDataflowTarget(String newDataflowRootUrl); + + public abstract DataflowClientFactoryConfiguration build(); + } +} diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowFilterEventarcJobs.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowFilterEventarcJobs.java new file mode 100644 index 000000000000..8daa7adef650 --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowFilterEventarcJobs.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.testinfra.pipelines.dataflow; + +import static org.apache.beam.sdk.util.Preconditions.checkStateNotNull; + +import com.google.auto.value.AutoValue; +import com.google.events.cloud.dataflow.v1beta3.Job; +import com.google.events.cloud.dataflow.v1beta3.JobState; +import com.google.events.cloud.dataflow.v1beta3.JobType; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import org.apache.beam.sdk.annotations.Internal; +import org.apache.beam.sdk.transforms.Filter; +import org.apache.beam.sdk.transforms.PTransform; +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.NonNull; + +/** Filters Eventarc {@link Job}s. */ +@Internal +@AutoValue +public abstract class DataflowFilterEventarcJobs + extends PTransform<@NonNull PCollection, @NonNull PCollection> { + + public static Builder builder() { + return new AutoValue_DataflowFilterEventarcJobs.Builder(); + } + + public abstract List getIncludeJobStates(); + + public abstract List getExcludeJobStates(); + + public abstract JobType getIncludeJobType(); + + abstract Builder toBuilder(); + + @Override + public @NonNull PCollection expand(PCollection input) { + return input.apply( + Filter.by( + job -> { + Job safeJob = + checkStateNotNull(job, "null Job input in %s", DataflowFilterEventarcJobs.class); + boolean matchesIncludes = + !getIncludeJobStates().isEmpty() + && getIncludeJobStates().contains(safeJob.getCurrentState()); + boolean matchesExcludes = + !getExcludeJobStates().isEmpty() + && getExcludeJobStates().contains(safeJob.getCurrentState()); + boolean matchesJobType = getIncludeJobType().equals(job.getType()); + return matchesIncludes && !matchesExcludes && matchesJobType; + })); + } + + @AutoValue.Builder + public abstract static class Builder { + + public abstract Builder setIncludeJobStates(List newIncludeJobStates); + + abstract Optional> getIncludeJobStates(); + + public abstract Builder setExcludeJobStates(List newExcludeJobStates); + + abstract Optional> getExcludeJobStates(); + + public abstract Builder setIncludeJobType(JobType newIncludeJobType); + + abstract JobType getIncludeJobType(); + + public abstract DataflowFilterEventarcJobs autoBuild(); + + public Builder terminatedOnly() { + return setIncludeJobStates( + ImmutableList.of(JobState.JOB_STATE_DONE, JobState.JOB_STATE_CANCELLED)); + } + + public final DataflowFilterEventarcJobs build() { + if (!getIncludeJobStates().isPresent()) { + setIncludeJobStates(Collections.emptyList()); + } + if (!getExcludeJobStates().isPresent()) { + setExcludeJobStates(Collections.emptyList()); + } + if (getIncludeJobType().equals(JobType.JOB_TYPE_UNKNOWN)) { + throw new IllegalStateException( + String.format( + "illegal %s: %s", JobType.class.getSimpleName(), JobType.JOB_TYPE_UNKNOWN)); + } + + return autoBuild(); + } + } +} diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowGetJobExecutionDetails.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowGetJobExecutionDetails.java new file mode 100644 index 000000000000..3df99c447bfe --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowGetJobExecutionDetails.java @@ -0,0 +1,160 @@ +/* + * 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.testinfra.pipelines.dataflow; + +import static org.apache.beam.sdk.util.Preconditions.checkStateNotNull; + +import com.google.dataflow.v1beta3.GetJobExecutionDetailsRequest; +import com.google.dataflow.v1beta3.Job; +import com.google.dataflow.v1beta3.JobExecutionDetails; +import com.google.dataflow.v1beta3.MetricsV1Beta3Grpc; +import com.google.dataflow.v1beta3.StageSummary; +import io.grpc.StatusRuntimeException; +import java.util.Optional; +import org.apache.beam.sdk.annotations.Internal; +import org.apache.beam.sdk.metrics.Counter; +import org.apache.beam.sdk.metrics.Metrics; +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.TupleTag; +import org.apache.beam.sdk.values.TupleTagList; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Strings; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Throwables; +import org.checkerframework.checker.nullness.qual.MonotonicNonNull; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.joda.time.Duration; +import org.joda.time.Instant; + +/** + * {@link PTransform} for executing {@link GetJobExecutionDetailsRequest}s using the {@link + * MetricsV1Beta3Grpc} client. Emits {@link StageSummaryWithAppendedDetails} or {@link + * DataflowRequestError}s. + */ +@Internal +public class DataflowGetJobExecutionDetails + extends PTransform< + @NonNull PCollection, + @NonNull DataflowReadResult> { + + private static final TupleTag SUCCESS = + new TupleTag() {}; + + private static final TupleTag FAILURE = + new TupleTag() {}; + + private final DataflowClientFactoryConfiguration configuration; + + public static DataflowGetJobExecutionDetails create( + DataflowClientFactoryConfiguration configuration) { + return new DataflowGetJobExecutionDetails(configuration); + } + + private DataflowGetJobExecutionDetails(DataflowClientFactoryConfiguration configuration) { + this.configuration = configuration; + } + + @Override + public @NonNull DataflowReadResult expand( + PCollection input) { + + PCollectionTuple pct = + input + .apply( + Throttle.class.getSimpleName() + + " " + + DataflowGetJobExecutionDetails.class.getSimpleName(), + Throttle.of( + DataflowGetJobExecutionDetails.class.getName(), Duration.standardSeconds(1L))) + .apply( + DataflowGetJobExecutionDetails.class.getSimpleName(), + ParDo.of(new GetJobExecutionDetailsFn(this)) + .withOutputTags(SUCCESS, TupleTagList.of(FAILURE))); + + return DataflowReadResult.of(SUCCESS, FAILURE, pct); + } + + private static class GetJobExecutionDetailsFn extends DoFn { + final Counter success = + Metrics.counter(GetJobExecutionDetailsRequest.class, "get_job_execution_details_success"); + final Counter failure = + Metrics.counter(GetJobExecutionDetailsRequest.class, "get_job_execution_details_failure"); + final Counter items = Metrics.counter(StageSummary.class, "job_execution_details_items"); + private final DataflowGetJobExecutionDetails spec; + private transient MetricsV1Beta3Grpc.@MonotonicNonNull MetricsV1Beta3BlockingStub client; + + private GetJobExecutionDetailsFn(DataflowGetJobExecutionDetails spec) { + this.spec = spec; + } + + @Setup + public void setup() { + client = DataflowClientFactory.INSTANCE.getOrCreateMetricsClient(spec.configuration); + } + + @ProcessElement + public void process(@Element Job job, MultiOutputReceiver receiver) { + GetJobExecutionDetailsRequest request = + GetJobExecutionDetailsRequest.newBuilder() + .setJobId(job.getId()) + .setProjectId(job.getProjectId()) + .setLocation(job.getLocation()) + .build(); + try { + JobExecutionDetails response = checkStateNotNull(client).getJobExecutionDetails(request); + success.inc(); + items.inc(response.getStagesCount()); + emitResponse(job, response, receiver.get(SUCCESS)); + while (!Strings.isNullOrEmpty(response.getNextPageToken())) { + GetJobExecutionDetailsRequest requestWithPageToken = + request.toBuilder().setPageToken(response.getNextPageToken()).build(); + response = client.getJobExecutionDetails(requestWithPageToken); + success.inc(); + items.inc(response.getStagesCount()); + emitResponse(job, response, receiver.get(SUCCESS)); + } + } catch (StatusRuntimeException e) { + failure.inc(); + receiver + .get(FAILURE) + .output( + DataflowRequestError.fromRequest(request, GetJobExecutionDetailsRequest.class) + .setObservedTime(Instant.now()) + .setMessage(Optional.ofNullable(e.getMessage()).orElse("")) + .setStackTrace(Throwables.getStackTraceAsString(e)) + .build()); + } + } + } + + private static void emitResponse( + @NonNull Job job, + @NonNull JobExecutionDetails response, + DoFn.OutputReceiver receiver) { + Instant createTime = Instant.ofEpochSecond(job.getCreateTime().getSeconds()); + for (StageSummary summary : response.getStagesList()) { + StageSummaryWithAppendedDetails result = new StageSummaryWithAppendedDetails(); + result.setJobId(job.getId()); + result.setJobCreateTime(createTime); + result.setStageSummary(summary); + receiver.output(result); + } + } +} diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowGetJobMetrics.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowGetJobMetrics.java new file mode 100644 index 000000000000..c8900d123532 --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowGetJobMetrics.java @@ -0,0 +1,139 @@ +/* + * 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.testinfra.pipelines.dataflow; + +import static org.apache.beam.sdk.util.Preconditions.checkStateNotNull; + +import com.google.dataflow.v1beta3.GetJobMetricsRequest; +import com.google.dataflow.v1beta3.Job; +import com.google.dataflow.v1beta3.JobMetrics; +import com.google.dataflow.v1beta3.MetricsV1Beta3Grpc; +import io.grpc.StatusRuntimeException; +import java.util.Optional; +import org.apache.beam.sdk.annotations.Internal; +import org.apache.beam.sdk.metrics.Counter; +import org.apache.beam.sdk.metrics.Metrics; +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.TupleTag; +import org.apache.beam.sdk.values.TupleTagList; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Throwables; +import org.checkerframework.checker.nullness.qual.MonotonicNonNull; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.joda.time.Duration; +import org.joda.time.Instant; + +/** + * {@link PTransform} for executing {@link GetJobMetricsRequest}s using the {@link + * MetricsV1Beta3Grpc} client. Emits {@link JobMetricsWithAppendedDetails} or {@link + * DataflowRequestError}s. + */ +@Internal +public class DataflowGetJobMetrics + extends PTransform< + @NonNull PCollection, + @NonNull DataflowReadResult> { + + public static DataflowGetJobMetrics create(DataflowClientFactoryConfiguration configuration) { + return new DataflowGetJobMetrics(configuration); + } + + private static final TupleTag SUCCESS = + new TupleTag() {}; + + private static final TupleTag FAILURE = + new TupleTag() {}; + + private final DataflowClientFactoryConfiguration configuration; + + private DataflowGetJobMetrics(DataflowClientFactoryConfiguration configuration) { + this.configuration = configuration; + } + + @Override + public @NonNull DataflowReadResult expand( + PCollection input) { + + PCollectionTuple pct = + input + .apply( + Throttle.class.getSimpleName() + " " + DataflowGetJobMetrics.class.getSimpleName(), + Throttle.of(DataflowGetJobMetrics.class.getName(), Duration.standardSeconds(1L))) + .apply( + DataflowGetJobMetrics.class.getSimpleName(), + ParDo.of(new GetJobMetricsFn(this)) + .withOutputTags(SUCCESS, TupleTagList.of(FAILURE))); + + return DataflowReadResult.of(SUCCESS, FAILURE, pct); + } + + private static class GetJobMetricsFn extends DoFn { + + final Counter success = Metrics.counter(GetJobMetricsRequest.class, "get_jobs_metrics_success"); + final Counter failure = Metrics.counter(GetJobMetricsRequest.class, "get_jobs_metrics_failure"); + final Counter items = Metrics.counter(JobMetrics.class, "job_metrics_items"); + private final DataflowGetJobMetrics spec; + private transient MetricsV1Beta3Grpc.@MonotonicNonNull MetricsV1Beta3BlockingStub client; + + private GetJobMetricsFn(DataflowGetJobMetrics spec) { + this.spec = spec; + } + + @Setup + public void setup() { + client = DataflowClientFactory.INSTANCE.getOrCreateMetricsClient(spec.configuration); + } + + @ProcessElement + public void process(@Element Job job, MultiOutputReceiver receiver) { + GetJobMetricsRequest request = + GetJobMetricsRequest.newBuilder() + .setJobId(job.getId()) + .setProjectId(job.getProjectId()) + .setLocation(job.getLocation()) + .build(); + try { + + JobMetrics response = checkStateNotNull(client).getJobMetrics(request); + success.inc(); + items.inc(response.getMetricsCount()); + com.google.protobuf.Timestamp timestamp = job.getCreateTime(); + JobMetricsWithAppendedDetails result = new JobMetricsWithAppendedDetails(); + result.setJobId(request.getJobId()); + result.setJobCreateTime(Instant.ofEpochSecond(timestamp.getSeconds())); + result.setJobMetrics(response); + + receiver.get(SUCCESS).output(result); + + } catch (StatusRuntimeException e) { + failure.inc(); + receiver + .get(FAILURE) + .output( + DataflowRequestError.fromRequest(request, GetJobMetricsRequest.class) + .setObservedTime(Instant.now()) + .setMessage(Optional.ofNullable(e.getMessage()).orElse("")) + .setStackTrace(Throwables.getStackTraceAsString(e)) + .build()); + } + } + } +} diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowGetJobs.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowGetJobs.java new file mode 100644 index 000000000000..e7a59560a7ec --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowGetJobs.java @@ -0,0 +1,121 @@ +/* + * 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.testinfra.pipelines.dataflow; + +import static org.apache.beam.sdk.util.Preconditions.checkStateNotNull; + +import com.google.dataflow.v1beta3.GetJobRequest; +import com.google.dataflow.v1beta3.Job; +import com.google.dataflow.v1beta3.JobsV1Beta3Grpc; +import io.grpc.StatusRuntimeException; +import java.util.Optional; +import org.apache.beam.sdk.annotations.Internal; +import org.apache.beam.sdk.metrics.Counter; +import org.apache.beam.sdk.metrics.Metrics; +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.TupleTag; +import org.apache.beam.sdk.values.TupleTagList; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Throwables; +import org.checkerframework.checker.nullness.qual.MonotonicNonNull; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.joda.time.Duration; +import org.joda.time.Instant; + +/** + * {@link PTransform} for executing {@link GetJobRequest}s using the {@link JobsV1Beta3Grpc}. Emits + * {@link Job}s or {@link DataflowRequestError}s. + */ +@Internal +public class DataflowGetJobs + extends PTransform< + @NonNull PCollection, + @NonNull DataflowReadResult> { + + private static final TupleTag SUCCESS = new TupleTag() {}; + + private static final TupleTag FAILURE = + new TupleTag() {}; + + public static DataflowGetJobs create(DataflowClientFactoryConfiguration configuration) { + return new DataflowGetJobs(configuration); + } + + private final DataflowClientFactoryConfiguration configuration; + + private DataflowGetJobs(@NonNull DataflowClientFactoryConfiguration configuration) { + this.configuration = configuration; + } + + @Override + public @NonNull DataflowReadResult expand( + PCollection input) { + + PCollectionTuple pct = + input + .apply( + Throttle.class.getSimpleName() + " " + DataflowGetJobs.class.getSimpleName(), + Throttle.of(DataflowGetJobs.class.getName(), Duration.standardSeconds(1L))) + .apply( + "GetJobs", + ParDo.of(new GetJobsFn(this)).withOutputTags(SUCCESS, TupleTagList.of(FAILURE))); + + return DataflowReadResult.of(SUCCESS, FAILURE, pct); + } + + private static class GetJobsFn extends DoFn { + final Counter success = Metrics.counter(GetJobRequest.class, "get_jobs_success"); + final Counter failure = Metrics.counter(GetJobRequest.class, "get_jobs_failure"); + private final DataflowGetJobs spec; + private transient JobsV1Beta3Grpc.@MonotonicNonNull JobsV1Beta3BlockingStub client; + + GetJobsFn(DataflowGetJobs spec) { + this.spec = spec; + } + + @Setup + public void setup() { + client = DataflowClientFactory.INSTANCE.getOrCreateJobsClient(spec.configuration); + } + + @ProcessElement + public void process(@Element GetJobRequest request, MultiOutputReceiver receiver) { + try { + + Job job = checkStateNotNull(client).getJob(request); + success.inc(); + receiver.get(SUCCESS).output(job); + + } catch (StatusRuntimeException e) { + + failure.inc(); + receiver + .get(FAILURE) + .output( + DataflowRequestError.fromRequest(request, GetJobRequest.class) + .setObservedTime(Instant.now()) + .setMessage(Optional.ofNullable(e.getMessage()).orElse("")) + .setStackTrace(Throwables.getStackTraceAsString(e)) + .build()); + } + } + } +} diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowGetStageExecutionDetails.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowGetStageExecutionDetails.java new file mode 100644 index 000000000000..1663577783b6 --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowGetStageExecutionDetails.java @@ -0,0 +1,166 @@ +/* + * 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.testinfra.pipelines.dataflow; + +import static org.apache.beam.sdk.util.Preconditions.checkStateNotNull; + +import com.google.dataflow.v1beta3.GetStageExecutionDetailsRequest; +import com.google.dataflow.v1beta3.Job; +import com.google.dataflow.v1beta3.MetricsV1Beta3Grpc; +import com.google.dataflow.v1beta3.StageExecutionDetails; +import com.google.dataflow.v1beta3.WorkerDetails; +import io.grpc.StatusRuntimeException; +import java.util.Optional; +import org.apache.beam.sdk.annotations.Internal; +import org.apache.beam.sdk.metrics.Counter; +import org.apache.beam.sdk.metrics.Metrics; +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.TupleTag; +import org.apache.beam.sdk.values.TupleTagList; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Strings; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Throwables; +import org.checkerframework.checker.nullness.qual.MonotonicNonNull; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.joda.time.Duration; +import org.joda.time.Instant; + +/** + * {@link PTransform} for executing {@link GetStageExecutionDetailsRequest}s using the {@link + * MetricsV1Beta3Grpc} client. Emits {@link WorkerDetailsWithAppendedDetails} or {@link + * DataflowRequestError}s. + */ +@Internal +public class DataflowGetStageExecutionDetails + extends PTransform< + @NonNull PCollection, + @NonNull DataflowReadResult> { + + public static DataflowGetStageExecutionDetails create( + DataflowClientFactoryConfiguration configuration) { + return new DataflowGetStageExecutionDetails(configuration); + } + + private static final TupleTag SUCCESS = + new TupleTag() {}; + + private static final TupleTag FAILURE = + new TupleTag() {}; + + private final DataflowClientFactoryConfiguration configuration; + + private DataflowGetStageExecutionDetails(DataflowClientFactoryConfiguration configuration) { + this.configuration = configuration; + } + + @Override + public @NonNull DataflowReadResult expand( + PCollection input) { + + PCollectionTuple pct = + input + .apply( + Throttle.class.getSimpleName() + + " " + + DataflowGetStageExecutionDetails.class.getSimpleName(), + Throttle.of( + DataflowGetStageExecutionDetails.class.getName(), Duration.standardSeconds(1L))) + .apply( + DataflowGetStageExecutionDetails.class.getSimpleName(), + ParDo.of(new GetStageExecutionDetailsFn(this)) + .withOutputTags(SUCCESS, TupleTagList.of(FAILURE))); + return DataflowReadResult.of(SUCCESS, FAILURE, pct); + } + + private static class GetStageExecutionDetailsFn + extends DoFn { + + final Counter success = + Metrics.counter( + GetStageExecutionDetailsRequest.class, "get_stage_execution_details_success"); + final Counter failure = + Metrics.counter( + GetStageExecutionDetailsRequest.class, "get_stage_execution_details_failure"); + + final Counter items = Metrics.counter(WorkerDetails.class, "stage_execution_details_items"); + private final DataflowGetStageExecutionDetails spec; + private transient MetricsV1Beta3Grpc.@MonotonicNonNull MetricsV1Beta3BlockingStub client; + + private GetStageExecutionDetailsFn(DataflowGetStageExecutionDetails spec) { + this.spec = spec; + } + + @Setup + public void setup() { + client = DataflowClientFactory.INSTANCE.getOrCreateMetricsClient(spec.configuration); + } + + @ProcessElement + public void process(@Element Job job, MultiOutputReceiver receiver) { + GetStageExecutionDetailsRequest request = + GetStageExecutionDetailsRequest.getDefaultInstance() + .toBuilder() + .setJobId(job.getId()) + .setProjectId(job.getProjectId()) + .setLocation(job.getLocation()) + .build(); + try { + StageExecutionDetails response = + checkStateNotNull(client).getStageExecutionDetails(request); + success.inc(); + items.inc(response.getWorkersCount()); + emitResponse(job, response, receiver.get(SUCCESS)); + while (!Strings.isNullOrEmpty(response.getNextPageToken())) { + GetStageExecutionDetailsRequest requestWithPageToken = + request.toBuilder().setPageToken(response.getNextPageToken()).build(); + response = client.getStageExecutionDetails(requestWithPageToken); + success.inc(); + emitResponse(job, response, receiver.get(SUCCESS)); + } + } catch (StatusRuntimeException e) { + failure.inc(); + receiver + .get(FAILURE) + .output( + DataflowRequestError.fromRequest(request, GetStageExecutionDetailsRequest.class) + .setObservedTime(Instant.now()) + .setMessage(Optional.ofNullable(e.getMessage()).orElse("")) + .setStackTrace(Throwables.getStackTraceAsString(e)) + .build()); + } + } + + private static void emitResponse( + @NonNull Job job, + @NonNull StageExecutionDetails response, + @NonNull OutputReceiver receiver) { + + for (WorkerDetails details : response.getWorkersList()) { + Instant createTime = Instant.ofEpochSecond(job.getCreateTime().getSeconds()); + WorkerDetailsWithAppendedDetails result = new WorkerDetailsWithAppendedDetails(); + result.setJobId(job.getId()); + result.setJobCreateTime(createTime); + result.setWorkerDetails(details); + receiver.output(result); + } + } + } +} diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowJobsOptions.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowJobsOptions.java new file mode 100644 index 000000000000..148dde303d66 --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowJobsOptions.java @@ -0,0 +1,36 @@ +/* + * 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.testinfra.pipelines.dataflow; + +import org.apache.beam.sdk.annotations.Internal; +import org.apache.beam.sdk.options.Default; +import org.apache.beam.sdk.options.Description; +import org.apache.beam.sdk.options.Hidden; +import org.apache.beam.sdk.options.PipelineOptions; + +/** Options required for calling the Dataflow API. */ +@Internal +public interface DataflowJobsOptions extends PipelineOptions { + + @Description("Target for use with the Google Cloud Dataflow API") + @Default.String("dns:///dataflow.googleapis.com") + @Hidden + String getDataflowTarget(); + + void setDataflowTarget(String value); +} diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowReadResult.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowReadResult.java new file mode 100644 index 000000000000..5ea13eb1fa00 --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowReadResult.java @@ -0,0 +1,90 @@ +/* + * 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.testinfra.pipelines.dataflow; + +import java.util.Map; +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.annotations.Internal; +import org.apache.beam.sdk.transforms.PTransform; +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.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableMap; +import org.checkerframework.checker.initialization.qual.Initialized; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.UnknownKeyFor; + +/** Convenience class for bundling Dataflow API successful request responses and failures. */ +@Internal +public class DataflowReadResult implements POutput { + + public static DataflowReadResult of( + TupleTag successTag, TupleTag failureTag, PCollectionTuple pct) { + return new DataflowReadResult<>(successTag, failureTag, pct); + } + + private final Pipeline pipeline; + + private final TupleTag successTag; + + private final PCollection success; + + private final TupleTag failureTag; + + private final PCollection failure; + + private DataflowReadResult( + TupleTag successTag, TupleTag failureTag, PCollectionTuple pct) { + this.pipeline = pct.getPipeline(); + this.successTag = successTag; + this.success = pct.get(successTag); + this.failureTag = failureTag; + this.failure = pct.get(failureTag); + } + + public PCollection getSuccess() { + return success; + } + + public PCollection getFailure() { + return failure; + } + + @Override + public @UnknownKeyFor @NonNull @Initialized Pipeline getPipeline() { + return pipeline; + } + + @Override + public @NonNull Map, PValue> expand() { + return ImmutableMap.of( + successTag, success, + failureTag, failure); + } + + @Override + public void finishSpecifyingOutput( + @UnknownKeyFor @NonNull @Initialized String transformName, + @UnknownKeyFor @NonNull @Initialized PInput input, + @UnknownKeyFor @NonNull @Initialized + PTransform<@UnknownKeyFor @NonNull @Initialized ?, @UnknownKeyFor @NonNull @Initialized ?> + transform) {} +} diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowRequestError.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowRequestError.java new file mode 100644 index 000000000000..a23843afa655 --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowRequestError.java @@ -0,0 +1,95 @@ +/* + * 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.testinfra.pipelines.dataflow; + +import static org.apache.beam.sdk.util.Preconditions.checkStateNotNull; + +import com.google.auto.value.AutoValue; +import com.google.protobuf.GeneratedMessageV3; +import com.google.protobuf.InvalidProtocolBufferException; +import com.google.protobuf.util.JsonFormat; +import org.apache.beam.sdk.annotations.Internal; +import org.apache.beam.sdk.schemas.AutoValueSchema; +import org.apache.beam.sdk.schemas.Schema; +import org.apache.beam.sdk.schemas.annotations.DefaultSchema; +import org.apache.beam.sdk.schemas.annotations.SchemaCaseFormat; +import org.apache.beam.sdk.transforms.SerializableFunction; +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.CaseFormat; +import org.joda.time.Instant; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** Stores errors related to Dataflow API request executions. */ +@Internal +@DefaultSchema(AutoValueSchema.class) +@AutoValue +@SchemaCaseFormat(CaseFormat.LOWER_UNDERSCORE) +public abstract class DataflowRequestError { + + private static final Logger LOG = LoggerFactory.getLogger(DataflowRequestError.class); + + private static final AutoValueSchema SCHEMA_PROVIDER = new AutoValueSchema(); + + private static final TypeDescriptor TYPE = + TypeDescriptor.of(DataflowRequestError.class); + + public static final Schema SCHEMA = checkStateNotNull(SCHEMA_PROVIDER.schemaFor(TYPE)); + + public static final SerializableFunction TO_ROW_FN = + SCHEMA_PROVIDER.toRowFunction(TYPE); + + public static Builder builder() { + return new AutoValue_DataflowRequestError.Builder(); + } + + public static Builder fromRequest( + RequestT request, Class clazz) { + Builder builder = builder(); + try { + String json = JsonFormat.printer().omittingInsignificantWhitespace().print(request); + builder = builder.setRequest(json); + } catch (InvalidProtocolBufferException e) { + LOG.warn("error converting {} to json: {}", clazz, e.getMessage()); + } + return builder; + } + + public abstract Instant getObservedTime(); + + public abstract String getRequest(); + + public abstract String getMessage(); + + public abstract String getStackTrace(); + + @AutoValue.Builder + public abstract static class Builder { + + public abstract Builder setObservedTime(Instant value); + + public abstract Builder setRequest(String value); + + public abstract Builder setMessage(String value); + + public abstract Builder setStackTrace(String value); + + public abstract DataflowRequestError build(); + } +} diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowRequests.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowRequests.java new file mode 100644 index 000000000000..6cc54310df68 --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowRequests.java @@ -0,0 +1,52 @@ +/* + * 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.testinfra.pipelines.dataflow; + +import static org.apache.beam.sdk.util.Preconditions.checkStateNotNull; + +import com.google.dataflow.v1beta3.GetJobRequest; +import com.google.dataflow.v1beta3.JobView; +import com.google.events.cloud.dataflow.v1beta3.Job; +import org.apache.beam.sdk.annotations.Internal; +import org.apache.beam.sdk.transforms.MapElements; +import org.apache.beam.sdk.values.TypeDescriptor; + +/** Various methods to create Dataflow API requests. */ +@Internal +public final class DataflowRequests { + + /** Creates {@link GetJobRequest}s from {@link Job}s with {@link JobView#JOB_VIEW_ALL}. */ + public static MapElements jobRequestsFromEventsViewAll() { + return jobRequests(JobView.JOB_VIEW_ALL); + } + + /** Creates {@link GetJobRequest}s from {@link Job}s with the assigned {@link JobView}. */ + public static MapElements jobRequests(JobView view) { + return MapElements.into(TypeDescriptor.of(GetJobRequest.class)) + .via( + event -> { + Job safeEvent = checkStateNotNull(event); + return GetJobRequest.newBuilder() + .setJobId(safeEvent.getId()) + .setLocation(safeEvent.getLocation()) + .setProjectId(safeEvent.getProjectId()) + .setView(view) + .build(); + }); + } +} diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/JobMetricsWithAppendedDetails.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/JobMetricsWithAppendedDetails.java new file mode 100644 index 000000000000..24ab889c7af5 --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/JobMetricsWithAppendedDetails.java @@ -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. + */ +package org.apache.beam.testinfra.pipelines.dataflow; + +import com.google.dataflow.v1beta3.Job; +import com.google.dataflow.v1beta3.JobMetrics; +import java.io.Serializable; +import org.apache.beam.sdk.annotations.Internal; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Objects; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.joda.time.Instant; + +/** + * A {@link JobMetrics} enrichment with a {@link Job}'s id and create time. The purpose of this + * enrichment is to join metrics with its Job while partitioning on the Job's create time. + */ +@Internal +public class JobMetricsWithAppendedDetails implements Serializable { + + private String jobId = ""; + + private Instant jobCreateTime = Instant.EPOCH; + + private JobMetrics jobMetrics = JobMetrics.getDefaultInstance(); + + public String getJobId() { + return jobId; + } + + public void setJobId(@NonNull String jobId) { + this.jobId = jobId; + } + + public Instant getJobCreateTime() { + return jobCreateTime; + } + + public void setJobCreateTime(@NonNull Instant jobCreateTime) { + this.jobCreateTime = jobCreateTime; + } + + public JobMetrics getJobMetrics() { + return jobMetrics; + } + + public void setJobMetrics(@NonNull JobMetrics jobMetrics) { + this.jobMetrics = jobMetrics; + } + + @Override + public boolean equals(@Nullable Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + JobMetricsWithAppendedDetails that = (JobMetricsWithAppendedDetails) o; + return Objects.equal(jobId, that.jobId) + && Objects.equal(jobCreateTime, that.jobCreateTime) + && Objects.equal(jobMetrics, that.jobMetrics); + } + + @Override + public int hashCode() { + return Objects.hashCode(jobId, jobCreateTime, jobMetrics); + } +} diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/StageSummaryWithAppendedDetails.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/StageSummaryWithAppendedDetails.java new file mode 100644 index 000000000000..4f454301bf52 --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/StageSummaryWithAppendedDetails.java @@ -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. + */ +package org.apache.beam.testinfra.pipelines.dataflow; + +import com.google.dataflow.v1beta3.Job; +import com.google.dataflow.v1beta3.StageSummary; +import java.io.Serializable; +import org.apache.beam.sdk.annotations.Internal; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Objects; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.joda.time.Instant; + +/** + * A {@link StageSummary} enrichment with a {@link Job}'s id and create time. The purpose of this + * enrichment is to join stage summaries with their Job while partitioning on the Job's create time. + */ +@Internal +public class StageSummaryWithAppendedDetails implements Serializable { + + private String jobId = ""; + + private Instant jobCreateTime = Instant.EPOCH; + + private StageSummary stageSummary = StageSummary.getDefaultInstance(); + + public String getJobId() { + return jobId; + } + + public void setJobId(@NonNull String jobId) { + this.jobId = jobId; + } + + public Instant getJobCreateTime() { + return jobCreateTime; + } + + public void setJobCreateTime(@NonNull Instant jobCreateTime) { + this.jobCreateTime = jobCreateTime; + } + + public StageSummary getStageSummary() { + return stageSummary; + } + + public void setStageSummary(@NonNull StageSummary stageSummary) { + this.stageSummary = stageSummary; + } + + @Override + public boolean equals(@Nullable Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + StageSummaryWithAppendedDetails that = (StageSummaryWithAppendedDetails) o; + return Objects.equal(jobId, that.jobId) + && Objects.equal(jobCreateTime, that.jobCreateTime) + && Objects.equal(stageSummary, that.stageSummary); + } + + @Override + public int hashCode() { + return Objects.hashCode(jobId, jobCreateTime, stageSummary); + } +} diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/Throttle.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/Throttle.java new file mode 100644 index 000000000000..3a062a9a8345 --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/Throttle.java @@ -0,0 +1,74 @@ +/* + * 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.testinfra.pipelines.dataflow; + +import org.apache.beam.sdk.annotations.Internal; +import org.apache.beam.sdk.transforms.DoFn; +import org.apache.beam.sdk.transforms.Flatten; +import org.apache.beam.sdk.transforms.GroupIntoBatches; +import org.apache.beam.sdk.transforms.PTransform; +import org.apache.beam.sdk.transforms.ParDo; +import org.apache.beam.sdk.transforms.Values; +import org.apache.beam.sdk.transforms.windowing.BoundedWindow; +import org.apache.beam.sdk.transforms.windowing.FixedWindows; +import org.apache.beam.sdk.transforms.windowing.Window; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.sdk.values.PCollection; +import org.joda.time.Duration; + +/** Controls the rate of elements. */ +@Internal +class Throttle extends PTransform, PCollection> { + + /** Control the rate of elements, emitting each element per {@link Duration}. */ + static Throttle of(String name, Duration duration) { + return new Throttle<>(name, duration); + } + + private final String tagName; + private final Duration duration; + + public Throttle(String tagName, Duration duration) { + this.tagName = tagName; + this.duration = duration; + } + + @Override + public PCollection expand(PCollection input) { + return input + .apply( + "Throttle/Window " + tagName, + Window.into(FixedWindows.of(Duration.standardSeconds(1L)))) + .apply( + "Throttle/Assign To Bounded Window " + tagName, + ParDo.of(new AssignToBoundedWindowFn<>())) + .apply( + "Throttle/GroupIntoBatches " + tagName, + GroupIntoBatches.ofSize(1L).withMaxBufferingDuration(duration)) + .apply("Throttle/Extract Values " + tagName, Values.create()) + .apply("Throttle/Flatten " + tagName, Flatten.iterables()); + } + + private static class AssignToBoundedWindowFn extends DoFn> { + @ProcessElement + public void process( + @Element T element, BoundedWindow boundedWindow, OutputReceiver> receiver) { + receiver.output(KV.of(boundedWindow.maxTimestamp().getMillis(), element)); + } + } +} diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/WorkerDetailsWithAppendedDetails.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/WorkerDetailsWithAppendedDetails.java new file mode 100644 index 000000000000..5b1542fbe30d --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/WorkerDetailsWithAppendedDetails.java @@ -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. + */ +package org.apache.beam.testinfra.pipelines.dataflow; + +import com.google.dataflow.v1beta3.Job; +import com.google.dataflow.v1beta3.WorkerDetails; +import java.io.Serializable; +import org.apache.beam.sdk.annotations.Internal; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Objects; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.joda.time.Instant; + +/** + * A {@link WorkerDetails} enrichment with a {@link Job}'s id and create time. The purpose of this + * enrichment is to join worker details with their Job while partitioning on the Job's create time. + */ +@Internal +public class WorkerDetailsWithAppendedDetails implements Serializable { + + private String jobId = ""; + + private Instant jobCreateTime = Instant.EPOCH; + + private WorkerDetails workerDetails = WorkerDetails.getDefaultInstance(); + + public String getJobId() { + return jobId; + } + + public void setJobId(@NonNull String jobId) { + this.jobId = jobId; + } + + public Instant getJobCreateTime() { + return jobCreateTime; + } + + public void setJobCreateTime(@NonNull Instant jobCreateTime) { + this.jobCreateTime = jobCreateTime; + } + + public WorkerDetails getWorkerDetails() { + return workerDetails; + } + + public void setWorkerDetails(@NonNull WorkerDetails workerDetails) { + this.workerDetails = workerDetails; + } + + @Override + public boolean equals(@Nullable Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + WorkerDetailsWithAppendedDetails that = (WorkerDetailsWithAppendedDetails) o; + return Objects.equal(jobId, that.jobId) + && Objects.equal(jobCreateTime, that.jobCreateTime) + && Objects.equal(workerDetails, that.workerDetails); + } + + @Override + public int hashCode() { + return Objects.hashCode(jobId, jobCreateTime, workerDetails); + } +} diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/package-info.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/package-info.java new file mode 100644 index 000000000000..3d359087172c --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/dataflow/package-info.java @@ -0,0 +1,20 @@ +/* + * 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. + */ + +/** Defines how to read from the Dataflow API. */ +package org.apache.beam.testinfra.pipelines.dataflow; diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/package-info.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/package-info.java new file mode 100644 index 000000000000..f61cdfa26331 --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/package-info.java @@ -0,0 +1,19 @@ +/* + * 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. + */ +/** Pipelines for use with test infrastructure. */ +package org.apache.beam.testinfra.pipelines; diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/pubsub/PubsubReadOptions.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/pubsub/PubsubReadOptions.java new file mode 100644 index 000000000000..1be06256efef --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/pubsub/PubsubReadOptions.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.testinfra.pipelines.pubsub; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import org.apache.beam.sdk.annotations.Internal; +import org.apache.beam.sdk.options.Description; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.Validation.Required; + +/** Options for reading from Pub/Sub. */ +@Internal +public interface PubsubReadOptions extends PipelineOptions { + @Description("Pub/Sub subscription") + @Required + @JsonIgnore + SubscriptionPathOptionValue getSubscription(); + + void setSubscription(SubscriptionPathOptionValue value); +} diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/pubsub/SubscriptionPathOptionValue.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/pubsub/SubscriptionPathOptionValue.java new file mode 100644 index 000000000000..c27ec16f57c5 --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/pubsub/SubscriptionPathOptionValue.java @@ -0,0 +1,45 @@ +/* + * 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.testinfra.pipelines.pubsub; + +import java.io.Serializable; +import org.apache.beam.sdk.annotations.Internal; +import org.apache.beam.sdk.io.gcp.pubsub.PubsubClient; +import org.apache.beam.sdk.io.gcp.pubsub.PubsubClient.SubscriptionPath; + +/** Converts a String Pub/Sub subscription path into a {@link SubscriptionPath}. */ +@Internal +public class SubscriptionPathOptionValue implements Serializable { + private final SubscriptionPath subscriptionPath; + + public SubscriptionPathOptionValue(String input) { + SubscriptionPath parsedResult = null; + try { + parsedResult = PubsubClient.subscriptionPathFromPath(input); + } catch (IllegalStateException e) { + throw new IllegalArgumentException( + String.format( + "error parsing '%s' into %s: %s", input, SubscriptionPath.class, e.getMessage())); + } + this.subscriptionPath = parsedResult; + } + + public SubscriptionPath getValue() { + return subscriptionPath; + } +} diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/pubsub/package-info.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/pubsub/package-info.java new file mode 100644 index 000000000000..a9694b1d1b3d --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/pubsub/package-info.java @@ -0,0 +1,20 @@ +/* + * 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. + */ + +/** Defines how to read from Pub/Sub. */ +package org.apache.beam.testinfra.pipelines.pubsub; diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/schemas/DependencyDrivenDescriptorQueue.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/schemas/DependencyDrivenDescriptorQueue.java new file mode 100644 index 000000000000..13458da742d0 --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/schemas/DependencyDrivenDescriptorQueue.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.testinfra.pipelines.schemas; + +import static org.apache.beam.sdk.util.Preconditions.checkStateNotNull; +import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkState; + +import com.google.protobuf.Descriptors.Descriptor; +import com.google.protobuf.Descriptors.FieldDescriptor; +import com.google.protobuf.Descriptors.FieldDescriptor.JavaType; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.apache.beam.sdk.annotations.Internal; +import org.checkerframework.checker.nullness.qual.NonNull; + +/** + * Prevents stack overflow errors when parsing a {@link Descriptor}. Orders {@link Descriptor} by + * their interdependencies such that the first has no dependencies i.e. only primitive types and + * subsequent {@link Descriptor}s contain {@link JavaType#MESSAGE} types. + */ +@Internal +class DependencyDrivenDescriptorQueue implements Iterable, Comparator { + private final Map<@NonNull String, @NonNull Descriptor> descriptorMap = new HashMap<>(); + private final Map<@NonNull String, @NonNull Set> dependencyMap = new HashMap<>(); + + private final Map<@NonNull String, @NonNull Integer> messageFieldCounts = new HashMap<>(); + + /** + * Enqueues a {@link Descriptor}. Walks down its dependency tree of any nested {@link + * JavaType#MESSAGE} types, further enqueuing these types' {@link Descriptor}s. + */ + void enqueue(@NonNull Descriptor descriptor) { + List<@NonNull Descriptor> descriptorStack = new ArrayList<>(); + descriptorStack.add(descriptor); + while (!descriptorStack.isEmpty()) { + Descriptor fromStack = descriptorStack.remove(0); + if (descriptorMap.containsKey(fromStack.getFullName())) { + checkState(dependencyMap.containsKey(fromStack.getFullName())); + checkState(messageFieldCounts.containsKey(fromStack.getFullName())); + continue; + } + int messageFieldCounts = 0; + for (FieldDescriptor field : fromStack.getFields()) { + if (!field.getJavaType().equals(JavaType.MESSAGE)) { + continue; + } + messageFieldCounts++; + Descriptor fieldDescriptor = field.getMessageType(); + if (!dependencyMap.containsKey(fieldDescriptor.getFullName())) { + dependencyMap.put(fieldDescriptor.getFullName(), new HashSet<>()); + } + Set dependents = dependencyMap.get(fieldDescriptor.getFullName()); + dependents.add(descriptor.getFullName()); + descriptorStack.add(fieldDescriptor); + } + descriptorMap.put(fromStack.getFullName(), fromStack); + this.messageFieldCounts.put(fromStack.getFullName(), messageFieldCounts); + if (!dependencyMap.containsKey(fromStack.getFullName())) { + dependencyMap.put(fromStack.getFullName(), new HashSet<>()); + } + } + } + + /** + * Returns an iteration of {@link Descriptor}s ordered by increasing dependency such that the + * first has no nested {@link JavaType#MESSAGE} types. + */ + @Override + public Iterator iterator() { + return descriptorMap.values().stream().sorted(this).iterator(); + } + + @Override + public int compare(@NonNull Descriptor a, @NonNull Descriptor b) { + boolean aDependsOnB = + checkStateNotNull(dependencyMap.get(b.getFullName())).contains(a.getFullName()); + boolean bDependsOnA = + checkStateNotNull(dependencyMap.get(a.getFullName())).contains(b.getFullName()); + if (aDependsOnB) { + return 1; + } + if (bDependsOnA) { + return -1; + } + Integer aMessageFieldCount = checkStateNotNull(messageFieldCounts.get(a.getFullName())); + Integer bMessageFieldCount = checkStateNotNull(messageFieldCounts.get(b.getFullName())); + return aMessageFieldCount.compareTo(bMessageFieldCount); + } +} diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/schemas/DescriptorSchemaRegistry.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/schemas/DescriptorSchemaRegistry.java new file mode 100644 index 000000000000..44fd4d668a38 --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/schemas/DescriptorSchemaRegistry.java @@ -0,0 +1,153 @@ +/* + * 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.testinfra.pipelines.schemas; + +import static org.apache.beam.sdk.util.Preconditions.checkStateNotNull; + +import com.google.protobuf.Descriptors.Descriptor; +import com.google.protobuf.Descriptors.FieldDescriptor; +import com.google.protobuf.Descriptors.FieldDescriptor.JavaType; +import java.util.HashMap; +import java.util.Map; +import org.apache.beam.sdk.annotations.Internal; +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.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableMap; +import org.checkerframework.checker.nullness.qual.NonNull; + +/** Registers and builds {@link Schema}s of {@link Descriptor} based types. */ +@Internal +public class DescriptorSchemaRegistry { + + public static final DescriptorSchemaRegistry INSTANCE = new DescriptorSchemaRegistry(); + + private DescriptorSchemaRegistry() {} + + static final String KEY_FIELD_NAME = "key"; + static final String VALUE_FIELD_NAME = "value"; + private static final Map<@NonNull String, @NonNull Schema> SCHEMA_CACHE = new HashMap<>(); + + boolean hasNoCachedBuild(Descriptor descriptor) { + return !SCHEMA_CACHE.containsKey(descriptor.getFullName()); + } + + public @NonNull Schema getOrBuild(Descriptor descriptor) { + if (hasNoCachedBuild(descriptor)) { + build(descriptor); + } + return checkStateNotNull(SCHEMA_CACHE.get(descriptor.getFullName())); + } + + public void build(Descriptor descriptor) { + DependencyDrivenDescriptorQueue queue = new DependencyDrivenDescriptorQueue(); + queue.enqueue(descriptor); + for (Descriptor queuedDescriptor : queue) { + Builder builder = new Builder(); + Schema schema = builder.build(queuedDescriptor); + SCHEMA_CACHE.put(queuedDescriptor.getFullName(), schema); + } + } + + static class Builder { + private static final Map FIELD_TYPE_MAP = + ImmutableMap.builder() + .put(JavaType.BOOLEAN, FieldType.BOOLEAN) + .put(JavaType.INT, FieldType.INT32) + .put(JavaType.LONG, FieldType.INT64) + .put(JavaType.FLOAT, FieldType.FLOAT) + .put(JavaType.DOUBLE, FieldType.DOUBLE) + .put(JavaType.ENUM, FieldType.STRING) + .put(JavaType.STRING, FieldType.STRING) + .build(); + + private static final Map<@NonNull String, @NonNull FieldType> FULL_NAME_TYPE_MAP = + ImmutableMap.builder() + .put("google.protobuf.Value", FieldType.STRING) + .put("google.protobuf.Timestamp", FieldType.DATETIME) + .put("google.protobuf.Any", FieldType.STRING) + .build(); + + private final Schema.Builder schemaBuilder = Schema.builder(); + + Schema build(Descriptor descriptor) { + parse(descriptor); + Schema schema = schemaBuilder.build(); + SCHEMA_CACHE.put(descriptor.getFullName(), schema); + return schema; + } + + void parse(Descriptor descriptor) { + for (FieldDescriptor fieldDescriptor : descriptor.getFields()) { + if (fieldDescriptor.getJavaType().equals(JavaType.BYTE_STRING)) { + continue; + } + FieldType type = build(fieldDescriptor); + schemaBuilder.addField(Field.of(fieldDescriptor.getName(), type)); + } + } + + FieldType build(FieldDescriptor fieldDescriptor) { + if (fieldDescriptor.isMapField()) { + return buildMapType(fieldDescriptor); + } + if (fieldDescriptor.getJavaType().equals(JavaType.MESSAGE)) { + return buildNestedType(fieldDescriptor); + } + FieldType type = checkStateNotNull(FIELD_TYPE_MAP.get(fieldDescriptor.getJavaType())); + if (fieldDescriptor.isRepeated()) { + type = FieldType.array(type); + } + return type; + } + + FieldType buildMapType(FieldDescriptor fieldDescriptor) { + Descriptor mapDescriptor = fieldDescriptor.getMessageType(); + FieldDescriptor keyField = checkStateNotNull(mapDescriptor.findFieldByName(KEY_FIELD_NAME)); + FieldType keyType = checkStateNotNull(FIELD_TYPE_MAP.get(keyField.getJavaType())); + FieldDescriptor valueField = + checkStateNotNull(mapDescriptor.findFieldByName(VALUE_FIELD_NAME)); + FieldType valueType = build(valueField); + return FieldType.array( + FieldType.row( + Schema.of(Field.of(KEY_FIELD_NAME, keyType), Field.of(VALUE_FIELD_NAME, valueType)))); + } + + FieldType buildNestedType(FieldDescriptor fieldDescriptor) { + Descriptor messageDescriptor = fieldDescriptor.getMessageType(); + if (FULL_NAME_TYPE_MAP.containsKey(messageDescriptor.getFullName())) { + return checkStateNotNull(FULL_NAME_TYPE_MAP.get(messageDescriptor.getFullName())); + } + if (!SCHEMA_CACHE.containsKey(messageDescriptor.getFullName())) { + Builder builder = new Builder(); + Schema schema = builder.build(messageDescriptor); + SCHEMA_CACHE.put(messageDescriptor.getFullName(), schema); + } + Schema schema = + checkStateNotNull( + SCHEMA_CACHE.get(messageDescriptor.getFullName()), + "nested type not cached: %s", + messageDescriptor.getFullName()); + FieldType type = FieldType.row(schema); + if (fieldDescriptor.isRepeated()) { + type = FieldType.array(type); + } + return type; + } + } +} diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/schemas/GeneratedMessageV3RowBuilder.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/schemas/GeneratedMessageV3RowBuilder.java new file mode 100644 index 000000000000..f8f8af3e06d4 --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/schemas/GeneratedMessageV3RowBuilder.java @@ -0,0 +1,280 @@ +/* + * 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.testinfra.pipelines.schemas; + +import static org.apache.beam.sdk.util.Preconditions.checkStateNotNull; +import static org.apache.beam.testinfra.pipelines.schemas.DescriptorSchemaRegistry.KEY_FIELD_NAME; +import static org.apache.beam.testinfra.pipelines.schemas.DescriptorSchemaRegistry.VALUE_FIELD_NAME; +import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkState; + +import com.google.protobuf.AbstractMessage; +import com.google.protobuf.Any; +import com.google.protobuf.Descriptors.Descriptor; +import com.google.protobuf.Descriptors.FieldDescriptor; +import com.google.protobuf.Descriptors.FieldDescriptor.JavaType; +import com.google.protobuf.GeneratedMessageV3; +import com.google.protobuf.InvalidProtocolBufferException; +import com.google.protobuf.Message; +import com.google.protobuf.Timestamp; +import com.google.protobuf.Value; +import com.google.protobuf.util.JsonFormat; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; +import java.util.function.Function; +import org.apache.beam.sdk.annotations.Internal; +import org.apache.beam.sdk.schemas.Schema; +import org.apache.beam.sdk.schemas.Schema.TypeName; +import org.apache.beam.sdk.values.Row; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Throwables; +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.util.concurrent.ListeningExecutorService; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.util.concurrent.MoreExecutors; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.joda.time.Instant; + +/** Converts a {@link GeneratedMessageV3} type to a {@link Row}. */ +@Internal +public class GeneratedMessageV3RowBuilder { + public static GeneratedMessageV3RowBuilder of(T source) { + return new GeneratedMessageV3RowBuilder<>(source); + } + + private static final Map DEFAULT_VALUES = + ImmutableMap.builder() + .put(JavaType.BOOLEAN, false) + .put(JavaType.INT, 0) + .put(JavaType.LONG, 0L) + .put(JavaType.FLOAT, 0f) + .put(JavaType.DOUBLE, 0.0) + .put(JavaType.ENUM, "") + .put(JavaType.STRING, "") + .build(); + + private final ExecutorService threadPool = Executors.newSingleThreadExecutor(); + private final ListeningExecutorService service = MoreExecutors.listeningDecorator(threadPool); + + private static final Map<@NonNull String, Function> CONVERTERS_MAP = + ImmutableMap.>builder() + .put("google.protobuf.Value", o -> convert((Value) o)) + .put("google.protobuf.Any", o -> convert((Any) o)) + .put("google.protobuf.Timestamp", o -> convert((Timestamp) o)) + .build(); + private final @NonNull T source; + + private Row.@NonNull FieldValueBuilder builder; + + GeneratedMessageV3RowBuilder(@NonNull T source) { + this.source = source; + Schema schema = + checkStateNotNull( + DescriptorSchemaRegistry.INSTANCE.getOrBuild(source.getDescriptorForType())); + builder = Row.withSchema(schema).withFieldValues(ImmutableMap.of()); + } + + /** + * Builds a {@link Row} from a {@link GeneratedMessageV3} type submitting nested types to an + * {@link ExecutorService} to prevent stack overflow errors. + */ + public Row build() { + for (FieldDescriptor fieldDescriptor : source.getDescriptorForType().getFields()) { + if (shouldSkip(fieldDescriptor)) { + continue; + } + Object value = getValue(fieldDescriptor); + builder.withFieldValue(fieldDescriptor.getName(), value); + } + + Row result = builder.build(); + shutdownAwaitTermination(); + return result; + } + + Object getValue(FieldDescriptor fieldDescriptor) { + return getValue(this.source, fieldDescriptor); + } + + Object getValue( + MessageT message, FieldDescriptor fieldDescriptor) { + if (fieldDescriptor.isMapField()) { + return mapOf(message, fieldDescriptor); + } + if (fieldDescriptor.isRepeated()) { + return listOf(message, fieldDescriptor); + } + Object value = message.getField(fieldDescriptor); + return convert(fieldDescriptor, value); + } + + Object listOf( + MessageT message, FieldDescriptor fieldDescriptor) { + List result = new ArrayList<>(); + int size = message.getRepeatedFieldCount(fieldDescriptor); + for (int i = 0; i < size; i++) { + Object value = getValue(message, fieldDescriptor, i); + result.add(value); + } + return result; + } + + Object getValue( + MessageT message, FieldDescriptor fieldDescriptor, int i) { + Object value = message.getRepeatedField(fieldDescriptor, i); + return convert(fieldDescriptor, value); + } + + Object mapOf( + MessageT message, FieldDescriptor fieldDescriptor) { + List result = new ArrayList<>(); + Descriptor mapDescriptor = fieldDescriptor.getMessageType(); + FieldDescriptor keyType = checkStateNotNull(mapDescriptor.findFieldByName(KEY_FIELD_NAME)); + FieldDescriptor valueType = checkStateNotNull(mapDescriptor.findFieldByName(VALUE_FIELD_NAME)); + int size = message.getRepeatedFieldCount(fieldDescriptor); + Schema messageSchema = + checkStateNotNull( + DescriptorSchemaRegistry.INSTANCE.getOrBuild(message.getDescriptorForType())); + Schema.Field mapField = messageSchema.getField(fieldDescriptor.getName()); + checkState(mapField.getType().getTypeName().equals(TypeName.ARRAY)); + Schema.FieldType mapEntryFieldType = + checkStateNotNull(mapField.getType().getCollectionElementType()); + checkState(mapEntryFieldType.getTypeName().equals(TypeName.ROW)); + Schema entrySchema = checkStateNotNull(mapEntryFieldType.getRowSchema()); + + for (int i = 0; i < size; i++) { + Object entryObj = message.getRepeatedField(fieldDescriptor, i); + checkState( + entryObj instanceof AbstractMessage, + "%s is not an instance of %s, found: %s", + fieldDescriptor.getName(), + AbstractMessage.class, + entryObj.getClass()); + AbstractMessage entry = (AbstractMessage) entryObj; + Object key = getValue(entry, keyType); + Object value = getValue(entry, valueType); + Row entryRow = + Row.withSchema(entrySchema) + .withFieldValue(KEY_FIELD_NAME, key) + .withFieldValue(VALUE_FIELD_NAME, value) + .build(); + result.add(entryRow); + } + return result; + } + + Object convert(FieldDescriptor fieldDescriptor, Object originalValue) { + + if (originalValue == null && DEFAULT_VALUES.containsKey(fieldDescriptor.getJavaType())) { + return checkStateNotNull(DEFAULT_VALUES.get(fieldDescriptor.getJavaType())); + } + + if (fieldDescriptor.getJavaType().equals(JavaType.ENUM)) { + return checkStateNotNull(originalValue).toString(); + } + + if (!fieldDescriptor.getJavaType().equals(JavaType.MESSAGE)) { + return originalValue; + } + + Descriptor descriptor = fieldDescriptor.getMessageType(); + if (CONVERTERS_MAP.containsKey(descriptor.getFullName())) { + Function converter = + checkStateNotNull(CONVERTERS_MAP.get(descriptor.getFullName())); + return converter.apply(originalValue); + } + + checkState( + originalValue instanceof GeneratedMessageV3, + "%s is not instance of %s, found: %s", + fieldDescriptor.getName(), + GeneratedMessageV3.class, + originalValue.getClass()); + + GeneratedMessageV3 message = (GeneratedMessageV3) originalValue; + GeneratedMessageV3RowBuilder rowBuilder = + new GeneratedMessageV3RowBuilder<>(message); + + try { + return service.submit(rowBuilder::build).get(); + } catch (InterruptedException | ExecutionException e) { + throw new IllegalStateException( + String.format( + "error building Row of %s type for field: %s of %s: %s %s", + fieldDescriptor.getMessageType().getFullName(), + fieldDescriptor.getName(), + source.getDescriptorForType().getFullName(), + e.getMessage(), + Throwables.getStackTraceAsString(e))); + } + } + + boolean shouldSkip(FieldDescriptor fieldDescriptor) { + return fieldDescriptor.getJavaType().equals(JavaType.BYTE_STRING); + } + + private static Object convert(Timestamp timestamp) { + return Instant.ofEpochMilli(timestamp.getSeconds() * 1000); + } + + private static Object convert(Message value) { + try { + return JsonFormat.printer().omittingInsignificantWhitespace().print(value); + } catch (InvalidProtocolBufferException e) { + throw new IllegalStateException(e); + } + } + + private void shutdownAwaitTermination() { + if (shutdownConsumeTerminationInterruptIfNeeded( + service, + e -> { + shutdownAndIgnoreInterruptIfNeeded(threadPool); + })) { + shutdownAndIgnoreInterruptIfNeeded(threadPool); + } + } + + private boolean shutdownConsumeTerminationInterruptIfNeeded( + ExecutorService executorService, Consumer handleInterrupt) { + try { + if (executorService.isShutdown()) { + return true; + } + executorService.shutdown(); + return executorService.awaitTermination(1L, TimeUnit.SECONDS); + } catch (InterruptedException e) { + handleInterrupt.accept(e); + return true; + } + } + + private void shutdownAndIgnoreInterruptIfNeeded(ExecutorService executorService) { + try { + if (executorService.isShutdown()) { + return; + } + executorService.shutdown(); + boolean ignored = executorService.awaitTermination(1L, TimeUnit.SECONDS); + } catch (InterruptedException ignored) { + } + } +} diff --git a/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/schemas/package-info.java b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/schemas/package-info.java new file mode 100644 index 000000000000..3fd4ebda4899 --- /dev/null +++ b/.test-infra/pipelines/src/main/java/org/apache/beam/testinfra/pipelines/schemas/package-info.java @@ -0,0 +1,20 @@ +/* + * 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. + */ + +/** Defines how to handle Beam Schemas. */ +package org.apache.beam.testinfra.pipelines.schemas; diff --git a/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/conversions/EventarcConversionsTest.java b/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/conversions/EventarcConversionsTest.java new file mode 100644 index 000000000000..8ead238eb109 --- /dev/null +++ b/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/conversions/EventarcConversionsTest.java @@ -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 org.apache.beam.testinfra.pipelines.conversions; + +import static org.apache.beam.sdk.util.Preconditions.checkStateNotNull; +import static org.apache.beam.sdk.values.TypeDescriptors.booleans; +import static org.apache.beam.sdk.values.TypeDescriptors.strings; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import com.google.events.cloud.dataflow.v1beta3.Job; +import com.google.events.cloud.dataflow.v1beta3.JobState; +import com.google.events.cloud.dataflow.v1beta3.JobType; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.testing.PAssert; +import org.apache.beam.sdk.transforms.Create; +import org.apache.beam.sdk.transforms.MapElements; +import org.apache.beam.sdk.transforms.WithFailures; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.TypeDescriptor; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.junit.jupiter.api.Test; + +/** Tests for {@link org.apache.beam.testinfra.pipelines.conversions.EventarcConversions}. */ +class EventarcConversionsTest { + + private static final EventarcConversions.JsonToJobFn FROM_JSON_FN = + new EventarcConversions.JsonToJobFn(); + + @Test + void fromJson_emptyStrings_emitsAsConversionErrors() { + Pipeline pipeline = Pipeline.create(); + WithFailures.Result<@NonNull PCollection, ConversionError> result = + pipeline.apply(Create.of("")).apply(EventarcConversions.fromJson()); + PAssert.that(result.output()).empty(); + PAssert.thatSingleton( + result + .failures() + .apply( + "get error message", + MapElements.into(strings()) + .via(error -> checkStateNotNull(error).getMessage()))) + .isEqualTo("json input missing path: $.data"); + + pipeline.run(); + } + + @Test + void fromJson_malformedJson_emitsAsConversionErrors() { + Pipeline pipeline = Pipeline.create(); + WithFailures.Result<@NonNull PCollection, ConversionError> result = + pipeline.apply(Create.of("{\"foo\", \"bar\"")).apply(EventarcConversions.fromJson()); + PAssert.that(result.output()).empty(); + PAssert.thatSingleton( + result + .failures() + .apply( + "contains message part", + MapElements.into(booleans()) + .via( + error -> + checkStateNotNull(error) + .getMessage() + .contains("JsonParseException")))) + .isEqualTo(true); + + pipeline.run(); + } + + @Test + void fromJson_missingDataKey_emitsAsConversionErrors() { + Pipeline pipeline = Pipeline.create(); + WithFailures.Result<@NonNull PCollection, ConversionError> result = + pipeline.apply(Create.of("{}")).apply(EventarcConversions.fromJson()); + PAssert.that(result.output()).empty(); + PAssert.thatSingleton( + result + .failures() + .apply( + "get error message", + MapElements.into(strings()) + .via(error -> checkStateNotNull(error).getMessage()))) + .isEqualTo("json input missing path: $.data"); + + pipeline.run(); + } + + @Test + void fromJson_missingTypeKey_emitsAsConversionErrors() { + Pipeline pipeline = Pipeline.create(); + WithFailures.Result<@NonNull PCollection, ConversionError> result = + pipeline.apply(Create.of("{\"data\":{}}")).apply(EventarcConversions.fromJson()); + PAssert.that(result.output()).empty(); + PAssert.thatSingleton( + result + .failures() + .apply( + "get error message", + MapElements.into(strings()) + .via(error -> checkStateNotNull(error).getMessage()))) + .isEqualTo("json input missing path: $.data.@type"); + + pipeline.run(); + } + + @Test + void fromJson_typeMismatch_emitsAsConversionErrors() { + Pipeline pipeline = Pipeline.create(); + WithFailures.Result<@NonNull PCollection, ConversionError> result = + pipeline + .apply(Create.of("{\"data\":{\"payload\": {},\"@type\": \"bad.type\"}}")) + .apply(EventarcConversions.fromJson()); + PAssert.that(result.output()).empty(); + PAssert.thatSingleton( + result + .failures() + .apply( + "get error message", + MapElements.into(strings()) + .via(error -> checkStateNotNull(error).getMessage()))) + .isEqualTo( + "expected @type=type.googleapis.com/google.events.cloud.dataflow.v1beta3.JobEventData at json path: $.data.@type, got: bad.type"); + + pipeline.run(); + } + + @Test + void fromJson_missingPayloadKey_emitsAsConversionErrors() { + Pipeline pipeline = Pipeline.create(); + WithFailures.Result<@NonNull PCollection, ConversionError> result = + pipeline + .apply( + Create.of( + "{\"data\":{\"@type\": \"type.googleapis.com/google.events.cloud.dataflow.v1beta3.JobEventData\"}}")) + .apply(EventarcConversions.fromJson()); + PAssert.that(result.output()).empty(); + PAssert.thatSingleton( + result + .failures() + .apply( + "get error message", + MapElements.into(strings()) + .via(error -> checkStateNotNull(error).getMessage()))) + .isEqualTo("json input missing path: $.data.payload"); + + pipeline.run(); + } + + @Test + void fromJson_hasUnexpectedProperty_emitsAsConversionErrors() throws IOException { + String resourceName = "eventarc_data/has_extra_data_payload_foo_property.json"; + Pipeline pipeline = Pipeline.create(); + WithFailures.Result<@NonNull PCollection, ConversionError> result = + readJsonThenApplyConversion(resourceName, pipeline); + PAssert.that(result.output()).empty(); + PAssert.thatSingleton( + result + .failures() + .apply( + "get error message", + MapElements.into(strings()) + .via(error -> checkStateNotNull(error).getMessage()))) + .isEqualTo( + "com.google.protobuf.InvalidProtocolBufferException: Cannot find field: foo in message google.events.cloud.dataflow.v1beta3.Job"); + + pipeline.run(); + } + + @Test + void fromJson_JobStateCanceledStreaming_emitsJob() throws IOException { + String resourceName = "eventarc_data/job_state_canceled_streaming.json"; + Pipeline pipeline = Pipeline.create(); + WithFailures.Result<@NonNull PCollection, ConversionError> result = + readJsonThenApplyConversion(resourceName, pipeline); + + PAssert.thatSingleton( + result + .output() + .apply( + "get current state", + MapElements.into(TypeDescriptor.of(JobState.class)) + .via(job -> checkStateNotNull(job).getCurrentState()))) + .isEqualTo(JobState.JOB_STATE_CANCELLED); + + PAssert.thatSingleton( + result + .output() + .apply( + "get job type", + MapElements.into(TypeDescriptor.of(JobType.class)) + .via(job -> checkStateNotNull(job).getType()))) + .isEqualTo(JobType.JOB_TYPE_STREAMING); + + PAssert.thatSingleton( + result + .output() + .apply( + "get job id", + MapElements.into(strings()).via(job -> checkStateNotNull(job).getId()))) + .isEqualTo("2023-05-09_13_23_50-11065941757886660214"); + + PAssert.that(result.failures()).empty(); + + pipeline.run(); + } + + @Test + void jobStateCanceledStreaming_JsonToDataFn() throws IOException { + String payload = loadResource("eventarc_data/job_state_canceled_streaming.json"); + Job actual = FROM_JSON_FN.apply(payload); + assertNotNull(actual); + assertEquals(JobState.JOB_STATE_CANCELLED, actual.getCurrentState()); + assertEquals(JobType.JOB_TYPE_STREAMING, actual.getType()); + assertEquals("2023-05-09_13_23_50-11065941757886660214", actual.getId()); + } + + @Test + void jobStateCancelingStreaming_JsonToDataFn() throws IOException { + String payload = loadResource("eventarc_data/job_state_canceling_streaming.json"); + Job actual = FROM_JSON_FN.apply(payload); + assertNotNull(actual); + assertEquals(JobState.JOB_STATE_CANCELLING, actual.getCurrentState()); + assertEquals(JobType.JOB_TYPE_STREAMING, actual.getType()); + assertEquals("2023-05-09_13_23_50-11065941757886660214", actual.getId()); + } + + @Test + void jobStateDoneBatch_JsonToDataFn() throws IOException { + String payload = loadResource("eventarc_data/job_state_done_batch.json"); + Job actual = FROM_JSON_FN.apply(payload); + assertNotNull(actual); + assertEquals(JobState.JOB_STATE_DONE, actual.getCurrentState()); + assertEquals(JobType.JOB_TYPE_BATCH, actual.getType()); + assertEquals("2023-05-09_13_39_13-18226864771788319755", actual.getId()); + } + + private static WithFailures.Result<@NonNull PCollection, ConversionError> + readJsonThenApplyConversion(String resourcePath, Pipeline pipeline) throws IOException { + + String payload = loadResource(resourcePath); + PCollection json = pipeline.apply(Create.of(payload)); + + return json.apply(EventarcConversions.fromJson()); + } + + private static String loadResource(String resourceName) throws IOException { + Path resourcePath = Paths.get("build", "resources", "test", resourceName); + byte[] bytes = Files.readAllBytes(resourcePath); + return new String(bytes, StandardCharsets.UTF_8); + } +} diff --git a/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/conversions/JobMetricsWithAppendedDetailsTest.java b/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/conversions/JobMetricsWithAppendedDetailsTest.java new file mode 100644 index 000000000000..afa792958fbf --- /dev/null +++ b/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/conversions/JobMetricsWithAppendedDetailsTest.java @@ -0,0 +1,143 @@ +/* + * 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.testinfra.pipelines.conversions; + +import static org.apache.beam.sdk.util.Preconditions.checkStateNotNull; +import static org.apache.beam.sdk.values.TypeDescriptors.rows; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.google.dataflow.v1beta3.JobMetrics; +import com.google.dataflow.v1beta3.MetricUpdate; +import com.google.protobuf.Descriptors; +import com.google.protobuf.Timestamp; +import com.google.protobuf.Value; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.function.Function; +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.schemas.Schema; +import org.apache.beam.sdk.testing.PAssert; +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.MapElements; +import org.apache.beam.sdk.transforms.ParDo; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.Row; +import org.apache.beam.testinfra.pipelines.dataflow.JobMetricsWithAppendedDetails; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableList; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.joda.time.Instant; +import org.joda.time.ReadableDateTime; +import org.junit.jupiter.api.Test; + +/** Tests for {@link WithAppendedDetailsToRow} of {@link JobMetricsWithAppendedDetails}. */ +class JobMetricsWithAppendedDetailsTest + extends WithAppendedDetailsToRowTest { + + @Override + WithAppendedDetailsToRow transform() { + return WithAppendedDetailsToRow.jobMetricsWithAppendedDetailsToRow(); + } + + @Override + Descriptors.Descriptor embeddedTypeDescriptor() { + return JobMetrics.getDescriptor(); + } + + @Override + String embeddedTypeFieldName() { + return "job_metrics"; + } + + @Override + Function jobIdGetter() { + return JobMetricsWithAppendedDetails::getJobId; + } + + @Override + Function createTimeGetter() { + return JobMetricsWithAppendedDetails::getJobCreateTime; + } + + @Override + @NonNull + List<@NonNull JobMetricsWithAppendedDetails> input() { + JobMetricsWithAppendedDetails details = new JobMetricsWithAppendedDetails(); + details.setJobId("job_id_value"); + details.setJobCreateTime(Instant.ofEpochSecond(1000L)); + details.setJobMetrics( + JobMetrics.getDefaultInstance() + .toBuilder() + .addMetrics( + MetricUpdate.getDefaultInstance() + .toBuilder() + .setUpdateTime(Timestamp.newBuilder().setSeconds(10000L).build()) + .setScalar(Value.newBuilder().setNumberValue(1.23456)) + .build()) + .build()); + return ImmutableList.of(details); + } + + @Test + void jobMetrics() { + + Schema jobMetricsSchema = expectedEmbeddedSchema(); + + Pipeline pipeline = Pipeline.create(); + + PCollection input = pipeline.apply(Create.of(input())); + + RowConversionResult result = + input.apply(transform()); + + PAssert.thatSingleton(result.getFailure().apply("count errors", Count.globally())) + .isEqualTo(0L); + + PCollection jobMetrics = + result + .getSuccess() + .apply( + "job_metrics", + MapElements.into(rows()) + .via(row -> checkStateNotNull(row.getRow(embeddedTypeFieldName())))) + .setRowSchema(jobMetricsSchema); + + PAssert.thatSingleton(jobMetrics.apply("count job_metrics", Count.globally())).isEqualTo(1L); + + jobMetrics.apply( + "metrics", + ParDo.of( + new DoFn() { + @ProcessElement + public void process(@Element Row row) { + Collection metrics = checkStateNotNull(row.getArray("metrics")); + assertEquals(1, metrics.size()); + Row metricsUpdate = checkStateNotNull(new ArrayList<>(metrics).get(0)); + ReadableDateTime timestamp = + checkStateNotNull(metricsUpdate.getDateTime("update_time")); + assertEquals(10000000L, timestamp.getMillis()); + String scaler = checkStateNotNull(metricsUpdate.getString("scalar")); + assertEquals("1.23456", scaler); + } + })); + + pipeline.run(); + } +} diff --git a/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/conversions/StageSummaryWithAppendedDetailsTest.java b/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/conversions/StageSummaryWithAppendedDetailsTest.java new file mode 100644 index 000000000000..a1bf2709ff66 --- /dev/null +++ b/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/conversions/StageSummaryWithAppendedDetailsTest.java @@ -0,0 +1,146 @@ +/* + * 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.testinfra.pipelines.conversions; + +import static org.apache.beam.sdk.util.Preconditions.checkStateNotNull; +import static org.apache.beam.sdk.values.TypeDescriptors.rows; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.google.dataflow.v1beta3.MetricUpdate; +import com.google.dataflow.v1beta3.StageSummary; +import com.google.protobuf.Descriptors; +import com.google.protobuf.Timestamp; +import com.google.protobuf.Value; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.function.Function; +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.schemas.Schema; +import org.apache.beam.sdk.testing.PAssert; +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.MapElements; +import org.apache.beam.sdk.transforms.ParDo; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.Row; +import org.apache.beam.testinfra.pipelines.dataflow.StageSummaryWithAppendedDetails; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableList; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.joda.time.Instant; +import org.joda.time.ReadableDateTime; +import org.junit.jupiter.api.Test; + +/** Tests for {@link WithAppendedDetailsToRow} of {@link StageSummaryWithAppendedDetails}. */ +class StageSummaryWithAppendedDetailsTest + extends WithAppendedDetailsToRowTest { + @Override + WithAppendedDetailsToRow transform() { + return WithAppendedDetailsToRow.stageSummaryWithAppendedDetailsToRow(); + } + + @Override + Descriptors.Descriptor embeddedTypeDescriptor() { + return StageSummary.getDescriptor(); + } + + @Override + String embeddedTypeFieldName() { + return "stage_summary"; + } + + @Override + Function jobIdGetter() { + return StageSummaryWithAppendedDetails::getJobId; + } + + @Override + Function createTimeGetter() { + return StageSummaryWithAppendedDetails::getJobCreateTime; + } + + @Override + @NonNull + List<@NonNull StageSummaryWithAppendedDetails> input() { + StageSummaryWithAppendedDetails details = new StageSummaryWithAppendedDetails(); + details.setJobId("job_id_value"); + details.setJobCreateTime(Instant.ofEpochSecond(1000L)); + details.setStageSummary( + StageSummary.getDefaultInstance() + .toBuilder() + .setStageId("stage_id_a") + .addMetrics( + MetricUpdate.getDefaultInstance() + .toBuilder() + .setUpdateTime(Timestamp.newBuilder().setSeconds(10000L).build()) + .setScalar(Value.newBuilder().setNumberValue(1.23456)) + .build()) + .build()); + return ImmutableList.of(details); + } + + @Test + void stageSummary() { + + Schema stageSummarySchema = expectedEmbeddedSchema(); + + Pipeline pipeline = Pipeline.create(); + + PCollection input = pipeline.apply(Create.of(input())); + + RowConversionResult result = + input.apply(transform()); + + PAssert.thatSingleton(result.getFailure().apply("count errors", Count.globally())) + .isEqualTo(0L); + + PCollection stageSummary = + result + .getSuccess() + .apply( + "stage_summary", + MapElements.into(rows()) + .via(row -> checkStateNotNull(row.getRow(embeddedTypeFieldName())))) + .setRowSchema(stageSummarySchema); + + PAssert.thatSingleton(stageSummary.apply("count stage_summary", Count.globally())) + .isEqualTo(1L); + + stageSummary.apply( + "iterate stage_summary", + ParDo.of( + new DoFn() { + @ProcessElement + public void process(@Element Row row) { + String stageId = checkStateNotNull(row.getString("stage_id")); + assertEquals("stage_id_a", stageId); + Collection metrics = checkStateNotNull(row.getArray("metrics")); + assertEquals(1, metrics.size()); + Row metricsUpdate = checkStateNotNull(new ArrayList<>(metrics).get(0)); + ReadableDateTime timestamp = + checkStateNotNull(metricsUpdate.getDateTime("update_time")); + assertEquals(10000L, timestamp.getMillis() / 1000); + String scalar = checkStateNotNull(metricsUpdate.getString("scalar")); + assertEquals("1.23456", scalar); + } + })); + + pipeline.run(); + } +} diff --git a/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/conversions/WithAppendedDetailsToRowTest.java b/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/conversions/WithAppendedDetailsToRowTest.java new file mode 100644 index 000000000000..9898781b15e5 --- /dev/null +++ b/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/conversions/WithAppendedDetailsToRowTest.java @@ -0,0 +1,153 @@ +/* + * 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.testinfra.pipelines.conversions; + +import static org.apache.beam.sdk.util.Preconditions.checkStateNotNull; +import static org.apache.beam.sdk.values.TypeDescriptors.longs; +import static org.apache.beam.sdk.values.TypeDescriptors.strings; +import static org.apache.beam.testinfra.pipelines.conversions.WithAppendedDetailsToRow.JOB_CREATE_TIME; +import static org.apache.beam.testinfra.pipelines.conversions.WithAppendedDetailsToRow.JOB_ID_FIELD; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.google.protobuf.Descriptors.Descriptor; +import com.google.protobuf.GeneratedMessageV3; +import java.io.Serializable; +import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.schemas.Schema; +import org.apache.beam.sdk.testing.PAssert; +import org.apache.beam.sdk.transforms.Count; +import org.apache.beam.sdk.transforms.Create; +import org.apache.beam.sdk.transforms.MapElements; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.testinfra.pipelines.schemas.DescriptorSchemaRegistry; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.joda.time.Instant; +import org.junit.jupiter.api.Test; + +/** Base class for testing {@link WithAppendedDetailsToRow} transforms. */ +abstract class WithAppendedDetailsToRowTest + implements Serializable { + + private static final DescriptorSchemaRegistry SCHEMA_REGISTRY = DescriptorSchemaRegistry.INSTANCE; + + abstract WithAppendedDetailsToRow transform(); + + abstract Descriptor embeddedTypeDescriptor(); + + abstract String embeddedTypeFieldName(); + + abstract Function jobIdGetter(); + + abstract Function createTimeGetter(); + + abstract @NonNull List<@NonNull AppendedDetailsT> input(); + + @Test + void emittedRowMatchesExpectedSchema() { + Pipeline pipeline = Pipeline.create(); + + PCollection input = pipeline.apply(Create.of(input())); + + RowConversionResult result = input.apply(transform()); + + PAssert.thatSingleton(result.getFailure().apply(Count.globally())).isEqualTo(0L); + + Schema actualSchema = result.getSuccess().getSchema(); + + assertEquals(expectedSchema(), actualSchema); + + pipeline.run(); + } + + @Test + void emittedRowsMatchesJobIds() { + Pipeline pipeline = Pipeline.create(); + + PCollection input = pipeline.apply(Create.of(input())); + + RowConversionResult result = input.apply(transform()); + + PAssert.thatSingleton(result.getFailure().apply(Count.globally())).isEqualTo(0L); + + List expectedJobIds = input().stream().map(jobIdGetter()).collect(Collectors.toList()); + + PAssert.that(jobIdsFrom(result)).containsInAnyOrder(expectedJobIds); + + pipeline.run(); + } + + @Test + void emittedRowsMatchesCreateTimes() { + Pipeline pipeline = Pipeline.create(); + + PCollection input = pipeline.apply(Create.of(input())); + + RowConversionResult result = input.apply(transform()); + + PAssert.thatSingleton(result.getFailure().apply(Count.globally())).isEqualTo(0L); + + List expectedCreateTimes = + input().stream() + .map(createTimeGetter()) + .map(Instant::getMillis) + .collect(Collectors.toList()); + + PAssert.that(createTimesFrom(result)).containsInAnyOrder(expectedCreateTimes); + + pipeline.run(); + } + + protected @NonNull Schema expectedEmbeddedSchema() { + return SCHEMA_REGISTRY.getOrBuild(embeddedTypeDescriptor()); + } + + private @NonNull Schema expectedSchema() { + Schema embeddedSchema = expectedEmbeddedSchema(); + return Schema.of( + JOB_ID_FIELD, + JOB_CREATE_TIME, + Schema.Field.of(embeddedTypeFieldName(), Schema.FieldType.row(embeddedSchema))); + } + + private PCollection jobIdsFrom( + RowConversionResult result) { + return result + .getSuccess() + .apply( + "get job ids", + MapElements.into(strings()) + .via(row -> checkStateNotNull(row).getString(JOB_ID_FIELD.getName()))); + } + + private PCollection createTimesFrom( + RowConversionResult result) { + return result + .getSuccess() + .apply( + "get create times", + MapElements.into(longs()) + .via( + row -> + checkStateNotNull(row) + .getLogicalTypeValue(JOB_CREATE_TIME.getName(), Instant.class) + .getMillis())); + } +} diff --git a/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/conversions/WorkerDetailsWithAppendedDetailsTest.java b/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/conversions/WorkerDetailsWithAppendedDetailsTest.java new file mode 100644 index 000000000000..bd0a900780ae --- /dev/null +++ b/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/conversions/WorkerDetailsWithAppendedDetailsTest.java @@ -0,0 +1,153 @@ +/* + * 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.testinfra.pipelines.conversions; + +import static org.apache.beam.sdk.util.Preconditions.checkStateNotNull; +import static org.apache.beam.sdk.values.TypeDescriptors.rows; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.google.dataflow.v1beta3.MetricUpdate; +import com.google.dataflow.v1beta3.WorkItemDetails; +import com.google.dataflow.v1beta3.WorkerDetails; +import com.google.protobuf.Descriptors; +import com.google.protobuf.Timestamp; +import com.google.protobuf.Value; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.function.Function; +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.schemas.Schema; +import org.apache.beam.sdk.testing.PAssert; +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.MapElements; +import org.apache.beam.sdk.transforms.ParDo; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.Row; +import org.apache.beam.testinfra.pipelines.dataflow.WorkerDetailsWithAppendedDetails; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableList; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.joda.time.Instant; +import org.joda.time.ReadableDateTime; +import org.junit.jupiter.api.Test; + +/** Tests for {@link WithAppendedDetailsToRow} of {@link WorkerDetailsWithAppendedDetails}. */ +class WorkerDetailsWithAppendedDetailsTest + extends WithAppendedDetailsToRowTest { + + @Override + WithAppendedDetailsToRow transform() { + return WithAppendedDetailsToRow.workerDetailsWithAppendedDetailsToRow(); + } + + @Override + Descriptors.Descriptor embeddedTypeDescriptor() { + return WorkerDetails.getDescriptor(); + } + + @Override + String embeddedTypeFieldName() { + return "worker_details"; + } + + @Override + Function jobIdGetter() { + return WorkerDetailsWithAppendedDetails::getJobId; + } + + @Override + Function createTimeGetter() { + return WorkerDetailsWithAppendedDetails::getJobCreateTime; + } + + @Override + @NonNull + List<@NonNull WorkerDetailsWithAppendedDetails> input() { + WorkerDetailsWithAppendedDetails details = new WorkerDetailsWithAppendedDetails(); + details.setJobId("job_id_value"); + details.setJobCreateTime(Instant.ofEpochSecond(1000L)); + details.setWorkerDetails( + WorkerDetails.getDefaultInstance() + .toBuilder() + .setWorkerName("worker_name_value") + .addWorkItems( + WorkItemDetails.getDefaultInstance() + .toBuilder() + .addMetrics( + MetricUpdate.getDefaultInstance() + .toBuilder() + .setUpdateTime(Timestamp.newBuilder().setSeconds(10000L).build()) + .setScalar(Value.newBuilder().setNumberValue(1.23456)) + .build()) + .build()) + .build()); + return ImmutableList.of(details); + } + + @Test + void workerDetails() { + + Schema embeddedSchema = expectedEmbeddedSchema(); + + Pipeline pipeline = Pipeline.create(); + + PCollection input = pipeline.apply(Create.of(input())); + + RowConversionResult result = + input.apply(transform()); + + PAssert.thatSingleton(result.getFailure().apply("count errors", Count.globally())) + .isEqualTo(0L); + + PCollection workDetails = + result + .getSuccess() + .apply( + "work_details", + MapElements.into(rows()) + .via(row -> checkStateNotNull(row).getRow(embeddedTypeFieldName()))) + .setRowSchema(embeddedSchema); + + PAssert.thatSingleton(workDetails.apply("count work_details", Count.globally())).isEqualTo(1L); + + workDetails.apply( + "iterate work_details", + ParDo.of( + new DoFn() { + @ProcessElement + public void process(@Element Row row) { + String workerName = checkStateNotNull(row.getString("worker_name")); + assertEquals("worker_name_value", workerName); + Collection workItems = checkStateNotNull(row.getArray("work_items")); + assertEquals(1, workItems.size()); + Row workItem = checkStateNotNull(new ArrayList<>(workItems).get(0)); + Collection metrics = checkStateNotNull(workItem.getArray("metrics")); + Row metricsUpdate = checkStateNotNull(new ArrayList<>(metrics).get(0)); + ReadableDateTime timestamp = + checkStateNotNull(metricsUpdate.getDateTime("update_time")); + assertEquals(10000L, timestamp.getMillis() / 1000); + String scalar = checkStateNotNull(metricsUpdate.getString("scalar")); + assertEquals("1.23456", scalar); + } + })); + + pipeline.run(); + } +} diff --git a/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowFilterEventarcJobsTest.java b/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowFilterEventarcJobsTest.java new file mode 100644 index 000000000000..151e0f9fbd71 --- /dev/null +++ b/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/dataflow/DataflowFilterEventarcJobsTest.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.testinfra.pipelines.dataflow; + +import static org.apache.beam.sdk.util.Preconditions.checkStateNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.google.events.cloud.dataflow.v1beta3.Job; +import com.google.events.cloud.dataflow.v1beta3.JobState; +import com.google.events.cloud.dataflow.v1beta3.JobType; +import java.nio.file.Path; +import java.nio.file.Paths; +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.io.TextIO; +import org.apache.beam.sdk.testing.PAssert; +import org.apache.beam.sdk.transforms.Count; +import org.apache.beam.sdk.transforms.MapElements; +import org.apache.beam.sdk.transforms.WithFailures; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.TypeDescriptor; +import org.apache.beam.testinfra.pipelines.conversions.ConversionError; +import org.apache.beam.testinfra.pipelines.conversions.EventarcConversions; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.junit.jupiter.api.Test; + +/** Tests for {@link DataflowFilterEventarcJobs}. */ +class DataflowFilterEventarcJobsTest { + + private static final String JSON_RESOURCE_PATH = "eventarc_data/job_state*.json"; + + @Test + void filterBatchJobTypeOnly_excludesStreamingJobs() { + Pipeline pipeline = Pipeline.create(); + + PCollection json = readJsonAndCheckNotEmpty(pipeline); + WithFailures.Result<@NonNull PCollection, ConversionError> jobs = + json.apply(EventarcConversions.fromJson()); + PCollection result = + jobs.output() + .apply( + DataflowFilterEventarcJobs.builder() + .setIncludeJobType(JobType.JOB_TYPE_BATCH) + .build()); + PAssert.that( + result.apply( + "get job type", + MapElements.into(TypeDescriptor.of(JobType.class)) + .via(job -> checkStateNotNull(job).getType()))) + .satisfies( + itr -> { + itr.forEach(jobType -> assertEquals(JobType.JOB_TYPE_BATCH, jobType)); + return null; + }); + + pipeline.run(); + } + + @Test + void filterBatchTerminatedOnly_includesDoneJobs() { + Pipeline pipeline = Pipeline.create(); + + PCollection json = readJsonAndCheckNotEmpty(pipeline); + WithFailures.Result<@NonNull PCollection, ConversionError> jobs = + json.apply(EventarcConversions.fromJson()); + PCollection result = + jobs.output() + .apply( + DataflowFilterEventarcJobs.builder() + .setIncludeJobType(JobType.JOB_TYPE_BATCH) + .terminatedOnly() + .build()); + + PAssert.thatSingleton( + result.apply( + "filter batch", + MapElements.into(TypeDescriptor.of(JobType.class)) + .via(job -> checkStateNotNull(job).getType()))) + .isEqualTo(JobType.JOB_TYPE_BATCH); + + PAssert.thatSingleton( + result.apply( + "filter done", + MapElements.into(TypeDescriptor.of(JobState.class)) + .via(job -> checkStateNotNull(job).getCurrentState()))) + .isEqualTo(JobState.JOB_STATE_DONE); + + pipeline.run(); + } + + @Test + void filterStreamTerminatedOnly_includesCanceledJobs() { + Pipeline pipeline = Pipeline.create(); + + PCollection json = readJsonAndCheckNotEmpty(pipeline); + WithFailures.Result<@NonNull PCollection, ConversionError> jobs = + json.apply(EventarcConversions.fromJson()); + PCollection result = + jobs.output() + .apply( + DataflowFilterEventarcJobs.builder() + .setIncludeJobType(JobType.JOB_TYPE_STREAMING) + .terminatedOnly() + .build()); + + PAssert.thatSingleton( + result.apply( + "get type", + MapElements.into(TypeDescriptor.of(JobType.class)) + .via(job -> checkStateNotNull(job).getType()))) + .isEqualTo(JobType.JOB_TYPE_STREAMING); + + PAssert.thatSingleton( + result.apply( + "get current state", + MapElements.into(TypeDescriptor.of(JobState.class)) + .via(job -> checkStateNotNull(job).getCurrentState()))) + .isEqualTo(JobState.JOB_STATE_CANCELLED); + + pipeline.run(); + } + + private static PCollection readJsonAndCheckNotEmpty(Pipeline pipeline) { + Path resourcePath = Paths.get("build", "resources", "test", JSON_RESOURCE_PATH); + PCollection json = + pipeline.apply(TextIO.read().from(resourcePath.toAbsolutePath().toString())); + PAssert.thatSingleton(json.apply(Count.globally())).notEqualTo(0L); + + return json; + } +} diff --git a/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/schemas/AbstractGeneratedMessageV3RowBuilderTest.java b/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/schemas/AbstractGeneratedMessageV3RowBuilderTest.java new file mode 100644 index 000000000000..eb7feacb0aef --- /dev/null +++ b/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/schemas/AbstractGeneratedMessageV3RowBuilderTest.java @@ -0,0 +1,409 @@ +/* + * 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.testinfra.pipelines.schemas; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.google.dataflow.v1beta3.DisplayData; +import com.google.dataflow.v1beta3.ExecutionStageSummary.ComponentSource; +import com.google.dataflow.v1beta3.ExecutionStageSummary.ComponentTransform; +import com.google.dataflow.v1beta3.ExecutionStageSummary.StageSource; +import com.google.protobuf.Descriptors.Descriptor; +import com.google.protobuf.Descriptors.EnumDescriptor; +import com.google.protobuf.Descriptors.FieldDescriptor; +import com.google.protobuf.Descriptors.FieldDescriptor.JavaType; +import com.google.protobuf.Duration; +import com.google.protobuf.GeneratedMessageV3; +import com.google.protobuf.ListValue; +import com.google.protobuf.Message; +import com.google.protobuf.Struct; +import com.google.protobuf.Timestamp; +import com.google.protobuf.Value; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +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.commons.lang3.tuple.Pair; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.joda.time.ReadableDateTime; +import org.junit.jupiter.api.Test; + +/** Base class for {@link GeneratedMessageV3RowBuilder} based tests of various types. */ +abstract class AbstractGeneratedMessageV3RowBuilderTest { + private static final Map<@NonNull String, GeneratedMessageV3> DEFAULT_INSTANCE_MAP = + ImmutableMap.<@NonNull String, GeneratedMessageV3>builder() + .put(StageSource.getDescriptor().getFullName(), StageSource.getDefaultInstance()) + .put( + ComponentTransform.getDescriptor().getFullName(), + ComponentTransform.getDefaultInstance()) + .put(ComponentSource.getDescriptor().getFullName(), ComponentSource.getDefaultInstance()) + .build(); + + protected abstract @NonNull Descriptor getDescriptorForType(); + + protected abstract @NonNull T getDefaultInstance(); + + protected abstract @NonNull Class getDefaultInstanceClass(); + + protected abstract @NonNull Set<@NonNull String> getStringFields(); + + protected abstract @NonNull Set<@NonNull String> getStringArrayFields(); + + protected abstract @NonNull Set<@NonNull String> getBooleanFields(); + + protected abstract @NonNull Set<@NonNull String> getStructFields(); + + protected abstract @NonNull Set<@NonNull String> getEnumFields(); + + protected abstract @NonNull Set<@NonNull String> getDisplayDataFields(); + + protected abstract @NonNull Set<@NonNull String> getRepeatedMessageFields(); + + @Test + void defaultInstance() { + GeneratedMessageV3RowBuilder builder = builderOf(getDefaultInstance()); + Row row = builder.build(); + assertNotNull(row); + assertEquals( + getDescriptorForType().getFields().stream() + .map(FieldDescriptor::getName) + .collect(Collectors.toSet()), + new HashSet<>(row.getSchema().getFieldNames())); + } + + @Test + void strings() { + Descriptor descriptor = getDescriptorForType(); + for (String fieldName : getStringFields()) { + FieldDescriptor field = descriptor.findFieldByName(fieldName); + assertNotNull(field); + String value = fieldName + "_value"; + Message message = getDefaultInstance().toBuilder().setField(field, value).build(); + T source = cast(message); + Row row = builderOf(source).build(); + assertRowValueEquals(row, fieldName, value); + } + } + + @Test + void booleans() { + Descriptor descriptor = getDescriptorForType(); + for (String fieldName : getBooleanFields()) { + FieldDescriptor field = descriptor.findFieldByName(fieldName); + assertNotNull(field); + Boolean value = true; + Message message = getDefaultInstance().toBuilder().setField(field, value).build(); + T source = cast(message); + Row row = builderOf(source).build(); + assertRowValueEquals(row, fieldName, value); + } + } + + @Test + void stringArrays() { + Descriptor descriptor = getDescriptorForType(); + for (String fieldName : getStringArrayFields()) { + FieldDescriptor field = descriptor.findFieldByName(fieldName); + assertNotNull(field); + + for (int n = 0; n < 3; n++) { + Message.Builder messageBuilder = getDefaultInstance().toBuilder(); + List expected = new ArrayList<>(); + for (int i = 0; i < n; i++) { + String value = String.format("%s_%s_value", fieldName, i); + expected.add(value); + messageBuilder.addRepeatedField(field, value); + } + Message message = messageBuilder.build(); + T source = cast(message); + Row row = builderOf(source).build(); + assertRowRepeatedValueEquals(row, fieldName, expected); + } + } + } + + @Test + void structs() { + Descriptor descriptor = getDescriptorForType(); + for (String fieldName : getStructFields()) { + Row defaultRow = builderOf(getDefaultInstance()).build(); + Row defaultStruct = defaultRow.getRow(fieldName); + assertNotNull(defaultStruct); + Collection defaultFields = defaultStruct.getArray("fields"); + assertNotNull(defaultFields); + assertTrue(defaultFields.isEmpty()); + + FieldDescriptor fieldDescriptor = descriptor.findFieldByName(fieldName); + assertNotNull(fieldDescriptor); + Message message = + getDefaultInstance().toBuilder().setField(fieldDescriptor, structOfAllTypes()).build(); + T source = cast(message); + Row row = builderOf(source).build(); + assertNotNull(row); + Row struct = row.getRow(fieldName); + assertNotNull(struct); + Collection fields = struct.getArray("fields"); + assertNotNull(fields); + Map<@NonNull String, @NonNull Object> expectedFields = + ImmutableMap.of( + "struct", + "{\"bool\":true,\"string\":\"string_value\",\"number\":1.234567,\"list\":[true,\"string_value\",1.234567]}"); + Map<@NonNull String, @NonNull Object> actualFields = new HashMap<>(); + for (Row field : fields) { + String key = field.getString("key"); + assertNotNull(key); + Object value = field.getValue("value"); + assertNotNull(value); + actualFields.put(key, value); + } + assertEquals(expectedFields, actualFields); + } + } + + @Test + void enums() { + Descriptor descriptor = getDescriptorForType(); + for (String fieldName : getEnumFields()) { + Row defaultRow = builderOf(getDefaultInstance()).build(); + assertNotNull(defaultRow); + FieldDescriptor fieldDescriptor = descriptor.findFieldByName(fieldName); + assertNotNull(fieldDescriptor); + assertEquals(JavaType.ENUM, fieldDescriptor.getJavaType()); + EnumDescriptor enumDescriptor = fieldDescriptor.getEnumType(); + String defaultEnum = defaultRow.getString(fieldName); + assertEquals(enumDescriptor.findValueByNumber(0).getName(), defaultEnum); + + Message message = + getDefaultInstance() + .toBuilder() + .setField(fieldDescriptor, enumDescriptor.findValueByNumber(1)) + .build(); + T source = cast(message); + Row row = builderOf(source).build(); + assertNotNull(row); + assertEquals(enumDescriptor.findValueByNumber(1).getName(), row.getString(fieldName)); + } + } + + @Test + void displayData() { + Descriptor descriptor = getDescriptorForType(); + for (String fieldName : getDisplayDataFields()) { + FieldDescriptor fieldDescriptor = descriptor.findFieldByName(fieldName); + assertNotNull(fieldDescriptor); + + T defaultInstance = getDefaultInstance(); + Row defaultRow = builderOf(defaultInstance).build(); + assertNotNull(defaultRow); + Collection defaultCollection = defaultRow.getArray(fieldName); + assertNotNull(defaultCollection); + assertTrue(defaultCollection.isEmpty()); + + Map expected = new HashMap<>(); + for (DisplayData data : displayDataOf()) { + expected.put(data.getKey(), data); + } + + Message message = + getDefaultInstance().toBuilder().setField(fieldDescriptor, displayDataOf()).build(); + + T instance = cast(message); + + Row row = builderOf(instance).build(); + assertNotNull(row); + Collection displayData = row.getArray(fieldName); + assertNotNull(displayData); + assertEquals(expected.size(), displayData.size()); + for (Row actual : displayData) { + String key = actual.getString("key"); + assertNotNull(key); + DisplayData expectedData = expected.get(key); + assertNotNull(expectedData); + assertEquals(expectedData.getNamespace(), actual.getString("namespace")); + assertEquals(expectedData.getShortStrValue(), actual.getString("short_str_value")); + assertEquals(expectedData.getUrl(), actual.getString("url")); + assertEquals(expectedData.getLabel(), actual.getString("label")); + assertEquals(expectedData.getBoolValue(), actual.getBoolean("bool_value")); + assertEquals(expectedData.getInt64Value(), actual.getInt64("int64_value")); + assertEquals(expectedData.getFloatValue(), actual.getFloat("float_value")); + assertEquals(expectedData.getJavaClassValue(), actual.getString("java_class_value")); + if (expectedData.hasTimestampValue()) { + Timestamp expectedTimestamp = expectedData.getTimestampValue(); + ReadableDateTime actualTimestamp = actual.getDateTime("timestamp_value"); + assertNotNull(actualTimestamp); + assertEquals(expectedTimestamp.getSeconds() * 1000, actualTimestamp.getMillis()); + } + } + } + } + + @Test + void repeatedMessages() { + Descriptor descriptor = getDescriptorForType(); + for (String fieldName : getRepeatedMessageFields()) { + FieldDescriptor fieldDescriptor = descriptor.findFieldByName(fieldName); + assertNotNull(fieldDescriptor); + + Row defaultRow = builderOf(getDefaultInstance()).build(); + assertNotNull(defaultRow); + Collection defaultcollection = defaultRow.getArray(fieldName); + assertNotNull(defaultcollection); + + GeneratedMessageV3 member = + DEFAULT_INSTANCE_MAP.get(fieldDescriptor.getMessageType().getFullName()); + assertNotNull(member); + + Message message = + getDefaultInstance().toBuilder().addRepeatedField(fieldDescriptor, member).build(); + + T instance = cast(message); + Row row = builderOf(instance).build(); + assertNotNull(row); + Collection collection = row.getArray(fieldName); + assertNotNull(collection); + assertEquals(1, collection.size()); + Set actualFieldNames = + new HashSet<>(new ArrayList<>(collection).get(0).getSchema().getFieldNames()); + Set expectedFieldNames = + fieldDescriptor.getMessageType().getFields().stream() + .map(FieldDescriptor::getName) + .collect(Collectors.toSet()); + assertEquals(expectedFieldNames, actualFieldNames); + } + } + + private static void assertRowValueEquals(Row source, String fieldName, ValueT expected) { + Object value = source.getValue(fieldName); + assertEquals(value, expected); + } + + private static void assertRowRepeatedValueEquals( + Row source, String fieldName, List expected) { + Collection value = source.getArray(fieldName); + assertEquals(value, expected); + } + + protected GeneratedMessageV3RowBuilder builderOf(@NonNull T instance) { + if (DescriptorSchemaRegistry.INSTANCE.hasNoCachedBuild(getDescriptorForType())) { + DescriptorSchemaRegistry.INSTANCE.build(getDescriptorForType()); + } + return new GeneratedMessageV3RowBuilder<>(instance); + } + + static Struct structOfAllTypes() { + Value boolV = Value.newBuilder().setBoolValue(true).build(); + Value stringV = Value.newBuilder().setStringValue("string_value").build(); + Value numberV = Value.newBuilder().setNumberValue(1.234567).build(); + Value listV = + Value.newBuilder() + .setListValue( + ListValue.getDefaultInstance() + .toBuilder() + .addValues(boolV) + .addValues(stringV) + .addValues(numberV) + .build()) + .build(); + Struct base = + structOf( + Pair.of("bool", boolV), + Pair.of("string", stringV), + Pair.of("number", numberV), + Pair.of("list", listV)); + + Value baseStruct = Value.newBuilder().setStructValue(base).build(); + + return structOf(Pair.of("struct", baseStruct)); + } + + static Struct structOf(Pair... pairs) { + Struct.Builder builder = Struct.newBuilder(); + for (Pair pair : pairs) { + builder.putFields(pair.getKey(), pair.getValue()); + } + return builder.build(); + } + + static List displayDataOf() { + return ImmutableList.of( + withBoolean(true), + withString("display_string"), + withInt64(1000L), + withFloat(2f), + withJavaClass("com.example.JavaBean"), + withTimestamp(Timestamp.getDefaultInstance().toBuilder().setSeconds(1000L).build()), + withDuration(Duration.getDefaultInstance().toBuilder().setSeconds(10L).build())); + } + + static DisplayData emptyDisplayData() { + return DisplayData.getDefaultInstance(); + } + + static DisplayData withoutValue() { + return DisplayData.getDefaultInstance() + .toBuilder() + .setKey("empty") + .setNamespace("namespace_") + .setUrl("https://example.com") + .setLabel("label_") + .setShortStrValue("short_str_value_") + .build(); + } + + static DisplayData withBoolean(boolean value) { + return withoutValue().toBuilder().setKey("boolean").setBoolValue(value).build(); + } + + static DisplayData withString(String value) { + return withoutValue().toBuilder().setKey("string").setStrValue(value).build(); + } + + static DisplayData withInt64(long value) { + return withoutValue().toBuilder().setKey("long").setInt64Value(value).build(); + } + + static DisplayData withFloat(float value) { + return withoutValue().toBuilder().setKey("float").setFloatValue(value).build(); + } + + static DisplayData withJavaClass(String value) { + return withoutValue().toBuilder().setKey("javaClass").setJavaClassValue(value).build(); + } + + static DisplayData withTimestamp(Timestamp value) { + return withoutValue().toBuilder().setKey("timestamp").setTimestampValue(value).build(); + } + + static DisplayData withDuration(Duration value) { + return withoutValue().toBuilder().setKey("duration").setDurationValue(value).build(); + } + + private T cast(Message message) { + assertTrue(getDefaultInstanceClass().isInstance(message)); + return getDefaultInstanceClass().cast(message); + } +} diff --git a/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/schemas/DependencyDrivenDescriptorQueueTest.java b/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/schemas/DependencyDrivenDescriptorQueueTest.java new file mode 100644 index 000000000000..c047a0b7271b --- /dev/null +++ b/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/schemas/DependencyDrivenDescriptorQueueTest.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.testinfra.pipelines.schemas; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.google.dataflow.v1beta3.Job; +import com.google.protobuf.Descriptors.Descriptor; +import com.google.protobuf.Descriptors.FieldDescriptor.JavaType; +import java.util.Iterator; +import org.junit.jupiter.api.Test; + +/** Tests for {@link DependencyDrivenDescriptorQueue}. */ +class DependencyDrivenDescriptorQueueTest { + @Test + void iterator_Job_isInDependencyOrder() { + DependencyDrivenDescriptorQueue queue = new DependencyDrivenDescriptorQueue(); + queue.enqueue(Job.getDescriptor()); + Iterator itr = queue.iterator(); + Descriptor previous = itr.next(); + int previousMessageCount = messageCount(previous); + assertTrue(itr.hasNext()); + while (itr.hasNext()) { + Descriptor current = itr.next(); + int currentMessageCount = messageCount(current); + assertTrue(previousMessageCount <= currentMessageCount); + boolean previousDependsOnCurrent = + previous.getFields().stream() + .anyMatch(field -> field.getFullName().equals(current.getFullName())); + assertFalse(previousDependsOnCurrent); + } + } + + private static int messageCount(Descriptor descriptor) { + return (int) + descriptor.getFields().stream() + .filter(field -> field.getJavaType().equals(JavaType.MESSAGE)) + .count(); + } +} diff --git a/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/schemas/DescriptorSchemaRegistryTest.java b/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/schemas/DescriptorSchemaRegistryTest.java new file mode 100644 index 000000000000..afa650a33cf1 --- /dev/null +++ b/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/schemas/DescriptorSchemaRegistryTest.java @@ -0,0 +1,79 @@ +/* + * 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.testinfra.pipelines.schemas; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.google.dataflow.v1beta3.Job; +import org.apache.beam.sdk.schemas.Schema; +import org.apache.beam.sdk.schemas.Schema.FieldType; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +/** Tests for {@link DescriptorSchemaRegistry}. */ +class DescriptorSchemaRegistryTest { + + private static final DescriptorSchemaRegistry REGISTRY = DescriptorSchemaRegistry.INSTANCE; + + @BeforeAll + public static void setup() { + REGISTRY.build(Job.getDescriptor()); + } + + @Test + void build_Job() { + Schema mapSchema = + Schema.of( + Schema.Field.of("key", FieldType.STRING), Schema.Field.of("value", FieldType.STRING)); + Schema schema = REGISTRY.getOrBuild(Job.getDescriptor()); + assertEquals(Schema.Field.of("id", FieldType.STRING), schema.getField("id")); + assertEquals(Schema.Field.of("type", FieldType.STRING), schema.getField("type")); + assertEquals( + Schema.Field.of("create_time", FieldType.DATETIME), schema.getField("create_time")); + assertEquals( + Schema.Field.of( + "steps", + FieldType.array( + FieldType.row( + Schema.of( + Schema.Field.of("kind", FieldType.STRING), + Schema.Field.of("name", FieldType.STRING), + Schema.Field.of( + "properties", + FieldType.row( + Schema.of( + Schema.Field.of( + "fields", FieldType.array(FieldType.row(mapSchema)))))))))), + schema.getField("steps")); + assertEquals( + Schema.Field.of("transform_name_mapping", FieldType.array(FieldType.row(mapSchema))), + schema.getField("transform_name_mapping")); + assertEquals( + Schema.Field.of( + "stage_states", + FieldType.array( + FieldType.row( + Schema.of( + Schema.Field.of("execution_stage_name", FieldType.STRING), + Schema.Field.of("execution_stage_state", FieldType.STRING), + Schema.Field.of("current_state_time", FieldType.DATETIME))))), + schema.getField("stage_states")); + assertEquals( + Schema.Field.of("satisfies_pzs", FieldType.BOOLEAN), schema.getField("satisfies_pzs")); + } +} diff --git a/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/schemas/EnvironmentRowBuilderTest.java b/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/schemas/EnvironmentRowBuilderTest.java new file mode 100644 index 000000000000..001b07fcc75e --- /dev/null +++ b/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/schemas/EnvironmentRowBuilderTest.java @@ -0,0 +1,140 @@ +/* + * 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.testinfra.pipelines.schemas; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.google.dataflow.v1beta3.DebugOptions; +import com.google.dataflow.v1beta3.Environment; +import com.google.dataflow.v1beta3.WorkerPool; +import com.google.protobuf.Descriptors.Descriptor; +import java.util.Collection; +import java.util.Collections; +import java.util.Set; +import org.apache.beam.sdk.values.Row; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableSet; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.junit.jupiter.api.Test; + +/** + * Tests for converting an {@link Environment} to a {@link Row} using {@link + * GeneratedMessageV3RowBuilder}. + */ +class EnvironmentRowBuilderTest extends AbstractGeneratedMessageV3RowBuilderTest { + + @Override + protected @NonNull Descriptor getDescriptorForType() { + return Environment.getDescriptor(); + } + + @Override + protected @NonNull Environment getDefaultInstance() { + return Environment.getDefaultInstance(); + } + + @Override + protected @NonNull Class getDefaultInstanceClass() { + return Environment.class; + } + + @Override + protected @NonNull Set<@NonNull String> getStringFields() { + return ImmutableSet.of( + "temp_storage_prefix", + "cluster_manager_api_service", + "service_kms_key_name", + "dataset", + "service_account_email", + "worker_region", + "worker_zone"); + } + + @Override + protected @NonNull Set<@NonNull String> getStringArrayFields() { + return ImmutableSet.of("experiments", "service_options"); + } + + @Override + protected @NonNull Set<@NonNull String> getBooleanFields() { + return Collections.emptySet(); + } + + @Override + protected @NonNull Set<@NonNull String> getStructFields() { + return ImmutableSet.of("user_agent", "version", "sdk_pipeline_options"); + } + + @Override + protected @NonNull Set<@NonNull String> getEnumFields() { + return ImmutableSet.of("flex_resource_scheduling_goal", "shuffle_mode"); + } + + @Override + protected @NonNull Set<@NonNull String> getDisplayDataFields() { + return ImmutableSet.of(); + } + + @Override + protected @NonNull Set<@NonNull String> getRepeatedMessageFields() { + return ImmutableSet.of(); + } + + @Test + void workerPools() { + String fieldName = "worker_pools"; + Environment defaultInstance = getDefaultInstance(); + Row defaultRow = builderOf(defaultInstance).build(); + assertNotNull(defaultRow); + Collection defaultCollection = defaultRow.getArray(fieldName); + assertNotNull(defaultCollection); + assertTrue(defaultCollection.isEmpty()); + + Environment instance = + getDefaultInstance().toBuilder().addWorkerPools(WorkerPool.getDefaultInstance()).build(); + Row row = builderOf(instance).build(); + Collection collection = row.getArray(fieldName); + assertNotNull(collection); + assertEquals(1, collection.size()); + } + + @Test + void debugOptions() { + String fieldName = "debug_options"; + Environment defaultInstance = getDefaultInstance(); + Row defaultRow = builderOf(defaultInstance).build(); + assertNotNull(defaultRow); + Row defaultDebugOptions = defaultRow.getRow(fieldName); + assertNotNull(defaultDebugOptions); + assertTrue(defaultDebugOptions.getSchema().hasField("enable_hot_key_logging")); + assertEquals(false, defaultDebugOptions.getBoolean("enable_hot_key_logging")); + + Environment instance = + getDefaultInstance() + .toBuilder() + .setDebugOptions( + DebugOptions.getDefaultInstance().toBuilder().setEnableHotKeyLogging(true).build()) + .build(); + Row row = builderOf(instance).build(); + assertNotNull(row); + Row debugOptions = row.getRow(fieldName); + assertNotNull(debugOptions); + assertEquals(true, debugOptions.getBoolean("enable_hot_key_logging")); + } +} diff --git a/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/schemas/ExecutionStageSummaryTest.java b/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/schemas/ExecutionStageSummaryTest.java new file mode 100644 index 000000000000..16830e17180c --- /dev/null +++ b/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/schemas/ExecutionStageSummaryTest.java @@ -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. + */ +package org.apache.beam.testinfra.pipelines.schemas; + +import com.google.dataflow.v1beta3.ExecutionStageSummary; +import com.google.protobuf.Descriptors.Descriptor; +import java.util.Set; +import org.apache.beam.sdk.values.Row; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableSet; +import org.checkerframework.checker.nullness.qual.NonNull; + +/** + * Tests for converting an {@link ExecutionStageSummary} to a {@link Row} using {@link + * GeneratedMessageV3RowBuilder}. + */ +class ExecutionStageSummaryTest + extends AbstractGeneratedMessageV3RowBuilderTest { + + @Override + protected @NonNull Descriptor getDescriptorForType() { + return ExecutionStageSummary.getDescriptor(); + } + + @Override + protected @NonNull ExecutionStageSummary getDefaultInstance() { + return ExecutionStageSummary.getDefaultInstance(); + } + + @Override + protected @NonNull Class getDefaultInstanceClass() { + return ExecutionStageSummary.class; + } + + @Override + protected @NonNull Set<@NonNull String> getStringFields() { + return ImmutableSet.of("name", "id"); + } + + @Override + protected @NonNull Set<@NonNull String> getStringArrayFields() { + return ImmutableSet.of("prerequisite_stage"); + } + + @Override + protected @NonNull Set<@NonNull String> getBooleanFields() { + return ImmutableSet.of(); + } + + @Override + protected @NonNull Set<@NonNull String> getStructFields() { + return ImmutableSet.of(); + } + + @Override + protected @NonNull Set<@NonNull String> getEnumFields() { + return ImmutableSet.of("kind"); + } + + @Override + protected @NonNull Set<@NonNull String> getDisplayDataFields() { + return ImmutableSet.of(); + } + + @Override + protected @NonNull Set<@NonNull String> getRepeatedMessageFields() { + return ImmutableSet.of( + "input_source", "output_source", "component_transform", "component_source"); + } +} diff --git a/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/schemas/TransformSummaryRowBuilderTest.java b/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/schemas/TransformSummaryRowBuilderTest.java new file mode 100644 index 000000000000..b07700c18cee --- /dev/null +++ b/.test-infra/pipelines/src/test/java/org/apache/beam/testinfra/pipelines/schemas/TransformSummaryRowBuilderTest.java @@ -0,0 +1,83 @@ +/* + * 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.testinfra.pipelines.schemas; + +import com.google.dataflow.v1beta3.TransformSummary; +import com.google.protobuf.Descriptors.Descriptor; +import java.util.Set; +import org.apache.beam.sdk.values.Row; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableSet; +import org.checkerframework.checker.nullness.qual.NonNull; + +/** + * Tests for converting a {@link TransformSummary} to a {@link Row} using {@link + * GeneratedMessageV3RowBuilder}. + */ +class TransformSummaryRowBuilderTest + extends AbstractGeneratedMessageV3RowBuilderTest { + + @Override + protected @NonNull Descriptor getDescriptorForType() { + return TransformSummary.getDescriptor(); + } + + @Override + protected @NonNull TransformSummary getDefaultInstance() { + return TransformSummary.getDefaultInstance(); + } + + @Override + protected @NonNull Class getDefaultInstanceClass() { + return TransformSummary.class; + } + + @Override + protected @NonNull Set<@NonNull String> getStringFields() { + return ImmutableSet.of("id", "name"); + } + + @Override + protected @NonNull Set<@NonNull String> getStringArrayFields() { + return ImmutableSet.of("output_collection_name", "input_collection_name"); + } + + @Override + protected @NonNull Set<@NonNull String> getBooleanFields() { + return ImmutableSet.of(); + } + + @Override + protected @NonNull Set<@NonNull String> getStructFields() { + return ImmutableSet.of(); + } + + @Override + protected @NonNull Set<@NonNull String> getEnumFields() { + return ImmutableSet.of("kind"); + } + + @Override + protected @NonNull Set<@NonNull String> getDisplayDataFields() { + return ImmutableSet.of("display_data"); + } + + @Override + protected @NonNull Set<@NonNull String> getRepeatedMessageFields() { + return ImmutableSet.of(); + } +} diff --git a/.test-infra/pipelines/src/test/resources/eventarc_data/has_extra_data_payload_foo_property.json b/.test-infra/pipelines/src/test/resources/eventarc_data/has_extra_data_payload_foo_property.json new file mode 100644 index 000000000000..6e41df872ce6 --- /dev/null +++ b/.test-infra/pipelines/src/test/resources/eventarc_data/has_extra_data_payload_foo_property.json @@ -0,0 +1 @@ +{"data": {"@type": "type.googleapis.com/google.events.cloud.dataflow.v1beta3.JobEventData", "payload": {"foo": "bar", "createTime": "2023-05-09T20:23:51.386359Z", "currentState": "JOB_STATE_CANCELLED", "currentStateTime": "2023-05-09T20:37:51.386412Z", "environment": {"userAgent": {"container.base_repository": "gcr.io/cloud-dataflow/v1beta3", "fnapi.container.version": "2.46.0", "fnapi.environment.major.version": "8", "java.vendor": "Oracle Corporation", "java.version": "11.0.9", "legacy.container.version": "2.46.0", "legacy.environment.major.version": "8", "name": "Apache Beam SDK for Java", "os.arch": "amd64", "os.name": "Linux", "os.version": "5.10.147+", "version": "2.46.0"}, "version": {"job_type": "STREAMING", "major": "8"}}, "id": "2023-05-09_13_23_50-11065941757886660214", "jobMetadata": {"sdkVersion": {"sdkSupportStatus": "SUPPORTED", "version": "2.46.0", "versionDisplayName": "Apache Beam SDK for Java"}}, "labels": {"goog-dataflow-provided-template-name": "cloud_pubsub_to_gcs_text_flex", "goog-dataflow-provided-template-type": "flex", "goog-dataflow-provided-template-version": "2023-04-25-00_rc00"}, "location": "us-central1", "name": "pubsub-to-gcs", "projectId": "temp-aac6645f", "startTime": "2023-05-09T20:23:51.386359Z", "type": "JOB_TYPE_STREAMING"}}, "datacontenttype": "application/json; charset=utf-8", "dataschema": "https://googleapis.github.io/google-cloudevents/proto/google/events/cloud/dataflow/v1beta3/data.proto#JobEventData", "id": "54464e9920f90a134a807b3668768aa", "job": "pubsub-to-gcs", "location": "us-central1", "project": "641223881136", "source": "//dataflow.googleapis.com/projects/temp-aac6645f/locations/us-central1", "specversion": "1.0", "subject": "jobs/pubsub-to-gcs", "time": "2023-05-09T20:37:51.386412Z", "type": "google.cloud.dataflow.job.v1beta3.statusChanged"} \ No newline at end of file diff --git a/.test-infra/pipelines/src/test/resources/eventarc_data/job_state_canceled_streaming.json b/.test-infra/pipelines/src/test/resources/eventarc_data/job_state_canceled_streaming.json new file mode 100644 index 000000000000..55d8ada3c2a6 --- /dev/null +++ b/.test-infra/pipelines/src/test/resources/eventarc_data/job_state_canceled_streaming.json @@ -0,0 +1 @@ +{"data": {"@type": "type.googleapis.com/google.events.cloud.dataflow.v1beta3.JobEventData", "payload": {"createTime": "2023-05-09T20:23:51.386359Z", "currentState": "JOB_STATE_CANCELLED", "currentStateTime": "2023-05-09T20:37:51.386412Z", "environment": {"userAgent": {"container.base_repository": "gcr.io/cloud-dataflow/v1beta3", "fnapi.container.version": "2.46.0", "fnapi.environment.major.version": "8", "java.vendor": "Oracle Corporation", "java.version": "11.0.9", "legacy.container.version": "2.46.0", "legacy.environment.major.version": "8", "name": "Apache Beam SDK for Java", "os.arch": "amd64", "os.name": "Linux", "os.version": "5.10.147+", "version": "2.46.0"}, "version": {"job_type": "STREAMING", "major": "8"}}, "id": "2023-05-09_13_23_50-11065941757886660214", "jobMetadata": {"sdkVersion": {"sdkSupportStatus": "SUPPORTED", "version": "2.46.0", "versionDisplayName": "Apache Beam SDK for Java"}}, "labels": {"goog-dataflow-provided-template-name": "cloud_pubsub_to_gcs_text_flex", "goog-dataflow-provided-template-type": "flex", "goog-dataflow-provided-template-version": "2023-04-25-00_rc00"}, "location": "us-central1", "name": "pubsub-to-gcs", "projectId": "temp-aac6645f", "startTime": "2023-05-09T20:23:51.386359Z", "type": "JOB_TYPE_STREAMING"}}, "datacontenttype": "application/json; charset=utf-8", "dataschema": "https://googleapis.github.io/google-cloudevents/proto/google/events/cloud/dataflow/v1beta3/data.proto#JobEventData", "id": "54464e9920f90a134a807b3668768aa", "job": "pubsub-to-gcs", "location": "us-central1", "project": "641223881136", "source": "//dataflow.googleapis.com/projects/temp-aac6645f/locations/us-central1", "specversion": "1.0", "subject": "jobs/pubsub-to-gcs", "time": "2023-05-09T20:37:51.386412Z", "type": "google.cloud.dataflow.job.v1beta3.statusChanged"} \ No newline at end of file diff --git a/.test-infra/pipelines/src/test/resources/eventarc_data/job_state_canceling_streaming.json b/.test-infra/pipelines/src/test/resources/eventarc_data/job_state_canceling_streaming.json new file mode 100644 index 000000000000..92ef37045ce9 --- /dev/null +++ b/.test-infra/pipelines/src/test/resources/eventarc_data/job_state_canceling_streaming.json @@ -0,0 +1 @@ +{"data": {"@type": "type.googleapis.com/google.events.cloud.dataflow.v1beta3.JobEventData", "payload": {"createTime": "2023-05-09T20:23:51.386359Z", "currentState": "JOB_STATE_CANCELLING", "currentStateTime": "2023-05-09T20:37:02.388860Z", "environment": {"userAgent": {"container.base_repository": "gcr.io/cloud-dataflow/v1beta3", "fnapi.container.version": "2.46.0", "fnapi.environment.major.version": "8", "java.vendor": "Oracle Corporation", "java.version": "11.0.9", "legacy.container.version": "2.46.0", "legacy.environment.major.version": "8", "name": "Apache Beam SDK for Java", "os.arch": "amd64", "os.name": "Linux", "os.version": "5.10.147+", "version": "2.46.0"}, "version": {"job_type": "STREAMING", "major": "8"}}, "id": "2023-05-09_13_23_50-11065941757886660214", "jobMetadata": {"sdkVersion": {"sdkSupportStatus": "SUPPORTED", "version": "2.46.0", "versionDisplayName": "Apache Beam SDK for Java"}}, "labels": {"goog-dataflow-provided-template-name": "cloud_pubsub_to_gcs_text_flex", "goog-dataflow-provided-template-type": "flex", "goog-dataflow-provided-template-version": "2023-04-25-00_rc00"}, "location": "us-central1", "name": "pubsub-to-gcs", "projectId": "temp-aac6645f", "requestedState": "JOB_STATE_CANCELLED", "startTime": "2023-05-09T20:23:51.386359Z", "type": "JOB_TYPE_STREAMING"}}, "datacontenttype": "application/json; charset=utf-8", "dataschema": "https://googleapis.github.io/google-cloudevents/proto/google/events/cloud/dataflow/v1beta3/data.proto#JobEventData", "id": "9031810c622ceae915d1f303d0440216", "job": "pubsub-to-gcs", "location": "us-central1", "project": "641223881136", "source": "//dataflow.googleapis.com/projects/temp-aac6645f/locations/us-central1", "specversion": "1.0", "subject": "jobs/pubsub-to-gcs", "time": "2023-05-09T20:37:02.388860Z", "type": "google.cloud.dataflow.job.v1beta3.statusChanged"} \ No newline at end of file diff --git a/.test-infra/pipelines/src/test/resources/eventarc_data/job_state_done_batch.json b/.test-infra/pipelines/src/test/resources/eventarc_data/job_state_done_batch.json new file mode 100644 index 000000000000..5ec88ac2647b --- /dev/null +++ b/.test-infra/pipelines/src/test/resources/eventarc_data/job_state_done_batch.json @@ -0,0 +1 @@ +{"data": {"@type": "type.googleapis.com/google.events.cloud.dataflow.v1beta3.JobEventData", "payload": {"createTime": "2023-05-09T20:39:13.690602Z", "currentState": "JOB_STATE_DONE", "currentStateTime": "2023-05-09T20:42:29.054956Z", "environment": {"shuffleMode": "SERVICE_BASED", "userAgent": {"container.base_repository": "gcr.io/cloud-dataflow/v1beta3", "fnapi.container.version": "2.46.0", "fnapi.environment.major.version": "8", "java.vendor": "Google Inc.", "java.version": "11.0.15", "legacy.container.version": "2.46.0", "legacy.environment.major.version": "8", "name": "Apache Beam SDK for Java", "os.arch": "amd64", "os.name": "Linux", "os.version": "4.15.0-smp-928.26.0.0", "version": "2.46.0"}, "version": {"job_type": "JAVA_BATCH_AUTOSCALING", "major": "8"}}, "id": "2023-05-09_13_39_13-18226864771788319755", "jobMetadata": {"sdkVersion": {"sdkSupportStatus": "SUPPORTED", "version": "2.46.0", "versionDisplayName": "Apache Beam SDK for Java"}}, "labels": {"goog-dataflow-provided-template-name": "word_count", "goog-dataflow-provided-template-type": "legacy", "goog-dataflow-provided-template-version": "2023-04-25-00_rc00"}, "location": "us-central1", "name": "wordcount", "projectId": "temp-aac6645f", "startTime": "2023-05-09T20:39:13.690602Z", "type": "JOB_TYPE_BATCH"}}, "datacontenttype": "application/json; charset=utf-8", "dataschema": "https://googleapis.github.io/google-cloudevents/proto/google/events/cloud/dataflow/v1beta3/data.proto#JobEventData", "id": "1f73d7cdba847a3c35963f3354833fba", "job": "wordcount", "location": "us-central1", "project": "641223881136", "source": "//dataflow.googleapis.com/projects/temp-aac6645f/locations/us-central1", "specversion": "1.0", "subject": "jobs/wordcount", "time": "2023-05-09T20:42:29.054956Z", "type": "google.cloud.dataflow.job.v1beta3.statusChanged"} \ No newline at end of file diff --git a/.test-infra/pipelines/src/test/resources/eventarc_data/job_state_pending_batch.json b/.test-infra/pipelines/src/test/resources/eventarc_data/job_state_pending_batch.json new file mode 100644 index 000000000000..83e49c6f0a46 --- /dev/null +++ b/.test-infra/pipelines/src/test/resources/eventarc_data/job_state_pending_batch.json @@ -0,0 +1 @@ +{"data": {"@type": "type.googleapis.com/google.events.cloud.dataflow.v1beta3.JobEventData", "payload": {"createTime": "2023-05-09T20:39:13.690602Z", "currentState": "JOB_STATE_PENDING", "currentStateTime": "2023-05-09T20:39:13.690602Z", "environment": {"shuffleMode": "SERVICE_BASED", "userAgent": {"container.base_repository": "gcr.io/cloud-dataflow/v1beta3", "fnapi.container.version": "2.46.0", "fnapi.environment.major.version": "8", "java.vendor": "Google Inc.", "java.version": "11.0.15", "legacy.container.version": "2.46.0", "legacy.environment.major.version": "8", "name": "Apache Beam SDK for Java", "os.arch": "amd64", "os.name": "Linux", "os.version": "4.15.0-smp-928.26.0.0", "version": "2.46.0"}, "version": {"job_type": "JAVA_BATCH_AUTOSCALING", "major": "8"}}, "id": "2023-05-09_13_39_13-18226864771788319755", "jobMetadata": {"sdkVersion": {"sdkSupportStatus": "SUPPORTED", "version": "2.46.0", "versionDisplayName": "Apache Beam SDK for Java"}}, "labels": {"goog-dataflow-provided-template-name": "word_count", "goog-dataflow-provided-template-type": "legacy", "goog-dataflow-provided-template-version": "2023-04-25-00_rc00"}, "location": "us-central1", "name": "wordcount", "projectId": "temp-aac6645f", "startTime": "2023-05-09T20:39:13.690602Z", "type": "JOB_TYPE_BATCH"}}, "datacontenttype": "application/json; charset=utf-8", "dataschema": "https://googleapis.github.io/google-cloudevents/proto/google/events/cloud/dataflow/v1beta3/data.proto#JobEventData", "id": "e2a0f3fc7b45602bce23b4cc2c9150bf", "job": "wordcount", "location": "us-central1", "project": "641223881136", "source": "//dataflow.googleapis.com/projects/temp-aac6645f/locations/us-central1", "specversion": "1.0", "subject": "jobs/wordcount", "time": "2023-05-09T20:39:13.690602Z", "type": "google.cloud.dataflow.job.v1beta3.statusChanged"} \ No newline at end of file diff --git a/.test-infra/pipelines/src/test/resources/eventarc_data/job_state_pending_streaming.json b/.test-infra/pipelines/src/test/resources/eventarc_data/job_state_pending_streaming.json new file mode 100644 index 000000000000..5a53cfe466ac --- /dev/null +++ b/.test-infra/pipelines/src/test/resources/eventarc_data/job_state_pending_streaming.json @@ -0,0 +1 @@ +{"data": {"@type": "type.googleapis.com/google.events.cloud.dataflow.v1beta3.JobEventData", "payload": {"createTime": "2023-05-09T20:23:51.386359Z", "currentState": "JOB_STATE_PENDING", "currentStateTime": "2023-05-09T20:25:38.932271Z", "environment": {"userAgent": {"container.base_repository": "gcr.io/cloud-dataflow/v1beta3", "fnapi.container.version": "2.46.0", "fnapi.environment.major.version": "8", "java.vendor": "Oracle Corporation", "java.version": "11.0.9", "legacy.container.version": "2.46.0", "legacy.environment.major.version": "8", "name": "Apache Beam SDK for Java", "os.arch": "amd64", "os.name": "Linux", "os.version": "5.10.147+", "version": "2.46.0"}, "version": {"job_type": "STREAMING", "major": "8"}}, "id": "2023-05-09_13_23_50-11065941757886660214", "jobMetadata": {"sdkVersion": {"sdkSupportStatus": "SUPPORTED", "version": "2.46.0", "versionDisplayName": "Apache Beam SDK for Java"}}, "labels": {"goog-dataflow-provided-template-name": "cloud_pubsub_to_gcs_text_flex", "goog-dataflow-provided-template-type": "flex", "goog-dataflow-provided-template-version": "2023-04-25-00_rc00"}, "location": "us-central1", "name": "pubsub-to-gcs", "projectId": "temp-aac6645f", "startTime": "2023-05-09T20:23:51.386359Z", "type": "JOB_TYPE_STREAMING"}}, "datacontenttype": "application/json; charset=utf-8", "dataschema": "https://googleapis.github.io/google-cloudevents/proto/google/events/cloud/dataflow/v1beta3/data.proto#JobEventData", "id": "48ecdd08fed35e33bac95c0aa95f7298", "job": "pubsub-to-gcs", "location": "us-central1", "project": "641223881136", "source": "//dataflow.googleapis.com/projects/temp-aac6645f/locations/us-central1", "specversion": "1.0", "subject": "jobs/pubsub-to-gcs", "time": "2023-05-09T20:25:38.932271Z", "type": "google.cloud.dataflow.job.v1beta3.statusChanged"} \ No newline at end of file diff --git a/.test-infra/pipelines/src/test/resources/eventarc_data/job_state_queued_streaming.json b/.test-infra/pipelines/src/test/resources/eventarc_data/job_state_queued_streaming.json new file mode 100644 index 000000000000..c6a8b72caa54 --- /dev/null +++ b/.test-infra/pipelines/src/test/resources/eventarc_data/job_state_queued_streaming.json @@ -0,0 +1 @@ +{"data": {"@type": "type.googleapis.com/google.events.cloud.dataflow.v1beta3.JobEventData", "payload": {"createTime": "2023-05-09T20:23:51.386359Z", "currentState": "JOB_STATE_QUEUED", "currentStateTime": "2023-05-09T20:23:51.386359Z", "environment": {}, "id": "2023-05-09_13_23_50-11065941757886660214", "location": "us-central1", "name": "pubsub-to-gcs", "projectId": "temp-aac6645f", "startTime": "2023-05-09T20:23:51.386359Z"}}, "datacontenttype": "application/json; charset=utf-8", "dataschema": "https://googleapis.github.io/google-cloudevents/proto/google/events/cloud/dataflow/v1beta3/data.proto#JobEventData", "id": "d97207126d9202dabe3101eada03b32c", "job": "pubsub-to-gcs", "location": "us-central1", "project": "641223881136", "source": "//dataflow.googleapis.com/projects/temp-aac6645f/locations/us-central1", "specversion": "1.0", "subject": "jobs/pubsub-to-gcs", "time": "2023-05-09T20:23:51.386359Z", "type": "google.cloud.dataflow.job.v1beta3.statusChanged"} \ No newline at end of file diff --git a/.test-infra/pipelines/src/test/resources/eventarc_data/job_state_running_batch.json b/.test-infra/pipelines/src/test/resources/eventarc_data/job_state_running_batch.json new file mode 100644 index 000000000000..8f2780bed576 --- /dev/null +++ b/.test-infra/pipelines/src/test/resources/eventarc_data/job_state_running_batch.json @@ -0,0 +1 @@ +{"data": {"@type": "type.googleapis.com/google.events.cloud.dataflow.v1beta3.JobEventData", "payload": {"createTime": "2023-05-09T20:39:13.690602Z", "currentState": "JOB_STATE_RUNNING", "currentStateTime": "2023-05-09T20:39:17.928139Z", "environment": {"shuffleMode": "SERVICE_BASED", "userAgent": {"container.base_repository": "gcr.io/cloud-dataflow/v1beta3", "fnapi.container.version": "2.46.0", "fnapi.environment.major.version": "8", "java.vendor": "Google Inc.", "java.version": "11.0.15", "legacy.container.version": "2.46.0", "legacy.environment.major.version": "8", "name": "Apache Beam SDK for Java", "os.arch": "amd64", "os.name": "Linux", "os.version": "4.15.0-smp-928.26.0.0", "version": "2.46.0"}, "version": {"job_type": "JAVA_BATCH_AUTOSCALING", "major": "8"}}, "id": "2023-05-09_13_39_13-18226864771788319755", "jobMetadata": {"sdkVersion": {"sdkSupportStatus": "SUPPORTED", "version": "2.46.0", "versionDisplayName": "Apache Beam SDK for Java"}}, "labels": {"goog-dataflow-provided-template-name": "word_count", "goog-dataflow-provided-template-type": "legacy", "goog-dataflow-provided-template-version": "2023-04-25-00_rc00"}, "location": "us-central1", "name": "wordcount", "projectId": "temp-aac6645f", "startTime": "2023-05-09T20:39:13.690602Z", "type": "JOB_TYPE_BATCH"}}, "datacontenttype": "application/json; charset=utf-8", "dataschema": "https://googleapis.github.io/google-cloudevents/proto/google/events/cloud/dataflow/v1beta3/data.proto#JobEventData", "id": "ca694e08aabb07465926af232904a941", "job": "wordcount", "location": "us-central1", "project": "641223881136", "source": "//dataflow.googleapis.com/projects/temp-aac6645f/locations/us-central1", "specversion": "1.0", "subject": "jobs/wordcount", "time": "2023-05-09T20:39:17.928139Z", "type": "google.cloud.dataflow.job.v1beta3.statusChanged"} \ No newline at end of file diff --git a/.test-infra/pipelines/src/test/resources/eventarc_data/job_state_running_streaming.json b/.test-infra/pipelines/src/test/resources/eventarc_data/job_state_running_streaming.json new file mode 100644 index 000000000000..42075dcfbd45 --- /dev/null +++ b/.test-infra/pipelines/src/test/resources/eventarc_data/job_state_running_streaming.json @@ -0,0 +1 @@ +{"data": {"@type": "type.googleapis.com/google.events.cloud.dataflow.v1beta3.JobEventData", "payload": {"createTime": "2023-05-09T20:23:51.386359Z", "currentState": "JOB_STATE_RUNNING", "currentStateTime": "2023-05-09T20:26:05.500274Z", "environment": {"userAgent": {"container.base_repository": "gcr.io/cloud-dataflow/v1beta3", "fnapi.container.version": "2.46.0", "fnapi.environment.major.version": "8", "java.vendor": "Oracle Corporation", "java.version": "11.0.9", "legacy.container.version": "2.46.0", "legacy.environment.major.version": "8", "name": "Apache Beam SDK for Java", "os.arch": "amd64", "os.name": "Linux", "os.version": "5.10.147+", "version": "2.46.0"}, "version": {"job_type": "STREAMING", "major": "8"}}, "id": "2023-05-09_13_23_50-11065941757886660214", "jobMetadata": {"sdkVersion": {"sdkSupportStatus": "SUPPORTED", "version": "2.46.0", "versionDisplayName": "Apache Beam SDK for Java"}}, "labels": {"goog-dataflow-provided-template-name": "cloud_pubsub_to_gcs_text_flex", "goog-dataflow-provided-template-type": "flex", "goog-dataflow-provided-template-version": "2023-04-25-00_rc00"}, "location": "us-central1", "name": "pubsub-to-gcs", "projectId": "temp-aac6645f", "startTime": "2023-05-09T20:23:51.386359Z", "type": "JOB_TYPE_STREAMING"}}, "datacontenttype": "application/json; charset=utf-8", "dataschema": "https://googleapis.github.io/google-cloudevents/proto/google/events/cloud/dataflow/v1beta3/data.proto#JobEventData", "id": "e43563146f083fe9cad14f6006c717f5", "job": "pubsub-to-gcs", "location": "us-central1", "project": "641223881136", "source": "//dataflow.googleapis.com/projects/temp-aac6645f/locations/us-central1", "specversion": "1.0", "subject": "jobs/pubsub-to-gcs", "time": "2023-05-09T20:26:05.500274Z", "type": "google.cloud.dataflow.job.v1beta3.statusChanged"} \ No newline at end of file diff --git a/.test-infra/tools/README.md b/.test-infra/tools/README.md index df6ab9525e9a..758c3885a814 100644 --- a/.test-infra/tools/README.md +++ b/.test-infra/tools/README.md @@ -47,7 +47,7 @@ Example: - Original ```bash -python_versions_arr=("3.8.16" "3.7.16" "3.9.16" "3.10.10") +python_versions_arr=("3.8.16" "3.9.16" "3.10.10" "3.11.4") ``` - Change diff --git a/.test-infra/tools/python_installer.sh b/.test-infra/tools/python_installer.sh index 0b40eb12b993..b1b05e597cb3 100644 --- a/.test-infra/tools/python_installer.sh +++ b/.test-infra/tools/python_installer.sh @@ -20,7 +20,7 @@ set -euo pipefail # Variable containing the python versions to install -python_versions_arr=("3.8.16" "3.7.16" "3.9.16" "3.10.10") +python_versions_arr=("3.8.16" "3.9.16" "3.10.10" "3.11.4") # Install pyenv dependencies. pyenv_dep(){ diff --git a/CHANGES.md b/CHANGES.md index 6ab0852f2b21..7ed75c7ee05d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -49,7 +49,8 @@ * ([#X](https://github.com/apache/beam/issues/X)). --> -# [2.49.0] - Unreleased + +# [2.50.0] - Unreleased ## Highlights @@ -59,6 +60,9 @@ ## I/Os * Support for X source added (Java/Python) ([#X](https://github.com/apache/beam/issues/X)). +* Python GCSIO is now implemented with GCP GCS Client instead of apitools ([#25676](https://github.com/apache/beam/issues/25676)) +* Java KafkaIO now supports picking up topics via topicPattern ([#26948](https://github.com/apache/beam/pull/26948)) +* Support for read from Cosmos DB Core SQL API [#23604](https://github.com/apache/beam/issues/23604) ## New Features / Improvements @@ -66,7 +70,7 @@ ## Breaking Changes -* X behavior was changed ([#X](https://github.com/apache/beam/issues/X)). +* Legacy runner support removed from Dataflow, all pipelines must use runner v2. ## Deprecations @@ -75,13 +79,38 @@ ## Bugfixes * Fixed X (Java/Python) ([#X](https://github.com/apache/beam/issues/X)). -* Fixed KinesisIO `NullPointerException` when a progress check is made before the reader is started (IO) ([#23868](https://github.com/apache/beam/issues/23868)) ## Known Issues * ([#X](https://github.com/apache/beam/issues/X)). +# [2.49.0] - Unreleased + + +## I/Os + +* Support for Bigtable Change Streams added in Java `BigtableIO.ReadChangeStream` ([#27183](https://github.com/apache/beam/issues/27183)) + +## New Features / Improvements + +* Allow prebuilding large images when using `--prebuild_sdk_container_engine=cloud_build`, like images depending on `tensorflow` or `torch` ([#27023](https://github.com/apache/beam/pull/27023)). +* Disabled `pip` cache when installing packages on the workers. This reduces the size of prebuilt Python container images ([#27035](https://github.com/apache/beam/pull/27035)). +* Select dedicated avro datum reader and writer (Java) ([#18874](https://github.com/apache/beam/issues/18874)). +* Timer API for the Go SDK (Go) ([#22737](https://github.com/apache/beam/issues/22737)). + + +## Deprecations + +* Remove Python 3.7 support. ([#26447](https://github.com/apache/beam/issues/26447)) + +## Bugfixes + +* Fixed KinesisIO `NullPointerException` when a progress check is made before the reader is started (IO) ([#23868](https://github.com/apache/beam/issues/23868)) + +## Known Issues + + # [2.48.0] - 2023-05-31 ## Highlights @@ -125,7 +154,7 @@ ## Known Issues -* ([#X](https://github.com/apache/beam/issues/X)). +* PubsubIO writes will throw *SizeLimitExceededException* for any message above 100 bytes, when used in batch (bounded) mode. (Java) ([#27000](https://github.com/apache/beam/issues/27000)). # [2.47.0] - 2023-05-10 diff --git a/CI.md b/CI.md index 0b6075c24d5b..200e1208e4d7 100644 --- a/CI.md +++ b/CI.md @@ -90,6 +90,9 @@ These variables are: Service Account shall have following permissions ([IAM roles](https://cloud.google.com/iam/docs/understanding-roles)): * Storage Admin (roles/storage.admin) * Dataflow Admin (roles/dataflow.admin) + * Artifact Registry writer (roles/artifactregistry.createOnPush) + * Big Query Data Editor (roles/bigquery.dataEditor) + * Service Account User (roles/iam.serviceAccountUser) ### Workflows diff --git a/README.md b/README.md index a039e5dec450..b579fb58b3ae 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ Beam supports executing programs on multiple distributed processing backends thr - The `DirectRunner` runs the pipeline on your local machine. - The `DataflowRunner` submits the pipeline to the [Google Cloud Dataflow](http://cloud.google.com/dataflow/). - The `FlinkRunner` runs the pipeline on an Apache Flink cluster. The code has been donated from [dataArtisans/flink-dataflow](https://github.com/dataArtisans/flink-dataflow) and is now part of Beam. -- The `SparkRunner` runs the pipeline on an Apache Spark cluster. The code has been donated from [cloudera/spark-dataflow](https://github.com/cloudera/spark-dataflow) and is now part of Beam. +- The `SparkRunner` runs the pipeline on an Apache Spark cluster. - The `JetRunner` runs the pipeline on a Hazelcast Jet cluster. The code has been donated from [hazelcast/hazelcast-jet](https://github.com/hazelcast/hazelcast-jet) and is now part of Beam. - The `Twister2Runner` runs the pipeline on a Twister2 cluster. The code has been donated from [DSC-SPIDAL/twister2](https://github.com/DSC-SPIDAL/twister2) and is now part of Beam. @@ -80,6 +80,10 @@ Have ideas for new Runners? See the [runner-ideas label](https://github.com/apac To learn how to write Beam pipelines, read the Quickstart for [[Java](https://beam.apache.org/get-started/quickstart-java), [Python](https://beam.apache.org/get-started/quickstart-py), or [Go](https://beam.apache.org/get-started/quickstart-go)] available on our website. +To play with some Beam examples, try [Beam Playground](https://play.beam.apache.org/?path=SDK_JAVA_MinimalWordCount&sdk=java). +To learn basic Beam concepts, try [Tour of Beam](https://tour.beam.apache.org/). + + ## Contact Us diff --git a/build.gradle.kts b/build.gradle.kts index b89270a9537f..d202d9c76fbb 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -18,11 +18,6 @@ plugins { base - // This plugin provides a task to determine which dependencies have updates. - // Additionally, the plugin checks for updates to Gradle itself. - // - // See https://github.com/ben-manes/gradle-versions-plugin for further details. - id("com.github.ben-manes.versions") version "0.33.0" // Apply one top level rat plugin to perform any required license enforcement analysis id("org.nosphere.apache.rat") version "0.8.0" // Enable gradle-based release management @@ -468,7 +463,6 @@ tasks.register("playgroundPreCommit") { tasks.register("pythonPreCommit") { dependsOn(":sdks:python:test-suites:tox:pycommon:preCommitPyCommon") - dependsOn(":sdks:python:test-suites:tox:py37:preCommitPy37") dependsOn(":sdks:python:test-suites:tox:py38:preCommitPy38") dependsOn(":sdks:python:test-suites:tox:py39:preCommitPy39") dependsOn(":sdks:python:test-suites:tox:py310:preCommitPy310") @@ -478,7 +472,6 @@ tasks.register("pythonPreCommit") { tasks.register("pythonPreCommitIT") { dependsOn(":sdks:python:test-suites:tox:pycommon:preCommitPyCommon") dependsOn(":sdks:python:test-suites:dataflow:preCommitIT") - dependsOn(":sdks:python:test-suites:dataflow:preCommitIT_V2") } tasks.register("pythonDocsPreCommit") { @@ -486,7 +479,6 @@ tasks.register("pythonDocsPreCommit") { } tasks.register("pythonDockerBuildPreCommit") { - dependsOn(":sdks:python:container:py37:docker") dependsOn(":sdks:python:container:py38:docker") dependsOn(":sdks:python:container:py39:docker") dependsOn(":sdks:python:container:py310:docker") @@ -495,25 +487,13 @@ tasks.register("pythonDockerBuildPreCommit") { tasks.register("pythonLintPreCommit") { // TODO(https://github.com/apache/beam/issues/20209): Find a better way to specify lint and formatter tasks without hardcoding py version. - dependsOn(":sdks:python:test-suites:tox:py37:lint") + dependsOn(":sdks:python:test-suites:tox:py38:lint") } tasks.register("pythonFormatterPreCommit") { dependsOn("sdks:python:test-suites:tox:py38:formatter") } -tasks.register("python37PostCommit") { - dependsOn(":sdks:python:test-suites:dataflow:py37:postCommitIT") - dependsOn(":sdks:python:test-suites:direct:py37:postCommitIT") - dependsOn(":sdks:python:test-suites:direct:py37:directRunnerIT") - dependsOn(":sdks:python:test-suites:direct:py37:hdfsIntegrationTest") - dependsOn(":sdks:python:test-suites:direct:py37:azureIntegrationTest") - dependsOn(":sdks:python:test-suites:portable:py37:postCommitPy37") - dependsOn(":sdks:python:test-suites:dataflow:py37:spannerioIT") - dependsOn(":sdks:python:test-suites:direct:py37:spannerioIT") - dependsOn(":sdks:python:test-suites:portable:py37:xlangSpannerIOIT") -} - tasks.register("python38PostCommit") { dependsOn(":sdks:python:test-suites:dataflow:py38:postCommitIT") dependsOn(":sdks:python:test-suites:direct:py38:postCommitIT") @@ -552,12 +532,11 @@ tasks.register("python311PostCommit") { } tasks.register("portablePythonPreCommit") { - dependsOn(":sdks:python:test-suites:portable:py37:preCommitPy37") + dependsOn(":sdks:python:test-suites:portable:py38:preCommitPy38") dependsOn(":sdks:python:test-suites:portable:py311:preCommitPy311") } tasks.register("pythonSparkPostCommit") { - dependsOn(":sdks:python:test-suites:portable:py37:sparkValidatesRunner") dependsOn(":sdks:python:test-suites:portable:py38:sparkValidatesRunner") dependsOn(":sdks:python:test-suites:portable:py39:sparkValidatesRunner") dependsOn(":sdks:python:test-suites:portable:py311:sparkValidatesRunner") @@ -580,11 +559,6 @@ tasks.register("javaExamplesDataflowPrecommit") { dependsOn(":runners:google-cloud-dataflow-java:examples-streaming:preCommit") } -tasks.register("runBeamDependencyCheck") { - dependsOn(":dependencyUpdates") - dependsOn(":sdks:python:dependencyUpdates") -} - tasks.register("whitespacePreCommit") { // TODO(https://github.com/apache/beam/issues/20209): Find a better way to specify the tasks without hardcoding py version. dependsOn(":sdks:python:test-suites:tox:py38:archiveFilesToLint") @@ -598,18 +572,65 @@ tasks.register("typescriptPreCommit") { dependsOn(":sdks:python:test-suites:tox:py38:jest") } -tasks.register("pushAllDockerImages") { +tasks.register("pushAllRunnersDockerImages") { dependsOn(":runners:spark:3:job-server:container:dockerPush") + for (version in project.ext.get("allFlinkVersions") as Array<*>) { + dependsOn(":runners:flink:${version}:job-server-container:dockerPush") + } + + doLast { + if (project.hasProperty("prune-images")) { + exec { + executable("docker") + args("system", "prune", "-a", "--force") + } + } + } +} + +tasks.register("pushAllSdkDockerImages") { + // Enforce ordering to allow the prune step to happen between runs. + // This will ensure we don't use up too much space (especially in CI environments) + mustRunAfter(":pushAllRunnersDockerImages") + dependsOn(":sdks:java:container:pushAll") dependsOn(":sdks:python:container:pushAll") dependsOn(":sdks:go:container:pushAll") dependsOn(":sdks:typescript:container:pushAll") - for (version in project.ext.get("allFlinkVersions") as Array<*>) { - dependsOn(":runners:flink:${version}:job-server-container:dockerPush") + + doLast { + if (project.hasProperty("prune-images")) { + exec { + executable("docker") + args("system", "prune", "-a", "--force") + } + } } +} + +tasks.register("pushAllXlangDockerImages") { + // Enforce ordering to allow the prune step to happen between runs. + // This will ensure we don't use up too much space (especially in CI environments) + mustRunAfter(":pushAllSdkDockerImages") + dependsOn(":sdks:java:expansion-service:container:dockerPush") dependsOn(":sdks:java:transform-service:controller-container:dockerPush") dependsOn(":sdks:python:expansion-service-container:dockerPush") + + doLast { + if (project.hasProperty("prune-images")) { + exec { + executable("docker") + args("system", "prune", "-a", "--force") + } + } + } +} + +tasks.register("pushAllDockerImages") { + dependsOn(":pushAllRunnersDockerImages") + dependsOn(":pushAllSdkDockerImages") + dependsOn(":pushAllXlangDockerImages") } // Use this task to validate the environment set up for Go, Python and Java diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 6df462a335de..50a146b1f5cd 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -30,6 +30,11 @@ repositories { url = uri("https://repo.spring.io/plugins-release/") content { includeGroup("io.spring.gradle") } } + // For obsolete Avro plugin + maven { + url = uri("https://jitpack.io") + content { includeGroup("com.github.davidmc24.gradle-avro-plugin") } + } } // Dependencies on other plugins used when this plugin is invoked @@ -40,7 +45,7 @@ dependencies { implementation("com.github.spotbugs.snom:spotbugs-gradle-plugin:5.0.14") runtimeOnly("com.google.protobuf:protobuf-gradle-plugin:0.8.13") // Enable proto code generation - runtimeOnly("com.commercehub.gradle.plugin:gradle-avro-plugin:0.11.0") // Enable Avro code generation + runtimeOnly("com.github.davidmc24.gradle-avro-plugin:gradle-avro-plugin:0.16.0") // Enable Avro code generation runtimeOnly("com.diffplug.spotless:spotless-plugin-gradle:5.6.1") // Enable a code formatting plugin runtimeOnly("com.palantir.gradle.docker:gradle-docker:0.34.0") // Enable building Docker containers runtimeOnly("gradle.plugin.com.dorongold.plugins:task-tree:1.5") // Adds a 'taskTree' task to print task dependency tree @@ -53,7 +58,7 @@ dependencies { runtimeOnly("com.avast.gradle:gradle-docker-compose-plugin:0.16.12") // Enable docker compose tasks runtimeOnly("ca.cutterslade.gradle:gradle-dependency-analyze:1.8.3") // Enable dep analysis runtimeOnly("gradle.plugin.net.ossindex:ossindex-gradle-plugin:0.4.11") // Enable dep vulnerability analysis - runtimeOnly("org.checkerframework:checkerframework-gradle-plugin:0.6.19") // Enable enhanced static checking plugin + runtimeOnly("org.checkerframework:checkerframework-gradle-plugin:0.6.29") // Enable enhanced static checking plugin } // Because buildSrc is built and tested automatically _before_ gradle diff --git a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy index dc87626b0e7f..9637f17dbf8b 100644 --- a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy +++ b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy @@ -430,7 +430,7 @@ class BeamModulePlugin implements Plugin { // Automatically use the official release version if we are performing a release // otherwise append '-SNAPSHOT' - project.version = '2.49.0' + project.version = '2.50.0' if (!isRelease(project)) { project.version += '-SNAPSHOT' } @@ -526,16 +526,16 @@ class BeamModulePlugin implements Plugin { def dbcp2_version = "2.9.0" def errorprone_version = "2.10.0" // Try to keep gax_version consistent with gax-grpc version in google_cloud_platform_libraries_bom - def gax_version = "2.26.0" + def gax_version = "2.29.0" def google_clients_version = "2.0.0" def google_cloud_bigdataoss_version = "2.2.6" // Try to keep google_cloud_spanner_version consistent with google_cloud_spanner_bom in google_cloud_platform_libraries_bom - def google_cloud_spanner_version = "6.41.0" + def google_cloud_spanner_version = "6.43.0" def google_code_gson_version = "2.9.1" def google_oauth_clients_version = "1.34.1" // Try to keep grpc_version consistent with gRPC version in google_cloud_platform_libraries_bom - def grpc_version = "1.54.0" - def guava_version = "31.1-jre" + def grpc_version = "1.55.1" + def guava_version = "32.0.1-jre" def hadoop_version = "2.10.2" def hamcrest_version = "2.1" def influxdb_version = "2.19" @@ -552,7 +552,7 @@ class BeamModulePlugin implements Plugin { def postgres_version = "42.2.16" def powermock_version = "2.0.9" // Try to keep protobuf_version consistent with the protobuf version in google_cloud_platform_libraries_bom - def protobuf_version = "3.21.12" + def protobuf_version = "3.23.2" def qpid_jms_client_version = "0.61.0" def quickcheck_version = "1.0" def sbe_tool_version = "1.25.1" @@ -612,6 +612,7 @@ class BeamModulePlugin implements Plugin { aws_java_sdk2_regions : "software.amazon.awssdk:regions:$aws_java_sdk2_version", aws_java_sdk2_utils : "software.amazon.awssdk:utils:$aws_java_sdk2_version", aws_java_sdk2_profiles : "software.amazon.awssdk:profiles:$aws_java_sdk2_version", + azure_sdk_bom : "com.azure:azure-sdk-bom:1.2.14", bigdataoss_gcsio : "com.google.cloud.bigdataoss:gcsio:$google_cloud_bigdataoss_version", bigdataoss_util : "com.google.cloud.bigdataoss:util:$google_cloud_bigdataoss_version", byte_buddy : "net.bytebuddy:byte-buddy:1.12.14", @@ -665,14 +666,14 @@ class BeamModulePlugin implements Plugin { google_cloud_core_grpc : "com.google.cloud:google-cloud-core-grpc", // google_cloud_platform_libraries_bom sets version google_cloud_datacatalog_v1beta1 : "com.google.cloud:google-cloud-datacatalog", // google_cloud_platform_libraries_bom sets version google_cloud_dataflow_java_proto_library_all: "com.google.cloud.dataflow:google-cloud-dataflow-java-proto-library-all:0.5.160304", - google_cloud_datastore_v1_proto_client : "com.google.cloud.datastore:datastore-v1-proto-client:2.9.0", + google_cloud_datastore_v1_proto_client : "com.google.cloud.datastore:datastore-v1-proto-client:2.15.0", google_cloud_firestore : "com.google.cloud:google-cloud-firestore", // google_cloud_platform_libraries_bom sets version google_cloud_pubsub : "com.google.cloud:google-cloud-pubsub", // google_cloud_platform_libraries_bom sets version google_cloud_pubsublite : "com.google.cloud:google-cloud-pubsublite", // google_cloud_platform_libraries_bom sets version // The release notes shows the versions set by the BOM: - // https://github.com/googleapis/java-cloud-bom/releases/tag/v26.14.0 + // https://github.com/googleapis/java-cloud-bom/releases/tag/v26.17.0 // Update libraries-bom version on sdks/java/container/license_scripts/dep_urls_java.yaml - google_cloud_platform_libraries_bom : "com.google.cloud:libraries-bom:26.14.0", + google_cloud_platform_libraries_bom : "com.google.cloud:libraries-bom:26.17.0", google_cloud_spanner : "com.google.cloud:google-cloud-spanner", // google_cloud_platform_libraries_bom sets version google_cloud_spanner_test : "com.google.cloud:google-cloud-spanner:$google_cloud_spanner_version:tests", google_code_gson : "com.google.code.gson:gson:$google_code_gson_version", @@ -793,7 +794,7 @@ class BeamModulePlugin implements Plugin { slf4j_jul_to_slf4j : "org.slf4j:jul-to-slf4j:$slf4j_version", slf4j_log4j12 : "org.slf4j:slf4j-log4j12:$slf4j_version", slf4j_jcl : "org.slf4j:slf4j-jcl:$slf4j_version", - snappy_java : "org.xerial.snappy:snappy-java:1.1.8.4", + snappy_java : "org.xerial.snappy:snappy-java:1.1.10.0", spark_core : "org.apache.spark:spark-core_2.11:$spark2_version", spark_streaming : "org.apache.spark:spark-streaming_2.11:$spark2_version", spark3_core : "org.apache.spark:spark-core_2.12:$spark3_version", @@ -802,14 +803,15 @@ class BeamModulePlugin implements Plugin { spark3_streaming : "org.apache.spark:spark-streaming_2.12:$spark3_version", stax2_api : "org.codehaus.woodstox:stax2-api:4.2.1", tephra : "org.apache.tephra:tephra-api:0.15.0-incubating", + testcontainers_azure : "org.testcontainers:azure:$testcontainers_version", testcontainers_base : "org.testcontainers:testcontainers:$testcontainers_version", testcontainers_clickhouse : "org.testcontainers:clickhouse:$testcontainers_version", testcontainers_elasticsearch : "org.testcontainers:elasticsearch:$testcontainers_version", + testcontainers_gcloud : "org.testcontainers:gcloud:$testcontainers_version", testcontainers_kafka : "org.testcontainers:kafka:$testcontainers_version", testcontainers_localstack : "org.testcontainers:localstack:$testcontainers_version", - testcontainers_postgresql : "org.testcontainers:postgresql:$testcontainers_version", testcontainers_mysql : "org.testcontainers:mysql:$testcontainers_version", - testcontainers_gcloud : "org.testcontainers:gcloud:$testcontainers_version", + testcontainers_postgresql : "org.testcontainers:postgresql:$testcontainers_version", testcontainers_rabbitmq : "org.testcontainers:rabbitmq:$testcontainers_version", vendored_grpc_1_54_0 : "org.apache.beam:beam-vendor-grpc-1_54_0:0.1", vendored_guava_26_0_jre : "org.apache.beam:beam-vendor-guava-26_0-jre:0.1", @@ -1197,7 +1199,7 @@ class BeamModulePlugin implements Plugin { "com.google.auto.service:auto-service-annotations:$autoservice_version", "com.google.auto.value:auto-value-annotations:$autovalue_version", "com.google.code.findbugs:jsr305:$jsr305_version", - "com.google.j2objc:j2objc-annotations:1.3", + "com.google.j2objc:j2objc-annotations:2.8", // These dependencies are needed to avoid error-prone warnings on package-info.java files, // also to include the annotations to suppress warnings. // @@ -2081,7 +2083,7 @@ class BeamModulePlugin implements Plugin { def goRootDir = "${project.rootDir}/sdks/go" // This sets the whole project Go version. - project.ext.goVersion = "go1.20.4" + project.ext.goVersion = "go1.20.5" // Minor TODO: Figure out if we can pull out the GOCMD env variable after goPrepare script // completion, and avoid this GOBIN substitution. @@ -2753,8 +2755,8 @@ class BeamModulePlugin implements Plugin { project.exec { executable 'sh' args '-c', ". ${project.ext.envdir}/bin/activate && " + - "pip install --retries 10 --upgrade pip && " + - "pip install --retries 10 --upgrade tox==3.20.1 -r ${project.rootDir}/sdks/python/build-requirements.txt" + "pip install --pre --retries 10 --upgrade pip && " + + "pip install --pre --retries 10 --upgrade tox -r ${project.rootDir}/sdks/python/build-requirements.txt" } } // Gradle will delete outputs whenever it thinks they are stale. Putting a @@ -2795,7 +2797,7 @@ class BeamModulePlugin implements Plugin { def distTarBall = "${pythonRootDir}/build/apache-beam.tar.gz" project.exec { executable 'sh' - args '-c', ". ${project.ext.envdir}/bin/activate && pip install --retries 10 ${distTarBall}[gcp,test,aws,azure,dataframe]" + args '-c', ". ${project.ext.envdir}/bin/activate && pip install --pre --retries 10 ${distTarBall}[gcp,test,aws,azure,dataframe]" } } } @@ -2909,10 +2911,10 @@ class BeamModulePlugin implements Plugin { mustRunAfter = [ ":runners:flink:${project.ext.latestFlinkVersion}:job-server:shadowJar", ':runners:spark:3:job-server:shadowJar', - ':sdks:python:container:py37:docker', ':sdks:python:container:py38:docker', ':sdks:python:container:py39:docker', ':sdks:python:container:py310:docker', + ':sdks:python:container:py311:docker', ] doLast { // TODO: Figure out GCS credentials and use real GCS input and output. diff --git a/examples/java/build.gradle b/examples/java/build.gradle index 7bbf50e6cc4e..9b5421cd6110 100644 --- a/examples/java/build.gradle +++ b/examples/java/build.gradle @@ -93,6 +93,8 @@ dependencies { implementation "org.apache.commons:commons-lang3:3.9" implementation "org.apache.httpcomponents:httpclient:4.5.13" implementation "org.apache.httpcomponents:httpcore:4.4.13" + implementation "com.fasterxml.jackson.core:jackson-annotations:2.14.1" + implementation "com.fasterxml.jackson.core:jackson-core:2.14.1" testImplementation project(path: ":runners:direct-java", configuration: "shadow") testImplementation project(":sdks:java:io:google-cloud-platform") testImplementation project(":sdks:java:extensions:ml") diff --git a/examples/java/src/main/java/org/apache/beam/examples/ApproximateQuantilesExample.java b/examples/java/src/main/java/org/apache/beam/examples/ApproximateQuantilesExample.java new file mode 100644 index 000000000000..52376e91d1d4 --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/ApproximateQuantilesExample.java @@ -0,0 +1,78 @@ +/* + * 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.examples; + +import java.util.List; +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +import org.apache.beam.sdk.transforms.ApproximateQuantiles; +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.values.PCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: ApproximateQuantiles +// description: Demonstration of ApproximateQuantiles transform usage. +// multifile: false +// default_example: false +// context_line: 46 +// categories: +// - Core Transforms +// complexity: BASIC +// tags: +// - transforms +// - numbers + +public class ApproximateQuantilesExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + // [START main_section] + // Create a collection with numbers + PCollection input = pipeline.apply(Create.of(1, 1, 2, 2, 3, 4, 4, 5, 5)); + // This will produce a collection containing 5 values: the minimum value, + // Quartile 1 value, Quartile 2 value (median), Quartile 3 value, and the + // maximum value. + PCollection> result = input.apply(ApproximateQuantiles.globally(5)); + // [END main_section] + result.apply( + ParDo.of( + new LogOutput<>( + "PCollection numbers after ApproximateQuantiles.globally transform: "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/CoGroupByKeyExample.java b/examples/java/src/main/java/org/apache/beam/examples/CoGroupByKeyExample.java new file mode 100644 index 000000000000..12d90b2f6bf7 --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/CoGroupByKeyExample.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.examples; + +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +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.join.CoGbkResult; +import org.apache.beam.sdk.transforms.join.CoGroupByKey; +import org.apache.beam.sdk.transforms.join.KeyedPCollectionTuple; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.TupleTag; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: CoGroupByKey +// description: Demonstration of CoGroupByKey transform usage. +// multifile: false +// default_example: false +// context_line: 54 +// categories: +// - Core Transforms +// - Joins +// complexity: BASIC +// tags: +// - transforms +// - strings +// - integers +// - tuples +// - pairs +// - group + +public class CoGroupByKeyExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + // [START main_section] + // Create pairs + PCollection> pt1 = + pipeline.apply(Create.of(KV.of("a", 1), KV.of("b", 2), KV.of("b", 3), KV.of("c", 4))); + PCollection> pt2 = + pipeline.apply( + Create.of( + KV.of("a", "apple"), + KV.of("a", "avocado"), + KV.of("b", "banana"), + KV.of("c", "cherry"))); + + final TupleTag t1 = new TupleTag<>(); + final TupleTag t2 = new TupleTag<>(); + PCollection> result = + KeyedPCollectionTuple.of(t1, pt1).and(t2, pt2).apply(CoGroupByKey.create()); + // [END main_section] + result.apply(ParDo.of(new LogOutput<>("PCollection pairs after CoGroupByKey transform: "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/CombineExample.java b/examples/java/src/main/java/org/apache/beam/examples/CombineExample.java new file mode 100644 index 000000000000..e63524989729 --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/CombineExample.java @@ -0,0 +1,76 @@ +/* + * 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.examples; + +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +import org.apache.beam.sdk.transforms.Combine; +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.Sum; +import org.apache.beam.sdk.values.PCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: Combine +// description: Demonstration of Combine transform usage. +// multifile: false +// default_example: false +// context_line: 47 +// categories: +// - Core Transforms +// - Combiners +// complexity: BASIC +// tags: +// - transforms +// - numbers + +public class CombineExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + // [START main_section] + // Sum.ofIntegers() combines the elements in the input PCollection. The + // resulting PCollection, called sum, + // contains one value: the sum of all the elements in the input PCollection. + PCollection pc = pipeline.apply(Create.of(1, 2, 3, 4, 5)); + PCollection sum = pc.apply(Combine.globally(Sum.ofIntegers())); + // [END main_section] + // Log values + sum.apply(ParDo.of(new LogOutput<>("PCollection numbers after Combine transform: "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/CountExample.java b/examples/java/src/main/java/org/apache/beam/examples/CountExample.java new file mode 100644 index 000000000000..e7586b6d5ea5 --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/CountExample.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.examples; + +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +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.values.PCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: Count +// description: Demonstration of Count transform usage. +// multifile: false +// default_example: false +// context_line: 45 +// categories: +// - Core Transforms +// complexity: BASIC +// tags: +// - transforms +// - numbers + +public class CountExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + // [START main_section] + PCollection pc = pipeline.apply(Create.of(1.0, 2.0, 3.0, 4.0, 5.0)); + PCollection count = pc.apply(Count.globally()); + // [END main_section] + // Log values + count.apply(ParDo.of(new LogOutput<>("PCollection numbers after Count transform: "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/CountPerKeyExample.java b/examples/java/src/main/java/org/apache/beam/examples/CountPerKeyExample.java new file mode 100644 index 000000000000..9b84ae02c113 --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/CountPerKeyExample.java @@ -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 org.apache.beam.examples; + +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +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.values.KV; +import org.apache.beam.sdk.values.PCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: CountPerKey +// description: Demonstration of Count.perKey transform usage. +// multifile: false +// default_example: false +// context_line: 47 +// categories: +// - Core Transforms +// complexity: BASIC +// tags: +// - transforms +// - numbers +// - pairs + +public class CountPerKeyExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + // [START main_section] + PCollection> input = + pipeline.apply( + Create.of(KV.of("a", 1), KV.of("a", 2), KV.of("b", 3), KV.of("b", 4), KV.of("b", 5))); + PCollection> countPerKey = input.apply(Count.perKey()); + // [END main_section] + // Log values + countPerKey.apply(ParDo.of(new LogOutput<>("PCollection numbers after Count transform: "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/CreateExample.java b/examples/java/src/main/java/org/apache/beam/examples/CreateExample.java new file mode 100644 index 000000000000..55cabd69fceb --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/CreateExample.java @@ -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 org.apache.beam.examples; + +import java.util.HashMap; +import java.util.Map; +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.coders.BigEndianIntegerCoder; +import org.apache.beam.sdk.coders.KvCoder; +import org.apache.beam.sdk.coders.StringUtf8Coder; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +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.values.KV; +import org.apache.beam.sdk.values.PCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: Create +// description: Demonstration of Create transform usage. +// multifile: false +// default_example: false +// context_line: 51 +// categories: +// - Core Transforms +// complexity: BASIC +// tags: +// - transforms +// - numbers +// - pairs + +public class CreateExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + // [START main_section] + PCollection pc = + pipeline.apply(Create.of(3, 4, 5).withCoder(BigEndianIntegerCoder.of())); + + Map map = new HashMap<>(); + map.put("a", 1); + map.put("b", 2); + + PCollection> pt = + pipeline.apply( + Create.of(map).withCoder(KvCoder.of(StringUtf8Coder.of(), BigEndianIntegerCoder.of()))); + // [END main_section] + // Log values + pc.apply(ParDo.of(new LogOutput<>("PCollection numbers after Create transform: "))); + pt.apply( + ParDo.of(new LogOutput<>("PCollection> map after Create transform: "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/DebuggingWordCount.java b/examples/java/src/main/java/org/apache/beam/examples/DebuggingWordCount.java index 943e8e113b8e..f9b2e326127d 100644 --- a/examples/java/src/main/java/org/apache/beam/examples/DebuggingWordCount.java +++ b/examples/java/src/main/java/org/apache/beam/examples/DebuggingWordCount.java @@ -23,7 +23,7 @@ // filter("Flourish|stomach"). // multifile: false // pipeline_options: --output output.txt -// context_line: 86 +// context_line: 180 // categories: // - Debugging // - Filtering diff --git a/examples/java/src/main/java/org/apache/beam/examples/DistinctExample.java b/examples/java/src/main/java/org/apache/beam/examples/DistinctExample.java new file mode 100644 index 000000000000..d83399fcb832 --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/DistinctExample.java @@ -0,0 +1,76 @@ +/* + * 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.examples; + +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +import org.apache.beam.sdk.transforms.Create; +import org.apache.beam.sdk.transforms.Distinct; +import org.apache.beam.sdk.transforms.DoFn; +import org.apache.beam.sdk.transforms.ParDo; +import org.apache.beam.sdk.values.PCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: Distinct +// description: Demonstration of Distinct transform usage. +// multifile: false +// default_example: false +// context_line: 46 +// categories: +// - Core Transforms +// complexity: BASIC +// tags: +// - transforms +// - numbers +// - distinct + +public class DistinctExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + + // [START main_section] + // Create a collection with repeating numbers + PCollection input = pipeline.apply(Create.of(1, 1, 2, 2, 3, 4, 4, 5, 5)); + // Apply Distinct transform + PCollection distinctNumbers = input.apply(Distinct.create()); + // [END main_section] + // Log values + distinctNumbers.apply( + ParDo.of(new LogOutput<>("PCollection numbers after Distinct.create transform: "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/FlatMapElementsExample.java b/examples/java/src/main/java/org/apache/beam/examples/FlatMapElementsExample.java new file mode 100644 index 000000000000..6dcfad0ff6a0 --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/FlatMapElementsExample.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.examples; + +import java.util.Arrays; +import java.util.List; +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +import org.apache.beam.sdk.transforms.Create; +import org.apache.beam.sdk.transforms.DoFn; +import org.apache.beam.sdk.transforms.FlatMapElements; +import org.apache.beam.sdk.transforms.InferableFunction; +import org.apache.beam.sdk.transforms.ParDo; +import org.apache.beam.sdk.values.PCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: FlatMapElements +// description: Demonstration of FlatMapElements transform usage. +// multifile: false +// default_example: false +// context_line: 50 +// categories: +// - Core Transforms +// complexity: BASIC +// tags: +// - transforms +// - pairs +// - strings +// - map + +public class FlatMapElementsExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + // [START main_section] + PCollection lines = + pipeline.apply(Create.of("the quick brown fox", "jumps over the lazy", "dog")); + // Use FlatMapElements to split the lines in PCollection into individual + // words. + PCollection words = + lines.apply( + FlatMapElements.via( + new InferableFunction>() { + @Override + public List apply(String line) { + return Arrays.asList(line.split(" ")); + } + })); + // [END main_section] + words.apply(ParDo.of(new LogOutput<>("PCollection elements after the transform: "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/GroupIntoBatchesExample.java b/examples/java/src/main/java/org/apache/beam/examples/GroupIntoBatchesExample.java new file mode 100644 index 000000000000..7e3e4639d5fe --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/GroupIntoBatchesExample.java @@ -0,0 +1,82 @@ +/* + * 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.examples; + +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +import org.apache.beam.sdk.transforms.Create; +import org.apache.beam.sdk.transforms.DoFn; +import org.apache.beam.sdk.transforms.GroupIntoBatches; +import org.apache.beam.sdk.transforms.ParDo; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.sdk.values.PCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: GroupIntoBatches +// description: Demonstration of GroupIntoBatches transform usage. +// multifile: false +// default_example: false +// context_line: 47 +// categories: +// - Core Transforms +// complexity: BASIC +// tags: +// - transforms +// - strings +// - group + +public class GroupIntoBatchesExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + // [START main_section] + // Create pairs + PCollection> pairs = + pipeline.apply( + Create.of( + KV.of("fall", "apple"), + KV.of("spring", "strawberry"), + KV.of("winter", "orange"), + KV.of("summer", "peach"), + KV.of("spring", "cherry"), + KV.of("fall", "pear"))); + // Group pairs into batches of size 2 + PCollection>> result = pairs.apply(GroupIntoBatches.ofSize(2)); + // [END main_section] + result.apply(ParDo.of(new LogOutput<>("PCollection pairs after GroupIntoBatches transform: "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/KafkaPassengerCountJson.java b/examples/java/src/main/java/org/apache/beam/examples/KafkaPassengerCountJson.java new file mode 100644 index 000000000000..20f70232ae94 --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/KafkaPassengerCountJson.java @@ -0,0 +1,174 @@ +/* + * 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.examples; + +// beam-playground: +// name: KafkaPassengerCountJson +// description: Read NYC Taxi dataset from Kafka server to count passengers for each vendor +// multifile: false +// default_example: false +// context_line: 64 +// categories: +// - Emulated Data Source +// - IO +// complexity: BASIC +// tags: +// - strings +// - emulator +// emulators: +// - type: kafka +// topic: +// id: NYCTaxi1000_simple +// source_dataset: NYCTaxi1000_simpleJson +// datasets: +// NYCTaxi1000_simpleJson: +// location: local +// format: json + +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.io.kafka.KafkaIO; +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.PipelineOptionsFactory; +import org.apache.beam.sdk.transforms.Combine; +import org.apache.beam.sdk.transforms.DoFn; +import org.apache.beam.sdk.transforms.ParDo; +import org.apache.beam.sdk.transforms.Sum; +import org.apache.beam.sdk.transforms.Values; +import org.apache.beam.sdk.values.KV; +import org.apache.kafka.common.TopicPartition; +import org.apache.kafka.common.serialization.StringDeserializer; + +public class KafkaPassengerCountJson { + + public interface KafkaStreamingOptions extends PipelineOptions { + /** + * By default, this example uses Playground's Kafka server. Set this option to different value + * to use your own Kafka server. + */ + @Description("Kafka server host") + @Default.String("kafka_server:9092") + String getKafkaHost(); + + void setKafkaHost(String value); + } + + public static void main(String[] args) { + KafkaStreamingOptions options = + PipelineOptionsFactory.fromArgs(args).withValidation().as(KafkaStreamingOptions.class); + final Pipeline p = Pipeline.create(options); + + Map consumerConfig = new HashMap<>(); + consumerConfig.put("auto.offset.reset", "earliest"); + ObjectMapper om = new ObjectMapper(); + + p.apply( + "ReadFromKafka", + KafkaIO.read() + .withBootstrapServers( + options.getKafkaHost()) // Set KafkaHost pipeline option to redefine + // default value (valid for Playground environment) + // NYCTaxi1000_simple is a small subset of NYC Taxi dataset with VendorID and + // passenger_count fields + .withTopicPartitions( + Collections.singletonList( + new TopicPartition( + "NYCTaxi1000_simple", + 0))) // Kafka topic is preloaded in Playground environment + .withKeyDeserializer(StringDeserializer.class) + .withValueDeserializer(StringDeserializer.class) + .withConsumerConfigUpdates(consumerConfig) + .withMaxNumRecords(998) + .withoutMetadata()) + .apply("CreateValues", Values.create()) + .apply( + "ExtractData", + ParDo.of( + new DoFn>() { + @ProcessElement + public void processElement(ProcessContext c) throws JsonProcessingException { + final VendorToPassengerDTO result = + om.readValue(c.element(), new TypeReference() {}); + c.output(KV.of(result.getVendorIdField(), result.getPassengerCountField())); + } + })) + .apply( + "Sum passengers per vendor", + Combine.perKey(Sum.ofIntegers())) + .apply( + "FormatResults", + ParDo.of( + new DoFn, KV>() { + @ProcessElement + public void processElement( + ProcessContext c, OutputReceiver> out) { + System.out.printf( + "Vendor: %s, Passengers: %s%n", + c.element().getKey(), c.element().getValue()); + out.output(c.element()); + } + })); + p.run().waitUntilFinish(); + } +} + +class VendorToPassengerDTO { + private Integer passengerCountField; + private Integer vendorIdField; + + public VendorToPassengerDTO(Integer passengerCount, Integer vendorId) { + + this.passengerCountField = passengerCount; + this.vendorIdField = vendorId; + } + + public VendorToPassengerDTO() { + + super(); + this.passengerCountField = 0; + this.vendorIdField = 0; + } + + public Integer getVendorIdField() { + + return this.vendorIdField; + } + + public Integer getPassengerCountField() { + + return this.passengerCountField; + } + + @JsonSetter("VendorID") + public void setVendorIdField(Integer vendorId) { + this.vendorIdField = vendorId; + } + + @JsonSetter("passenger_count") + public void setPassengerCountField(Integer passengerCount) { + this.passengerCountField = passengerCount; + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/KafkaStreaming.java b/examples/java/src/main/java/org/apache/beam/examples/KafkaStreaming.java new file mode 100644 index 000000000000..34a4b646555d --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/KafkaStreaming.java @@ -0,0 +1,320 @@ +/* + * 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.examples; + +// beam-playground: +// name: KafkaStreaming +// description: Example of streaming data processing using Kafka +// multifile: false +// context_line: 186 +// never_run: true +// always_run: true +// categories: +// - Filtering +// - Windowing +// - Streaming +// - IO +// complexity: MEDIUM +// tags: +// - strings +// - pairs +// - emulator + +import java.util.HashMap; +import java.util.Map; +import java.util.Random; +import java.util.Timer; +import java.util.TimerTask; +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.io.GenerateSequence; +import org.apache.beam.sdk.io.kafka.KafkaIO; +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.PipelineOptionsFactory; +import org.apache.beam.sdk.transforms.Combine; +import org.apache.beam.sdk.transforms.DoFn; +import org.apache.beam.sdk.transforms.ParDo; +import org.apache.beam.sdk.transforms.Sum; +import org.apache.beam.sdk.transforms.windowing.AfterProcessingTime; +import org.apache.beam.sdk.transforms.windowing.FixedWindows; +import org.apache.beam.sdk.transforms.windowing.IntervalWindow; +import org.apache.beam.sdk.transforms.windowing.PaneInfo; +import org.apache.beam.sdk.transforms.windowing.Repeatedly; +import org.apache.beam.sdk.transforms.windowing.Trigger; +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.kafka.common.serialization.IntegerDeserializer; +import org.apache.kafka.common.serialization.IntegerSerializer; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.apache.kafka.common.serialization.StringSerializer; +import org.joda.time.Duration; +import org.joda.time.Instant; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; + +public class KafkaStreaming { + + // Kafka topic name + private static final String TOPIC_NAME = "my-topic"; + + // The deadline for processing late data + private static final int ALLOWED_LATENESS_TIME = 1; + + // Delay time after the first element in window + private static final int TIME_OUTPUT_AFTER_FIRST_ELEMENT = 10; + + // The time of the window in which the elements will be processed + private static final int WINDOW_TIME = 30; + + // Number of game events to send during game window + private static final int MESSAGES_COUNT = 100; + + // List usernames + private static final String[] NAMES = {"Alice", "Bob", "Charlie", "David"}; + + private static final DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("HH:mm:ss"); + + public interface KafkaStreamingOptions extends PipelineOptions { + /** + * By default, this example uses Playground's Kafka server. Set this option to different value + * to use your own Kafka server. + */ + @Description("Kafka server host") + @Default.String("kafka_server:9092") + String getKafkaHost(); + + void setKafkaHost(String value); + } + + public static void main(String[] args) { + // FixedWindows will always start at an integer multiple of the window size counting from epoch + // start. + // To get nicer looking results we will start producing results right after the next window + // starts. + Duration windowSize = Duration.standardSeconds(WINDOW_TIME); + Instant nextWindowStart = + new Instant( + Instant.now().getMillis() + + windowSize.getMillis() + - Instant.now().plus(windowSize).getMillis() % windowSize.getMillis()); + + KafkaStreamingOptions options = + PipelineOptionsFactory.fromArgs(args).withValidation().as(KafkaStreamingOptions.class); + + Timer timer = new Timer(); + + /* + * Kafka producer which sends messages (works in background thread) + */ + KafkaProducer producer = new KafkaProducer(options); + timer.schedule(producer, nextWindowStart.toDate()); + + /* + * Kafka consumer which reads messages + */ + KafkaConsumer kafkaConsumer = new KafkaConsumer(options); + kafkaConsumer.run(); + } + + // Kafka producer + public static class KafkaProducer extends TimerTask { + private final KafkaStreamingOptions options; + + public KafkaProducer(KafkaStreamingOptions options) { + this.options = options; + } + + @Override + public void run() { + Pipeline pipeline = Pipeline.create(options); + + // Generating scores with a randomly selected names and random amount of points + PCollection> input = + pipeline + .apply( + GenerateSequence.from(0) + .withRate(MESSAGES_COUNT, Duration.standardSeconds(WINDOW_TIME)) + .withTimestampFn((Long n) -> new Instant(System.currentTimeMillis()))) + .apply(ParDo.of(new RandomUserScoreGeneratorFn())); + input.apply( + KafkaIO.write() + .withBootstrapServers(options.getKafkaHost()) + .withTopic(TOPIC_NAME) + .withKeySerializer(StringSerializer.class) + .withValueSerializer(IntegerSerializer.class) + .withProducerConfigUpdates(new HashMap<>())); + + pipeline.run().waitUntilFinish(); + } + + // A class that randomly selects a name with random amount of points + static class RandomUserScoreGeneratorFn extends DoFn> { + private static final int MAX_SCORE = 100; + + @ProcessElement + public void processElement(ProcessContext c) { + c.output(generate()); + } + + public KV generate() { + Random random = new Random(); + String randomName = NAMES[random.nextInt(NAMES.length)]; + int randomScore = random.nextInt(MAX_SCORE) + 1; + return KV.of(randomName, randomScore); + } + } + } + + // Kafka consumer + public static class KafkaConsumer { + private final KafkaStreamingOptions options; + + public KafkaConsumer(KafkaStreamingOptions options) { + this.options = options; + } + + public void run() { + Pipeline pipeline = Pipeline.create(options); + + // Create fixed window for the length of the game round + Window> window = + Window.into(FixedWindows.of(Duration.standardSeconds(WINDOW_TIME))); + + // After the first element, the trigger waits for a [TIME_OUTPUT_AFTER_FIRST_ELEMENT], after + // which the output of elements begins + Trigger trigger = + AfterProcessingTime.pastFirstElementInPane() + .plusDelayOf(Duration.standardSeconds(TIME_OUTPUT_AFTER_FIRST_ELEMENT)); + + Map consumerConfig = new HashMap<>(); + + // Start reading form Kafka with the latest offset + consumerConfig.put("auto.offset.reset", "latest"); + + PCollection> pCollection = + pipeline.apply( + KafkaIO.read() + .withBootstrapServers(options.getKafkaHost()) + .withTopic(TOPIC_NAME) + .withKeyDeserializer(StringDeserializer.class) + .withValueDeserializer(IntegerDeserializer.class) + .withConsumerConfigUpdates(consumerConfig) + .withoutMetadata()); + + pCollection + // Apply a window and a trigger ourput repeatedly. + // To prevent late data from being lost, we set [withAllowedLateness]. + // To save data after each trigger is triggered [accumulatingFiredPanes] is specified. + .apply( + window + .triggering(Repeatedly.forever(trigger)) + .withAllowedLateness(Duration.standardSeconds(ALLOWED_LATENESS_TIME)) + .accumulatingFiredPanes()) + // Sum points for each player per window + .apply(Sum.integersPerKey()) + // Combine all summed points into a single Map<> + .apply(Combine.globally(new WindowCombineFn()).withoutDefaults()) + // Output results on the console + .apply(ParDo.of(new LogResults())); + + pipeline.run().waitUntilFinish(); + System.out.println("Pipeline finished"); + } + } + + static class WindowCombineFn + extends Combine.CombineFn, Map, Map> { + @Override + public Map createAccumulator() { + return new HashMap<>(); + } + + @Override + public Map addInput( + Map mutableAccumulator, KV input) { + assert input != null; + assert mutableAccumulator != null; + mutableAccumulator.put(input.getKey(), input.getValue()); + return mutableAccumulator; + } + + @Override + public Map mergeAccumulators(Iterable> accumulators) { + Map result = new HashMap<>(); + for (Map acc : accumulators) { + for (Map.Entry kv : acc.entrySet()) { + if (result.containsKey(kv.getKey())) { + result.put(kv.getKey(), result.get(kv.getKey()) + kv.getValue()); + } else { + result.put(kv.getKey(), kv.getValue()); + } + } + } + return result; + } + + @Override + public Map extractOutput(Map accumulator) { + return accumulator; + } + } + + static class LogResults extends DoFn, Map> { + @ProcessElement + public void processElement(ProcessContext c, IntervalWindow w) throws Exception { + Map map = c.element(); + if (map == null) { + c.output(c.element()); + return; + } + + String startTime = w.start().toString(dateTimeFormatter); + String endTime = w.end().toString(dateTimeFormatter); + + PaneInfo.Timing timing = c.pane().getTiming(); + + switch (timing) { + case EARLY: + System.out.println("Live score (running sum) for the current round:"); + break; + case ON_TIME: + System.out.println("Final score for the current round:"); + break; + case LATE: + System.out.printf("Late score for the round from %s to %s:%n", startTime, endTime); + break; + default: + throw new RuntimeException("Unknown timing value"); + } + + for (Map.Entry entry : map.entrySet()) { + System.out.printf("%10s: %-10s%n", entry.getKey(), entry.getValue()); + } + + if (timing == PaneInfo.Timing.ON_TIME) { + System.out.printf("======= End of round from %s to %s =======%n%n", startTime, endTime); + } else { + System.out.println(); + } + + c.output(c.element()); + } + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/KafkaWordCountAvro.java b/examples/java/src/main/java/org/apache/beam/examples/KafkaWordCountAvro.java index 0379ef10de0c..9e2da248017d 100644 --- a/examples/java/src/main/java/org/apache/beam/examples/KafkaWordCountAvro.java +++ b/examples/java/src/main/java/org/apache/beam/examples/KafkaWordCountAvro.java @@ -19,22 +19,20 @@ // beam-playground: // name: KafkaWordCountAvro -// description: Test example with Apache Kafka +// description: Read CountWords dataset (CountWords.avro) from Kafka to count words // multifile: false -// context_line: 55 +// context_line: 64 // categories: -// - Filtering -// - Options -// - Quickstart +// - Emulated Data Source +// - IO // complexity: MEDIUM // tags: -// - filter // - strings // - emulator // emulators: // - type: kafka // topic: -// id: dataset +// id: CountWords // source_dataset: CountWordsAvro // datasets: // CountWordsAvro: @@ -47,6 +45,8 @@ import org.apache.beam.sdk.Pipeline; import org.apache.beam.sdk.io.TextIO; import org.apache.beam.sdk.io.kafka.KafkaIO; +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.PipelineOptionsFactory; import org.apache.beam.sdk.transforms.Count; @@ -63,8 +63,21 @@ public class KafkaWordCountAvro { static final String TOKENIZER_PATTERN = "[^\\p{L}]+"; // Java pattern for letters + public interface KafkaStreamingOptions extends PipelineOptions { + /** + * By default, this example uses Playground's Kafka server. Set this option to different value + * to use your own Kafka server. + */ + @Description("Kafka server host") + @Default.String("kafka_server:9092") + String getKafkaHost(); + + void setKafkaHost(String value); + } + public static void main(String[] args) { - final PipelineOptions options = PipelineOptionsFactory.create(); + KafkaStreamingOptions options = + PipelineOptionsFactory.fromArgs(args).withValidation().as(KafkaStreamingOptions.class); final Pipeline p = Pipeline.create(options); final Map consumerConfig = new HashMap<>(); @@ -73,16 +86,12 @@ public static void main(String[] args) { p.apply( KafkaIO.read() .withBootstrapServers( - "kafka_server:9092") // The argument is hardcoded to a predefined value. Do not - // change it manually. It's replaced to the correct Kafka cluster address when code - // starts in backend. + options.getKafkaHost()) // Set KafkaHost pipeline option to redefine + // default value (valid for Playground environment) .withTopicPartitions( Collections.singletonList( new TopicPartition( - "dataset", - 0))) // The argument is hardcoded to a predefined value. Do not - // change it manually. It's replaced to the correct topic name when code starts in - // backend. + "CountWords", 0))) // Kafka topic is preloaded in Playground environment .withKeyDeserializer(LongDeserializer.class) .withValueDeserializer(StringDeserializer.class) .withConsumerConfigUpdates(consumerConfig) diff --git a/examples/java/src/main/java/org/apache/beam/examples/KafkaWordCountJson.java b/examples/java/src/main/java/org/apache/beam/examples/KafkaWordCountJson.java index 545354810c92..355614b43869 100644 --- a/examples/java/src/main/java/org/apache/beam/examples/KafkaWordCountJson.java +++ b/examples/java/src/main/java/org/apache/beam/examples/KafkaWordCountJson.java @@ -19,22 +19,21 @@ // beam-playground: // name: KafkaWordCountJson -// description: Test example with Apache Kafka +// description: Read CountWords dataset (CountWords.json) from Kafka to count words // multifile: false -// context_line: 55 +// context_line: 65 // categories: -// - Filtering -// - Options +// - Emulated Data Source +// - IO // - Quickstart // complexity: MEDIUM // tags: -// - filter // - strings // - emulator // emulators: // - type: kafka // topic: -// id: dataset +// id: CountWords // source_dataset: CountWordsJson // datasets: // CountWordsJson: @@ -47,6 +46,8 @@ import org.apache.beam.sdk.Pipeline; import org.apache.beam.sdk.io.TextIO; import org.apache.beam.sdk.io.kafka.KafkaIO; +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.PipelineOptionsFactory; import org.apache.beam.sdk.transforms.Count; @@ -63,8 +64,21 @@ public class KafkaWordCountJson { static final String TOKENIZER_PATTERN = "[^\\p{L}]+"; // Java pattern for letters + public interface KafkaStreamingOptions extends PipelineOptions { + /** + * By default, this example uses Playground's Kafka server. Set this option to different value + * to use your own Kafka server. + */ + @Description("Kafka server host") + @Default.String("kafka_server:9092") + String getKafkaHost(); + + void setKafkaHost(String value); + } + public static void main(String[] args) { - final PipelineOptions options = PipelineOptionsFactory.create(); + KafkaStreamingOptions options = + PipelineOptionsFactory.fromArgs(args).withValidation().as(KafkaStreamingOptions.class); final Pipeline p = Pipeline.create(options); final Map consumerConfig = new HashMap<>(); @@ -73,16 +87,12 @@ public static void main(String[] args) { p.apply( KafkaIO.read() .withBootstrapServers( - "kafka_server:9092") // The argument is hardcoded to a predefined value. Do not - // change it manually. It's replaced to the correct Kafka cluster address when code - // starts in backend. + options.getKafkaHost()) // Set KafkaHost pipeline option to redefine + // default value (valid for Playground environment) .withTopicPartitions( Collections.singletonList( new TopicPartition( - "dataset", - 0))) // The argument is hardcoded to a predefined value. Do not - // change it manually. It's replaced to the correct topic name when code starts in - // backend. + "CountWords", 0))) // Kafka topic is preloaded in Playground environment .withKeyDeserializer(LongDeserializer.class) .withValueDeserializer(StringDeserializer.class) .withConsumerConfigUpdates(consumerConfig) diff --git a/examples/java/src/main/java/org/apache/beam/examples/KeysExample.java b/examples/java/src/main/java/org/apache/beam/examples/KeysExample.java new file mode 100644 index 000000000000..d851b1e8524b --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/KeysExample.java @@ -0,0 +1,78 @@ +/* + * 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.examples; + +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +import org.apache.beam.sdk.transforms.Create; +import org.apache.beam.sdk.transforms.DoFn; +import org.apache.beam.sdk.transforms.Keys; +import org.apache.beam.sdk.transforms.ParDo; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.sdk.values.PCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: Keys +// description: Demonstration of Keys transform usage. +// multifile: false +// default_example: false +// context_line: 46 +// categories: +// - Core Transforms +// complexity: BASIC +// tags: +// - transforms +// - pairs + +public class KeysExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + // [START main_section] + // Create key/value pairs + PCollection> pairs = + pipeline.apply( + Create.of(KV.of("one", 1), KV.of("two", 2), KV.of("three", 3), KV.of("four", 4))); + // Returns only the values of the collection: PCollection> -> + // PCollection + PCollection valuesOnly = pairs.apply(Keys.create()); + // [END main_section] + pairs.apply(ParDo.of(new LogOutput<>("PCollection element before Values.create transform: "))); + valuesOnly.apply( + ParDo.of(new LogOutput<>("PCollection element after Values.create transform: "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/KvSwapExample.java b/examples/java/src/main/java/org/apache/beam/examples/KvSwapExample.java new file mode 100644 index 000000000000..1b0fd2f7b520 --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/KvSwapExample.java @@ -0,0 +1,77 @@ +/* + * 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.examples; + +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +import org.apache.beam.sdk.transforms.Create; +import org.apache.beam.sdk.transforms.DoFn; +import org.apache.beam.sdk.transforms.KvSwap; +import org.apache.beam.sdk.transforms.ParDo; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.sdk.values.PCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: KvSwap +// description: Demonstration of KvSwap transform usage. +// multifile: false +// default_example: false +// context_line: 46 +// categories: +// - Core Transforms +// complexity: BASIC +// tags: +// - transforms +// - pairs + +public class KvSwapExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + // [START main_section] + // Create key/value pairs + PCollection> pairs = + pipeline.apply( + Create.of(KV.of("one", 1), KV.of("two", 2), KV.of("three", 3), KV.of("four", 4))); + // Returns KV collection with keys and values swapped: PCollection> -> + // PCollection> + PCollection> swap = pairs.apply(KvSwap.create()); + // [END main_section] + pairs.apply(ParDo.of(new LogOutput<>("PCollection element before KvSwap transform: "))); + swap.apply(ParDo.of(new LogOutput<>("PCollection element after KvSwap transform: "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/LatestExample.java b/examples/java/src/main/java/org/apache/beam/examples/LatestExample.java new file mode 100644 index 000000000000..7b214ff92b39 --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/LatestExample.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.examples; + +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +import org.apache.beam.sdk.transforms.Create; +import org.apache.beam.sdk.transforms.DoFn; +import org.apache.beam.sdk.transforms.Latest; +import org.apache.beam.sdk.transforms.ParDo; +import org.apache.beam.sdk.transforms.WithTimestamps; +import org.apache.beam.sdk.values.PCollection; +import org.joda.time.Duration; +import org.joda.time.Instant; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: Latest +// description: Demonstration of Latest transform usage. +// multifile: false +// default_example: false +// context_line: 49 +// categories: +// - Core Transforms +// complexity: BASIC +// tags: +// - transforms +// - timestamps +// - latest + +public class LatestExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + + // [START main_section] + Instant baseInstant = Instant.now().minus(Duration.standardSeconds(10)); + + // Create collection + PCollection numbers = pipeline.apply(Create.of(5, 4, 3, 2, 1)); + + // Add Timestamps for elements based on elements values. Largest element will be + // the latest. + PCollection withTimestamps = + numbers.apply( + WithTimestamps.of(duration -> baseInstant.plus(Duration.standardSeconds(duration)))); + + // Get the latest element from collection without timestamps. It will vary from + // run to run + PCollection latest = numbers.apply(Latest.globally()); + + // Get the latest element from collection with timestamps. Should always be 5 + PCollection latestTimestamped = withTimestamps.apply(Latest.globally()); + // [END main_section] + + latest.apply(ParDo.of(new LogOutput<>("Latest element (without timestamps): "))); + latestTimestamped.apply(ParDo.of(new LogOutput<>("Latest element (with timestamps): "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/MapElementsExample.java b/examples/java/src/main/java/org/apache/beam/examples/MapElementsExample.java new file mode 100644 index 000000000000..ff5a52c1b10d --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/MapElementsExample.java @@ -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. + */ +package org.apache.beam.examples; + +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +import org.apache.beam.sdk.transforms.Create; +import org.apache.beam.sdk.transforms.DoFn; +import org.apache.beam.sdk.transforms.MapElements; +import org.apache.beam.sdk.transforms.ParDo; +import org.apache.beam.sdk.transforms.SimpleFunction; +import org.apache.beam.sdk.values.PCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: MapElements +// description: Demonstration of MapElements transform usage. +// multifile: false +// default_example: false +// context_line: 47 +// categories: +// - Core Transforms +// complexity: BASIC +// tags: +// - transforms +// - strings +// - map + +public class MapElementsExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + // [START main_section] + // Create collection of lowercase string + PCollection strings = pipeline.apply(Create.of("one", "two", "three", "four")); + // Transform strings to upper case + PCollection upperCaseStrings = + strings.apply( + MapElements.via( + new SimpleFunction() { + @Override + public String apply(String s) { + return s.toUpperCase(); + } + })); + // [END main_section] + strings.apply(ParDo.of(new LogOutput<>("PCollection element before MapElements transform: "))); + upperCaseStrings.apply( + ParDo.of(new LogOutput<>("PCollection element after MapElements transform: "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/MaxExample.java b/examples/java/src/main/java/org/apache/beam/examples/MaxExample.java new file mode 100644 index 000000000000..95c27592eeb5 --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/MaxExample.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.examples; + +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +import org.apache.beam.sdk.transforms.Create; +import org.apache.beam.sdk.transforms.DoFn; +import org.apache.beam.sdk.transforms.Max; +import org.apache.beam.sdk.transforms.ParDo; +import org.apache.beam.sdk.values.PCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: Max +// description: Demonstration of Max transform usage. +// multifile: false +// default_example: false +// context_line: 45 +// categories: +// - Core Transforms +// complexity: BASIC +// tags: +// - transforms +// - numbers + +public class MaxExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + // [START main_section] + PCollection pc = pipeline.apply(Create.of(1.0, 2.0, 3.0, 4.0, 5.0)); + PCollection max = pc.apply(Max.globally()); + // [END main_section] + // Log values + max.apply(ParDo.of(new LogOutput<>("PCollection numbers after Max transform: "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/MaxPerKeyExample.java b/examples/java/src/main/java/org/apache/beam/examples/MaxPerKeyExample.java new file mode 100644 index 000000000000..8a0b599c7502 --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/MaxPerKeyExample.java @@ -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 org.apache.beam.examples; + +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +import org.apache.beam.sdk.transforms.Create; +import org.apache.beam.sdk.transforms.DoFn; +import org.apache.beam.sdk.transforms.Max; +import org.apache.beam.sdk.transforms.ParDo; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.sdk.values.PCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: MaxPerKey +// description: Demonstration of Max.perKey transform usage. +// multifile: false +// default_example: false +// context_line: 47 +// categories: +// - Core Transforms +// complexity: BASIC +// tags: +// - transforms +// - numbers +// - pairs + +public class MaxPerKeyExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + // [START main_section] + PCollection> input = + pipeline.apply( + Create.of(KV.of("a", 1), KV.of("a", 2), KV.of("b", 3), KV.of("b", 4), KV.of("b", 5))); + PCollection> maxPerKey = input.apply(Max.perKey()); + // [END main_section] + // Log values + maxPerKey.apply(ParDo.of(new LogOutput<>("PCollection numbers after Max transform: "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/MeanExample.java b/examples/java/src/main/java/org/apache/beam/examples/MeanExample.java new file mode 100644 index 000000000000..1084bf6fb809 --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/MeanExample.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.examples; + +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +import org.apache.beam.sdk.transforms.Create; +import org.apache.beam.sdk.transforms.DoFn; +import org.apache.beam.sdk.transforms.Mean; +import org.apache.beam.sdk.transforms.ParDo; +import org.apache.beam.sdk.values.PCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: Mean +// description: Demonstration of Mean transform usage. +// multifile: false +// default_example: false +// context_line: 45 +// categories: +// - Core Transforms +// complexity: BASIC +// tags: +// - transforms +// - numbers + +public class MeanExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + // [START main_section] + PCollection pc = pipeline.apply(Create.of(1.0, 2.0, 3.0, 4.0, 5.0)); + PCollection mean = pc.apply(Mean.globally()); + // [END main_section] + // Log values + mean.apply(ParDo.of(new LogOutput<>("PCollection numbers after Mean transform: "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/MeanPerKeyExample.java b/examples/java/src/main/java/org/apache/beam/examples/MeanPerKeyExample.java new file mode 100644 index 000000000000..6b853d599b5d --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/MeanPerKeyExample.java @@ -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 org.apache.beam.examples; + +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +import org.apache.beam.sdk.transforms.Create; +import org.apache.beam.sdk.transforms.DoFn; +import org.apache.beam.sdk.transforms.Mean; +import org.apache.beam.sdk.transforms.ParDo; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.sdk.values.PCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: MeanPerKey +// description: Demonstration of Mean.perKey transform usage. +// multifile: false +// default_example: false +// context_line: 47 +// categories: +// - Core Transforms +// complexity: BASIC +// tags: +// - transforms +// - numbers +// - pairs + +public class MeanPerKeyExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + // [START main_section] + PCollection> input = + pipeline.apply( + Create.of(KV.of("a", 1), KV.of("a", 2), KV.of("b", 3), KV.of("b", 4), KV.of("b", 5))); + PCollection> meanPerKey = input.apply(Mean.perKey()); + // [END main_section] + // Log values + meanPerKey.apply(ParDo.of(new LogOutput<>("PCollection numbers after Mean transform: "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/MinExample.java b/examples/java/src/main/java/org/apache/beam/examples/MinExample.java new file mode 100644 index 000000000000..f9fce309c0cb --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/MinExample.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.examples; + +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +import org.apache.beam.sdk.transforms.Create; +import org.apache.beam.sdk.transforms.DoFn; +import org.apache.beam.sdk.transforms.Min; +import org.apache.beam.sdk.transforms.ParDo; +import org.apache.beam.sdk.values.PCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: Min +// description: Demonstration of Min transform usage. +// multifile: false +// default_example: false +// context_line: 45 +// categories: +// - Core Transforms +// complexity: BASIC +// tags: +// - transforms +// - numbers + +public class MinExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + // [START main_section] + PCollection pc = pipeline.apply(Create.of(1.0, 2.0, 3.0, 4.0, 5.0)); + PCollection min = pc.apply(Min.globally()); + // [END main_section] + // Log values + min.apply(ParDo.of(new LogOutput<>("PCollection numbers after Min transform: "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/MinPerKeyExample.java b/examples/java/src/main/java/org/apache/beam/examples/MinPerKeyExample.java new file mode 100644 index 000000000000..6861e5e49465 --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/MinPerKeyExample.java @@ -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 org.apache.beam.examples; + +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +import org.apache.beam.sdk.transforms.Create; +import org.apache.beam.sdk.transforms.DoFn; +import org.apache.beam.sdk.transforms.Min; +import org.apache.beam.sdk.transforms.ParDo; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.sdk.values.PCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: MinPerKey +// description: Demonstration of Min.perKey transform usage. +// multifile: false +// default_example: false +// context_line: 47 +// categories: +// - Core Transforms +// complexity: BASIC +// tags: +// - transforms +// - numbers +// - pairs + +public class MinPerKeyExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + // [START main_section] + PCollection> input = + pipeline.apply( + Create.of(KV.of("a", 1), KV.of("a", 2), KV.of("b", 3), KV.of("b", 4), KV.of("b", 5))); + PCollection> minPerKey = input.apply(Min.perKey()); + // [END main_section] + // Log values + minPerKey.apply(ParDo.of(new LogOutput<>("PCollection numbers after Min transform: "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/MinimalWordCount.java b/examples/java/src/main/java/org/apache/beam/examples/MinimalWordCount.java index 35f34768bee3..d7c03f5ef1fc 100644 --- a/examples/java/src/main/java/org/apache/beam/examples/MinimalWordCount.java +++ b/examples/java/src/main/java/org/apache/beam/examples/MinimalWordCount.java @@ -22,7 +22,7 @@ // description: An example that counts words in Shakespeare's works. // multifile: false // default_example: true -// context_line: 71 +// context_line: 78 // categories: // - Combiners // - Filtering @@ -77,11 +77,13 @@ public class MinimalWordCount { public static void main(String[] args) { + // [START create_pipeline_options] // Create a PipelineOptions object. This object lets us set various execution // options for our pipeline, such as the runner you wish to use. This example // will run with the DirectRunner by default, based on the class path configured // in its dependencies. PipelineOptions options = PipelineOptionsFactory.create(); + // [END create_pipeline_options] // In order to run your pipeline, you need to make following runner specific changes: // @@ -98,42 +100,62 @@ public static void main(String[] args) { // options.as(FlinkPipelineOptions.class) // .setRunner(FlinkRunner.class); + // [START create_pipeline] // Create the Pipeline object with the options we defined above Pipeline p = Pipeline.create(options); + // [END create_pipeline] // Concept #1: Apply a root transform to the pipeline; in this case, TextIO.Read to read a set // of input text files. TextIO.Read returns a PCollection where each element is one line from // the input text (a set of Shakespeare's texts). // This example reads from a public dataset containing the text of King Lear. + // [START read_input] p.apply(TextIO.read().from("gs://apache-beam-samples/shakespeare/kinglear.txt")) + // [END read_input] // Concept #2: Apply a FlatMapElements transform the PCollection of text lines. // This transform splits the lines in PCollection, where each element is an // individual word in Shakespeare's collected texts. + // [START extract_words] .apply( FlatMapElements.into(TypeDescriptors.strings()) .via((String line) -> Arrays.asList(line.split("[^\\p{L}]+")))) + // [END extract_words] + // We use a Filter transform to avoid empty word + // [START remove_empty_words] .apply(Filter.by((String word) -> !word.isEmpty())) + // [END remove_empty_words] + // Concept #3: Apply the Count transform to our PCollection of individual words. The Count // transform returns a new PCollection of key/value pairs, where each key represents a // unique word in the text. The associated value is the occurrence count for that word. + // [START count_words] .apply(Count.perElement()) + // [END count_words] + // Apply a MapElements transform that formats our PCollection of word counts into a // printable string, suitable for writing to an output file. + // [START format_output] .apply( MapElements.into(TypeDescriptors.strings()) .via( (KV wordCount) -> wordCount.getKey() + ": " + wordCount.getValue())) + // [END format_output] + // Concept #4: Apply a write transform, TextIO.Write, at the end of the pipeline. // TextIO.Write writes the contents of a PCollection (in this case, our PCollection of // formatted strings) to a series of text files. // // By default, it will write to a set of files with names like wordcounts-00001-of-00005 + // [START write_output] .apply(TextIO.write().to("wordcounts")); + // [END write_output] + // [START run_pipeline] p.run().waitUntilFinish(); + // [END run_pipeline] } } diff --git a/examples/java/src/main/java/org/apache/beam/examples/PartitionExample.java b/examples/java/src/main/java/org/apache/beam/examples/PartitionExample.java new file mode 100644 index 000000000000..51e44daf5ae7 --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/PartitionExample.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.examples; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.List; +import org.apache.beam.sdk.Pipeline; +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.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +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.Partition; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.PCollectionList; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: PartitionPercentile +// description: Demonstration of Partition transform usage. +// multifile: false +// default_example: false +// context_line: 58 +// categories: +// - Core Transforms +// - Coders +// complexity: MEDIUM +// tags: +// - transforms +// - partitions +// - coders + +public class PartitionExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + + CoderProvider coderProvider = + CoderProviders.fromStaticMethods(Student.class, StudentCoder.class); + pipeline.getCoderRegistry().registerCoderProvider(coderProvider); + // [START main_section] + // Provide an int value with the desired number of result partitions, and a + // PartitionFn that represents the + // partitioning function. In this example, we define the PartitionFn in-line. + // Returns a PCollectionList + // containing each of the resulting partitions as individual PCollection + // objects. + PCollection students = + pipeline.apply( + Create.of( + Student.of("Amy", 88), + Student.of("Bob", 87), + Student.of("Chris", 49), + Student.of("Dylan", 62), + Student.of("Ellen", 78), + Student.of("Francis", 53), + Student.of("Gagan", 43), + Student.of("Holly", 59), + Student.of("Irene", 22), + Student.of("Jack", 19), + Student.of("Kelly", 74), + Student.of("Loris", 43), + Student.of("Megan", 13), + Student.of("Nemo", 97), + Student.of("Omar", 50), + Student.of("Patty", 58), + Student.of("Qi", 31), + Student.of("Raj", 40), + Student.of("Sandy", 20), + Student.of("Tina", 0), + Student.of("Uma", 97), + Student.of("Vicky", 41), + Student.of("Wendy", 62), + Student.of("Xin", 59), + Student.of("Yvonne", 57), + Student.of("Zane", 89))); + // Split students up into 10 partitions, by percentile: + PCollectionList studentsByPercentile = + students.apply( + Partition.of( + 10, + new Partition.PartitionFn() { + @Override + public int partitionFor(Student student, int numPartitions) { + return student.getPercentile() // 0..99 + * numPartitions + / 100; + } + })); + + // You can extract each partition from the PCollectionList using the get method, + // as follows: + PCollection fortiethPercentile = studentsByPercentile.get(4); + // [END main_section] + fortiethPercentile.apply(ParDo.of(new LogOutput<>("Fortieth percentile: "))); + pipeline.run(); + } + + static class Student { + private Student() {} + + private String name = ""; + private int percentile; + + public String getName() { + return name; + } + + public int getPercentile() { + return percentile; + } + + public static Student of(String name, int percentile) { + Student student = new Student(); + student.name = name; + student.percentile = percentile; + return student; + } + + @Override + public String toString() { + return name + " (" + percentile + ")"; + } + } + + static class StudentCoder extends Coder { + public static StudentCoder of() { + return new StudentCoder(); + } + + @Override + public void encode(Student student, OutputStream outStream) throws IOException { + String serializableStudent = student.getName() + "," + student.getPercentile(); + outStream.write(serializableStudent.getBytes(StandardCharsets.UTF_8)); + } + + @Override + public Student decode(InputStream inStream) throws IOException { + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + + int nRead; + byte[] data = new byte[1024]; + + while ((nRead = inStream.read(data, 0, data.length)) != -1) { + buffer.write(data, 0, nRead); + } + + String serializableStudent = buffer.toString(StandardCharsets.UTF_8.name()); + String[] fields = serializableStudent.split(",", -1); + return Student.of(fields[0], Integer.parseInt(fields[1])); + } + + @Override + public List> getCoderArguments() { + return Collections.emptyList(); + } + + @Override + public void verifyDeterministic() {} + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/RegexExample.java b/examples/java/src/main/java/org/apache/beam/examples/RegexExample.java new file mode 100644 index 000000000000..e5ee02224697 --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/RegexExample.java @@ -0,0 +1,83 @@ +/* + * 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.examples; + +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +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.Regex; +import org.apache.beam.sdk.values.PCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: Regex +// description: Demonstration of Regex transform usage. +// multifile: false +// default_example: false +// context_line: 46 +// categories: +// - Core Transforms +// complexity: BASIC +// tags: +// - transforms +// - strings +// - regex + +public class RegexExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + // [START main_section] + // Create a collection with strings + PCollection emails = + pipeline.apply( + Create.of( + "johndoe@gmail.com", + "sarahsmith@yahoo.com", + "mikebrown@outlook.com", + "amandajohnson", + "davidlee", + "emilyrodriguez")); + + // Take only strings which match the email regex + PCollection result = + emails.apply(Regex.matches("([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6})")); + // [END main_section] + result.apply(ParDo.of(new LogOutput<>("PCollection after Regex transform: "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/SampleExample.java b/examples/java/src/main/java/org/apache/beam/examples/SampleExample.java new file mode 100644 index 000000000000..5d920a3851d4 --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/SampleExample.java @@ -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. + */ +package org.apache.beam.examples; + +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +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.Sample; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.sdk.values.PCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: Sample +// description: Demonstration of Sample transform usage. +// multifile: false +// default_example: false +// context_line: 47 +// categories: +// - Core Transforms +// complexity: BASIC +// tags: +// - transforms +// - pairs +// - group + +public class SampleExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + // [START main_section] + // Create pairs + PCollection> pairs = + pipeline.apply( + Create.of( + KV.of("fall", "apple"), + KV.of("spring", "strawberry"), + KV.of("winter", "orange"), + KV.of("summer", "peach"), + KV.of("spring", "cherry"), + KV.of("fall", "pear"))); + // We use Sample.fixedSizePerKey() to get fixed-size random samples for each + // unique key in a PCollection of key-values. + PCollection>> result = pairs.apply(Sample.fixedSizePerKey(2)); + // [END main_section] + result.apply( + ParDo.of(new LogOutput<>("PCollection pairs after Sample.fixedSizePerKey transform: "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/SumExample.java b/examples/java/src/main/java/org/apache/beam/examples/SumExample.java new file mode 100644 index 000000000000..b52557fddbda --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/SumExample.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.examples; + +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +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.Sum; +import org.apache.beam.sdk.values.PCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: Sum +// description: Demonstration of Sum transform usage. +// multifile: false +// default_example: false +// context_line: 45 +// categories: +// - Core Transforms +// complexity: BASIC +// tags: +// - transforms +// - numbers + +public class SumExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + // [START main_section] + PCollection pc = pipeline.apply(Create.of(1.0, 2.0, 3.0, 4.0, 5.0)); + PCollection sum = pc.apply(Sum.doublesGlobally()); + // [END main_section] + // Log values + sum.apply(ParDo.of(new LogOutput<>("PCollection numbers after Sum transform: "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/SumPerKeyExample.java b/examples/java/src/main/java/org/apache/beam/examples/SumPerKeyExample.java new file mode 100644 index 000000000000..e3a312314017 --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/SumPerKeyExample.java @@ -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 org.apache.beam.examples; + +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +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.Sum; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.sdk.values.PCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: SumPerKey +// description: Demonstration of Sum.integersPerKey transform usage. +// multifile: false +// default_example: false +// context_line: 47 +// categories: +// - Core Transforms +// complexity: BASIC +// tags: +// - transforms +// - numbers +// - pairs + +public class SumPerKeyExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + // [START main_section] + PCollection> input = + pipeline.apply( + Create.of(KV.of("a", 1), KV.of("a", 2), KV.of("b", 3), KV.of("b", 4), KV.of("b", 5))); + PCollection> sumPerKey = input.apply(Sum.integersPerKey()); + // [END main_section] + // Log values + sumPerKey.apply(ParDo.of(new LogOutput<>("PCollection numbers after Sum transform: "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/ToStringExample.java b/examples/java/src/main/java/org/apache/beam/examples/ToStringExample.java new file mode 100644 index 000000000000..276f1754fbb3 --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/ToStringExample.java @@ -0,0 +1,82 @@ +/* + * 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.examples; + +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +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.ToString; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.sdk.values.PCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: ToString +// description: Demonstration of ToString transform usage. +// multifile: false +// default_example: false +// context_line: 46 +// categories: +// - Core Transforms +// complexity: BASIC +// tags: +// - transforms +// - pairs + +public class ToStringExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + // [START main_section] + // Create key-value pairs + PCollection> pairs = + pipeline.apply( + Create.of( + KV.of("fall", "apple"), + KV.of("spring", "strawberry"), + KV.of("winter", "orange"), + KV.of("summer", "peach"), + KV.of("spring", "cherry"), + KV.of("fall", "pear"))); + // Use ToString on key-value pairs + PCollection result = pairs.apply(ToString.kvs()); + // [END main_section] + result.apply( + ParDo.of(new LogOutput<>("PCollection key-value pairs after ToString transform: "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/TopExample.java b/examples/java/src/main/java/org/apache/beam/examples/TopExample.java new file mode 100644 index 000000000000..6be6bca68086 --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/TopExample.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.examples; + +import java.util.List; +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +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.Top; +import org.apache.beam.sdk.values.PCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: Top +// description: Demonstration of Top transform usage. +// multifile: false +// default_example: false +// context_line: 46 +// categories: +// - Core Transforms +// complexity: BASIC +// tags: +// - transforms +// - numbers + +public class TopExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + // [START main_section] + // Create numbers + PCollection input = pipeline.apply(Create.of(1, 2, 3, 4, 5, 6)); + PCollection> result = input.apply(Top.largest(3)); + // [END main_section] + result.apply(ParDo.of(new LogOutput<>("Three largest numbers: "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/ValuesExample.java b/examples/java/src/main/java/org/apache/beam/examples/ValuesExample.java new file mode 100644 index 000000000000..2b5ecd3aa3be --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/ValuesExample.java @@ -0,0 +1,78 @@ +/* + * 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.examples; + +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +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.Values; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.sdk.values.PCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: Values +// description: Demonstration of Values transform usage. +// multifile: false +// default_example: false +// context_line: 46 +// categories: +// - Core Transforms +// complexity: BASIC +// tags: +// - transforms +// - pairs + +public class ValuesExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + // [START main_section] + // Create key/value pairs + PCollection> pairs = + pipeline.apply( + Create.of(KV.of("one", 1), KV.of("two", 2), KV.of("three", 3), KV.of("four", 4))); + // Returns only the values of the collection: PCollection> -> + // PCollection + PCollection valuesOnly = pairs.apply(Values.create()); + // [END main_section] + pairs.apply(ParDo.of(new LogOutput<>("PCollection element before Values.create transform: "))); + valuesOnly.apply( + ParDo.of(new LogOutput<>("PCollection element after Values.create transform: "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/ViewExample.java b/examples/java/src/main/java/org/apache/beam/examples/ViewExample.java new file mode 100644 index 000000000000..2c44eff3b4e3 --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/ViewExample.java @@ -0,0 +1,120 @@ +/* + * 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.examples; + +import java.util.Map; +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +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.View; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.PCollectionView; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: View +// description: Demonstration of View transform usage. +// multifile: false +// default_example: false +// context_line: 49 +// categories: +// - Core Transforms +// complexity: MEDIUM +// tags: +// - transforms +// - views +// - pairs + +public class ViewExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.fromArgs(args).create(); + Pipeline pipeline = Pipeline.create(options); + + // [START main_section] + // List of elements + PCollection> citiesToCountries = + pipeline.apply( + "Cities and Countries", + Create.of( + KV.of("Beijing", "China"), + KV.of("London", "United Kingdom"), + KV.of("San Francisco", "United States"), + KV.of("Singapore", "Singapore"), + KV.of("Sydney", "Australia"))); + + PCollectionView> citiesToCountriesView = + citiesToCountries.apply(View.asMap()); + + PCollection> persons = + pipeline.apply( + "Persons", + Create.of( + KV.of("Henry", "Singapore"), + KV.of("Jane", "San Francisco"), + KV.of("Lee", "Beijing"), + KV.of("John", "Sydney"), + KV.of("Alfred", "London"))); + + PCollection> output = + persons.apply( + ParDo.of( + new DoFn, KV>() { + // Get city from person and get from city view + @ProcessElement + public void processElement( + @Element KV person, + OutputReceiver> out, + ProcessContext context) { + Map citiesToCountries = + context.sideInput(citiesToCountriesView); + String city = person.getValue(); + String country = citiesToCountries.get(city); + if (country == null) { + country = "Unknown"; + } + out.output(KV.of(person.getKey(), country)); + } + }) + .withSideInputs(citiesToCountriesView)); + // [END main_section] + + output.apply("Log", ParDo.of(new LogOutput<>("Output: "))); + + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/WindowExample.java b/examples/java/src/main/java/org/apache/beam/examples/WindowExample.java new file mode 100644 index 000000000000..b143d5871aa6 --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/WindowExample.java @@ -0,0 +1,95 @@ +/* + * 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.examples; + +import java.util.Arrays; +import java.util.List; +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +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.windowing.FixedWindows; +import org.apache.beam.sdk.transforms.windowing.Window; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.sdk.values.PCollection; +import org.joda.time.Duration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: Window +// description: Demonstration of Window transform usage. +// multifile: false +// default_example: false +// context_line: 54 +// categories: +// - Core Transforms +// - Windowing +// complexity: BASIC +// tags: +// - transforms +// - strings +// - timestamps +// - windows + +public class WindowExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + + // [START main_section] + // Create some input data with timestamps + List inputData = Arrays.asList("foo", "bar", "foo", "foo"); + List timestamps = + Arrays.asList( + Duration.standardSeconds(15).getMillis(), + Duration.standardSeconds(30).getMillis(), + Duration.standardSeconds(45).getMillis(), + Duration.standardSeconds(90).getMillis()); + + // Create a PCollection from the input data with timestamps + PCollection items = pipeline.apply(Create.timestamped(inputData, timestamps)); + + // Create a windowed PCollection + PCollection windowedItems = + items.apply(Window.into(FixedWindows.of(Duration.standardMinutes(1)))); + + PCollection> windowedCounts = windowedItems.apply(Count.perElement()); + // [END main_section] + windowedCounts.apply(ParDo.of(new LogOutput<>("PCollection elements after Count transform: "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/examples/java/src/main/java/org/apache/beam/examples/WindowedWordCount.java b/examples/java/src/main/java/org/apache/beam/examples/WindowedWordCount.java index 4091d36a66f8..3d67f28e9f10 100644 --- a/examples/java/src/main/java/org/apache/beam/examples/WindowedWordCount.java +++ b/examples/java/src/main/java/org/apache/beam/examples/WindowedWordCount.java @@ -21,9 +21,8 @@ // name: WindowedWordCount // description: An example that counts words in text, and can run over either // unbounded or bounded input collections. -// multifile: true // pipeline_options: --output output.txt -// context_line: 103 +// context_line: 245 // categories: // - Combiners // - Options diff --git a/examples/java/src/main/java/org/apache/beam/examples/WordCount.java b/examples/java/src/main/java/org/apache/beam/examples/WordCount.java index c1b688471194..3d8e12218368 100644 --- a/examples/java/src/main/java/org/apache/beam/examples/WordCount.java +++ b/examples/java/src/main/java/org/apache/beam/examples/WordCount.java @@ -22,7 +22,7 @@ // description: An example that counts words in Shakespeare's works. // multifile: false // pipeline_options: --output output.txt -// context_line: 95 +// context_line: 204 // categories: // - Combiners // - Options @@ -103,6 +103,7 @@ public class WordCount { * statically out-of-line. This DoFn tokenizes lines of text into individual words; we pass it to * a ParDo in the pipeline. */ + // [START extract_words_fn] static class ExtractWordsFn extends DoFn { private final Counter emptyLines = Metrics.counter(ExtractWordsFn.class, "emptyLines"); private final Distribution lineLenDist = @@ -126,6 +127,7 @@ public void processElement(@Element String element, OutputReceiver recei } } } + // [END extract_words_fn] /** A SimpleFunction that converts a Word and Count into a printable string. */ public static class FormatAsTextFn extends SimpleFunction, String> { @@ -143,6 +145,7 @@ public String apply(KV input) { * Count) as a reusable PTransform subclass. Using composite transforms allows for easy reuse, * modular testing, and an improved monitoring experience. */ + // [START count_words] public static class CountWords extends PTransform, PCollection>> { @Override @@ -157,6 +160,7 @@ public PCollection> expand(PCollection lines) { return wordCounts; } } + // [END count_words] /** * Options supported by {@link WordCount}. @@ -167,6 +171,7 @@ public PCollection> expand(PCollection lines) { * *

Inherits standard configuration options. */ + // [START wordcount_options] public interface WordCountOptions extends PipelineOptions { /** @@ -186,6 +191,7 @@ public interface WordCountOptions extends PipelineOptions { void setOutput(String value); } + // [END wordcount_options] static void runWordCount(WordCountOptions options) { Pipeline p = Pipeline.create(options); diff --git a/examples/java/src/main/java/org/apache/beam/examples/complete/TfIdf.java b/examples/java/src/main/java/org/apache/beam/examples/complete/TfIdf.java index be0067ba9a67..309834a4b6c3 100644 --- a/examples/java/src/main/java/org/apache/beam/examples/complete/TfIdf.java +++ b/examples/java/src/main/java/org/apache/beam/examples/complete/TfIdf.java @@ -23,7 +23,7 @@ // GCS prefix. // multifile: true // pipeline_options: --output output.txt -// context_line: 97 +// context_line: 447 // categories: // - Combiners // - Options diff --git a/examples/java/src/main/java/org/apache/beam/examples/complete/TopWikipediaSessions.java b/examples/java/src/main/java/org/apache/beam/examples/complete/TopWikipediaSessions.java index cc75fee5c318..75d7e2febb5b 100644 --- a/examples/java/src/main/java/org/apache/beam/examples/complete/TopWikipediaSessions.java +++ b/examples/java/src/main/java/org/apache/beam/examples/complete/TopWikipediaSessions.java @@ -24,7 +24,7 @@ // each month. // multifile: true // pipeline_options: --output output.txt -// context_line: 84 +// context_line: 236 // categories: // - Combiners // - Options diff --git a/examples/java/src/main/java/org/apache/beam/examples/complete/TrafficMaxLaneFlow.java b/examples/java/src/main/java/org/apache/beam/examples/complete/TrafficMaxLaneFlow.java index d3e5144d5338..6f75e2e03d99 100644 --- a/examples/java/src/main/java/org/apache/beam/examples/complete/TrafficMaxLaneFlow.java +++ b/examples/java/src/main/java/org/apache/beam/examples/complete/TrafficMaxLaneFlow.java @@ -23,7 +23,7 @@ // window, it finds the lane that had the highest flow recorded, for each sensor station. // It writes those max values along with auxiliary info to a BigQuery table. // multifile: true -// context_line: 92 +// context_line: 402 // categories: // - Combiners // - Streaming diff --git a/examples/java/src/main/java/org/apache/beam/examples/complete/TrafficRoutes.java b/examples/java/src/main/java/org/apache/beam/examples/complete/TrafficRoutes.java index 4705d461f3c9..8a9cdcecf4ef 100644 --- a/examples/java/src/main/java/org/apache/beam/examples/complete/TrafficRoutes.java +++ b/examples/java/src/main/java/org/apache/beam/examples/complete/TrafficRoutes.java @@ -24,7 +24,7 @@ // of predefined 'routes', and looks for 'slowdowns' in those routes. It writes its // results to a BigQuery table. // multifile: true -// context_line: 97 +// context_line: 399 // categories: // - Combiners // - Streaming diff --git a/examples/java/src/main/java/org/apache/beam/examples/complete/game/injector/InjectorUtils.java b/examples/java/src/main/java/org/apache/beam/examples/complete/game/injector/InjectorUtils.java index dbefed2b7cc3..4713d15a05c2 100644 --- a/examples/java/src/main/java/org/apache/beam/examples/complete/game/injector/InjectorUtils.java +++ b/examples/java/src/main/java/org/apache/beam/examples/complete/game/injector/InjectorUtils.java @@ -47,7 +47,7 @@ public static Pubsub getClient(final HttpTransport httpTransport, final JsonFact } if (credential.getClientAuthentication() != null) { System.out.println( - "\n***Warning! You are not using service account credentials to " + "\n***Error! You are not using service account credentials to " + "authenticate.\nYou need to use service account credentials for this example," + "\nsince user-level credentials do not have enough pubsub quota,\nand so you will run " + "out of PubSub quota very quickly.\nSee " diff --git a/examples/java/src/main/java/org/apache/beam/examples/cookbook/DistinctExample.java b/examples/java/src/main/java/org/apache/beam/examples/cookbook/DistinctExample.java index 3d1025ba62e4..2876ddd81732 100644 --- a/examples/java/src/main/java/org/apache/beam/examples/cookbook/DistinctExample.java +++ b/examples/java/src/main/java/org/apache/beam/examples/cookbook/DistinctExample.java @@ -24,7 +24,7 @@ // duplicate lines across all the files. // multifile: false // pipeline_options: --output output.txt -// context_line: 65 +// context_line: 102 // categories: // - Filtering // - Options diff --git a/examples/java/src/main/java/org/apache/beam/examples/cookbook/MinimalBigQueryTornadoes.java b/examples/java/src/main/java/org/apache/beam/examples/cookbook/MinimalBigQueryTornadoes.java new file mode 100644 index 000000000000..43654ea4a05b --- /dev/null +++ b/examples/java/src/main/java/org/apache/beam/examples/cookbook/MinimalBigQueryTornadoes.java @@ -0,0 +1,142 @@ +/* + * 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.examples.cookbook; + +import com.google.api.services.bigquery.model.TableRow; +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.io.TextIO; +import org.apache.beam.sdk.io.gcp.bigquery.BigQueryIO; +import org.apache.beam.sdk.io.gcp.bigquery.BigQueryIO.TypedRead; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +import org.apache.beam.sdk.transforms.Count; +import org.apache.beam.sdk.transforms.DoFn; +import org.apache.beam.sdk.transforms.ParDo; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.Lists; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: MinimalBigQueryTornadoes +// description: An example that reads the public samples of weather data from BigQuery. +// multifile: false +// never_run: true +// always_run: true +// default_example: false +// pipeline_options: --project apache-beam-testing +// context_line: 102 +// categories: +// - Filtering +// - IO +// - Core Transforms +// complexity: BASIC +// tags: +// - filter +// - bigquery +// - strings + +/** + * An example that reads the public samples of weather data from BigQuery, counts the number of + * tornadoes that occur in each month, and writes the results to BigQuery. + * + *

Concepts: Reading/writing BigQuery; counting a PCollection; user-defined PTransforms + * + *

The BigQuery input is taken from {@code clouddataflow-readonly:samples.weather_stations} + */ +public class MinimalBigQueryTornadoes { + private static final Logger LOG = LoggerFactory.getLogger(MinimalBigQueryTornadoes.class); + + // Use a 1000 row subset of the public weather station table publicdata:samples.gsod. + private static final String WEATHER_SAMPLES_TABLE = + "clouddataflow-readonly:samples.weather_stations"; + + /** + * Examines each row in the input table. If a tornado was recorded in that sample, the month in + * which it occurred is output. + */ + static class ExtractTornadoesFn extends DoFn { + @ProcessElement + public void processElement(ProcessContext c) { + TableRow row = c.element(); + if ((Boolean) row.get("tornado")) { + c.output(Integer.parseInt((String) row.get("month"))); + } + } + } + + /** + * Prepares the data for writing to BigQuery by building a TableRow object containing an integer + * representation of month and the number of tornadoes that occurred in each month. + */ + static class FormatCountsFn extends DoFn, String> { + @ProcessElement + public void processElement(ProcessContext c) { + c.output(c.element().getKey() + ": " + c.element().getValue()); + } + } + + public static void applyBigQueryTornadoes(Pipeline p) { + TypedRead bigqueryIO = + BigQueryIO.readTableRows() + .from(WEATHER_SAMPLES_TABLE) + .withMethod(TypedRead.Method.DIRECT_READ) + .withSelectedFields(Lists.newArrayList("month", "tornado")); + + PCollection rowsFromBigQuery = p.apply(bigqueryIO); + + rowsFromBigQuery + // Extract rows which include information on tornadoes per month. + .apply(ParDo.of(new ExtractTornadoesFn())) + // Count the number of times each month appears in the data. + .apply(Count.perElement()) + // Format each month and count into a printable string. + .apply(ParDo.of(new FormatCountsFn())) + // Write the formatted results to the log. + .apply(ParDo.of(new LogOutput<>("Result: "))) + // Write the formatted results to a file. + .apply(TextIO.write().to("tornadoes")); + } + + public static void runBigQueryTornadoes(PipelineOptions options) { + Pipeline p = Pipeline.create(options); + applyBigQueryTornadoes(p); + p.run().waitUntilFinish(); + } + + public static void main(String[] args) { + PipelineOptions options = + PipelineOptionsFactory.fromArgs(args).withValidation().as(PipelineOptions.class); + runBigQueryTornadoes(options); + } + + static class LogOutput extends DoFn { + private final String prefix; + + LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/examples/java/src/test/java/org/apache/beam/examples/complete/TfIdfTest.java b/examples/java/src/test/java/org/apache/beam/examples/complete/TfIdfTest.java index 4223ce43c4de..2190f35b05ef 100644 --- a/examples/java/src/test/java/org/apache/beam/examples/complete/TfIdfTest.java +++ b/examples/java/src/test/java/org/apache/beam/examples/complete/TfIdfTest.java @@ -17,19 +17,6 @@ */ package org.apache.beam.examples.complete; -// beam-playground: -// name: TfIdfTest -// description: Unit-test for the TfIdf example. -// multifile: false -// context_line: 45 -// categories: -// - Side Input -// - Flatten -// complexity: BASIC -// tags: -// - tfidf -// - test - import java.net.URI; import java.util.Arrays; import org.apache.beam.sdk.coders.StringDelegateCoder; diff --git a/examples/java/src/test/java/org/apache/beam/examples/complete/game/GameStatsTest.java b/examples/java/src/test/java/org/apache/beam/examples/complete/game/GameStatsTest.java index 48d308f4fe44..33d3c5699477 100644 --- a/examples/java/src/test/java/org/apache/beam/examples/complete/game/GameStatsTest.java +++ b/examples/java/src/test/java/org/apache/beam/examples/complete/game/GameStatsTest.java @@ -17,19 +17,6 @@ */ package org.apache.beam.examples.complete.game; -// beam-playground: -// name: GameStatsTest -// description: Unit-test for the GameStats example. -// multifile: false -// context_line: 51 -// categories: -// - Testing -// - Filtering -// complexity: BASIC -// tags: -// - tfidf -// - test - import java.io.Serializable; import java.util.Arrays; import java.util.List; diff --git a/examples/java/src/test/java/org/apache/beam/examples/cookbook/DistinctExampleTest.java b/examples/java/src/test/java/org/apache/beam/examples/cookbook/DistinctExampleTest.java index 8e5b139b5340..988a492ad4a9 100644 --- a/examples/java/src/test/java/org/apache/beam/examples/cookbook/DistinctExampleTest.java +++ b/examples/java/src/test/java/org/apache/beam/examples/cookbook/DistinctExampleTest.java @@ -17,19 +17,6 @@ */ package org.apache.beam.examples.cookbook; -// beam-playground: -// name: DistinctExampleTest -// description: Unit-test for the DistinctExample example. -// multifile: false -// context_line: 45 -// categories: -// - Core Transforms -// - Filtering -// complexity: BASIC -// tags: -// - distinct -// - test - import java.util.Arrays; import java.util.List; import org.apache.beam.sdk.coders.StringUtf8Coder; diff --git a/examples/java/src/test/java/org/apache/beam/examples/cookbook/MinimalBigQueryTornadoesTest.java b/examples/java/src/test/java/org/apache/beam/examples/cookbook/MinimalBigQueryTornadoesTest.java new file mode 100644 index 000000000000..6591f03adb37 --- /dev/null +++ b/examples/java/src/test/java/org/apache/beam/examples/cookbook/MinimalBigQueryTornadoesTest.java @@ -0,0 +1,82 @@ +/* + * 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.examples.cookbook; + +import com.google.api.services.bigquery.model.TableRow; +import org.apache.beam.examples.cookbook.MinimalBigQueryTornadoes.ExtractTornadoesFn; +import org.apache.beam.examples.cookbook.MinimalBigQueryTornadoes.FormatCountsFn; +import org.apache.beam.sdk.testing.PAssert; +import org.apache.beam.sdk.testing.TestPipeline; +import org.apache.beam.sdk.testing.ValidatesRunner; +import org.apache.beam.sdk.transforms.Create; +import org.apache.beam.sdk.transforms.ParDo; +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; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** Test case for {@link MinimalBigQueryTornadoes}. */ +@RunWith(JUnit4.class) +public class MinimalBigQueryTornadoesTest { + @Rule public TestPipeline p = TestPipeline.create(); + + @Test + @Category(ValidatesRunner.class) + public void testExtractTornadoes() { + TableRow row = new TableRow().set("month", "6").set("tornado", true); + PCollection input = p.apply(Create.of(ImmutableList.of(row))); + PCollection result = input.apply(ParDo.of(new ExtractTornadoesFn())); + PAssert.that(result).containsInAnyOrder(6); + p.run().waitUntilFinish(); + } + + @Test + @Category(ValidatesRunner.class) + public void testNoTornadoes() { + TableRow row = new TableRow().set("month", 6).set("tornado", false); + PCollection inputs = p.apply(Create.of(ImmutableList.of(row))); + PCollection result = inputs.apply(ParDo.of(new ExtractTornadoesFn())); + PAssert.that(result).empty(); + p.run().waitUntilFinish(); + } + + @Test + @Category(ValidatesRunner.class) + public void testEmpty() { + PCollection> inputs = + p.apply(Create.empty(new TypeDescriptor>() {})); + PCollection result = inputs.apply(ParDo.of(new FormatCountsFn())); + PAssert.that(result).empty(); + p.run().waitUntilFinish(); + } + + @Test + @Category(ValidatesRunner.class) + public void testFormatCounts() { + PCollection> inputs = + p.apply(Create.of(KV.of(3, 0L), KV.of(4, Long.MAX_VALUE), KV.of(5, Long.MIN_VALUE))); + PCollection result = inputs.apply(ParDo.of(new FormatCountsFn())); + PAssert.that(result).containsInAnyOrder("3: 0", "4: " + Long.MAX_VALUE, "5: " + Long.MIN_VALUE); + p.run().waitUntilFinish(); + } +} diff --git a/examples/notebooks/beam-ml/image_processing_tensorflow.ipynb b/examples/notebooks/beam-ml/image_processing_tensorflow.ipynb new file mode 100644 index 000000000000..0914653f1de8 --- /dev/null +++ b/examples/notebooks/beam-ml/image_processing_tensorflow.ipynb @@ -0,0 +1,951 @@ +{ + "cells": [ + { + "cell_type": "code", + "source": [ + "# @title ###### Licensed to the Apache Software Foundation (ASF), Version 2.0 (the \"License\")\n", + "\n", + "# Licensed to the Apache Software Foundation (ASF) under one\n", + "# or more contributor license agreements. See the NOTICE file\n", + "# distributed with this work for additional information\n", + "# regarding copyright ownership. The ASF licenses this file\n", + "# to you under the Apache License, Version 2.0 (the\n", + "# \"License\"); you may not use this file except in compliance\n", + "# with the License. You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing,\n", + "# software distributed under the License is distributed on an\n", + "# \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n", + "# KIND, either express or implied. See the License for the\n", + "# specific language governing permissions and limitations\n", + "# under the License" + ], + "metadata": { + "id": "NsNImDL8TGM1" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "# Image Processing using Apache Beam\n", + "\n", + "\n", + " \n", + " \n", + "
\n", + " Run in Google Colab\n", + " \n", + " View source on GitHub\n", + "
\n", + "\n" + ], + "metadata": { + "id": "SwN0Rj4cJSg5" + } + }, + { + "cell_type": "markdown", + "source": [ + "Image Processing is a machine learning technique to read, analyze and extract meaningful information from images. It involves multiple steps such as applying various preprocessing fuctions, getting predictions from a model, storing the predictions in a useful format, etc. Apache Beam is a suitable tool to handle these tasks and build a structured workflow. This notebook demonstrates the use of Apache Beam in image processing and performs the following:\n", + "* Import and preprocess the CIFAR-10 dataset\n", + "* Train a TensorFlow model to classify images\n", + "* Store the model in Google Cloud and create a model handler\n", + "* Build a Beam pipeline to:\n", + " 1. Create a [PCollection]('https://beam.apache.org/documentation/programming-guide/#pcollections') of input images\n", + " 2. Perform preprocessing [transforms]('https://beam.apache.org/documentation/programming-guide/#transforms')\n", + " 3. RunInference to get predictions from the previously trained model\n", + " 4. Store the results\n", + "\n", + "For more information on using Apache Beam for machine learning, have a look at [AI/ML Pipelines using Beam]('https://beam.apache.org/documentation/ml/overview/')." + ], + "metadata": { + "id": "yxLoBQxocAOv" + } + }, + { + "cell_type": "markdown", + "metadata": { + "id": "OSZrRmHl9NQY" + }, + "source": [ + "## Installing Apache Beam" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "MO7iNmvkBdA5", + "outputId": "6c76e29d-3c70-4c3e-aca2-7cc1dcd167a1" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m14.3/14.3 MB\u001b[0m \u001b[31m28.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m89.7/89.7 kB\u001b[0m \u001b[31m8.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m137.0/137.0 kB\u001b[0m \u001b[31m15.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m152.0/152.0 kB\u001b[0m \u001b[31m14.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.6/2.6 MB\u001b[0m \u001b[31m44.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m648.9/648.9 kB\u001b[0m \u001b[31m46.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.7/2.7 MB\u001b[0m \u001b[31m84.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m283.7/283.7 kB\u001b[0m \u001b[31m27.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25h Building wheel for crcmod (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Building wheel for dill (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Building wheel for docopt (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m307.5/307.5 kB\u001b[0m \u001b[31m7.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m152.8/152.8 kB\u001b[0m \u001b[31m16.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m138.3/138.3 kB\u001b[0m \u001b[31m13.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m798.7/798.7 kB\u001b[0m \u001b[31m24.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.6/1.6 MB\u001b[0m \u001b[31m46.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.1/2.1 MB\u001b[0m \u001b[31m60.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25h Building wheel for timeloop (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", + "google-colab 1.0.0 requires ipykernel==5.5.6, but you have ipykernel 6.23.2 which is incompatible.\n", + "google-colab 1.0.0 requires ipython==7.34.0, but you have ipython 8.14.0 which is incompatible.\u001b[0m\u001b[31m\n", + "\u001b[0m" + ] + } + ], + "source": [ + "!pip install apache_beam --quiet\n", + "!pip install apache-beam[interactive] --quiet" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "45mf7oHu9XbI" + }, + "source": [ + "## Importing necessary libraries\n", + "Here is a brief overview of the uses of each library imported:\n", + "* **NumPy**: Multidimensional numpy arrays are used to store images, and the library also allows performing various operations on them.\n", + "* **Matplotlib**: Displays images stored in numpy array format.\n", + "* **TensorFlow**: Trains a machine learning model.\n", + "* **TFModelHandlerNumpy**: Defines the configuration used to load/use the model that we train. We use `TFModelHandlerNumpy` because the model was trained with TensorFlow and takes numpy arrays as input.\n", + "* **RunInference**: Loads the model and obtains predictions as part of the Apache Beam pipeline. For more information, see [docs on prediction and inference](https://beam.apache.org/documentation/ml/inference-overview/).\n", + "* **Apache Beam**: Builds a pipeline for Image Processing." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "z5_PUeZgOygU" + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import tensorflow as tf\n", + "from apache_beam.ml.inference.tensorflow_inference import TFModelHandlerNumpy\n", + "from apache_beam.ml.inference.base import RunInference\n", + "import apache_beam as beam" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "x3tSAqP7R2rZ" + }, + "source": [ + "## CIFAR-10 Dataset\n", + "CIFAR-10 is a popular dataset used for multiclass object classification.\n", + "It has 60,000 images of the following 10 categories:\n", + "\n", + "* airplane\n", + "* automobile\n", + "* bird\n", + "* cat\n", + "* deer\n", + "* dog\n", + "* frog\n", + "* horse\n", + "* ship\n", + "* truck\n", + "\n", + "The dataset can be directly imported from the TensorFlow library." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "MqylmjBhPCOW", + "outputId": "9d9f5854-80f2-4a4f-a52b-2b81d6295639" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Downloading data from https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz\n", + "170498071/170498071 [==============================] - 4s 0us/step\n" + ] + } + ], + "source": [ + "(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()" + ] + }, + { + "cell_type": "code", + "source": [ + "x_test.shape" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "pfzkgryZUV8P", + "outputId": "79bc798f-f93b-4d7b-8783-c5defa6a2322" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(10000, 32, 32, 3)" + ] + }, + "metadata": {}, + "execution_count": 4 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "The labels in y_train and y_test are numeric, with each number representing a class. The labels list defined below contains the various classes, and their positions in the list represent the corresponding number used to refer to them." + ], + "metadata": { + "id": "6hEHIHPsVxw4" + } + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "3uImFIBXv0My" + }, + "outputs": [], + "source": [ + "labels = ['Airplane', 'Automobile', 'Bird', 'Cat', 'Deer', 'Dog', 'Frog', 'Horse','Ship', 'Truck']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 447 + }, + "id": "zeE81PNOcGfZ", + "outputId": "d2a08cb5-4fdc-47af-c2b2-5602e7600f09" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": {}, + "execution_count": 6 + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "

" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaAAAAGdCAYAAABU0qcqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAvsklEQVR4nO3df3Bc5Xn3/8/Z1e5KsqSVZVuShWVjG2Pzy85TBxwNCSXYxXanDARPB5LM1KR8YaAyU3DTJO4kEGg7SslMQpJxzB+luHkmhoQ+MQx8GyiYWDStTWsHPw5QHOwYbGJLBtv6rf2hPff3D76oFdhwX7bk2xLv18zOWNrLl+5zzu5eOtrdz0bOOScAAM6wROgFAAA+nhhAAIAgGEAAgCAYQACAIBhAAIAgGEAAgCAYQACAIBhAAIAgykIv4P3iONahQ4dUXV2tKIpCLwcAYOScU29vr5qampRInPw856wbQIcOHVJzc3PoZQAATtPBgwc1Y8aMk14/ZgNo/fr1+va3v62Ojg4tWrRIP/jBD3TZZZd95P+rrq6WJP3R//NHSqVTXj+r+UL/gRWXFb1rJSlpOAlLRra/aCaU9K6NPuS3iBP2Npw9WrOYnItN9aXYv75kXExs+A+leMjU27JuOdvxcbKd3VsSs1xs24mx4Xhak7uGTMfetg+T6bR3bWVVjal3ZXayqT5K+B/PQq7X1Hugu8u7tpQrmHonDIfT8hBUyBX0v//q4eHH85MZkwH0k5/8RGvXrtWDDz6oJUuW6IEHHtDy5cu1Z88e1dfXf+j/fe/Pbql0SqmM3wDKVGS81xaXGW/kYzmAIgbQB2tta7ENIP/9/W59ybvWOVvvsR1Atp04lgMoMaYDyP9+n6ksN/XOVFaY6iPDA0WUsP0SPFTw386S8VkL2wCyPyXyUU+jjMmLEL7zne/olltu0Ze+9CVdeOGFevDBB1VZWal/+Id/GIsfBwAYh0Z9ABUKBe3cuVPLli377x+SSGjZsmXatm3bB+rz+bx6enpGXAAAE9+oD6B33nlHpVJJDQ0NI77f0NCgjo6OD9S3tbUpm80OX3gBAgB8PAR/H9C6devU3d09fDl48GDoJQEAzoBRfxHC1KlTlUwm1dnZOeL7nZ2damxs/EB9JpNRJuP/JBsAYGIY9TOgdDqtxYsXa8uWLcPfi+NYW7ZsUUtLy2j/OADAODUmL8Neu3atVq9erU9+8pO67LLL9MADD6i/v19f+tKXxuLHAQDGoTEZQDfccIPefvtt3X333ero6NAnPvEJPf300x94YQIA4ONrzJIQ1qxZozVr1pzy/y8NlT40Q+h/coY3uEcJ2yYnk/5/pUw4vzfOvseV/HsX8rY3rxUM74hOGP8Sm0zb3nSZKPd/x3osW1pBXPLfTssbLiXJ8p5L6xs0rW//jQz1LjL2trzJVbZ9mLDUO/83/kpSPOh/7PtyA6beg319pvrKyXXeteWTKk29s9P87z8547oHe/1TGUpD/vdN3/eHB38VHADg44kBBAAIggEEAAiCAQQACIIBBAAIggEEAAiCAQQACIIBBAAIggEEAAiCAQQACGLMonhOl4uScgm/yBdX8t+Mw7/94IfifWjvgn9MSUV5jan3gTcPedfu+81vTb0tHw4/KV1laj15StZUf+78Gd6155w7xdQ79k8pUUmDpt4f8XH2I2tNnU+F/09IGFcTG9JyEiVbDFNsiBAqyRbFEyWt8Uf+XN4/okaSBo75R2UVS7bbeHlFtX9t5WRT70Tk/1E4+XzOuzZO5P1+vndHAABGEQMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABDEWZsFN1jIa0h+IVXd/V3efTve9s9fk6RCj38+VZyvMPU+bMiCSydsuVfHjh71ru2LbblXcdGWNdbxu1951y78xAJT7zkXNXvXpqptv2/lXJ93bTJhCFSTpMiWqSbnv/aEIX9NkspMeW22Yz9kKffMfhzm/Pd5bAm8k6SE7bZi6Z/r9b9dSdJQzr93WcL4kB4Zjr2hdykx5FXHGRAAIAgGEAAgCAYQACAIBhAAIAgGEAAgCAYQACAIBhAAIAgGEAAgCAYQACAIBhAAIIizNoqnPJ1SKpPyq53kP0cv+l/zbOtIVnvXZsvPNfV+8zeHvWtf3bXT1HvmzJnetVXV5abe6cwkU/1rr77hX/t/99rWkkh7157/ybm23qmMd21B/abepcgvquQ9LvKPhIpiW1xOQv4ROHFki7RJGJaScLZ1m3J+jL1LxqXIEGeUGMrbOg/5H/uSMc7IlfnXl1X43x+SnrcTzoAAAEEwgAAAQTCAAABBMIAAAEEwgAAAQTCAAABBMIAAAEEwgAAAQTCAAABBMIAAAEEwgAAAQZy1WXDOleRiv/kYGXKeXOSf2SRJQ27Qu7arcMDUu35eo3dt7+AnTL3f3LPfu/bYgU5T74F+W15beabKuzY3YMtUe3nnr71rB3r7TL1nzZ/lXVvXPM3Uu5jqMdXnXJd3rUvafq+M5Z+nZ7z7KCH/HDNn7F2W8t/OMkPm2btrsWXeWbLgJGNvVzQU2zIGS85/HyYNj7NJzzVzBgQACGLUB9A3v/lNRVE04rJgwYLR/jEAgHFuTP4Ed9FFF+m555777x9Sdtb+pQ8AEMiYTIaysjI1Nvo/vwEA+PgZk+eAXn/9dTU1NWnOnDn64he/qAMHTv7kfD6fV09Pz4gLAGDiG/UBtGTJEm3cuFFPP/20NmzYoP379+szn/mMent7T1jf1tambDY7fGlubh7tJQEAzkKjPoBWrlypP/7jP9bChQu1fPly/fM//7O6urr005/+9IT169atU3d39/Dl4MGDo70kAMBZaMxfHVBbW6vzzz9fe/ee+L0jmUxGmYz/Z40DACaGMX8fUF9fn/bt26fp06eP9Y8CAIwjoz6AvvzlL6u9vV1vvPGG/v3f/12f+9znlEwm9fnPf360fxQAYBwb9T/BvfXWW/r85z+vo0ePatq0afr0pz+t7du3a9o0W1RJvr+gUtEv3mLIkD6RMMR3SFIp8o/NKLmjtt5D/r3PmTPT1Hugxz8C5a3X/eOGJCkeskXaxMm8d+3AoO1VkN1d/vv8+DHb8el8yz+i6LwL5pl6z77kHFN9de1U79r+0olf8HMyLvK/rcSG+4Nk+w03NibURJF/NIxZbO09hmsxxfwY84wM9UM5/8eJobzffX7UB9Cjjz462i0BABMQWXAAgCAYQACAIBhAAIAgGEAAgCAYQACAIBhAAIAgGEAAgCAYQACAIBhAAIAgGEAAgCDG/OMYTlUhFysueWZUFVL+jY1bHCf9g+aSyaStufPP4Kqqti18cl2Nd23fZP9aSaqfYtvOQt4/m6z7+DFT79xgv3ftQM4WNvbmmyf/JN/3O9Lxtql3Z+f5pvrFV3zCu7aqvs7Uu6/kv3brb6xx5P8/ooQtx8xSHTlbVptLGrfU0D+y5rVF1nw3fwlD5p2L/fdJwrOWMyAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBBnbxTPYFHxkF8ERfOUud59Z82bZVrHnjde9q493n/E1LuU8I+RKUVHTb2nTpvsXdv39jRT79KQLdaksmqSd+1FmUpT79/u2eNdWyzaonhyQ/5RSf1D/sdSkt7Y96apPpnwjz9a+JkFpt5lk/2PTykaNPW2/Ioby3Z8IucfUZMw1EoyReu8uxhj/RiJnG0fWrjI//6Q8KzlDAgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQxFmbBVcs5RQn/Jb3q50vefd1LmNax/xzL/OuLSb6TL33/s5/3YMDx029yyr8t7Oq1j8LTJJ6evwzoSSpp7/XuzabbTD1Pv+Scu/awwd/a+ptiffq6R4w9Y6LRVN9X5f/8X/7zbdNvWeUN3rXugrbukuJvHdtQra8Nkv6WtL5Z+lJkotsmWq2eltunDPUO2c7pygZdvmQ4XxlKPKr5QwIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEMRZmwVXXTtJZWm/5cWZQe++z/3r/2taR/pf/XPS5s+7wNR77oK53rX5clvW2PHj/hlcqeoqU+/qshpTfVH+2WTHertMvcucfxacS9vWPZTr966tqKg29Y4qTeXKFfyP/zuH3jH1rs1O9q7Nzsmaepfibu9al7DlzEmG/DVLsJ8kyZgdl/DvHxtz6WLDw3RsXHexzL930bCOwlDOq44zIABAEOYB9MILL+iaa65RU1OToijS448/PuJ655zuvvtuTZ8+XRUVFVq2bJlef/310VovAGCCMA+g/v5+LVq0SOvXrz/h9ffff7++//3v68EHH9SLL76oSZMmafny5crl/E7JAAAfD+bngFauXKmVK1ee8DrnnB544AF9/etf17XXXitJ+tGPfqSGhgY9/vjjuvHGG09vtQCACWNUnwPav3+/Ojo6tGzZsuHvZbNZLVmyRNu2bTvh/8nn8+rp6RlxAQBMfKM6gDo6OiRJDQ0jP9WyoaFh+Lr3a2trUzabHb40NzeP5pIAAGep4K+CW7dunbq7u4cvBw8eDL0kAMAZMKoDqLHx3c+W7+zsHPH9zs7O4eveL5PJqKamZsQFADDxjeoAmj17thobG7Vly5bh7/X09OjFF19US0vLaP4oAMA4Z34VXF9fn/bu3Tv89f79+7Vr1y7V1dVp5syZuvPOO/U3f/M3mjdvnmbPnq1vfOMbampq0nXXXTea6wYAjHPmAbRjxw599rOfHf567dq1kqTVq1dr48aN+spXvqL+/n7deuut6urq0qc//Wk9/fTTKi/3j0yRpKpshVLplFdt42z/eJD62bbIlJ6j/nEsu17+V1Pv1/b8X+/azyy7ytT7/S8E+TCDuSOm3oP+6SqSpGmJE//59URSqQrbWgb6vGur6/xuT+/J93V51yZdwdS7ttY/4kmSBgb9Xx06OOgfTSVJv3vjkHdttv4iU+9s1n+f95T8I5skKU6W/GuNETUlZ7utlAzxOiXjWoZi/4fpfMF/n0hSPucf2VUs+N/xi559zQPoyiuvlHPupNdHUaT77rtP9913n7U1AOBjJPir4AAAH08MIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBDmKJ4zJY5ixVHsVVtyfnWSVJY8eYzQiUxp9M+Zy2b9ayXpzd8c8K594mebTL0vv3y5d+3c+bZ8rzfefMdUPzRkOD5pW2agG8h5107K1pt6T67zz9NzcdHUu7am0lTvSgPetQN9tky1/GCvd+3RN4+bep970TnetbmEf+6iJPUb9slQyZa/VixFpvo48q8vxLa8tv4+/wy2Qt6WAxgl/NddljLk4yX8tpEzIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEGdtFE8yVaZk2m95lnAdV7JF8ZTckH9x2jbPZ1/oH/WilH8chyT92/b/4107ONBn6n3e/EtN9cWif3xLT58h7kNS/fTzvGtzg7btrKz0X0sist2VypK2qJekCv69M1Wm3sWC/22re9AWl3Po8FHv2swUWzxRvugfw1RK+u8/SVKZLbrHJQ2329h27Ctq/fdLbbra1DuT8Y++Sjj/fZL3jMjiDAgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQxFmbBVdeVaFUxi9fyUWxd1/n/GslyZLaVJIhN06SUkXv0lkX1JhaZyb1eNdu277Z1Pvw7zpM9Rf9ryXetVVZWxZcIumfk9XU3GzqnfHMIpSkfMF27Af7bZlqlRnDLTGuNfUuFf2z4Hr7bce+q2fQu3ZyusLUu7au3ru2P+mfRyhJiUr/jDRJSqb8M9jihO02Hjv/Yx+XbLfDpPN/DIrz/rfZKPbL3uMMCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQxFkbxZOZVK50edqrNpYhiidypnVEhugeS60kRYmkd20i7V8rSdkG/+1snmfr/dtXdtjWUlPlXdt03gWm3n15/xiZfNF2c0+npnjXRkn/SBNJKgz1murl/I9nRcbWOnYl79rJWf/4G0lS0X+/OGeLkSkv94/uKZTb7vcu7ffYM1wv/50e2x4mFA/578PIUCtJruh/O4wHu/z7Dua96jgDAgAEwQACAARhHkAvvPCCrrnmGjU1NSmKIj3++OMjrr/pppsURdGIy4oVK0ZrvQCACcI8gPr7+7Vo0SKtX7/+pDUrVqzQ4cOHhy+PPPLIaS0SADDxmF+EsHLlSq1cufJDazKZjBobG095UQCAiW9MngPaunWr6uvrNX/+fN1+++06evToSWvz+bx6enpGXAAAE9+oD6AVK1boRz/6kbZs2aK/+7u/U3t7u1auXKlS6cQv9Wxra1M2mx2+NBs/tRIAMD6N+vuAbrzxxuF/X3LJJVq4cKHmzp2rrVu3aunSpR+oX7dundauXTv8dU9PD0MIAD4Gxvxl2HPmzNHUqVO1d+/eE16fyWRUU1Mz4gIAmPjGfAC99dZbOnr0qKZPnz7WPwoAMI6Y/wTX19c34mxm//792rVrl+rq6lRXV6d7771Xq1atUmNjo/bt26evfOUrOu+887R8+fJRXTgAYHwzD6AdO3bos5/97PDX7z1/s3r1am3YsEG7d+/WP/7jP6qrq0tNTU26+uqr9dd//dfKZGwBVcmyhJJlfidozhCu5CLTMgwpc1KUsIU8uZL/CWjNpDmm3jVT/DO7Eql9pt79vYdN9b/a+Qvv2qIrmHrPPN9/v5QZM9KGSoa7h7M1T5elTPVvdxzwrh3K2V5Jmoz893ldrX+unyTNOn+Wd20ubTv2fSm/vDFJitP+uXGSLV/y3f+Q868dsm1nsjjgX2yplRQV/dcSxf6ZgSXPx2TzALryyivlPiQY8ZlnnrG2BAB8DJEFBwAIggEEAAiCAQQACIIBBAAIggEEAAiCAQQACIIBBAAIggEEAAiCAQQACIIBBAAIYtQ/D2i0RIl3L1618g94iyJjGJxBHNnyvaKSf95Uf9+gqfc5hvTxSVW2fTI5Y/vIjKNN/jlp+157y9S7PJ30rq2uP27q3Zd707u2snyKqfc7R98x1R87fvJPFX6/qZNta8mkyr1rB8tsWWPdyV7v2qjafx2SpKT//S0y5q8ljPVxwX+/REOG3DhJUcl/Lcm4aOqtD4lVe7+S4bHTt5QzIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEGdvFI/84xxs/KMnhhfi3do2z6OE/1qKBVsUz9Cgf8xP0+SLTL0nT59nqj+3rtK7drBnm6n3b179tXdt9lCjqXcuLnnXNp3vHzckSZOm2Oqz9f7xR9Mb/WOYJKmsrMq7ts/1mHonqv2jkpxsMTJRbsi7dqin39S7zNnub2XOEFHkbDE/kfxvh5ZYMklypnr/xxRfnAEBAIJgAAEAgmAAAQCCYAABAIJgAAEAgmAAAQCCYAABAIJgAAEAgmAAAQCCYAABAIJgAAEAgjh7s+AS7168OEu+my0Lzjn//KM48s+mMivaflfoO+q/lpde2WPqffxop6k+Ve2fe1ZW6Z8dJkn9vf75YXHhmKl3zbRy79pMyj/vTpKqs/69Jang8t61fTpiW4shry1dljL1LuX9c8/eOWBb9+u/es27dsYUWz7elGmTTPXl1f6PK1GZ7TEoTvo/BjnjOYXpodP02OlXyxkQACAIBhAAIAgGEAAgCAYQACAIBhAAIAgGEAAgCAYQACAIBhAAIAgGEAAgCAYQACCIszeKxzlFnjkRUcIQg5G0xWCUpfxjSsoythiZhPOf/0OD/nEcktR3zD8u560DtiieeRfOM9Wnsv6xJsfe6jD1rq33jxw6duSoqXeqf4p3ba7XduwzVaZyTZpS411bVWeLkVFZv3dpYdA/EkiScsdy3rVH3zho6v27V/Z518ZZ/22UpNRFc0z1FRXV3rXJtO33/thF3rUu8q+VJEX+j4eJMajlDAgAEIRpALW1tenSSy9VdXW16uvrdd1112nPnpG/PedyObW2tmrKlCmqqqrSqlWr1NlpC68EAEx8pgHU3t6u1tZWbd++Xc8++6yKxaKuvvpq9ff/9+ntXXfdpSeffFKPPfaY2tvbdejQIV1//fWjvnAAwPhmeg7o6aefHvH1xo0bVV9fr507d+qKK65Qd3e3HnroIW3atElXXXWVJOnhhx/WBRdcoO3bt+tTn/rU6K0cADCundZzQN3d3ZKkuro6SdLOnTtVLBa1bNmy4ZoFCxZo5syZ2rZt2wl75PN59fT0jLgAACa+Ux5AcRzrzjvv1OWXX66LL75YktTR0aF0Oq3a2toRtQ0NDeroOPGrm9ra2pTNZocvzc3Np7okAMA4csoDqLW1VS+//LIeffTR01rAunXr1N3dPXw5eND2UkwAwPh0Su8DWrNmjZ566im98MILmjFjxvD3GxsbVSgU1NXVNeIsqLOzU42NjSfslclklMn4f2QzAGBiMJ0BOee0Zs0abd68Wc8//7xmz5494vrFixcrlUppy5Ytw9/bs2ePDhw4oJaWltFZMQBgQjCdAbW2tmrTpk164oknVF1dPfy8TjabVUVFhbLZrG6++WatXbtWdXV1qqmp0R133KGWlhZeAQcAGME0gDZs2CBJuvLKK0d8/+GHH9ZNN90kSfrud7+rRCKhVatWKZ/Pa/ny5frhD384KosFAEwcpgHkPLLZysvLtX79eq1fv/6UFyVJmaqEMhV+fyGcVFXu3bc6618rSRWVae/ayoztNR0lz6w7Scr12zLs3t57yLt2siGrTZLmnn+BqT5f8M8De+e3r5t6nzuv3ru2GPeaeufz/jlz6Um2p1OzU237fFJdrXdtvmjLDRzsOeZdm+uzZapFQ/73icbGrKl34rJLvGv73/E/lpJUiG2ZagOFQe/ayirb8XGGLDhDXJskKTYsxRmesYk9a8mCAwAEwQACAATBAAIABMEAAgAEwQACAATBAAIABMEAAgAEwQACAATBAAIABMEAAgAEcUofx3AmzLpwiiqq/D6mobK8wrtv5GwxGPFQybt2qFg09e7uHfCuzfUWTL17ev1jZ6ZOOfFHZZxMearSVP/6a3u9a/v7bPuwqm6ad+30WbYYptf/yz8WyMk/bkiSamtqTfXvHPOPy+nt7TP1jkv+t/FEZNuHqaR/73S1LUdm1nz/GKaBev9ILUkqk+0jYmprkt61/YVOU28lLfvFf39LkpN/79j5j4vYsy1nQACAIBhAAIAgGEAAgCAYQACAIBhAAIAgGEAAgCAYQACAIBhAAIAgGEAAgCAYQACAIBhAAIAgztosOBc7xZ6BQseP9Xj3zedsmWqDA/4ZX4WcLYcpjvzzo+pqaky9U2n/fdLfY8sxe+2V10z173T4Z1+lM7acuVLSfx9m6237cL5metcee+OQqffLfbbcs0nTqr1r48h2G08mUt61kSmXTJLzz/aLE0Om1lEy8q6tnGzLghs8blxL5H+7TZXZbof5obz/Ooz70JX87/tR7H8so5JfLWdAAIAgGEAAgCAYQACAIBhAAIAgGEAAgCAYQACAIBhAAIAgGEAAgCAYQACAIBhAAIAgztoongO/OaZMhV98RrHkH4GTKLNtcjqT8a5NZWzzvLzKfy3lxt654lHv2uqaClPvVHLAVJ8f8I8FylTbYkok/xgZpfxjeyQpO22ad23n4f2m3sd+122qv6R5lndtMmOMY4n8Y2oSCds+jF3sX2zsbQm+ssQNSVJmUpWpfjBtWHtmiqm3DI9vceQflyNJKhpiuIr+x9JFfvFBnAEBAIJgAAEAgmAAAQCCYAABAIJgAAEAgmAAAQCCYAABAIJgAAEAgmAAAQCCYAABAIJgAAEAgjhrs+CGhhJKDPnNx4oa/9ymiupy0zrKDPlhUcKWwaWo4F1aGjJkNkmKh/yymCQpU5M19a6u9M/Hk6RyQ56eq5hs6p0on+TfW7asMVdR51077/Lppt65AVueXt+A//EsV6WpdzITedc6SwCbJMX+v+MOyZAbJymKnP8yItvCXZl/b0nq6/K/75cl/bP3JKmyxv945uJBU+/IkKXoEv7rHor8+nIGBAAIwjSA2tradOmll6q6ulr19fW67rrrtGfPnhE1V155paIoGnG57bbbRnXRAIDxzzSA2tvb1draqu3bt+vZZ59VsVjU1Vdfrf7+/hF1t9xyiw4fPjx8uf/++0d10QCA8c/0HNDTTz894uuNGzeqvr5eO3fu1BVXXDH8/crKSjU2No7OCgEAE9JpPQfU3f3uh2rV1Y18svbHP/6xpk6dqosvvljr1q3TwIc84ZrP59XT0zPiAgCY+E75VXBxHOvOO+/U5Zdfrosvvnj4+1/4whc0a9YsNTU1affu3frqV7+qPXv26Gc/+9kJ+7S1tenee+891WUAAMapUx5Ara2tevnll/XLX/5yxPdvvfXW4X9fcsklmj59upYuXap9+/Zp7ty5H+izbt06rV27dvjrnp4eNTc3n+qyAADjxCkNoDVr1uipp57SCy+8oBkzZnxo7ZIlSyRJe/fuPeEAymQyyhjeJwIAmBhMA8g5pzvuuEObN2/W1q1bNXv27I/8P7t27ZIkTZ9ue6MeAGBiMw2g1tZWbdq0SU888YSqq6vV0dEhScpms6qoqNC+ffu0adMm/eEf/qGmTJmi3bt366677tIVV1yhhQsXjskGAADGJ9MA2rBhg6R332z6Pz388MO66aablE6n9dxzz+mBBx5Qf3+/mpubtWrVKn39618ftQUDACYG85/gPkxzc7Pa29tPa0HvqW3IKuOZORZl/DO+UinbK8/Lkv45WaW8LW+qUPDPgitL2tY9VPKvP3LU9tL3dNo/e0+S6qb5Z6r1GPa3JE2q9N/nccl2fI539XnXppO25zHf/u2bpvqXtr3iXfvJyy4z9Z49v967dsjZssYSCf/jacl2k6TIcJeIbDcrJRL+GWmSlO/0vy8X4ymm3rMX+b8o68DRI6befSX/jMFi5H+/Lw769SULDgAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQxCl/HtBYc8mSXJlfdErsYu++ZTJGbAz4R2z0H+8y9U4YYoHKKipMvVPl/rEZA122eJUjb3eZ6tMV/jez2qx/rJIkNTb475ehgSFT7+Nvd3jX5ou241NTU26qn1TpX18YsB3PdOR/fIrGOKM44X8bN6blKPqIaLD/yZAIJEkaGiqa6uvqpnnX1lbPN/UuK/OPsiqp2tS733CfiOW/v4s5v1rOgAAAQTCAAABBMIAAAEEwgAAAQTCAAABBMIAAAEEwgAAAQTCAAABBMIAAAEEwgAAAQTCAAABBnLVZcKl0Rul0xqs2MqRIubwty+rYoXe8a6PIPytJkjLpSu/awYItx6yQ919LnLMFZR0bPGaqr23yz6WbUl1j6l2Ie7xrB3P+uX6SlCjzv3vkCrbbVVWtLZNw/kXneNce+d3bpt79Ped616aqbZl3ueKAd23SGthmuL+5yNa7lPDPl5SkoSjnX1y0HZ/Ow8e9a7uKtnXHKf+MwYQhBzCR8KvlDAgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEMRZG8XjiiW5omecQ5T07psu86+VpOnn1HvXRsb4jnzRP77jeEeXqXfPsX7vWtdni/mpqLbFmlRnp3rXZtJTTL2P9XZ41xbyeVPv8gr/2JlC/6Cpdylh2+d1U/33y5G3/I+9JL21b7937fyF80y9c8Vu79pS0nb/SUZ+UV3/f3dTb5ey/W5eKvOPeep3R229Y/+H6UlJ430zXfSujWP/WKVC5Lc/OAMCAATBAAIABMEAAgAEwQACAATBAAIABMEAAgAEwQACAATBAAIABMEAAgAEwQACAATBAAIABHHWZsEdeO2g0uUpr9pkwj/fLZWxZcFlMv7ZStbekyr8tk+SqhL+tZLUNM0/wy6f7jH1jlP+uVeSlJ3qvxYlK029ayY3edeW19v2Yb7bPz/sWOXbpt6DA7bsuGKvf+5Zuef95j0dh970rp1cV2vqPeWcKu/annyXqbcz3N0SkS1nLoqcqT5p2OVRZMsB7Os67l2bssUdqqEp613bG/vfZuOYLDgAwFnMNIA2bNighQsXqqamRjU1NWppadHPf/7z4etzuZxaW1s1ZcoUVVVVadWqVers7Bz1RQMAxj/TAJoxY4a+9a1vaefOndqxY4euuuoqXXvttXrllVckSXfddZeefPJJPfbYY2pvb9ehQ4d0/fXXj8nCAQDjm+k5oGuuuWbE13/7t3+rDRs2aPv27ZoxY4Yeeughbdq0SVdddZUk6eGHH9YFF1yg7du361Of+tTorRoAMO6d8nNApVJJjz76qPr7+9XS0qKdO3eqWCxq2bJlwzULFizQzJkztW3btpP2yefz6unpGXEBAEx85gH061//WlVVVcpkMrrtttu0efNmXXjhhero6FA6nVZtbe2I+oaGBnV0nPxTK9va2pTNZocvzc3N5o0AAIw/5gE0f/587dq1Sy+++KJuv/12rV69Wq+++uopL2DdunXq7u4evhw8ePCUewEAxg/z+4DS6bTOO+88SdLixYv1n//5n/re976nG264QYVCQV1dXSPOgjo7O9XY2HjSfplMRpmM5bPdAQATwWm/DyiOY+XzeS1evFipVEpbtmwZvm7Pnj06cOCAWlpaTvfHAAAmGNMZ0Lp167Ry5UrNnDlTvb292rRpk7Zu3apnnnlG2WxWN998s9auXau6ujrV1NTojjvuUEtLC6+AAwB8gGkAHTlyRH/yJ3+iw4cPK5vNauHChXrmmWf0B3/wB5Kk7373u0okElq1apXy+byWL1+uH/7wh6e0sEJPLFfwi8+wnMblk0XTOvoThtgMY8RGddY/v6OpYZqtd5N/pE3HQJep91AmbapXynCEkrYskYT8I1Pyg7Zjn6rwz3ppmlVn6p3rtkXDbHv+V9612aztL+uzzpntXXv4rTdMvatr5nvXZrO2fdiV6/KuLau2xRNFCVsUT6nY6987zpl6Vxsivmqra029yxL+981I/rFkvrWmW+pDDz30odeXl5dr/fr1Wr9+vaUtAOBjiCw4AEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEOY07LHm3LsRGMW8f2xKZJijUdIWgRKNYRRPwZBokxsomHqX5f33ST5ni6gpOdvvLbl+Q7xO0da7JP/j6Yb8o0QkqZT0j0BJGo99bsB2Oyzm/fsPFWxrsdzXhorG23je/3Yb5WzxNwXD7TYqs/W2RvHEhsMZOVvvRNH/dpgv2aKsLPdly7Es5N6tdR+xrZH7qIoz7K233uJD6QBgAjh48KBmzJhx0uvPugEUx7EOHTqk6upqRdF//8ba09Oj5uZmHTx4UDU1NQFXOLbYzonj47CNEts50YzGdjrn1Nvbq6amJiU+JPD0rPsTXCKR+NCJWVNTM6EP/nvYzonj47CNEts50Zzudmaz2Y+s4UUIAIAgGEAAgCDGzQDKZDK65557lMlkQi9lTLGdE8fHYRsltnOiOZPbeda9CAEA8PEwbs6AAAATCwMIABAEAwgAEAQDCAAQxLgZQOvXr9e5556r8vJyLVmyRP/xH/8Rekmj6pvf/KaiKBpxWbBgQehlnZYXXnhB11xzjZqamhRFkR5//PER1zvndPfdd2v69OmqqKjQsmXL9Prrr4dZ7Gn4qO286aabPnBsV6xYEWaxp6itrU2XXnqpqqurVV9fr+uuu0579uwZUZPL5dTa2qopU6aoqqpKq1atUmdnZ6AVnxqf7bzyyis/cDxvu+22QCs+NRs2bNDChQuH32za0tKin//858PXn6ljOS4G0E9+8hOtXbtW99xzj371q19p0aJFWr58uY4cORJ6aaPqoosu0uHDh4cvv/zlL0Mv6bT09/dr0aJFWr9+/Qmvv//++/X9739fDz74oF588UVNmjRJy5cvVy6XO8MrPT0ftZ2StGLFihHH9pFHHjmDKzx97e3tam1t1fbt2/Xss8+qWCzq6quvVn9//3DNXXfdpSeffFKPPfaY2tvbdejQIV1//fUBV23ns52SdMstt4w4nvfff3+gFZ+aGTNm6Fvf+pZ27typHTt26KqrrtK1116rV155RdIZPJZuHLjssstca2vr8NelUsk1NTW5tra2gKsaXffcc49btGhR6GWMGUlu8+bNw1/HcewaGxvdt7/97eHvdXV1uUwm4x555JEAKxwd799O55xbvXq1u/baa4OsZ6wcOXLESXLt7e3OuXePXSqVco899thwzX/91385SW7btm2hlnna3r+dzjn3+7//++7P//zPwy1qjEyePNn9/d///Rk9lmf9GVChUNDOnTu1bNmy4e8lEgktW7ZM27ZtC7iy0ff666+rqalJc+bM0Re/+EUdOHAg9JLGzP79+9XR0THiuGazWS1ZsmTCHVdJ2rp1q+rr6zV//nzdfvvtOnr0aOglnZbu7m5JUl1dnSRp586dKhaLI47nggULNHPmzHF9PN+/ne/58Y9/rKlTp+riiy/WunXrNDAwEGJ5o6JUKunRRx9Vf3+/WlpazuixPOvCSN/vnXfeUalUUkNDw4jvNzQ06LXXXgu0qtG3ZMkSbdy4UfPnz9fhw4d177336jOf+YxefvllVVdXh17eqOvo6JCkEx7X966bKFasWKHrr79es2fP1r59+/RXf/VXWrlypbZt26ak4TOHzhZxHOvOO+/U5ZdfrosvvljSu8cznU6rtrZ2RO14Pp4n2k5J+sIXvqBZs2apqalJu3fv1le/+lXt2bNHP/vZzwKu1u7Xv/61WlpalMvlVFVVpc2bN+vCCy/Url27ztixPOsH0MfFypUrh/+9cOFCLVmyRLNmzdJPf/pT3XzzzQFXhtN14403Dv/7kksu0cKFCzV37lxt3bpVS5cuDbiyU9Pa2qqXX3553D9H+VFOtp233nrr8L8vueQSTZ8+XUuXLtW+ffs0d+7cM73MUzZ//nzt2rVL3d3d+qd/+ietXr1a7e3tZ3QNZ/2f4KZOnapkMvmBV2B0dnaqsbEx0KrGXm1trc4//3zt3bs39FLGxHvH7uN2XCVpzpw5mjp16rg8tmvWrNFTTz2lX/ziFyM+NqWxsVGFQkFdXV0j6sfr8TzZdp7IkiVLJGncHc90Oq3zzjtPixcvVltbmxYtWqTvfe97Z/RYnvUDKJ1Oa/HixdqyZcvw9+I41pYtW9TS0hJwZWOrr69P+/bt0/Tp00MvZUzMnj1bjY2NI45rT0+PXnzxxQl9XKV3P/X36NGj4+rYOue0Zs0abd68Wc8//7xmz5494vrFixcrlUqNOJ579uzRgQMHxtXx/KjtPJFdu3ZJ0rg6nicSx7Hy+fyZPZaj+pKGMfLoo4+6TCbjNm7c6F599VV36623utraWtfR0RF6aaPmL/7iL9zWrVvd/v373b/927+5ZcuWualTp7ojR46EXtop6+3tdS+99JJ76aWXnCT3ne98x7300kvuzTffdM45961vfcvV1ta6J554wu3evdtde+21bvbs2W5wcDDwym0+bDt7e3vdl7/8Zbdt2za3f/9+99xzz7nf+73fc/PmzXO5XC700r3dfvvtLpvNuq1bt7rDhw8PXwYGBoZrbrvtNjdz5kz3/PPPux07driWlhbX0tIScNV2H7Wde/fudffdd5/bsWOH279/v3viiSfcnDlz3BVXXBF45TZf+9rXXHt7u9u/f7/bvXu3+9rXvuaiKHL/8i//4pw7c8dyXAwg55z7wQ9+4GbOnOnS6bS77LLL3Pbt20MvaVTdcMMNbvr06S6dTrtzzjnH3XDDDW7v3r2hl3VafvGLXzhJH7isXr3aOffuS7G/8Y1vuIaGBpfJZNzSpUvdnj17wi76FHzYdg4MDLirr77aTZs2zaVSKTdr1ix3yy23jLtfnk60fZLcww8/PFwzODjo/uzP/sxNnjzZVVZWus997nPu8OHD4RZ9Cj5qOw8cOOCuuOIKV1dX5zKZjDvvvPPcX/7lX7ru7u6wCzf60z/9Uzdr1iyXTqfdtGnT3NKlS4eHj3Nn7ljycQwAgCDO+ueAAAATEwMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEMT/B5JVDaVYFj2wAAAAAElFTkSuQmCC\n" + }, + "metadata": {} + } + ], + "source": [ + "plt.imshow(x_train[800])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "4arvJDYwfsAj", + "outputId": "a355a4e2-c1a7-461e-bff9-059daaa6a9f7" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(32, 32, 3)" + ] + }, + "metadata": {}, + "execution_count": 7 + } + ], + "source": [ + "x_train[0].shape" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ndeZ_RH32Upu" + }, + "source": [ + "(32, 32, 3) represents an image of size 32x32 in the RGB scale" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Preprocessing" + ], + "metadata": { + "id": "L2pg1uxSXPHn" + } + }, + { + "cell_type": "markdown", + "source": [ + "**Standardization** is the process of transforming the pixel values of an image to have zero mean and unit variance. This brings the pixel values to a similar scale and makes them easier to work with." + ], + "metadata": { + "id": "Hwwm-EHhW0rC" + } + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "ZlInmab9MD-N" + }, + "outputs": [], + "source": [ + "x_train = x_train/255.0" + ] + }, + { + "cell_type": "markdown", + "source": [ + "**Normalization** is the process of scaling the pixel values to a specified range, typically between 0 and 1. This improves the consistency of images." + ], + "metadata": { + "id": "6GFdU-HZWztg" + } + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 447 + }, + "id": "TLmsgV9_Wij5", + "outputId": "03fb00c5-efb9-421c-ef55-bbd36679dfbe" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": {}, + "execution_count": 9 + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaAAAAGdCAYAAABU0qcqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAvsklEQVR4nO3df3Bc5Xn3/8/Z1e5KsqSVZVuShWVjG2Pzy85TBxwNCSXYxXanDARPB5LM1KR8YaAyU3DTJO4kEGg7SslMQpJxzB+luHkmhoQ+MQx8GyiYWDStTWsHPw5QHOwYbGJLBtv6rf2hPff3D76oFdhwX7bk2xLv18zOWNrLl+5zzu5eOtrdz0bOOScAAM6wROgFAAA+nhhAAIAgGEAAgCAYQACAIBhAAIAgGEAAgCAYQACAIBhAAIAgykIv4P3iONahQ4dUXV2tKIpCLwcAYOScU29vr5qampRInPw856wbQIcOHVJzc3PoZQAATtPBgwc1Y8aMk14/ZgNo/fr1+va3v62Ojg4tWrRIP/jBD3TZZZd95P+rrq6WJP3R//NHSqVTXj+r+UL/gRWXFb1rJSlpOAlLRra/aCaU9K6NPuS3iBP2Npw9WrOYnItN9aXYv75kXExs+A+leMjU27JuOdvxcbKd3VsSs1xs24mx4Xhak7uGTMfetg+T6bR3bWVVjal3ZXayqT5K+B/PQq7X1Hugu8u7tpQrmHonDIfT8hBUyBX0v//q4eHH85MZkwH0k5/8RGvXrtWDDz6oJUuW6IEHHtDy5cu1Z88e1dfXf+j/fe/Pbql0SqmM3wDKVGS81xaXGW/kYzmAIgbQB2tta7ENIP/9/W59ybvWOVvvsR1Atp04lgMoMaYDyP9+n6ksN/XOVFaY6iPDA0WUsP0SPFTw386S8VkL2wCyPyXyUU+jjMmLEL7zne/olltu0Ze+9CVdeOGFevDBB1VZWal/+Id/GIsfBwAYh0Z9ABUKBe3cuVPLli377x+SSGjZsmXatm3bB+rz+bx6enpGXAAAE9+oD6B33nlHpVJJDQ0NI77f0NCgjo6OD9S3tbUpm80OX3gBAgB8PAR/H9C6devU3d09fDl48GDoJQEAzoBRfxHC1KlTlUwm1dnZOeL7nZ2damxs/EB9JpNRJuP/JBsAYGIY9TOgdDqtxYsXa8uWLcPfi+NYW7ZsUUtLy2j/OADAODUmL8Neu3atVq9erU9+8pO67LLL9MADD6i/v19f+tKXxuLHAQDGoTEZQDfccIPefvtt3X333ero6NAnPvEJPf300x94YQIA4ONrzJIQ1qxZozVr1pzy/y8NlT40Q+h/coY3uEcJ2yYnk/5/pUw4vzfOvseV/HsX8rY3rxUM74hOGP8Sm0zb3nSZKPd/x3osW1pBXPLfTssbLiXJ8p5L6xs0rW//jQz1LjL2trzJVbZ9mLDUO/83/kpSPOh/7PtyA6beg319pvrKyXXeteWTKk29s9P87z8547oHe/1TGUpD/vdN3/eHB38VHADg44kBBAAIggEEAAiCAQQACIIBBAAIggEEAAiCAQQACIIBBAAIggEEAAiCAQQACGLMonhOl4uScgm/yBdX8t+Mw7/94IfifWjvgn9MSUV5jan3gTcPedfu+81vTb0tHw4/KV1laj15StZUf+78Gd6155w7xdQ79k8pUUmDpt4f8XH2I2tNnU+F/09IGFcTG9JyEiVbDFNsiBAqyRbFEyWt8Uf+XN4/okaSBo75R2UVS7bbeHlFtX9t5WRT70Tk/1E4+XzOuzZO5P1+vndHAABGEQMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABDEWZsFN1jIa0h+IVXd/V3efTve9s9fk6RCj38+VZyvMPU+bMiCSydsuVfHjh71ru2LbblXcdGWNdbxu1951y78xAJT7zkXNXvXpqptv2/lXJ93bTJhCFSTpMiWqSbnv/aEIX9NkspMeW22Yz9kKffMfhzm/Pd5bAm8k6SE7bZi6Z/r9b9dSdJQzr93WcL4kB4Zjr2hdykx5FXHGRAAIAgGEAAgCAYQACAIBhAAIAgGEAAgCAYQACAIBhAAIAgGEAAgCAYQACAIBhAAIIizNoqnPJ1SKpPyq53kP0cv+l/zbOtIVnvXZsvPNfV+8zeHvWtf3bXT1HvmzJnetVXV5abe6cwkU/1rr77hX/t/99rWkkh7157/ybm23qmMd21B/abepcgvquQ9LvKPhIpiW1xOQv4ROHFki7RJGJaScLZ1m3J+jL1LxqXIEGeUGMrbOg/5H/uSMc7IlfnXl1X43x+SnrcTzoAAAEEwgAAAQTCAAABBMIAAAEEwgAAAQTCAAABBMIAAAEEwgAAAQTCAAABBMIAAAEEwgAAAQZy1WXDOleRiv/kYGXKeXOSf2SRJQ27Qu7arcMDUu35eo3dt7+AnTL3f3LPfu/bYgU5T74F+W15beabKuzY3YMtUe3nnr71rB3r7TL1nzZ/lXVvXPM3Uu5jqMdXnXJd3rUvafq+M5Z+nZ7z7KCH/HDNn7F2W8t/OMkPm2btrsWXeWbLgJGNvVzQU2zIGS85/HyYNj7NJzzVzBgQACGLUB9A3v/lNRVE04rJgwYLR/jEAgHFuTP4Ed9FFF+m555777x9Sdtb+pQ8AEMiYTIaysjI1Nvo/vwEA+PgZk+eAXn/9dTU1NWnOnDn64he/qAMHTv7kfD6fV09Pz4gLAGDiG/UBtGTJEm3cuFFPP/20NmzYoP379+szn/mMent7T1jf1tambDY7fGlubh7tJQEAzkKjPoBWrlypP/7jP9bChQu1fPly/fM//7O6urr005/+9IT169atU3d39/Dl4MGDo70kAMBZaMxfHVBbW6vzzz9fe/ee+L0jmUxGmYz/Z40DACaGMX8fUF9fn/bt26fp06eP9Y8CAIwjoz6AvvzlL6u9vV1vvPGG/v3f/12f+9znlEwm9fnPf360fxQAYBwb9T/BvfXWW/r85z+vo0ePatq0afr0pz+t7du3a9o0W1RJvr+gUtEv3mLIkD6RMMR3SFIp8o/NKLmjtt5D/r3PmTPT1Hugxz8C5a3X/eOGJCkeskXaxMm8d+3AoO1VkN1d/vv8+DHb8el8yz+i6LwL5pl6z77kHFN9de1U79r+0olf8HMyLvK/rcSG+4Nk+w03NibURJF/NIxZbO09hmsxxfwY84wM9UM5/8eJobzffX7UB9Cjjz462i0BABMQWXAAgCAYQACAIBhAAIAgGEAAgCAYQACAIBhAAIAgGEAAgCAYQACAIBhAAIAgGEAAgCDG/OMYTlUhFysueWZUFVL+jY1bHCf9g+aSyaStufPP4Kqqti18cl2Nd23fZP9aSaqfYtvOQt4/m6z7+DFT79xgv3ftQM4WNvbmmyf/JN/3O9Lxtql3Z+f5pvrFV3zCu7aqvs7Uu6/kv3brb6xx5P8/ooQtx8xSHTlbVptLGrfU0D+y5rVF1nw3fwlD5p2L/fdJwrOWMyAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBBnbxTPYFHxkF8ERfOUud59Z82bZVrHnjde9q493n/E1LuU8I+RKUVHTb2nTpvsXdv39jRT79KQLdaksmqSd+1FmUpT79/u2eNdWyzaonhyQ/5RSf1D/sdSkt7Y96apPpnwjz9a+JkFpt5lk/2PTykaNPW2/Ioby3Z8IucfUZMw1EoyReu8uxhj/RiJnG0fWrjI//6Q8KzlDAgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQxFmbBVcs5RQn/Jb3q50vefd1LmNax/xzL/OuLSb6TL33/s5/3YMDx029yyr8t7Oq1j8LTJJ6evwzoSSpp7/XuzabbTD1Pv+Scu/awwd/a+ptiffq6R4w9Y6LRVN9X5f/8X/7zbdNvWeUN3rXugrbukuJvHdtQra8Nkv6WtL5Z+lJkotsmWq2eltunDPUO2c7pygZdvmQ4XxlKPKr5QwIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEMRZmwVXXTtJZWm/5cWZQe++z/3r/2taR/pf/XPS5s+7wNR77oK53rX5clvW2PHj/hlcqeoqU+/qshpTfVH+2WTHertMvcucfxacS9vWPZTr966tqKg29Y4qTeXKFfyP/zuH3jH1rs1O9q7Nzsmaepfibu9al7DlzEmG/DVLsJ8kyZgdl/DvHxtz6WLDw3RsXHexzL930bCOwlDOq44zIABAEOYB9MILL+iaa65RU1OToijS448/PuJ655zuvvtuTZ8+XRUVFVq2bJlef/310VovAGCCMA+g/v5+LVq0SOvXrz/h9ffff7++//3v68EHH9SLL76oSZMmafny5crl/E7JAAAfD+bngFauXKmVK1ee8DrnnB544AF9/etf17XXXitJ+tGPfqSGhgY9/vjjuvHGG09vtQCACWNUnwPav3+/Ojo6tGzZsuHvZbNZLVmyRNu2bTvh/8nn8+rp6RlxAQBMfKM6gDo6OiRJDQ0jP9WyoaFh+Lr3a2trUzabHb40NzeP5pIAAGep4K+CW7dunbq7u4cvBw8eDL0kAMAZMKoDqLHx3c+W7+zsHPH9zs7O4eveL5PJqKamZsQFADDxjeoAmj17thobG7Vly5bh7/X09OjFF19US0vLaP4oAMA4Z34VXF9fn/bu3Tv89f79+7Vr1y7V1dVp5syZuvPOO/U3f/M3mjdvnmbPnq1vfOMbampq0nXXXTea6wYAjHPmAbRjxw599rOfHf567dq1kqTVq1dr48aN+spXvqL+/n7deuut6urq0qc//Wk9/fTTKi/3j0yRpKpshVLplFdt42z/eJD62bbIlJ6j/nEsu17+V1Pv1/b8X+/azyy7ytT7/S8E+TCDuSOm3oP+6SqSpGmJE//59URSqQrbWgb6vGur6/xuT+/J93V51yZdwdS7ttY/4kmSBgb9Xx06OOgfTSVJv3vjkHdttv4iU+9s1n+f95T8I5skKU6W/GuNETUlZ7utlAzxOiXjWoZi/4fpfMF/n0hSPucf2VUs+N/xi559zQPoyiuvlHPupNdHUaT77rtP9913n7U1AOBjJPir4AAAH08MIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBDmKJ4zJY5ixVHsVVtyfnWSVJY8eYzQiUxp9M+Zy2b9ayXpzd8c8K594mebTL0vv3y5d+3c+bZ8rzfefMdUPzRkOD5pW2agG8h5107K1pt6T67zz9NzcdHUu7am0lTvSgPetQN9tky1/GCvd+3RN4+bep970TnetbmEf+6iJPUb9slQyZa/VixFpvo48q8vxLa8tv4+/wy2Qt6WAxgl/NddljLk4yX8tpEzIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEGdtFE8yVaZk2m95lnAdV7JF8ZTckH9x2jbPZ1/oH/WilH8chyT92/b/4107ONBn6n3e/EtN9cWif3xLT58h7kNS/fTzvGtzg7btrKz0X0sist2VypK2qJekCv69M1Wm3sWC/22re9AWl3Po8FHv2swUWzxRvugfw1RK+u8/SVKZLbrHJQ2329h27Ctq/fdLbbra1DuT8Y++Sjj/fZL3jMjiDAgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQxFmbBVdeVaFUxi9fyUWxd1/n/GslyZLaVJIhN06SUkXv0lkX1JhaZyb1eNdu277Z1Pvw7zpM9Rf9ryXetVVZWxZcIumfk9XU3GzqnfHMIpSkfMF27Af7bZlqlRnDLTGuNfUuFf2z4Hr7bce+q2fQu3ZyusLUu7au3ru2P+mfRyhJiUr/jDRJSqb8M9jihO02Hjv/Yx+XbLfDpPN/DIrz/rfZKPbL3uMMCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQxFkbxZOZVK50edqrNpYhiidypnVEhugeS60kRYmkd20i7V8rSdkG/+1snmfr/dtXdtjWUlPlXdt03gWm3n15/xiZfNF2c0+npnjXRkn/SBNJKgz1murl/I9nRcbWOnYl79rJWf/4G0lS0X+/OGeLkSkv94/uKZTb7vcu7ffYM1wv/50e2x4mFA/578PIUCtJruh/O4wHu/z7Dua96jgDAgAEwQACAARhHkAvvPCCrrnmGjU1NSmKIj3++OMjrr/pppsURdGIy4oVK0ZrvQCACcI8gPr7+7Vo0SKtX7/+pDUrVqzQ4cOHhy+PPPLIaS0SADDxmF+EsHLlSq1cufJDazKZjBobG095UQCAiW9MngPaunWr6uvrNX/+fN1+++06evToSWvz+bx6enpGXAAAE9+oD6AVK1boRz/6kbZs2aK/+7u/U3t7u1auXKlS6cQv9Wxra1M2mx2+NBs/tRIAMD6N+vuAbrzxxuF/X3LJJVq4cKHmzp2rrVu3aunSpR+oX7dundauXTv8dU9PD0MIAD4Gxvxl2HPmzNHUqVO1d+/eE16fyWRUU1Mz4gIAmPjGfAC99dZbOnr0qKZPnz7WPwoAMI6Y/wTX19c34mxm//792rVrl+rq6lRXV6d7771Xq1atUmNjo/bt26evfOUrOu+887R8+fJRXTgAYHwzD6AdO3bos5/97PDX7z1/s3r1am3YsEG7d+/WP/7jP6qrq0tNTU26+uqr9dd//dfKZGwBVcmyhJJlfidozhCu5CLTMgwpc1KUsIU8uZL/CWjNpDmm3jVT/DO7Eql9pt79vYdN9b/a+Qvv2qIrmHrPPN9/v5QZM9KGSoa7h7M1T5elTPVvdxzwrh3K2V5Jmoz893ldrX+unyTNOn+Wd20ubTv2fSm/vDFJitP+uXGSLV/y3f+Q868dsm1nsjjgX2yplRQV/dcSxf6ZgSXPx2TzALryyivlPiQY8ZlnnrG2BAB8DJEFBwAIggEEAAiCAQQACIIBBAAIggEEAAiCAQQACIIBBAAIggEEAAiCAQQACIIBBAAIYtQ/D2i0RIl3L1618g94iyJjGJxBHNnyvaKSf95Uf9+gqfc5hvTxSVW2fTI5Y/vIjKNN/jlp+157y9S7PJ30rq2uP27q3Zd707u2snyKqfc7R98x1R87fvJPFX6/qZNta8mkyr1rB8tsWWPdyV7v2qjafx2SpKT//S0y5q8ljPVxwX+/REOG3DhJUcl/Lcm4aOqtD4lVe7+S4bHTt5QzIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEGdvFI/84xxs/KMnhhfi3do2z6OE/1qKBVsUz9Cgf8xP0+SLTL0nT59nqj+3rtK7drBnm6n3b179tXdt9lCjqXcuLnnXNp3vHzckSZOm2Oqz9f7xR9Mb/WOYJKmsrMq7ts/1mHonqv2jkpxsMTJRbsi7dqin39S7zNnub2XOEFHkbDE/kfxvh5ZYMklypnr/xxRfnAEBAIJgAAEAgmAAAQCCYAABAIJgAAEAgmAAAQCCYAABAIJgAAEAgmAAAQCCYAABAIJgAAEAgjh7s+AS7168OEu+my0Lzjn//KM48s+mMivaflfoO+q/lpde2WPqffxop6k+Ve2fe1ZW6Z8dJkn9vf75YXHhmKl3zbRy79pMyj/vTpKqs/69Jang8t61fTpiW4shry1dljL1LuX9c8/eOWBb9+u/es27dsYUWz7elGmTTPXl1f6PK1GZ7TEoTvo/BjnjOYXpodP02OlXyxkQACAIBhAAIAgGEAAgCAYQACAIBhAAIAgGEAAgCAYQACAIBhAAIAgGEAAgCAYQACCIszeKxzlFnjkRUcIQg5G0xWCUpfxjSsoythiZhPOf/0OD/nEcktR3zD8u560DtiieeRfOM9Wnsv6xJsfe6jD1rq33jxw6duSoqXeqf4p3ba7XduwzVaZyTZpS411bVWeLkVFZv3dpYdA/EkiScsdy3rVH3zho6v27V/Z518ZZ/22UpNRFc0z1FRXV3rXJtO33/thF3rUu8q+VJEX+j4eJMajlDAgAEIRpALW1tenSSy9VdXW16uvrdd1112nPnpG/PedyObW2tmrKlCmqqqrSqlWr1NlpC68EAEx8pgHU3t6u1tZWbd++Xc8++6yKxaKuvvpq9ff/9+ntXXfdpSeffFKPPfaY2tvbdejQIV1//fWjvnAAwPhmeg7o6aefHvH1xo0bVV9fr507d+qKK65Qd3e3HnroIW3atElXXXWVJOnhhx/WBRdcoO3bt+tTn/rU6K0cADCundZzQN3d3ZKkuro6SdLOnTtVLBa1bNmy4ZoFCxZo5syZ2rZt2wl75PN59fT0jLgAACa+Ux5AcRzrzjvv1OWXX66LL75YktTR0aF0Oq3a2toRtQ0NDeroOPGrm9ra2pTNZocvzc3Np7okAMA4csoDqLW1VS+//LIeffTR01rAunXr1N3dPXw5eND2UkwAwPh0Su8DWrNmjZ566im98MILmjFjxvD3GxsbVSgU1NXVNeIsqLOzU42NjSfslclklMn4f2QzAGBiMJ0BOee0Zs0abd68Wc8//7xmz5494vrFixcrlUppy5Ytw9/bs2ePDhw4oJaWltFZMQBgQjCdAbW2tmrTpk164oknVF1dPfy8TjabVUVFhbLZrG6++WatXbtWdXV1qqmp0R133KGWlhZeAQcAGME0gDZs2CBJuvLKK0d8/+GHH9ZNN90kSfrud7+rRCKhVatWKZ/Pa/ny5frhD384KosFAEwcpgHkPLLZysvLtX79eq1fv/6UFyVJmaqEMhV+fyGcVFXu3bc6618rSRWVae/ayoztNR0lz6w7Scr12zLs3t57yLt2siGrTZLmnn+BqT5f8M8De+e3r5t6nzuv3ru2GPeaeufz/jlz6Um2p1OzU237fFJdrXdtvmjLDRzsOeZdm+uzZapFQ/73icbGrKl34rJLvGv73/E/lpJUiG2ZagOFQe/ayirb8XGGLDhDXJskKTYsxRmesYk9a8mCAwAEwQACAATBAAIABMEAAgAEwQACAATBAAIABMEAAgAEwQACAATBAAIABMEAAgAEcUofx3AmzLpwiiqq/D6mobK8wrtv5GwxGPFQybt2qFg09e7uHfCuzfUWTL17ev1jZ6ZOOfFHZZxMearSVP/6a3u9a/v7bPuwqm6ad+30WbYYptf/yz8WyMk/bkiSamtqTfXvHPOPy+nt7TP1jkv+t/FEZNuHqaR/73S1LUdm1nz/GKaBev9ILUkqk+0jYmprkt61/YVOU28lLfvFf39LkpN/79j5j4vYsy1nQACAIBhAAIAgGEAAgCAYQACAIBhAAIAgGEAAgCAYQACAIBhAAIAgGEAAgCAYQACAIBhAAIAgztosOBc7xZ6BQseP9Xj3zedsmWqDA/4ZX4WcLYcpjvzzo+pqaky9U2n/fdLfY8sxe+2V10z173T4Z1+lM7acuVLSfx9m6237cL5metcee+OQqffLfbbcs0nTqr1r48h2G08mUt61kSmXTJLzz/aLE0Om1lEy8q6tnGzLghs8blxL5H+7TZXZbof5obz/Ooz70JX87/tR7H8so5JfLWdAAIAgGEAAgCAYQACAIBhAAIAgGEAAgCAYQACAIBhAAIAgGEAAgCAYQACAIBhAAIAgztoongO/OaZMhV98RrHkH4GTKLNtcjqT8a5NZWzzvLzKfy3lxt654lHv2uqaClPvVHLAVJ8f8I8FylTbYkok/xgZpfxjeyQpO22ad23n4f2m3sd+122qv6R5lndtMmOMY4n8Y2oSCds+jF3sX2zsbQm+ssQNSVJmUpWpfjBtWHtmiqm3DI9vceQflyNJKhpiuIr+x9JFfvFBnAEBAIJgAAEAgmAAAQCCYAABAIJgAAEAgmAAAQCCYAABAIJgAAEAgmAAAQCCYAABAIJgAAEAgjhrs+CGhhJKDPnNx4oa/9ymiupy0zrKDPlhUcKWwaWo4F1aGjJkNkmKh/yymCQpU5M19a6u9M/Hk6RyQ56eq5hs6p0on+TfW7asMVdR51077/Lppt65AVueXt+A//EsV6WpdzITedc6SwCbJMX+v+MOyZAbJymKnP8yItvCXZl/b0nq6/K/75cl/bP3JKmyxv945uJBU+/IkKXoEv7rHor8+nIGBAAIwjSA2tradOmll6q6ulr19fW67rrrtGfPnhE1V155paIoGnG57bbbRnXRAIDxzzSA2tvb1draqu3bt+vZZ59VsVjU1Vdfrf7+/hF1t9xyiw4fPjx8uf/++0d10QCA8c/0HNDTTz894uuNGzeqvr5eO3fu1BVXXDH8/crKSjU2No7OCgEAE9JpPQfU3f3uh2rV1Y18svbHP/6xpk6dqosvvljr1q3TwIc84ZrP59XT0zPiAgCY+E75VXBxHOvOO+/U5Zdfrosvvnj4+1/4whc0a9YsNTU1affu3frqV7+qPXv26Gc/+9kJ+7S1tenee+891WUAAMapUx5Ara2tevnll/XLX/5yxPdvvfXW4X9fcsklmj59upYuXap9+/Zp7ty5H+izbt06rV27dvjrnp4eNTc3n+qyAADjxCkNoDVr1uipp57SCy+8oBkzZnxo7ZIlSyRJe/fuPeEAymQyyhjeJwIAmBhMA8g5pzvuuEObN2/W1q1bNXv27I/8P7t27ZIkTZ9ue6MeAGBiMw2g1tZWbdq0SU888YSqq6vV0dEhScpms6qoqNC+ffu0adMm/eEf/qGmTJmi3bt366677tIVV1yhhQsXjskGAADGJ9MA2rBhg6R332z6Pz388MO66aablE6n9dxzz+mBBx5Qf3+/mpubtWrVKn39618ftQUDACYG85/gPkxzc7Pa29tPa0HvqW3IKuOZORZl/DO+UinbK8/Lkv45WaW8LW+qUPDPgitL2tY9VPKvP3LU9tL3dNo/e0+S6qb5Z6r1GPa3JE2q9N/nccl2fI539XnXppO25zHf/u2bpvqXtr3iXfvJyy4z9Z49v967dsjZssYSCf/jacl2k6TIcJeIbDcrJRL+GWmSlO/0vy8X4ymm3rMX+b8o68DRI6befSX/jMFi5H+/Lw769SULDgAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQxCl/HtBYc8mSXJlfdErsYu++ZTJGbAz4R2z0H+8y9U4YYoHKKipMvVPl/rEZA122eJUjb3eZ6tMV/jez2qx/rJIkNTb475ehgSFT7+Nvd3jX5ou241NTU26qn1TpX18YsB3PdOR/fIrGOKM44X8bN6blKPqIaLD/yZAIJEkaGiqa6uvqpnnX1lbPN/UuK/OPsiqp2tS733CfiOW/v4s5v1rOgAAAQTCAAABBMIAAAEEwgAAAQTCAAABBMIAAAEEwgAAAQTCAAABBMIAAAEEwgAAAQTCAAABBnLVZcKl0Rul0xqs2MqRIubwty+rYoXe8a6PIPytJkjLpSu/awYItx6yQ919LnLMFZR0bPGaqr23yz6WbUl1j6l2Ie7xrB3P+uX6SlCjzv3vkCrbbVVWtLZNw/kXneNce+d3bpt79Ped616aqbZl3ueKAd23SGthmuL+5yNa7lPDPl5SkoSjnX1y0HZ/Ow8e9a7uKtnXHKf+MwYQhBzCR8KvlDAgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEMRZG8XjiiW5omecQ5T07psu86+VpOnn1HvXRsb4jnzRP77jeEeXqXfPsX7vWtdni/mpqLbFmlRnp3rXZtJTTL2P9XZ41xbyeVPv8gr/2JlC/6Cpdylh2+d1U/33y5G3/I+9JL21b7937fyF80y9c8Vu79pS0nb/SUZ+UV3/f3dTb5ey/W5eKvOPeep3R229Y/+H6UlJ430zXfSujWP/WKVC5Lc/OAMCAATBAAIABMEAAgAEwQACAATBAAIABMEAAgAEwQACAATBAAIABMEAAgAEwQACAATBAAIABHHWZsEdeO2g0uUpr9pkwj/fLZWxZcFlMv7ZStbekyr8tk+SqhL+tZLUNM0/wy6f7jH1jlP+uVeSlJ3qvxYlK029ayY3edeW19v2Yb7bPz/sWOXbpt6DA7bsuGKvf+5Zuef95j0dh970rp1cV2vqPeWcKu/annyXqbcz3N0SkS1nLoqcqT5p2OVRZMsB7Os67l2bssUdqqEp613bG/vfZuOYLDgAwFnMNIA2bNighQsXqqamRjU1NWppadHPf/7z4etzuZxaW1s1ZcoUVVVVadWqVers7Bz1RQMAxj/TAJoxY4a+9a1vaefOndqxY4euuuoqXXvttXrllVckSXfddZeefPJJPfbYY2pvb9ehQ4d0/fXXj8nCAQDjm+k5oGuuuWbE13/7t3+rDRs2aPv27ZoxY4Yeeughbdq0SVdddZUk6eGHH9YFF1yg7du361Of+tTorRoAMO6d8nNApVJJjz76qPr7+9XS0qKdO3eqWCxq2bJlwzULFizQzJkztW3btpP2yefz6unpGXEBAEx85gH061//WlVVVcpkMrrtttu0efNmXXjhhero6FA6nVZtbe2I+oaGBnV0nPxTK9va2pTNZocvzc3N5o0AAIw/5gE0f/587dq1Sy+++KJuv/12rV69Wq+++uopL2DdunXq7u4evhw8ePCUewEAxg/z+4DS6bTOO+88SdLixYv1n//5n/re976nG264QYVCQV1dXSPOgjo7O9XY2HjSfplMRpmM5bPdAQATwWm/DyiOY+XzeS1evFipVEpbtmwZvm7Pnj06cOCAWlpaTvfHAAAmGNMZ0Lp167Ry5UrNnDlTvb292rRpk7Zu3apnnnlG2WxWN998s9auXau6ujrV1NTojjvuUEtLC6+AAwB8gGkAHTlyRH/yJ3+iw4cPK5vNauHChXrmmWf0B3/wB5Kk7373u0okElq1apXy+byWL1+uH/7wh6e0sEJPLFfwi8+wnMblk0XTOvoThtgMY8RGddY/v6OpYZqtd5N/pE3HQJep91AmbapXynCEkrYskYT8I1Pyg7Zjn6rwz3ppmlVn6p3rtkXDbHv+V9612aztL+uzzpntXXv4rTdMvatr5nvXZrO2fdiV6/KuLau2xRNFCVsUT6nY6987zpl6Vxsivmqra029yxL+981I/rFkvrWmW+pDDz30odeXl5dr/fr1Wr9+vaUtAOBjiCw4AEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEOY07LHm3LsRGMW8f2xKZJijUdIWgRKNYRRPwZBokxsomHqX5f33ST5ni6gpOdvvLbl+Q7xO0da7JP/j6Yb8o0QkqZT0j0BJGo99bsB2Oyzm/fsPFWxrsdzXhorG23je/3Yb5WzxNwXD7TYqs/W2RvHEhsMZOVvvRNH/dpgv2aKsLPdly7Es5N6tdR+xrZH7qIoz7K233uJD6QBgAjh48KBmzJhx0uvPugEUx7EOHTqk6upqRdF//8ba09Oj5uZmHTx4UDU1NQFXOLbYzonj47CNEts50YzGdjrn1Nvbq6amJiU+JPD0rPsTXCKR+NCJWVNTM6EP/nvYzonj47CNEts50Zzudmaz2Y+s4UUIAIAgGEAAgCDGzQDKZDK65557lMlkQi9lTLGdE8fHYRsltnOiOZPbeda9CAEA8PEwbs6AAAATCwMIABAEAwgAEAQDCAAQxLgZQOvXr9e5556r8vJyLVmyRP/xH/8Rekmj6pvf/KaiKBpxWbBgQehlnZYXXnhB11xzjZqamhRFkR5//PER1zvndPfdd2v69OmqqKjQsmXL9Prrr4dZ7Gn4qO286aabPnBsV6xYEWaxp6itrU2XXnqpqqurVV9fr+uuu0579uwZUZPL5dTa2qopU6aoqqpKq1atUmdnZ6AVnxqf7bzyyis/cDxvu+22QCs+NRs2bNDChQuH32za0tKin//858PXn6ljOS4G0E9+8hOtXbtW99xzj371q19p0aJFWr58uY4cORJ6aaPqoosu0uHDh4cvv/zlL0Mv6bT09/dr0aJFWr9+/Qmvv//++/X9739fDz74oF588UVNmjRJy5cvVy6XO8MrPT0ftZ2StGLFihHH9pFHHjmDKzx97e3tam1t1fbt2/Xss8+qWCzq6quvVn9//3DNXXfdpSeffFKPPfaY2tvbdejQIV1//fUBV23ns52SdMstt4w4nvfff3+gFZ+aGTNm6Fvf+pZ27typHTt26KqrrtK1116rV155RdIZPJZuHLjssstca2vr8NelUsk1NTW5tra2gKsaXffcc49btGhR6GWMGUlu8+bNw1/HcewaGxvdt7/97eHvdXV1uUwm4x555JEAKxwd799O55xbvXq1u/baa4OsZ6wcOXLESXLt7e3OuXePXSqVco899thwzX/91385SW7btm2hlnna3r+dzjn3+7//++7P//zPwy1qjEyePNn9/d///Rk9lmf9GVChUNDOnTu1bNmy4e8lEgktW7ZM27ZtC7iy0ff666+rqalJc+bM0Re/+EUdOHAg9JLGzP79+9XR0THiuGazWS1ZsmTCHVdJ2rp1q+rr6zV//nzdfvvtOnr0aOglnZbu7m5JUl1dnSRp586dKhaLI47nggULNHPmzHF9PN+/ne/58Y9/rKlTp+riiy/WunXrNDAwEGJ5o6JUKunRRx9Vf3+/WlpazuixPOvCSN/vnXfeUalUUkNDw4jvNzQ06LXXXgu0qtG3ZMkSbdy4UfPnz9fhw4d177336jOf+YxefvllVVdXh17eqOvo6JCkEx7X966bKFasWKHrr79es2fP1r59+/RXf/VXWrlypbZt26ak4TOHzhZxHOvOO+/U5ZdfrosvvljSu8cznU6rtrZ2RO14Pp4n2k5J+sIXvqBZs2apqalJu3fv1le/+lXt2bNHP/vZzwKu1u7Xv/61WlpalMvlVFVVpc2bN+vCCy/Url27ztixPOsH0MfFypUrh/+9cOFCLVmyRLNmzdJPf/pT3XzzzQFXhtN14403Dv/7kksu0cKFCzV37lxt3bpVS5cuDbiyU9Pa2qqXX3553D9H+VFOtp233nrr8L8vueQSTZ8+XUuXLtW+ffs0d+7cM73MUzZ//nzt2rVL3d3d+qd/+ietXr1a7e3tZ3QNZ/2f4KZOnapkMvmBV2B0dnaqsbEx0KrGXm1trc4//3zt3bs39FLGxHvH7uN2XCVpzpw5mjp16rg8tmvWrNFTTz2lX/ziFyM+NqWxsVGFQkFdXV0j6sfr8TzZdp7IkiVLJGncHc90Oq3zzjtPixcvVltbmxYtWqTvfe97Z/RYnvUDKJ1Oa/HixdqyZcvw9+I41pYtW9TS0hJwZWOrr69P+/bt0/Tp00MvZUzMnj1bjY2NI45rT0+PXnzxxQl9XKV3P/X36NGj4+rYOue0Zs0abd68Wc8//7xmz5494vrFixcrlUqNOJ579uzRgQMHxtXx/KjtPJFdu3ZJ0rg6nicSx7Hy+fyZPZaj+pKGMfLoo4+6TCbjNm7c6F599VV36623utraWtfR0RF6aaPmL/7iL9zWrVvd/v373b/927+5ZcuWualTp7ojR46EXtop6+3tdS+99JJ76aWXnCT3ne98x7300kvuzTffdM45961vfcvV1ta6J554wu3evdtde+21bvbs2W5wcDDwym0+bDt7e3vdl7/8Zbdt2za3f/9+99xzz7nf+73fc/PmzXO5XC700r3dfvvtLpvNuq1bt7rDhw8PXwYGBoZrbrvtNjdz5kz3/PPPux07driWlhbX0tIScNV2H7Wde/fudffdd5/bsWOH279/v3viiSfcnDlz3BVXXBF45TZf+9rXXHt7u9u/f7/bvXu3+9rXvuaiKHL/8i//4pw7c8dyXAwg55z7wQ9+4GbOnOnS6bS77LLL3Pbt20MvaVTdcMMNbvr06S6dTrtzzjnH3XDDDW7v3r2hl3VafvGLXzhJH7isXr3aOffuS7G/8Y1vuIaGBpfJZNzSpUvdnj17wi76FHzYdg4MDLirr77aTZs2zaVSKTdr1ix3yy23jLtfnk60fZLcww8/PFwzODjo/uzP/sxNnjzZVVZWus997nPu8OHD4RZ9Cj5qOw8cOOCuuOIKV1dX5zKZjDvvvPPcX/7lX7ru7u6wCzf60z/9Uzdr1iyXTqfdtGnT3NKlS4eHj3Nn7ljycQwAgCDO+ueAAAATEwMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEAQDCAAQBAMIABAEAwgAEMT/B5JVDaVYFj2wAAAAAElFTkSuQmCC\n" + }, + "metadata": {} + } + ], + "source": [ + "x_train = (x_train - np.min(x_train)) / (np.max(x_train) - np.min(x_train))\n", + "plt.imshow(x_train[800])" + ] + }, + { + "cell_type": "markdown", + "source": [ + "**Grayscale Conversion** refers to the conversion of a colored image in RGB scale into a grayscale image. It represents the pixel intensities without considering colors, which makes calculations easier." + ], + "metadata": { + "id": "bfgy0Z_gX_lH" + } + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "P2oPvZkbfEPo" + }, + "outputs": [], + "source": [ + "grayscale = []\n", + "for i in x_train:\n", + " grayImage = 0.07 * i[:,:,2] + 0.72 * i[:,:,1] + 0.21 * i[:,:,0]\n", + " grayscale.append(grayImage)\n", + "x_train_gray = np.asarray(grayscale)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "jzQ2Zulg99NU" + }, + "source": [ + "## Defining DoFns for Image Preprocessing\n", + "\n", + "[DoFn](https://beam.apache.org/releases/typedoc/current/interfaces/transforms_pardo.DoFn) stands for \"Do Function\". In Apache Beam, it is a set of operations that can be applied to individual elements of a PCollection (a collection of data). It is similar to a function in Python, except that it is used in Beam Pipelines to apply various transformations. DoFns can be used in various Apache Beam transforms, such as ParDo, Map, Filter, and FlatMap." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "cqm-m0cONsZS" + }, + "outputs": [], + "source": [ + "class StandardizeImage(beam.DoFn):\n", + " def process(self, element: np.ndarray):\n", + " element = element/255.0\n", + " return [element]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "mZhFCgPxPEwm" + }, + "outputs": [], + "source": [ + "class NormalizeImage(beam.DoFn):\n", + " def process(self, element: np.ndarray):\n", + " element = (element-element.min())/(element.max()-element.min())\n", + " return [element]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "gv23KPt5NyXT" + }, + "outputs": [], + "source": [ + "class GrayscaleImage(beam.DoFn):\n", + " def process(self, element: np.ndarray):\n", + " element = 0.07 * element[:,:,2] + 0.72 * element[:,:,1] + 0.21 * element[:,:,0]\n", + " return [element]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "8gz7_SvN-P2L" + }, + "source": [ + "## Training a Convolutional Neural Network\n", + "\n", + "A Convolutional Neural Network (CNN) is one of the most popular model types for image processing. Here is a brief description of the convolutional layers used in the model.\n", + "* **Reshape**: Changes the shape of the input data to the desired size.\n", + "The CIFAR-10 images are of 32x32 pixels in grayscale. We will train our model using these images and thus, all images fed into the model need to be reshaped to the required size, that is (32,32,1).\n", + "* **Conv2D**: Applies a set of filters to extract features from the input image, producing a feature map as the output.\n", + "This layer is used as it is an essential component of a CNN, and does the major task of finding patterns in images.\n", + "* **MaxPooling2D**: Reduces the spatial dimensions of the input while retaining the most prominent features.\n", + "We use this layer to downsample the images and preserve only the important features.\n", + "* **Flatten**: Flattens the input data or feature maps into a 1-dimensional vector.\n", + "The input images are 2-dimensional. However in the end we require our results in a 1-D array. Flatten layer is used for this.\n", + "* **Dense**: Connects every neuron in the current layer to every neuron in the subsequent layer.\n", + "The CIFAR-10 dataset contains images belonging to 10 different classes. This is why the last dense layer gives 10 outputs, where each output corresponds to the probability of an image belonging to one of the 10 classes." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "chYD9y7cH4Td", + "outputId": "b91eed4e-c383-40b8-96dc-8cf330d11a09" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Model: \"sequential\"\n", + "_________________________________________________________________\n", + " Layer (type) Output Shape Param # \n", + "=================================================================\n", + " reshape (Reshape) (None, 32, 32, 1) 0 \n", + " \n", + " conv2d (Conv2D) (None, 30, 30, 32) 320 \n", + " \n", + " max_pooling2d (MaxPooling2D (None, 15, 15, 32) 0 \n", + " ) \n", + " \n", + " conv2d_1 (Conv2D) (None, 13, 13, 64) 18496 \n", + " \n", + " max_pooling2d_1 (MaxPooling (None, 6, 6, 64) 0 \n", + " 2D) \n", + " \n", + " conv2d_2 (Conv2D) (None, 4, 4, 64) 36928 \n", + " \n", + " flatten (Flatten) (None, 1024) 0 \n", + " \n", + " dense (Dense) (None, 64) 65600 \n", + " \n", + " dense_1 (Dense) (None, 10) 650 \n", + " \n", + "=================================================================\n", + "Total params: 121,994\n", + "Trainable params: 121,994\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "def create_model():\n", + " model = tf.keras.Sequential([\n", + " tf.keras.layers.Reshape((32,32,1),input_shape=x_train_gray.shape[1:]),\n", + " tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 1)),\n", + " tf.keras.layers.MaxPooling2D((2, 2)),\n", + " tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),\n", + " tf.keras.layers.MaxPooling2D((2, 2)),\n", + " tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),\n", + " tf.keras.layers.Flatten(),\n", + " tf.keras.layers.Dense(64, activation='relu'),\n", + " tf.keras.layers.Dense(10)\n", + " ])\n", + " model.compile(optimizer='adam',\n", + " loss='sparse_categorical_crossentropy',\n", + " metrics=['accuracy'])\n", + " return model\n", + "\n", + "model = create_model()\n", + "model.summary()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The input shape is changed to (32,32,1) as our input images are of 32 x 32 pixels and 1 represents grayscale. In the final dense layer, there are 10 outputs as there are 10 possible classes in the CIFAR-10 dataset." + ], + "metadata": { + "id": "UpO090vNbHir" + } + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3D1SdCC94DQi" + }, + "source": [ + "## Fitting the model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "KuMP46UVXkof", + "outputId": "5340424c-7a33-45c9-b773-3ff625c65290" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 1/10\n", + "1563/1563 [==============================] - 87s 55ms/step - loss: 1.6511 - accuracy: 0.4054\n", + "Epoch 2/10\n", + "1563/1563 [==============================] - 84s 54ms/step - loss: 1.2737 - accuracy: 0.5540\n", + "Epoch 3/10\n", + "1563/1563 [==============================] - 80s 51ms/step - loss: 1.1204 - accuracy: 0.6095\n", + "Epoch 4/10\n", + "1563/1563 [==============================] - 79s 51ms/step - loss: 1.0184 - accuracy: 0.6461\n", + "Epoch 5/10\n", + "1563/1563 [==============================] - 80s 51ms/step - loss: 0.9430 - accuracy: 0.6724\n", + "Epoch 6/10\n", + "1563/1563 [==============================] - 81s 52ms/step - loss: 0.8810 - accuracy: 0.6946\n", + "Epoch 7/10\n", + "1563/1563 [==============================] - 80s 51ms/step - loss: 0.8299 - accuracy: 0.7135\n", + "Epoch 8/10\n", + "1563/1563 [==============================] - 80s 51ms/step - loss: 0.7904 - accuracy: 0.7248\n", + "Epoch 9/10\n", + "1563/1563 [==============================] - 80s 51ms/step - loss: 0.7504 - accuracy: 0.7385\n", + "Epoch 10/10\n", + "1563/1563 [==============================] - 84s 54ms/step - loss: 0.7150 - accuracy: 0.7498\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": {}, + "execution_count": 22 + } + ], + "source": [ + "model.fit(x_train_gray, y_train, epochs=10)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3obkK5fQ4KG6" + }, + "source": [ + "## Authenticating from Google Cloud\n", + "\n", + "We need to store our trained model in Google Cloud. For running inferences, we will load our model from cloud into the notebook using a Model Handler." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Jj_NX568mhsE" + }, + "outputs": [], + "source": [ + "from google.colab import auth\n", + "auth.authenticate_user()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "7jn7HYPi4hH9" + }, + "source": [ + "Saving the trained model in a Google Cloud Storage bucket" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "CDqLPkzLfrt1" + }, + "outputs": [], + "source": [ + "save_model_dir = '' # Add the link to you GCS bucket here\n", + "model.save(save_model_dir)" + ] + }, + { + "cell_type": "markdown", + "source": [ + "A model handler is used to save, load and manage trained ML models. Here we used TFModelHandlerNumpy as our input images are in the form of numpy arrays." + ], + "metadata": { + "id": "ilYg15uOcZSY" + } + }, + { + "cell_type": "code", + "source": [ + "model_handler = TFModelHandlerNumpy(save_model_dir)" + ], + "metadata": { + "id": "RqefS6I_c1kc" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "### Saving predictions\n", + "RunInference returns the predictions for each class. In the below DoFn, the maximum predicion is selected (which refers to the class the input image most probably belongs to) and is stored in a list of predictions." + ], + "metadata": { + "id": "4vJZEXFOboUi" + } + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "9T_YW19P46dW" + }, + "outputs": [], + "source": [ + "from tensorflow.python.ops.numpy_ops import np_config\n", + "np_config.enable_numpy_behavior()\n", + "predictions = []\n", + "class SavePredictions(beam.DoFn):\n", + " def process(self, element, *args, **kwargs):\n", + " list_of_predictions = element.inference.tolist()\n", + " highest_prediction = max(list_of_predictions)\n", + " ans = labels[list_of_predictions.index(highest_prediction)]\n", + " predictions.append(ans)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "c5x1HD_V4-RS" + }, + "source": [ + "## Building a Beam Pipeline\n", + "\n", + "A Pipeline represents the workflow of a series of computations. Here we are performing the following tasks in our pipeline:\n", + "* Creating a PCollection of the data on which we need to run inference\n", + "* Appying the Image Preprocessing DoFns we defined earlier
\n", + " These include:\n", + " 1. Standardization\n", + " 2. Normalization\n", + " 3. Converting to grayscale\n", + "* Running Inference by using the trained model stored in Google Cloud.\n", + "* Displaying the output of the model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "KxYdNXefTFcD" + }, + "outputs": [], + "source": [ + "with beam.Pipeline() as p:\n", + " _ = (p | beam.Create(x_test)\n", + " | beam.ParDo(StandardizeImage())\n", + " | beam.ParDo(NormalizeImage())\n", + " | beam.ParDo(GrayscaleImage())\n", + " | RunInference(model_handler)\n", + " | beam.ParDo(SavePredictions())\n", + " )" + ] + }, + { + "cell_type": "markdown", + "source": [ + "So we got our predictions! Let us verify one of them." + ], + "metadata": { + "id": "yCADuo_yk1sK" + } + }, + { + "cell_type": "code", + "source": [ + "index = 5000\n", + "#You can change this index value to see and verify any image\n", + "predictions[index]" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "id": "Zj2p_V2qmYMM", + "outputId": "f45c4f9f-3fa2-49f9-8471-602eea8faf68" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'Horse'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 40 + } + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 447 + }, + "id": "kd5fXda1yr6G", + "outputId": "51589888-2986-4d99-a6a3-c89ff24ebd9e" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": {}, + "execution_count": 30 + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaAAAAGdCAYAAABU0qcqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAxWElEQVR4nO3dfXTU9Z33/9fMZGZynxBC7iQgNwqigIqCuawuAstNr+NPK2d/2na72Hr06EavVbbblp5Wq7t7xbVnW9teiNfvrCvb31W0ulfR6rZaRQl1BSpUimiLgEFAkiA3uZtkksnM9/rDy7RRkM8bEj5JfD7OmXMk8/adz3e+M9/3fDMzrwkFQRAIAIAzLOx7AQCATycGEADACwYQAMALBhAAwAsGEADACwYQAMALBhAAwAsGEADAiyzfC/ioTCajgwcPqqCgQKFQyPdyAABGQRCovb1dVVVVCodPfJ4z5AbQwYMHVV1d7XsZAIDTtH//fo0dO/aE1w/aAFq5cqW++93vqqmpSTNnztSPfvQjzZ49+6T/X0FBgSRpes1cRbLcllc5psx5XT29vc61kqSY+0102SVzTK2L8guda48dazH1nj79fOfastLRpt652VFTfTQcca4tKi4w9X777V3Otel0xtR77FlVzrU//4+fm3q/07DTVN/b2+lc251JmXonetLOtXlJ220YNuz7cDxm6p04fMS5tjPZauptPU5kMu63yyedERy33hCWlhXYeqej7vVpuS+ktzetzZt+13c8P5FBGUA//elPtXz5cj388MOaM2eOHnzwQS1atEg7d+5UWdknD4sP/+wWycpSJMvtQBeNut9xM9Y/60XdD7bZ2Tmm1jk5uc61XV3dpt65eXnOtXn5+abeedm2A0U04n4QKihwH8qSlJfnvvZ02v1AK0n5J3nw/Kns7GxT71jMdhuGw+4HRMOxUJIUNbwUHDUOcdMAihmf2ETdD19ZvbZDXcZwsJWkTMb9uDKUBlAoy70+ZLxNJJ30ZZRBeRPC9773Pd1888368pe/rGnTpunhhx9Wbm6u/vVf/3Uwfh0AYBga8AHU09OjrVu3asGCBX/8JeGwFixYoI0bN36svru7W21tbf0uAICRb8AH0OHDh5VOp1VeXt7v5+Xl5WpqavpYfV1dnYqKivouvAEBAD4dvH8OaMWKFWptbe277N+/3/eSAABnwIC/CaG0tFSRSETNzc39ft7c3KyKioqP1cfjccXj8YFeBgBgiBvwM6BYLKZZs2Zp3bp1fT/LZDJat26dampqBvrXAQCGqUF5G/by5cu1bNkyXXLJJZo9e7YefPBBJRIJffnLXx6MXwcAGIYGZQBdf/31ev/993X33XerqalJF154oZ577rmPvTEBAPDpFQqCwP7pokHU1tamoqIiffObX1d2tttrQwvmzXPuv/G135jW885B9zdFXD1/ial3ssv9g5H7G5tPXvQnLB8Wzc+2/SU2mbS9Vb61tcW5NjvH9oHOg+8ddK5tPNho6p0Vcn9tsvmQbf+0dBwz1fdmepxr80YXmXoHhg8Kh450mHq7pplIUlev+zZKUtDp/uHsXtnSIUJh2wfWLR+4tX4gOki7H6KDjO2xnHJfttKGm6S3N62tr72p1tZWFRae+MPl3t8FBwD4dGIAAQC8YAABALxgAAEAvGAAAQC8YAABALxgAAEAvGAAAQC8YAABALxgAAEAvBiULLiB8Jtfv6ioY4zHb19d79y3S7YYjKSh/s1Xfm3qHY2Pcq6ddvFsU+/db73hXJtqs8XIZEK22zCVyTjXxmLuEUKSJEM8SCwrampdWlDqXNvV2mrq3d2dNNWnDU8VYylbulZOtuF2idgOGaGw+8IjhkggSQpF3dedMsTZSFLGlsSj3rT7fby31xrF4947ZMnLkZQybGg65H4busYNcQYEAPCCAQQA8IIBBADwggEEAPCCAQQA8IIBBADwggEEAPCCAQQA8IIBBADwggEEAPCCAQQA8GLIZsE1HTyoSMRtPvYG7llJuWWjTeuIF+Y516aTnabeQeDeW6G4qXc8nutc25HsNvVW3JbXFooY1h6y3SVdM6ckqSvZa+pddnaZc20Qtq279eB7pvog7J6T1ivbfSUdcd+fGeN2RgL3rLHuVMrUO5Nyf9x3u5dKsh1TJCljqE8bc+lCve718ZAtCy6Tce+dMWTBufblDAgA4AUDCADgBQMIAOAFAwgA4AUDCADgBQMIAOAFAwgA4AUDCADgBQMIAOAFAwgA4MWQjeLJCmcpEnacjyH3ORqEbTElkWz3uJysaIepd5YhRibLEMchSdnxfOfa4opKU+9ET8JU39PmXh+KGOKJJLUfa3OuLeqxPd9qeeegc+2xkG3fZ9Rjqg/1usfl9KTc71eSJMP9UIGtd07SEN+StEXx9PS6RyuF0ra4qYxs29lruGuF07aYn6yMe7xOxnAslKSM6zFWkiKWceF2+3EGBADwggEEAPCCAQQA8IIBBADwggEEAPCCAQQA8IIBBADwggEEAPCCAQQA8IIBBADwggEEAPBiyGbBBUFIQeCWgRQY5mjgHh8lSQor6lzbGXPPbJIkpd3zwLrUaWp99jnVzrVjiiebev/+je2m+j1H33auTaVtz4mqJpzrXHtZ9TRT7/bDLc617zbuMPUuyC8w1We63e+4iVSXqXc0UuhcW1Babuqd2+WeqZY86J69J0k9YcPhy5iRFjJmwWVF3PvHYxFbb0tWX8aWMRjIPZcuZckBdKzlDAgA4MWAD6DvfOc7CoVC/S5Tp04d6F8DABjmBuVPcOeff75efPHFP/6SrCH7lz4AgCeDMhmysrJUUVExGK0BACPEoLwGtGvXLlVVVWnixIn64he/qH379p2wtru7W21tbf0uAICRb8AH0Jw5c7R69Wo999xzWrVqlRoaGnTFFVeovb39uPV1dXUqKirqu1RXu797CwAwfA34AFqyZIn+4i/+QjNmzNCiRYv0i1/8Qi0tLXriiSeOW79ixQq1trb2Xfbv3z/QSwIADEGD/u6A4uJinXvuudq9e/dxr4/H44rH44O9DADAEDPonwPq6OjQnj17VFlZOdi/CgAwjAz4APrqV7+q+vp67d27V6+++qo+97nPKRKJ6POf//xA/yoAwDA24H+CO3DggD7/+c/ryJEjGjNmjD7zmc9o06ZNGjNmjKlPKpxSJuw2H6MR9wic3CxbXE6uAufaaGCL2Ah63GMzco69b+o9tcQ9XmeUMf5m4vmzTPXbs0qca599fZup956md51rJ5bNNPW+cPZVzrV/+HWrqfe0c2x/EehsP+Jcu7Xh+H/uPpEc5TrXThx3tql3QcT9EJPsdY+FkaREs3t0T/k4W9yU9WWBjlb3d+9OPWeKqfeRJvftfG/fH0y949nu2xnLc4+PSqVSeuP135+0bsAH0OOPPz7QLQEAIxBZcAAALxhAAAAvGEAAAC8YQAAALxhAAAAvGEAAAC8YQAAALxhAAAAvGEAAAC8YQAAALwb96xhO1QX5eYpG3LLVCmL5zn2Li9xzySQpJ+reO1Jouzmz3Fsrv73D1DvvnQbn2lRnl6l3OmrLyRqXV+hcm+nqNvV+r8k9I23bW3tMvXvD7tvZG46aeucY7rOSVD3J/SvuGw7bvlW4/VDSufaNw2+beocy7nmHzY227wLrTrv3Lkr1mnpPnWTLaxt/sXu2X/VZY02943nuWX29huxKSeq2RGPGc5xLOxMJ/eoXL5y0jjMgAIAXDCAAgBcMIACAFwwgAIAXDCAAgBcMIACAFwwgAIAXDCAAgBcMIACAFwwgAIAXQzaKZ0GsSDlZblE8QZd7zEbWIVtMSV6h2xokKVo4xtQ7k+Me35IMOk29u4+871zbe7TV1DsesT1v6cjJc67NdLWbepeMco+0SStl6v3ypnrn2tLKAlPviWefa6ofXeAeZ5S/bZepd8Pu3c61jY0HTL2TPe6Pt97uhKl32HD02rXvXVPvmZNtUTwXnj/Tufbo0WOm3qPHuEf3tKVjpt7bf/eGc+3h1ibn2u6k2/GKMyAAgBcMIACAFwwgAIAXDCAAgBcMIACAFwwgAIAXDCAAgBcMIACAFwwgAIAXDCAAgBcMIACAF0M2Cy7o6lIQccthSxv6ZkVtmxyKZZxrSyttWXDHQoFzbV5Rhal39yH3vKnD779p6h1Eekz1DYc7nGuPtB8x9T7S6Z4f9mbClqc36+L/4lxbWV5i6n2gqdFU39jofrvsevMdU++9+/7gXNveYcsxS/e631cipkeyFDI8fe7Nsj3X3rjd9pgoqJzuXNt8xJZ5d/TVt51rS0aPNvU+9P5h59r3j7jfB3tT3U51nAEBALxgAAEAvGAAAQC8YAABALxgAAEAvGAAAQC8YAABALxgAAEAvGAAAQC8YAABALxgAAEAvBiyWXDVsz6jvFjMqTaWl+fcN5Jxz1+TpIPN7pld6cmlpt6RnqRzbWkk29S7xZDbdDDca+r9+uEuU/22LvfnOR29cVPvTE+Lc21LypYz19Cwx7l2dEm+qfd/PP+cqb7laItz7bv79pt6t3a557uFwra8tqywe5ZiJGRqrVgs6lybTNvW3dNlu4+PGzfOuXZ/43ZT77jhhhk7OtfUu6r4LOfa0LlVzrXJZKc2/O+T13EGBADwwjyANmzYoKuvvlpVVVUKhUJ66qmn+l0fBIHuvvtuVVZWKicnRwsWLNCuXbsGar0AgBHCPIASiYRmzpyplStXHvf6Bx54QD/84Q/18MMPa/PmzcrLy9OiRYuUTLr/uQkAMPKZXwNasmSJlixZctzrgiDQgw8+qG9961u65pprJEk//vGPVV5erqeeeko33HDD6a0WADBiDOhrQA0NDWpqatKCBQv6flZUVKQ5c+Zo48aNx/1/uru71dbW1u8CABj5BnQANTU1SZLKy8v7/by8vLzvuo+qq6tTUVFR36W6unoglwQAGKK8vwtuxYoVam1t7bvs3297CykAYHga0AFUUVEhSWpubu738+bm5r7rPioej6uwsLDfBQAw8g3oAJowYYIqKiq0bt26vp+1tbVp8+bNqqmpGchfBQAY5szvguvo6NDu3bv7/t3Q0KBt27appKRE48aN05133ql/+Id/0DnnnKMJEybo29/+tqqqqnTttdcO5LoBAMOceQBt2bJFV111Vd+/ly9fLklatmyZVq9era997WtKJBK65ZZb1NLSos985jN67rnnlJ1tjJJpbFBP1C1qIxS4n8jFZcv7SCU6nGsbf2f7rFM84hY1JElNKdvJ6sFW93iVdYcPmnrvC59tqp/92c8716be+LWp96//82nn2vPPm2nqfdHFn3GuTad7TL1TmYipfs9e9w9zRyLu8TeSFIu6PyZ6e21RVmG518ez3KN1JCmW5f6YKB5VbOr9/17zX0318y5zv2+dU11m6t3c7P74HFNSYOodd4w7k6TAsOs7HI+b5gE0d+5cBZ+wklAopPvuu0/33XeftTUA4FPE+7vgAACfTgwgAIAXDCAAgBcMIACAFwwgAIAXDCAAgBcMIACAFwwgAIAXDCAAgBcMIACAF+YonjOl893fSxG3+djdnXLuW2z8uoc8S4bdIVNrlVZPdq7d1d5l6v3vb+51rn0z6Z4HJUlnTb/IVH+kJ9+59pKL5pl6t7cc/4sOjyeVtuWY5RdUOdfmZOeYeh892m6qD8K/da5NptxzACUpK+KeSxcObFmK8Sz3+9aFM8439T5y9H3n2rQxZ660rMhUf2D/751rU73dpt7xeMK59mire3blB9z3ZzqTdq7t7Ox0quMMCADgBQMIAOAFAwgA4AUDCADgBQMIAOAFAwgA4AUDCADgBQMIAOAFAwgA4AUDCADgxZCN4inKLlCuY0RIazjp3LczsMWxJOVeH+TZ4j52HD3oXPsf2/eaev9mn3scS9FZ00y99za3mer3v/Oqc+3ci6aaep8zabpz7a83bzT1fuONd51r/+tnrzb1nnWJezyRJL225dfOtYmEWwzKh4oL3WOEOjuMUS+G+JazqipNrYNQxrn2vRZbPNFrv3vNVL/9ze3OtZGI+7olSWH3Y1BHj611qrfXudYSwtTT7bYQzoAAAF4wgAAAXjCAAABeMIAAAF4wgAAAXjCAAABeMIAAAF4wgAAAXjCAAABeMIAAAF4wgAAAXgzZLLi90Zhystyy4Nqy3OdowpgFlw6757s1Hjhs6v3qrgbn2r1ttpCndLjQubbtaJOp9zkV55jqp06b5Vwbzoqbevd2tTrXlpVPMPXOLih1rt2z/z1T7/37f2eq70y6Z3ZlMjFT75jheWhR2ShT76y422NYkoKo7XBUWFrhXBsb7f54kKQjxxpN9SFDUlpnZ8LUu7vH/bGfnZNr6p3OuOfSJbu6nGt7U273V86AAABeMIAAAF4wgAAAXjCAAABeMIAAAF4wgAAAXjCAAABeMIAAAF4wgAAAXjCAAABeDNkonm1VYxWLusXgdGfc43W6etwjTSRJIfcokb279ptav3vMfS1BLNvUO0innGuTiUOm3l3H9pjqy0tmO9cWFZWbeoej7lEiuw/Y9s9bu3/rXLtj5yum3j0dtvij7q6jzrWRTKep96FD7lEv0ZjtOWt+UZ5zbcg9zUaSNP2C85xru7raTL0LCvJN9YWF7lE/GUP8jSSFQu63eU627ThhSBBSyLCDurqSWvcfG05axxkQAMALBhAAwAvzANqwYYOuvvpqVVVVKRQK6amnnup3/Y033qhQKNTvsnjx4oFaLwBghDAPoEQioZkzZ2rlypUnrFm8eLEaGxv7Lo899thpLRIAMPKY34SwZMkSLVmy5BNr4vG4Kircv6sDAPDpMyivAa1fv15lZWWaMmWKbrvtNh05cuSEtd3d3Wpra+t3AQCMfAM+gBYvXqwf//jHWrdunf7pn/5J9fX1WrJkidLp9HHr6+rqVFRU1Heprq4e6CUBAIagAf8c0A033ND339OnT9eMGTM0adIkrV+/XvPnz/9Y/YoVK7R8+fK+f7e1tTGEAOBTYNDfhj1x4kSVlpZq9+7dx70+Ho+rsLCw3wUAMPIN+gA6cOCAjhw5osrKysH+VQCAYcT8J7iOjo5+ZzMNDQ3atm2bSkpKVFJSonvvvVdLly5VRUWF9uzZo6997WuaPHmyFi1aNKALBwAMb+YBtGXLFl111VV9//7w9Ztly5Zp1apV2r59u/7t3/5NLS0tqqqq0sKFC/X3f//3isfjpt/TnOlR1DHjLZV0z1TLzrJlJbW2djjXNhxuMfXOxHKca8Mh97w7SRo1yj2DKyxb7717Npvqf7qm0bl26vmXm3rnFrpnx3V0tZh6dyTeca7NUtLUu7f7mKk+K2h3rg0F7jmAkhRE3DO+unuP/2aiE0k0tzrXjq8ea+r9lb+83rm2N2nbP/GY7XgVDrvfhtFozNQ7FnPLxPxgHbY/alke+YEhc7O9vUNf/bv7TlpnHkBz585VEJx4Ic8//7y1JQDgU4gsOACAFwwgAIAXDCAAgBcMIACAFwwgAIAXDCAAgBcMIACAFwwgAIAXDCAAgBcMIACAFwP+fUAD5fqr5io3xy23LaSIc9+SohLTOh5/4mfOtVs7j5p658Xdc+niIdtzhVGF7jlzZWdVmXq//fbbpvqjR951rt30myZT7+xs96/vKB41ytS7OMs9BzDZ6Z7VJkkJ432lN+Oe7xYxZLtJUuYTorU+XmxqrVjU/bFZXmp7bBbmu2ekdVrz8QL3fElJCoXctzPV22XqbanPitgO6b297tv5SRFsH9WRSDjVcQYEAPCCAQQA8IIBBADwggEEAPCCAQQA8IIBBADwggEEAPCCAQQA8IIBBADwggEEAPBiyEbx/D9XX63CggKn2t7AfY7u3feeaR2/37vXubans9XUe9q0s5xrjx05Zuq9951dzrX7m2y3SSQaM9VffsXFzrV5cdtzogPv7nWuTfccMvXOi+Q51yYj7rFKklSQO8ZUf6zdPernWJvtflg62j0CZ1Rhsan3vj17nWvbW23r7uxsca491u4WDfNHtvthfp77fSWTseUZGYKSlJU1eFE8ltpEkigeAMAQxgACAHjBAAIAeMEAAgB4wQACAHjBAAIAeMEAAgB4wQACAHjBAAIAeMEAAgB4wQACAHgxZLPgjh1rUm/KLf+qK5N27vu/nnjctI7Xd7zhXJtfkGvqfeMtNzrX7jFkaknS//gfDzvXphLuOWOSNGb0aFP9bV+6wbn2vIlVpt6t7S3OtT29llQtqast6VwbhGz5XrFcW3ZcY/NR59p77/uuqffs2Rc51y5cONfU+xtfu8+5NtHpnjUmSaGI+/PnwpwcU28FIVt92v0YZOxs+h/SqR5T61g06lybHXOvDRzz7jgDAgB4wQACAHjBAAIAeMEAAgB4wQACAHjBAAIAeMEAAgB4wQACAHjBAAIAeMEAAgB4MWSjeDKZlDKZlFPt7rd3Ofd9/rnnTOvo6XGP2Ljk4imm3hddNMO5duOrm029KyvKnGvLyspNvTs7OmxrKRvjXFs6qtjUu6gwz7m2x5aWo6yQIXok5H4/kaRQxBbIUlk51rm2rNQWlVRa4l4/6+KZpt6TJo13rk2nbTsoGo279zbunyBji20Kh92fy6cNsT2SFMkyHKZDtnV3J93jpnIscUaB2zo4AwIAeGEaQHV1dbr00ktVUFCgsrIyXXvttdq5c2e/mmQyqdraWo0ePVr5+flaunSpmpubB3TRAIDhzzSA6uvrVVtbq02bNumFF15QKpXSwoULlUgk+mruuusuPfPMM3ryySdVX1+vgwcP6rrrrhvwhQMAhjfTa0DPfeT1k9WrV6usrExbt27VlVdeqdbWVj3yyCNas2aN5s2bJ0l69NFHdd5552nTpk267LLLBm7lAIBh7bReA2ptbZUklZSUSJK2bt2qVCqlBQsW9NVMnTpV48aN08aNG4/bo7u7W21tbf0uAICR75QHUCaT0Z133qnLL79cF1xwgSSpqalJsVhMxcXF/WrLy8vV1NR03D51dXUqKirqu1RXV5/qkgAAw8gpD6Da2lrt2LFDjz9u+4bRj1qxYoVaW1v7Lvv37z+tfgCA4eGUPgd0++2369lnn9WGDRs0duwfP59QUVGhnp4etbS09DsLam5uVkVFxXF7xeNxxePu7+cHAIwMpjOgIAh0++23a+3atXrppZc0YcKEftfPmjVL0WhU69at6/vZzp07tW/fPtXU1AzMigEAI4LpDKi2tlZr1qzR008/rYKCgr7XdYqKipSTk6OioiLddNNNWr58uUpKSlRYWKg77rhDNTU1vAMOANCPaQCtWrVKkjR37tx+P3/00Ud14403SpK+//3vKxwOa+nSperu7taiRYv00EMPDchiAQAjh2kABQ75PtnZ2Vq5cqVWrlx5youSpHgsW/F4tlPtjh07nPu+9957p7qkk5pz6UWm+q2b3fPdnv/FL029v/SlLzrXNjTsM/Xef8B2GxbkFzjX9vS45f99KC33XK3Orh5T74jc6yNR2/t50oExmE7uuXRjz7K9kzTZ7X6b5+S6PSY/dN60c51rjxw5bOrdleg21Haaeodky+qLRCLOtX/6wX0X2YYMtlDEeD/MuN8Pe3rcHw8px1qy4AAAXjCAAABeMIAAAF4wgAAAXjCAAABeMIAAAF4wgAAAXjCAAABeMIAAAF4wgAAAXpzS1zGcCYnODoXDJ4/+kaT3D7/v3LcnZYtjKRnlHiNz9rixJy/6Ey//SWr4yVxy0QxT76XXXO1c+7/W/NTUu2Hvu6b6o8eOOteWFpabeqd73WNk8vJyTb0zvYZ1pG33q54e9xgZSYpnu39lyYm++uREjh5rca7NWG4USbPnXOxc+/xz6029E4YonuLCIlPvrk5bdI9DSlmffEM0lSRFY+4xTL3GiKdoyD1yyBI3FMlyGy2cAQEAvGAAAQC8YAABALxgAAEAvGAAAQC8YAABALxgAAEAvGAAAQC8YAABALxgAAEAvGAAAQC8GLJZcNFoXNGoW/5VkHHPM0p2GkKbJM1fcIlzbfVYWxbc0aNHnGu/9Jd/Zeo9dmyVc+2Xl/2lqXfaVC2tedw9a+6/3foVU+/CQvd8t0jUdncPZ7k/P+vpdb8PSlI8L89Uv3dfk3PtO+82mHpfcXmNc21OtnsumSRdOmu6c+2v61819d7zzl7n2jkXnW/qbYg9kySFwu77P5Ox5bV1dLQ618ZzbHmHPSn3bD/LuhMJtyw9zoAAAF4wgAAAXjCAAABeMIAAAF4wgAAAXjCAAABeMIAAAF4wgAAAXjCAAABeMIAAAF4M2SiedCaktGPETumo0c59L7v4XNM6bvrLpc61+w8cMPXOzslxrr3wQluUSE93h3NtYb7tbrDsi+63iST96KGHnWtXPvr/m3rX3nyjc+2oPFuIUDpwrw+H3felJL3x1jum+h+s+v+ca/MKbWu5at6FzrVdLYdNvfOi7pk2ebkxU+9Nv/mtc+2MaRNMvZPdbaZ6yT2mJtndZeocj2c71/b22CKhMmn3dVuieDK93U51nAEBALxgAAEAvGAAAQC8YAABALxgAAEAvGAAAQC8YAABALxgAAEAvGAAAQC8YAABALxgAAEAvBiyWXDhrLTCWW5ZXP/l8kuc+150kS1TLRR2n9H/8sjPTb0njBvvXJsVsuWY9XS2OtcGmZSpd2VR3FS/eG6Nc+1//+cfmnoX57nnZH3p87YMu1Co17k20emevSdJDz30P031W7a655498M/3mXpHs9zv44lEwtQ7NzvXuTY725YF96sXXnSuvXjaJFPvqVMmm+ozhsdQb8qW1xbNcq+Pxd2z9yQpyATOtV3JpHNtd5IsOADAEGYaQHV1dbr00ktVUFCgsrIyXXvttdq5c2e/mrlz5yoUCvW73HrrrQO6aADA8GcaQPX19aqtrdWmTZv0wgsvKJVKaeHChR87Lb/55pvV2NjYd3nggQcGdNEAgOHP9BrQc8891+/fq1evVllZmbZu3aorr7yy7+e5ubmqqKgYmBUCAEak03oNqLX1gxe6S0pK+v38Jz/5iUpLS3XBBRdoxYoV6uzsPGGP7u5utbW19bsAAEa+U34XXCaT0Z133qnLL79cF1xwQd/Pv/CFL2j8+PGqqqrS9u3b9fWvf107d+7Uz372s+P2qaur07333nuqywAADFOnPIBqa2u1Y8cOvfLKK/1+fsstt/T99/Tp01VZWan58+drz549mjTp42+FXLFihZYvX97377a2NlVXV5/qsgAAw8QpDaDbb79dzz77rDZs2KCxY8d+Yu2cOXMkSbt37z7uAIrH44rHbZ8rAQAMf6YBFASB7rjjDq1du1br16/XhAkTTvr/bNu2TZJUWVl5SgsEAIxMpgFUW1urNWvW6Omnn1ZBQYGampokSUVFRcrJydGePXu0Zs0affazn9Xo0aO1fft23XXXXbryyis1Y8aMQdkAAMDwZBpAq1atkvTBh03/1KOPPqobb7xRsVhML774oh588EElEglVV1dr6dKl+ta3vjVgCwYAjAzmP8F9kurqatXX15/Wgv74u1IKArd8pfLyUue+4Yjtnec/f/oZ59pdu9429b7wwouca3t73XPJJKkn1eNcmxOz5Ud1tBw21Z937kTn2gXz55t6v7zhlZMX/V8LF80z9Z404Wzn2u60LQsunbbtz3Mmur8x59wJ7hmDkhQOuWewZQL3+5UkpTMZ59qLLp5u6v3qa1uda996c7ep96yLLjXVK+S+nUXGD7+kUu4ZbCFbzJwKCwuda4uLi51r2zvcMgPJggMAeMEAAgB4wQACAHjBAAIAeMEAAgB4wQACAHjBAAIAeMEAAgB4wQACAHjBAAIAeHHK3wc06ILoBxcHqZ5u97aBLQJl4sSpzrWzLrvC1HvXuweda99tOmrqnZvtHq9y+J0mU++eHlscS1faPR+kuPyTv97jo86d5r7v32nYZ+rd2t7uXGtIPpIk1dTMMdVPmuQerzOmZJSpd+vRFufaguxcU+9YzP057uRz3CObJKnu/r93rh1bMsbUO2qMp7KwHoOiUffDdDhsO6dIJNwicySZvjbH9RjBGRAAwAsGEADACwYQAMALBhAAwAsGEADACwYQAMALBhAAwAsGEADACwYQAMALBhAAwAsGEADAiyGbBbdlyxvKzcl2qj34nnumWjqdNq2jraPDubY34555JklHW9qca5/43z839Y4YnlrEsmx3g/yiYlN9EHLvnzKGqo0ZXeJc23rUlqcXZNzvK/n5tvy1P58/z1Q/prTYubazyz3DTpLy8/Kda+PmI4Z77llpifu+lKScgiLn2lDSPTNQkro6W031gSzHlYypdzKZdC8O2TLsOjs7nWvjMfcsuI6EW1/OgAAAXjCAAABeMIAAAF4wgAAAXjCAAABeMIAAAF4wgAAAXjCAAABeMIAAAF4wgAAAXgzZKJ633npT8XjMqTbZ7R6zkR13i/c5FZdMP9dUn5OT61wbCmzPFTKBeyxQ9dhqU++8nKipflSxe2SKKXZEUldnwrk2Py/P1Dscdr/NE4ZIE0nqbD1iqt/X5h4j1N1juw1LS90jcJJhW9xUOu0exZPOBKbepWn3+rAhEkiSsiK27QxH3B8T6V7bWuJRt+OgJKUD221YUOD+mGhrc48O6+7pcqrjDAgA4AUDCADgBQMIAOAFAwgA4AUDCADgBQMIAOAFAwgA4AUDCADgBQMIAOAFAwgA4AUDCADgxZDNgrvi8ouVl5vjVJuV5b4Z4Yht5sZicefaUMiWH5UyZELlZOebeh8+fMy5dveuPabezT0pU31xkXsWXE6uez6eJLW3tzvX7jXmtQVBxrk2Y6iVJNs9RcrOcXssSNKxo+65cZJUPW6sc200assBtOSHjRkzxtS7uLDAuTbd65ZN9ke2TLXsbPeMyZaWFlPv3nTaubag0P2xJknJpHuOZigUca+VWy1nQAAAL0wDaNWqVZoxY4YKCwtVWFiompoa/fKXv+y7PplMqra2VqNHj1Z+fr6WLl2q5ubmAV80AGD4Mw2gsWPH6v7779fWrVu1ZcsWzZs3T9dcc43efPNNSdJdd92lZ555Rk8++aTq6+t18OBBXXfddYOycADA8GZ6Dejqq6/u9+9//Md/1KpVq7Rp0yaNHTtWjzzyiNasWaN58+ZJkh599FGdd9552rRpky677LKBWzUAYNg75deA0um0Hn/8cSUSCdXU1Gjr1q1KpVJasGBBX83UqVM1btw4bdy48YR9uru71dbW1u8CABj5zAPojTfeUH5+vuLxuG699VatXbtW06ZNU1NTk2KxmIqLi/vVl5eXq6mp6YT96urqVFRU1HeprrZ9OycAYHgyD6ApU6Zo27Zt2rx5s2677TYtW7ZMb7311ikvYMWKFWptbe277N+//5R7AQCGD/PngGKxmCZPnixJmjVrll577TX94Ac/0PXXX6+enh61tLT0Owtqbm5WRUXFCfvF43HF4+6ftQEAjAyn/TmgTCaj7u5uzZo1S9FoVOvWreu7bufOndq3b59qampO99cAAEYY0xnQihUrtGTJEo0bN07t7e1as2aN1q9fr+eff15FRUW66aabtHz5cpWUlKiwsFB33HGHampqeAccAOBjTAPo0KFD+qu/+is1NjaqqKhIM2bM0PPPP68///M/lyR9//vfVzgc1tKlS9Xd3a1FixbpoYceOqWF5ccD5We7xWFkAvdomEzGPdZCktJJ9wiPVMYW3xHPdo+dyYnbTlarz3KPNYmGbesOh2Km+sDQPj/fFjmUMcSUpHptEULxbPeHR06OexSLJL333num+ljM/TbPZMabeo8aVeJcG4nY/mpvebxZY34SHe4xTJnepKl3OGwLS8pk3KOYLPtSkiKG3slkj6n3EUNkV1Gxe8xPyPGPa6Z70yOPPPKJ12dnZ2vlypVauXKlpS0A4FOILDgAgBcMIACAFwwgAIAXDCAAgBcMIACAFwwgAIAXDCAAgBcMIACAFwwgAIAX5jTswRb839yWRKd7dIYlAScwRvFI7pEcKUvmjKRU2r13JNxp6m15bpHodI8bkqRwyHYbmm6WkO05kSWKp9cYxZNKuz880oa4FMl+m6d63bfTEgsjSdGY+31rSEXxJNzXnentNvW2RvFEsiKmeou04QCXCWzrthxns6LuEUIf3r+Dkzz4Q8HJKs6wAwcO8KV0ADAC7N+/X2PHjj3h9UNuAGUyGR08eFAFBQUKhf44zdva2lRdXa39+/ersLDQ4woHF9s5cnwatlFiO0eagdjOIAjU3t6uqqoqhcMn/qvGkPsTXDgc/sSJWVhYOKJ3/ofYzpHj07CNEts50pzudhYVnTw9mzchAAC8YAABALwYNgMoHo/rnnvuUTwe972UQcV2jhyfhm2U2M6R5kxu55B7EwIA4NNh2JwBAQBGFgYQAMALBhAAwAsGEADAi2EzgFauXKmzzz5b2dnZmjNnjn7zm9/4XtKA+s53vqNQKNTvMnXqVN/LOi0bNmzQ1VdfraqqKoVCIT311FP9rg+CQHfffbcqKyuVk5OjBQsWaNeuXX4WexpOtp033njjx/bt4sWL/Sz2FNXV1enSSy9VQUGBysrKdO2112rnzp39apLJpGprazV69Gjl5+dr6dKlam5u9rTiU+OynXPnzv3Y/rz11ls9rfjUrFq1SjNmzOj7sGlNTY1++ctf9l1/pvblsBhAP/3pT7V8+XLdc889+u1vf6uZM2dq0aJFOnTokO+lDajzzz9fjY2NfZdXXnnF95JOSyKR0MyZM7Vy5crjXv/AAw/ohz/8oR5++GFt3rxZeXl5WrRokZJJ94DEoeBk2ylJixcv7rdvH3vssTO4wtNXX1+v2tpabdq0SS+88IJSqZQWLlyoRCLRV3PXXXfpmWee0ZNPPqn6+nodPHhQ1113ncdV27lspyTdfPPN/fbnAw884GnFp2bs2LG6//77tXXrVm3ZskXz5s3TNddcozfffFPSGdyXwTAwe/bsoLa2tu/f6XQ6qKqqCurq6jyuamDdc889wcyZM30vY9BICtauXdv370wmE1RUVATf/e53+37W0tISxOPx4LHHHvOwwoHx0e0MgiBYtmxZcM0113hZz2A5dOhQICmor68PguCDfReNRoMnn3yyr+b3v/99ICnYuHGjr2Weto9uZxAEwZ/92Z8Ff/M3f+NvUYNk1KhRwb/8y7+c0X055M+Aenp6tHXrVi1YsKDvZ+FwWAsWLNDGjRs9rmzg7dq1S1VVVZo4caK++MUvat++fb6XNGgaGhrU1NTUb78WFRVpzpw5I26/StL69etVVlamKVOm6LbbbtORI0d8L+m0tLa2SpJKSkokSVu3blUqleq3P6dOnapx48YN6/350e380E9+8hOVlpbqggsu0IoVK9TZaf26lKEjnU7r8ccfVyKRUE1NzRndl0MujPSjDh8+rHQ6rfLy8n4/Ly8v1x/+8AdPqxp4c+bM0erVqzVlyhQ1Njbq3nvv1RVXXKEdO3aooKDA9/IGXFNTkyQdd79+eN1IsXjxYl133XWaMGGC9uzZo29+85tasmSJNm7cqEhk8L5HZrBkMhndeeeduvzyy3XBBRdI+mB/xmIxFRcX96sdzvvzeNspSV/4whc0fvx4VVVVafv27fr617+unTt36mc/+5nH1dq98cYbqqmpUTKZVH5+vtauXatp06Zp27ZtZ2xfDvkB9GmxZMmSvv+eMWOG5syZo/Hjx+uJJ57QTTfd5HFlOF033HBD339Pnz5dM2bM0KRJk7R+/XrNnz/f48pOTW1trXbs2DHsX6M8mRNt5y233NL339OnT1dlZaXmz5+vPXv2aNKkSWd6madsypQp2rZtm1pbW/Xv//7vWrZsmerr68/oGob8n+BKS0sViUQ+9g6M5uZmVVRUeFrV4CsuLta5556r3bt3+17KoPhw333a9qskTZw4UaWlpcNy395+++169tln9fLLL/f72pSKigr19PSopaWlX/1w3Z8n2s7jmTNnjiQNu/0Zi8U0efJkzZo1S3V1dZo5c6Z+8IMfnNF9OeQHUCwW06xZs7Ru3bq+n2UyGa1bt041NTUeVza4Ojo6tGfPHlVWVvpeyqCYMGGCKioq+u3XtrY2bd68eUTvV+mDb/09cuTIsNq3QRDo9ttv19q1a/XSSy9pwoQJ/a6fNWuWotFov/25c+dO7du3b1jtz5Nt5/Fs27ZNkobV/jyeTCaj7u7uM7svB/QtDYPk8ccfD+LxeLB69ergrbfeCm655ZaguLg4aGpq8r20AfO3f/u3wfr164OGhobgP//zP4MFCxYEpaWlwaFDh3wv7ZS1t7cHr7/+evD6668HkoLvfe97weuvvx68++67QRAEwf333x8UFxcHTz/9dLB9+/bgmmuuCSZMmBB0dXV5XrnNJ21ne3t78NWvfjXYuHFj0NDQELz44ovBxRdfHJxzzjlBMpn0vXRnt912W1BUVBSsX78+aGxs7Lt0dnb21dx6663BuHHjgpdeeinYsmVLUFNTE9TU1Hhctd3JtnP37t3BfffdF2zZsiVoaGgInn766WDixInBlVde6XnlNt/4xjeC+vr6oKGhIdi+fXvwjW98IwiFQsGvfvWrIAjO3L4cFgMoCILgRz/6UTBu3LggFosFs2fPDjZt2uR7SQPq+uuvDyorK4NYLBacddZZwfXXXx/s3r3b97JOy8svvxxI+thl2bJlQRB88Fbsb3/720F5eXkQj8eD+fPnBzt37vS76FPwSdvZ2dkZLFy4MBgzZkwQjUaD8ePHBzfffPOwe/J0vO2TFDz66KN9NV1dXcFf//VfB6NGjQpyc3ODz33uc0FjY6O/RZ+Ck23nvn37giuvvDIoKSkJ4vF4MHny5ODv/u7vgtbWVr8LN/rKV74SjB8/PojFYsGYMWOC+fPn9w2fIDhz+5KvYwAAeDHkXwMCAIxMDCAAgBcMIACAFwwgAIAXDCAAgBcMIACAFwwgAIAXDCAAgBcMIACAFwwgAIAXDCAAgBcMIACAF/8HQQxmwY8SIeIAAAAASUVORK5CYII=\n" + }, + "metadata": {} + } + ], + "source": [ + "plt.imshow(x_test[index])" + ] + }, + { + "cell_type": "code", + "source": [ + "labels[y_test[index][0]]" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "id": "O32stbnNkTLh", + "outputId": "c6dc9b40-290d-4029-e626-da88efc6e4e3" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'Horse'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 32 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "Let us make a dictionary to see how many predictions belong to each class" + ], + "metadata": { + "id": "qT00-He7pfNi" + } + }, + { + "cell_type": "code", + "source": [ + "aggregate_results = dict()\n", + "for i in range(len(predictions)):\n", + " if predictions[i] in aggregate_results:\n", + " aggregate_results[predictions[i]] += 1\n", + " else:\n", + " aggregate_results[predictions[i]] = 1" + ], + "metadata": { + "id": "x744tmPnowMr" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "aggregate_results" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "evQnjvDdqbuG", + "outputId": "69c6d8d6-7986-444b-c66b-76c2fda98553" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "{'Dog': 641,\n", + " 'Automobile': 3387,\n", + " 'Deer': 793,\n", + " 'Horse': 1030,\n", + " 'Truck': 392,\n", + " 'Frog': 290,\n", + " 'Airplane': 179,\n", + " 'Cat': 3175,\n", + " 'Bird': 91,\n", + " 'Ship': 22}" + ] + }, + "metadata": {}, + "execution_count": 37 + } + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/examples/notebooks/beam-ml/run_inference_generative_ai.ipynb b/examples/notebooks/beam-ml/run_inference_generative_ai.ipynb new file mode 100644 index 000000000000..d93f12a7b79d --- /dev/null +++ b/examples/notebooks/beam-ml/run_inference_generative_ai.ipynb @@ -0,0 +1,323 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "code", + "source": [ + "# @title ###### Licensed to the Apache Software Foundation (ASF), Version 2.0 (the \"License\")\n", + "\n", + "# Licensed to the Apache Software Foundation (ASF) under one\n", + "# or more contributor license agreements. See the NOTICE file\n", + "# distributed with this work for additional information\n", + "# regarding copyright ownership. The ASF licenses this file\n", + "# to you under the Apache License, Version 2.0 (the\n", + "# \"License\"); you may not use this file except in compliance\n", + "# with the License. You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing,\n", + "# software distributed under the License is distributed on an\n", + "# \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n", + "# KIND, either express or implied. See the License for the\n", + "# specific language governing permissions and limitations\n", + "# under the License" + ], + "metadata": { + "cellView": "form", + "id": "IVkpU8HZ1eyz" + }, + "execution_count": 1, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "# Use RunInference for Generative AI\n", + "\n", + "\n", + " \n", + " \n", + "
\n", + " Run in Google Colab\n", + " \n", + " View source on GitHub\n", + "
\n" + ], + "metadata": { + "id": "kH8SORNim8on" + } + }, + { + "cell_type": "markdown", + "source": [ + "This notebook shows how to use the Apache Beam [RunInference](https://beam.apache.org/releases/pydoc/current/apache_beam.ml.inference.base.html#apache_beam.ml.inference.base.RunInference) transform for generative AI tasks. It uses a large language model (LLM) from the [Hugging Face Model Hub](https://huggingface.co/models).\n", + "\n", + "This notebook demonstrates the following steps:\n", + "- Load and save a model from the Hugging Face Model Hub.\n", + "- Use the PyTorch model handler for RunInference.\n", + "\n", + "For more information about using RunInference, see [Get started with AI/ML pipelines](https://beam.apache.org/documentation/ml/overview/) in the Apache Beam documentation." + ], + "metadata": { + "id": "7N2XzwoA0k4L" + } + }, + { + "cell_type": "markdown", + "source": [ + "## Install the Apache Beam SDK and dependencies\n", + "\n", + "Use the following code to install the Apache Beam Python SDK, PyTorch, and Transformers." + ], + "metadata": { + "id": "nhf_lOeEsO1C" + } + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "wS9a3Y0oZ_l5" + }, + "outputs": [], + "source": [ + "!pip install apache_beam[gcp]==2.48.0\n", + "!pip install torch\n", + "!pip install transformers" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Use the following code to import dependencies\n", + "\n", + "**Important**: If an error occurs, restart your runtime." + ], + "metadata": { + "id": "I7vMsFGW16bZ" + } + }, + { + "cell_type": "code", + "source": [ + "import os\n", + "import apache_beam as beam\n", + "from apache_beam.options.pipeline_options import PipelineOptions\n", + "from apache_beam.ml.inference.base import PredictionResult\n", + "from apache_beam.ml.inference.base import RunInference\n", + "from apache_beam.ml.inference.pytorch_inference import make_tensor_model_fn\n", + "from apache_beam.ml.inference.pytorch_inference import PytorchModelHandlerTensor\n", + "import torch\n", + "from transformers import AutoConfig\n", + "from transformers import AutoModelForSeq2SeqLM\n", + "from transformers import AutoTokenizer\n", + "from transformers.tokenization_utils import PreTrainedTokenizer\n", + "\n", + "\n", + "MAX_RESPONSE_TOKENS = 256\n", + "\n", + "model_name = \"google/flan-t5-small\"\n", + "state_dict_path = \"saved_model\"" + ], + "metadata": { + "id": "uhbOYUzvbOSc" + }, + "execution_count": 3, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "## Download and save the model\n", + "This notebook uses the [auto classes](https://huggingface.co/docs/transformers/model_doc/auto) from Hugging Face to instantly load the model in memory. Later, the model is saved to the path defined previously." + ], + "metadata": { + "id": "yRls3LmxswrC" + } + }, + { + "cell_type": "code", + "source": [ + "model = AutoModelForSeq2SeqLM.from_pretrained(\n", + " model_name, torch_dtype=torch.bfloat16\n", + " )\n", + "\n", + "directory = os.path.dirname(state_dict_path)\n", + "torch.save(model.state_dict(), state_dict_path)" + ], + "metadata": { + "id": "PKhkiQFJe44n" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "## Define utility functions\n", + "The input and output for the [`google/flan-t5-small`](https://huggingface.co/google/flan-t5-small) model are token tensors. These utility functions are used for the conversion of text to token tensors and then back to text.\n" + ], + "metadata": { + "id": "7TSqb3l1s7F7" + } + }, + { + "cell_type": "code", + "source": [ + "def to_tensors(input_text: str, tokenizer) -> torch.Tensor:\n", + " \"\"\"Encodes input text into token tensors.\n", + " Args:\n", + " input_text: Input text for the LLM model.\n", + " tokenizer: Tokenizer for the LLM model.\n", + " Returns: Tokenized input tokens.\n", + " \"\"\"\n", + " return tokenizer(input_text, return_tensors=\"pt\").input_ids[0]\n", + "\n", + "\n", + "def from_tensors(result: PredictionResult, tokenizer) -> str:\n", + " \"\"\"Decodes output token tensors into text.\n", + " Args:\n", + " result: Prediction results from the RunInference transform.\n", + " tokenizer: Tokenizer for the LLM model.\n", + " Returns: The model's response as text.\n", + " \"\"\"\n", + " output_tokens = result.inference\n", + " return tokenizer.decode(output_tokens, skip_special_tokens=True)" + ], + "metadata": { + "id": "OeTMbaLidnBe" + }, + "execution_count": 5, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Load the tokenizer.\n", + "tokenizer = AutoTokenizer.from_pretrained(model_name)\n", + "\n", + "# Create an instance of the PyTorch model handler.\n", + "model_handler = PytorchModelHandlerTensor(\n", + " state_dict_path=state_dict_path,\n", + " model_class=AutoModelForSeq2SeqLM.from_config,\n", + " model_params={\"config\": AutoConfig.from_pretrained(model_name)},\n", + " inference_fn=make_tensor_model_fn(\"generate\"),\n", + " )" + ], + "metadata": { + "id": "77mOPlQR5Mev" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "## Run the Pipeline\n" + ], + "metadata": { + "id": "y7IU3cYKtA3e" + } + }, + { + "cell_type": "code", + "source": [ + "example = [\"translate English to Spanish: We are in New York City.\"]\n", + "\n", + "pipeline = beam.Pipeline(options=PipelineOptions(save_main_session=True,pickle_library=\"cloudpickle\"))\n", + "\n", + "with pipeline as p:\n", + " _ = (\n", + " p\n", + " | \"Create Examples\" >> beam.Create(example)\n", + " | \"To tensors\" >> beam.Map(to_tensors, tokenizer)\n", + " | \"RunInference\"\n", + " >> RunInference(\n", + " model_handler,\n", + " inference_args={\"max_new_tokens\": MAX_RESPONSE_TOKENS},\n", + " )\n", + " | \"From tensors\" >> beam.Map(from_tensors, tokenizer)\n", + " | \"Print\" >> beam.Map(print)\n", + " )" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 106 + }, + "id": "JUBrJEDYcjRG", + "outputId": "e7e7f0a2-dc0d-427d-bdf8-047739bb3160" + }, + "execution_count": 7, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "WARNING:apache_beam.runners.interactive.interactive_environment:Dependencies required for Interactive Beam PCollection visualization are not available, please use: `pip install apache-beam[interactive]` to install necessary dependencies to enable all data visualization features.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "application/javascript": [ + "\n", + " if (typeof window.interactive_beam_jquery == 'undefined') {\n", + " var jqueryScript = document.createElement('script');\n", + " jqueryScript.src = 'https://code.jquery.com/jquery-3.4.1.slim.min.js';\n", + " jqueryScript.type = 'text/javascript';\n", + " jqueryScript.onload = function() {\n", + " var datatableScript = document.createElement('script');\n", + " datatableScript.src = 'https://cdn.datatables.net/1.10.20/js/jquery.dataTables.min.js';\n", + " datatableScript.type = 'text/javascript';\n", + " datatableScript.onload = function() {\n", + " window.interactive_beam_jquery = jQuery.noConflict(true);\n", + " window.interactive_beam_jquery(document).ready(function($){\n", + " \n", + " });\n", + " }\n", + " document.head.appendChild(datatableScript);\n", + " };\n", + " document.head.appendChild(jqueryScript);\n", + " } else {\n", + " window.interactive_beam_jquery(document).ready(function($){\n", + " \n", + " });\n", + " }" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "WARNING:apache_beam.options.pipeline_options:Discarding unparseable args: ['-f', '/root/.local/share/jupyter/runtime/kernel-f8e31a84-7d91-44b3-8c53-59a03657a833.json']\n", + "WARNING:apache_beam.options.pipeline_options:Discarding unparseable args: ['-f', '/root/.local/share/jupyter/runtime/kernel-f8e31a84-7d91-44b3-8c53-59a03657a833.json']\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Estamos en Nueva York City.\n" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/examples/notebooks/beam-ml/run_inference_multi_model.ipynb b/examples/notebooks/beam-ml/run_inference_multi_model.ipynb index 9a99ad2cf475..7cd144223cae 100644 --- a/examples/notebooks/beam-ml/run_inference_multi_model.ipynb +++ b/examples/notebooks/beam-ml/run_inference_multi_model.ipynb @@ -47,8 +47,7 @@ { "cell_type": "markdown", "source": [ - "# Ensemble model using an image captioning and ranking example", - "\n", + "# Ensemble model using an image captioning and ranking example\n", "\n", " diff --git a/website/www/site/content/en/documentation/programming-guide.md b/website/www/site/content/en/documentation/programming-guide.md index 8a135b9817ae..0427e50e0b19 100644 --- a/website/www/site/content/en/documentation/programming-guide.md +++ b/website/www/site/content/en/documentation/programming-guide.md @@ -2568,9 +2568,7 @@ Timers and States are explained in more detail in the {{< paragraph class="language-go">}} **Timer and State:** -User defined State parameters can be used in a stateful DoFn. Timers aren't implemented in the Go SDK yet; -see more at [Issue 22737](https://github.com/apache/beam/issues/22737). Once implemented, user defined Timer -parameters can be used in a stateful DoFn. +User defined State and Timer parameters can be used in a stateful DoFn. Timers and States are explained in more detail in the [Timely (and Stateful) Processing with Apache Beam](/blog/2017/08/28/timely-processing.html) blog post. {{< /paragraph >}} @@ -6147,7 +6145,7 @@ _ = (p | 'Read per user' >> ReadPerUser() {{< /highlight >}} {{< highlight go >}} -{{< code_sample "sdks/go/examples/snippets/04transforms.go" state_and_timers >}} +{{< code_sample "sdks/go/examples/snippets/04transforms.go" bag_state >}} {{< /highlight >}} ### 11.2. Deferred state reads {#deferred-state-reads} @@ -6270,7 +6268,7 @@ _ = (p | 'Read per user' >> ReadPerUser() {{< /highlight >}} {{< highlight go >}} -This is not supported yet, see https://github.com/apache/beam/issues/22737. +{{< code_sample "sdks/go/examples/snippets/04transforms.go" event_time_timer >}} {{< /highlight >}} #### 11.3.2. Processing-time timers {#processing-time-timers} @@ -6322,7 +6320,7 @@ _ = (p | 'Read per user' >> ReadPerUser() {{< /highlight >}} {{< highlight go >}} -This is not supported yet, see https://github.com/apache/beam/issues/22737. +{{< code_sample "sdks/go/examples/snippets/04transforms.go" processing_time_timer >}} {{< /highlight >}} #### 11.3.3. Dynamic timer tags {#dynamic-timer-tags} @@ -6383,7 +6381,7 @@ _ = (p | 'Read per user' >> ReadPerUser() {{< /highlight >}} {{< highlight go >}} -This is not supported yet, see https://github.com/apache/beam/issues/22737. +{{< code_sample "sdks/go/examples/snippets/04transforms.go" dynamic_timer_tags >}} {{< /highlight >}} #### 11.3.4. Timer output timestamps {#timer-output-timestamps} @@ -6435,6 +6433,10 @@ perUser.apply(ParDo.of(new DoFn, OutputT>() { })); {{< /highlight >}} +{{< highlight go >}} +{{< code_sample "sdks/go/examples/snippets/04transforms.go" timer_output_timestamps_bad >}} +{{< /highlight >}} + The problem with this code is that the ParDo is buffering elements, however nothing is preventing the watermark from advancing past the timestamp of those elements, so all those elements might be dropped as late data. In order to prevent this from happening, an output timestamp needs to be set on the timer to prevent the watermark from advancing @@ -6471,7 +6473,7 @@ perUser.apply(ParDo.of(new DoFn, OutputT>() { ? Instant.now().plus(Duration.standardMinutes(1)) : new Instant(timerTimestampMs); // Setting the outputTimestamp to the minimum timestamp in the bag holds the watermark to that timestamp until the // timer fires. This allows outputting all the elements with their timestamp. - timer.withOutputTimestamp(minTimestamp.read()).set(timerToSet). + timer.withOutputTimestamp(minTimestamp.read()).s et(timerToSet). timerTimestamp.write(timerToSet.getMillis()); } @@ -6494,7 +6496,7 @@ Timer output timestamps is not yet supported in Python SDK. See https://github.c {{< /highlight >}} {{< highlight go >}} -This is not supported yet, see https://github.com/apache/beam/issues/22737. +{{< code_sample "sdks/go/examples/snippets/04transforms.go" timer_output_timestamps_good >}} {{< /highlight >}} ### 11.4. Garbage collecting state {#garbage-collecting-state} @@ -6624,7 +6626,7 @@ _ = (p | 'Read per user' >> ReadPerUser() {{< /highlight >}} {{< highlight go >}} -This is not supported yet, see https://github.com/apache/beam/issues/22737. +{{< code_sample "sdks/go/examples/snippets/04transforms.go" timer_garbage_collection >}} {{< /highlight >}} ### 11.5. State and timers examples {#state-timers-examples} @@ -6764,6 +6766,11 @@ _ = (p | 'EventsPerLinkId' >> ReadPerLinkEvents() | 'Join DoFn' >> beam.ParDo(JoinDoFn())) {{< /highlight >}} + +{{< highlight go >}} +{{< code_sample "sdks/go/examples/snippets/04transforms.go" join_dofn_example >}} +{{< /highlight >}} + #### 11.5.2. Batching RPCs {#batching-rpcs} In this example, input elements are being forwarded to an external RPC service. The RPC accepts batch requests - @@ -6830,6 +6837,12 @@ class BufferDoFn(DoFn): {{< /highlight >}} + +{{< highlight go >}} +{{< code_sample "sdks/go/examples/snippets/04transforms.go" batching_dofn_example >}} +{{< /highlight >}} + + ## 12. Splittable `DoFns` {#splittable-dofns} A Splittable `DoFn` (SDF) enables users to create modular components containing I/Os (and some advanced @@ -7664,7 +7677,7 @@ When an SDK-specific wrapper isn't available, you will have to access the cross- | beam.Create(['a', 'b']).with_output_types(unicode) | beam.ExternalTransform( TEST_PREFIX_URN, - ImplicitSchemaPayloadBuilder({'data': u'0'}), + ImplicitSchemaPayloadBuilder({'data': '0'}), )) assert_that(res, equal_to(['0a', '0b'])) ``` diff --git a/website/www/site/content/en/documentation/runners/flink.md b/website/www/site/content/en/documentation/runners/flink.md index 2fc4bc83bb70..64a6e9bade9b 100644 --- a/website/www/site/content/en/documentation/runners/flink.md +++ b/website/www/site/content/en/documentation/runners/flink.md @@ -93,7 +93,7 @@ from the [compatibility table](#flink-version-compatibility) below. For example: {{< highlight java >}} org.apache.beam - beam-runners-flink-1.14 + beam-runners-flink-1.16 {{< param release_latest >}} {{< /highlight >}} @@ -201,6 +201,8 @@ Starting with Beam 2.18.0, pre-built Flink Job Service Docker images are availab [Flink 1.12](https://hub.docker.com/r/apache/beam_flink1.12_job_server). [Flink 1.13](https://hub.docker.com/r/apache/beam_flink1.13_job_server). [Flink 1.14](https://hub.docker.com/r/apache/beam_flink1.14_job_server). +[Flink 1.15](https://hub.docker.com/r/apache/beam_flink1.15_job_server). +[Flink 1.16](https://hub.docker.com/r/apache/beam_flink1.16_job_server). {{< /paragraph >}} @@ -313,8 +315,8 @@ reference. ## Flink Version Compatibility The Flink cluster version has to match the minor version used by the FlinkRunner. -The minor version is the first two numbers in the version string, e.g. in `1.13.0` the -minor version is `1.13`. +The minor version is the first two numbers in the version string, e.g. in `1.16.0` the +minor version is `1.16`. We try to track the latest version of Apache Flink at the time of the Beam release. A Flink version is supported by Beam for the time it is supported by the Flink community. @@ -323,189 +325,87 @@ To find out which version of Flink is compatible with Beam please see the table
\n", " Run in Google Colab\n", @@ -65,12 +64,12 @@ { "cell_type": "markdown", "source": [ - "A single machine learning model might not be the right solution for your task. Often, machine learning model tasks involve aggregating mutliple models together to produce one optimal predictive model and to boost performance. \n", - " \n", + "When performing complex tasks like image captioning, using a single ML model may not be the best solution.\n", + "\n", "\n", "This notebook shows how to implement a cascade model in Apache Beam using the [RunInference API](https://beam.apache.org/documentation/sdks/python-machine-learning/). The RunInference API enables you to run your Beam transforms as part of your pipeline for optimal machine learning inference.\n", "\n", - "For more information about the RunInference API, review the [RunInference notebook](https://colab.research.google.com/drive/111USL4VhUa0xt_mKJxl5nC1YLOC8_yF4?usp=sharing#scrollTo=746b67a7-3562-467f-bea3-d8cd18c14927).\n", + "For more information about the RunInference API, review the [RunInference notebook](https://colab.research.google.com/drive/111USL4VhUa0xt_mKJxl5nC1YLOC8_yF4?usp=sharing#scrollTo=746b67a7-3562-467f-bea3-d8cd18c14927) or the [Beam ML documentation](https://beam.apache.org/documentation/ml/overview/).\n", "\n", "**Note:** All images are licensed CC-BY, and creators are listed in the [LICENSE.txt](https://storage.googleapis.com/apache-beam-samples/image_captioning/LICENSE.txt) file." ], @@ -94,7 +93,7 @@ "\n", "This example shows how to generate captions on a a large set of images. Apache Beam is the ideal tool to handle this workflow. We use two models for this task:\n", "\n", - "* [BLIP](https://github.com/salesforce/BLIP): Generates a set of candidate captions for a given image. \n", + "* [BLIP](https://github.com/salesforce/BLIP): Generates a set of candidate captions for a given image.\n", "* [CLIP](https://github.com/openai/CLIP): Ranks the generated captions based on accuracy." ], "metadata": { @@ -119,7 +118,7 @@ "* Run inference with BLIP to generate a list of caption candidates.\n", "* Aggregate the generated captions with their source image.\n", "* Preprocess the aggregated image-caption pairs to rank them with CLIP.\n", - "* Run inference with CLIP to generate the caption ranking. \n", + "* Run inference with CLIP to generate the caption ranking.\n", "* Print the image names and the captions sorted according to their ranking.\n", "\n", "\n", @@ -139,13 +138,13 @@ "metadata": { "colab": { "base_uri": "https://localhost:8080/", - "height": 440 + "height": 460 }, "id": "3suC5woJLW_N", - "outputId": "d2f9f67b-361b-4ae9-f9db-ce2ff9abd509", + "outputId": "2b5e78bf-f212-4a77-9325-8808ef024c2e", "cellView": "form" }, - "execution_count": null, + "execution_count": 1, "outputs": [ { "output_type": "execute_result", @@ -158,7 +157,7 @@ ] }, "metadata": {}, - "execution_count": 3 + "execution_count": 1 } ] }, @@ -184,68 +183,34 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 1, "metadata": { - "id": "tTUZpG9_q-OW", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "9ee6407a-8e4b-4520-fe5d-54a886b6e0b1" + "id": "tTUZpG9_q-OW" }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "\u001b[K |████████████████████████████████| 2.1 MB 7.0 MB/s \n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.4/3.4 MB\u001b[0m \u001b[31m47.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.3/3.3 MB\u001b[0m \u001b[31m90.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m182.4/182.4 kB\u001b[0m \u001b[31m21.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m880.6/880.6 kB\u001b[0m \u001b[31m69.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Building wheel for sacremoses (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m377.0/377.0 kB\u001b[0m \u001b[31m10.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m53.1/53.1 kB\u001b[0m \u001b[31m3.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m6.5/6.5 MB\u001b[0m \u001b[31m60.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m12.8/12.8 MB\u001b[0m \u001b[31m91.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m235.4/235.4 kB\u001b[0m \u001b[31m8.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n", - " Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n", - " Installing backend dependencies ... \u001b[?25l\u001b[?25hdone\n", - " Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", - " Building wheel for fairscale (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", - "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", - "\u001b[0m\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", - "\u001b[0m" - ] - } - ], + "outputs": [], "source": [ "!pip install --upgrade pip --quiet\n", - "!pip install transformers==4.15.0 --quiet\n", + "!pip install transformers==4.30.2 --quiet\n", "!pip install timm==0.4.12 --quiet\n", "!pip install ftfy==6.1.1 --quiet\n", "!pip install spacy==3.4.1 --quiet\n", "!pip install fairscale==0.4.4 --quiet\n", - "!pip install apache_beam[gcp]>=2.40.0 \n", + "!pip install apache_beam[gcp]>=2.48.0\n", "\n", "# To use the newly installed versions, restart the runtime.\n", - "exit() " + "exit()" ] }, { "cell_type": "code", "source": [ "import requests\n", - "import os \n", + "import os\n", "import urllib\n", - "import json \n", + "import json\n", "import io\n", "from io import BytesIO\n", + "from typing import Sequence\n", "from typing import Iterator\n", "from typing import Iterable\n", "from typing import Tuple\n", @@ -303,7 +268,7 @@ "base_uri": "https://localhost:8080/" }, "id": "Ud4sUXV2x8LO", - "outputId": "9e12ea04-a347-426f-8145-280a5676e78b" + "outputId": "cc814ff8-d424-4880-e006-56803e0508aa" }, "execution_count": 2, "outputs": [ @@ -311,7 +276,6 @@ "output_type": "stream", "name": "stdout", "text": [ - "Error: Failed to call git rev-parse --git-dir --show-toplevel: \"fatal: not a git repository (or any of the parent directories): .git\\n\"\n", "Git LFS initialized.\n", "Cloning into 'clip-vit-base-patch32'...\n", "remote: Enumerating objects: 51, done.\u001b[K\n", @@ -362,7 +326,7 @@ "base_uri": "https://localhost:8080/" }, "id": "g4-6WwqUtxea", - "outputId": "3b04b933-aab0-4f5b-c967-ed784125bc6a" + "outputId": "29112ca0-f111-48b7-d8cc-a4e04fb7a02b" }, "execution_count": 4, "outputs": [ @@ -388,8 +352,8 @@ "from BLIP.models.blip import blip_decoder\n", "\n", "!gdown 'https://storage.googleapis.com/sfr-vision-language-research/BLIP/models/model*_base_caption.pth'\n", - "# The blip model is saved as a checkoint, load it and save it as a state dict since RunInference required \n", - "# a state dict for model instantiation \n", + "# The blip model is saved as a checkpoint, load it and save it as a state dict since RunInference required\n", + "# a state dict for model instantiation\n", "blip_state_dict_path = '/content/BLIP/blip_state_dict.pth'\n", "torch.save(torch.load('/content/BLIP/model*_base_caption.pth')['model'], blip_state_dict_path)" ], @@ -398,7 +362,7 @@ "base_uri": "https://localhost:8080/" }, "id": "GCvOP_iZh41c", - "outputId": "224c22b1-eda6-463c-c926-1341ec9edef8" + "outputId": "a96f0ff5-cdf7-4394-be6e-d5bfca2f3a1f" }, "execution_count": 5, "outputs": [ @@ -409,7 +373,7 @@ "Downloading...\n", "From: https://storage.googleapis.com/sfr-vision-language-research/BLIP/models/model*_base_caption.pth\n", "To: /content/BLIP/model*_base_caption.pth\n", - "100% 896M/896M [00:04<00:00, 198MB/s] \n" + "100% 896M/896M [00:04<00:00, 198MB/s]\n" ] } ] @@ -500,9 +464,9 @@ "\n", " \"\"\"\n", " Process the raw image input to a format suitable for BLIP inference. The processed\n", - " images are duplicated to the number of desired captions per image. \n", + " images are duplicated to the number of desired captions per image.\n", "\n", - " Preprocessing transformation taken from: \n", + " Preprocessing transformation taken from:\n", " https://github.com/salesforce/BLIP/blob/d10be550b2974e17ea72e74edc7948c9e5eab884/predict.py\n", " \"\"\"\n", "\n", @@ -510,7 +474,7 @@ " self._captions_per_image = captions_per_image\n", "\n", " def setup(self):\n", - " \n", + "\n", " # Initialize the image transformer.\n", " self._transform = transforms.Compose([\n", " transforms.Resize((384, 384),interpolation=InterpolationMode.BICUBIC),\n", @@ -519,7 +483,7 @@ " ])\n", "\n", " def process(self, element):\n", - " image_url, image = element \n", + " image_url, image = element\n", " # The following lines provide a workaround to turn off BatchElements.\n", " preprocessed_img = self._transform(image).unsqueeze(0)\n", " preprocessed_img = preprocessed_img.repeat(self._captions_per_image, 1, 1, 1)\n", @@ -533,7 +497,7 @@ " Process the PredictionResult to get the generated image captions\n", " \"\"\"\n", " def process(self, element : Tuple[str, Iterable[PredictionResult]]):\n", - " image_url, prediction = element \n", + " image_url, prediction = element\n", "\n", " return [(image_url, prediction.inference)]" ], @@ -546,7 +510,7 @@ { "cell_type": "markdown", "source": [ - "### Define CLIP functions \n", + "### Define CLIP functions\n", "\n", "Define the preprocessing and postprocessing functions for CLIP." ], @@ -560,9 +524,9 @@ "class PreprocessCLIPInput(beam.DoFn):\n", "\n", " \"\"\"\n", - " Process the image-caption pair to a format suitable for CLIP inference. \n", + " Process the image-caption pair to a format suitable for CLIP inference.\n", "\n", - " After grouping the raw images with the generated captions, we need to \n", + " After grouping the raw images with the generated captions, we need to\n", " preprocess them before passing them to the ranking stage (CLIP model).\n", " \"\"\"\n", "\n", @@ -572,12 +536,12 @@ " merges_file_config_path: str):\n", "\n", " self._feature_extractor_config_path = feature_extractor_config_path\n", - " self._tokenizer_vocab_config_path = tokenizer_vocab_config_path \n", + " self._tokenizer_vocab_config_path = tokenizer_vocab_config_path\n", " self._merges_file_config_path = merges_file_config_path\n", "\n", "\n", " def setup(self):\n", - " \n", + "\n", " # Initialize the CLIP feature extractor.\n", " feature_extractor_config = CLIPConfig.from_pretrained(self._feature_extractor_config_path)\n", " feature_extractor = CLIPFeatureExtractor(feature_extractor_config)\n", @@ -585,14 +549,14 @@ " # Initialize the CLIP tokenizer.\n", " tokenizer = CLIPTokenizer(self._tokenizer_vocab_config_path,\n", " self._merges_file_config_path)\n", - " \n", + "\n", " # Initialize the CLIP processor used to process the image-caption pair.\n", " self._processor = CLIPProcessor(feature_extractor=feature_extractor,\n", " tokenizer=tokenizer)\n", "\n", " def process(self, element: Tuple[str, Dict[str, List[Any]]]):\n", "\n", - " image_url, image_captions_pair = element \n", + " image_url, image_captions_pair = element\n", " # Unpack the image and captions after grouping them with 'CoGroupByKey()'.\n", " image = image_captions_pair['image'][0]\n", " captions = image_captions_pair['captions'][0]\n", @@ -600,7 +564,7 @@ " text = captions,\n", " return_tensors=\"pt\",\n", " padding=True)\n", - " \n", + "\n", " image_url_caption_pair = (image_url, captions)\n", " return [(image_url_caption_pair, preprocessed_clip_input)]\n", "\n", @@ -612,7 +576,7 @@ " The logits are the output of the CLIP model. Here, we apply a softmax activation\n", " function to the logits to get the probabilistic distribution of the relevance\n", " of each caption to the target image. After that, we sort the captions in descending\n", - " order with respect to the probabilities as a caption-probability pair. \n", + " order with respect to the probabilities as a caption-probability pair.\n", " \"\"\"\n", "\n", " def process(self, element : Tuple[Tuple[str, List[str]], Iterable[PredictionResult]]):\n", @@ -642,7 +606,9 @@ { "cell_type": "markdown", "source": [ - "Use a `KeyedModelHandler` for both models to attach a key to the general `ModelHandler`.\n", + "A `ModelHandler` is Beam's method for defining the configuration needed to load and invoke your model. Since both the BLIP and CLIP models use Pytorch and take KeyedTensors as inputs, we will use `PytorchModelHandlerKeyedTensor` for both.\n", + "\n", + "We will use a `KeyedModelHandler` for both models to attach a key to the general `ModelHandler`.\n", "The key is used for the following purposes:\n", "* To keep a reference to the image that the inference is associated with.\n", "* To aggregate transforms of different inputs.\n", @@ -654,36 +620,6 @@ "id": "BTmSPnjj8M2m" } }, - { - "cell_type": "code", - "source": [ - "class PytorchNoBatchModelHandlerKeyedTensor(PytorchModelHandlerKeyedTensor):\n", - " \"\"\"Wrapper to PytorchModelHandler to limit batch size to 1.\n", - " The caption strings generated from the BLIP tokenizer might have different\n", - " lengths. Different length strings don't work with torch.stack() in the current RunInference\n", - " implementation, because stack() requires tensors to be the same size.\n", - " Restricting max_batch_size to 1 means there is only 1 example per `batch`\n", - " in the run_inference() call.\n", - " \"\"\"\n", - " # The following lines provide a workaround to turn off BatchElements.\n", - " def batch_elements_kwargs(self):\n", - " return {'max_batch_size': 1}" - ], - "metadata": { - "id": "OaR02_wxTMpc" - }, - "execution_count": 9, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "Note that we use a `KeyedModelHandler` for both models to attach a key to the general `ModelHandler`. The key is used for aggregation transforms of different inputs." - ], - "metadata": { - "id": "gNLRO0EwvcGP" - } - }, { "cell_type": "markdown", "source": [ @@ -713,48 +649,36 @@ { "cell_type": "code", "source": [ - "class BLIPWrapper(torch.nn.Module):\n", - " \"\"\"\n", - " Wrapper around the BLIP model to overwrite the default \"forward\" method with the \"generate\" method, because BLIP uses the \n", - " \"generate\" method to produce the image captions.\n", - " \"\"\"\n", - " \n", - " def __init__(self, base_model: blip_decoder, num_beams: int, max_length: int,\n", - " min_length: int):\n", - " super().__init__()\n", - " self._model = base_model()\n", - " self._num_beams = num_beams\n", - " self._max_length = max_length\n", - " self._min_length = min_length\n", - "\n", - " def forward(self, inputs: torch.Tensor):\n", - " # Squeeze because RunInference adds an extra dimension, which is empty.\n", - " # The following lines provide a workaround to turn off BatchElements.\n", - " inputs = inputs.squeeze(0)\n", - " captions = self._model.generate(inputs,\n", - " sample=True,\n", - " num_beams=self._num_beams,\n", - " max_length=self._max_length,\n", - " min_length=self._min_length)\n", - " return [captions]\n", - "\n", - " def load_state_dict(self, state_dict: dict):\n", - " self._model.load_state_dict(state_dict)\n", - "\n", - "\n", - "BLIP_model_handler = PytorchNoBatchModelHandlerKeyedTensor(\n", + "def blip_keyed_tensor_inference_fn(\n", + " batch: Sequence[Dict[str, torch.Tensor]],\n", + " model: torch.nn.Module,\n", + " device: str,\n", + " inference_args: Optional[Dict[str, Any]] = None,\n", + " model_id: Optional[str] = None,\n", + ") -> Iterable[PredictionResult]:\n", + " # By default, Beam batches inputs for bulk inference and calls model(batch)\n", + " # Since we want to call model.generate on a single unbatched input (BLIP/CLIP\n", + " # don't handle batched inputs), we define a custom inference function.\n", + " captions = model.generate(batch[0]['inputs'],\n", + " sample=True,\n", + " num_beams=NUM_BEAMS,\n", + " max_length=MAX_CAPTION_LENGTH,\n", + " min_length=MIN_CAPTION_LENGTH)\n", + " return [PredictionResult(batch[0], captions, model_id)]\n", + "\n", + "\n", + "BLIP_model_handler = PytorchModelHandlerKeyedTensor(\n", " state_dict_path=blip_state_dict_path,\n", - " model_class=BLIPWrapper,\n", - " model_params={'base_model': blip_decoder, 'num_beams': NUM_BEAMS,\n", - " 'max_length': MAX_CAPTION_LENGTH, 'min_length': MIN_CAPTION_LENGTH},\n", - " device='GPU')\n", + " model_class=blip_decoder,\n", + " inference_fn=blip_keyed_tensor_inference_fn,\n", + " max_batch_size=1)\n", "\n", "BLIP_keyed_model_handler = KeyedModelHandler(BLIP_model_handler)" ], "metadata": { "id": "RCKBJjujVw4q" }, - "execution_count": 11, + "execution_count": 10, "outputs": [] }, { @@ -771,29 +695,33 @@ { "cell_type": "code", "source": [ - "class CLIPWrapper(CLIPModel):\n", - "\n", - " def forward(self, **kwargs: Dict[str, torch.Tensor]):\n", - " # Squeeze because RunInference adds an extra dimension, which is empty.\n", - " # The following lines provide a workaround to turn off BatchElements.\n", - " kwargs = {key: tensor.squeeze(0) for key, tensor in kwargs.items()}\n", - " output = super().forward(**kwargs)\n", - " logits = output.logits_per_image\n", - " return logits\n", - "\n", - "\n", - "CLIP_model_handler = PytorchNoBatchModelHandlerKeyedTensor(\n", + "def clip_keyed_tensor_inference_fn(\n", + " batch: Sequence[Dict[str, torch.Tensor]],\n", + " model: torch.nn.Module,\n", + " device: str,\n", + " inference_args: Optional[Dict[str, Any]] = None,\n", + " model_id: Optional[str] = None,\n", + ") -> Iterable[PredictionResult]:\n", + " # By default, Beam batches inputs for bulk inference and calls model(batch)\n", + " # Since we want to call model on a single unbatched input (BLIP/CLIP don't\n", + " # handle batched inputs), we define a custom inference function.\n", + " output = model(**batch[0], **inference_args)\n", + " return [PredictionResult(batch[0], output.logits_per_image[0], model_id)]\n", + "\n", + "\n", + "CLIP_model_handler = PytorchModelHandlerKeyedTensor(\n", " state_dict_path=clip_state_dict_path,\n", - " model_class=CLIPWrapper,\n", + " model_class=CLIPModel,\n", " model_params={'config': CLIPConfig.from_pretrained(clip_model_config_path)},\n", - " device='GPU')\n", + " inference_fn=clip_keyed_tensor_inference_fn,\n", + " max_batch_size=1)\n", "\n", "CLIP_keyed_model_handler = KeyedModelHandler(CLIP_model_handler)\n" ], "metadata": { "id": "EJw_OnZ1ZfuH" }, - "execution_count": 12, + "execution_count": 11, "outputs": [] }, { @@ -817,7 +745,7 @@ "metadata": { "id": "VJwE0bquoXOf" }, - "execution_count": 13, + "execution_count": 12, "outputs": [] }, { @@ -834,7 +762,7 @@ "source": [ "#@title\n", "license_txt_url = 'https://storage.googleapis.com/apache-beam-samples/image_captioning/LICENSE.txt'\n", - "license_dict = json.loads(urllib.request.urlopen(license_txt_url).read().decode(\"utf-8\")) \n", + "license_dict = json.loads(urllib.request.urlopen(license_txt_url).read().decode(\"utf-8\"))\n", "\n", "for image_url in images_url:\n", " response = requests.get(image_url)\n", @@ -855,7 +783,7 @@ "outputId": "6e771e4e-a76a-4855-b466-976cdf35b506", "cellView": "form" }, - "execution_count": 16, + "execution_count": null, "outputs": [ { "output_type": "display_data", @@ -918,7 +846,7 @@ "metadata": { "id": "Dcz_M9GW0Kan" }, - "execution_count": 14, + "execution_count": 13, "outputs": [] }, { @@ -947,13 +875,13 @@ "with beam.Pipeline() as pipeline:\n", "\n", " read_images = (\n", - " pipeline \n", + " pipeline\n", " | \"ReadUrl\" >> beam.Create(images_url)\n", " | \"ReadImages\" >> beam.ParDo(ReadImagesFromUrl()))\n", "\n", " blip_caption_generation = (\n", " read_images\n", - " | \"PreprocessBlipInput\" >> beam.ParDo(PreprocessBLIPInput(NUM_CAPTIONS_PER_IMAGE)) \n", + " | \"PreprocessBlipInput\" >> beam.ParDo(PreprocessBLIPInput(NUM_CAPTIONS_PER_IMAGE))\n", " | \"GenerateCaptions\" >> RunInference(BLIP_keyed_model_handler)\n", " | \"PostprocessCaptions\" >> beam.ParDo(PostprocessBLIPOutput()))\n", "\n", @@ -966,19 +894,21 @@ " clip_tokenizer_vocab_config_path,\n", " clip_merges_config_path))\n", " | \"GetRankingLogits\" >> RunInference(CLIP_keyed_model_handler)\n", - " | \"RankClipOutput\" >> beam.ParDo(RankCLIPOutput()))\n", + " | \"RankClipOutput\" >> beam.ParDo(RankCLIPOutput())\n", + " )\n", "\n", " clip_captions_ranking | \"FormatCaptions\" >> beam.ParDo(FormatCaptions(NUM_TOP_CAPTIONS_TO_DISPLAY))\n", - " " + "" ], "metadata": { "colab": { - "base_uri": "https://localhost:8080/" + "base_uri": "https://localhost:8080/", + "height": 428 }, "id": "002e-FNbmuB8", - "outputId": "49c646f1-8612-433f-b134-ea8af0ff5591" + "outputId": "1b540b1e-b146-45d6-f8d3-ccaf461a87b7" }, - "execution_count": 18, + "execution_count": 14, "outputs": [ { "output_type": "stream", @@ -986,29 +916,41 @@ "text": [ "Image: Paris-sunset\n", "\tTop 3 captions ranked by CLIP:\n", - "\t\t1: the eiffel tower in paris is silhouetted at sunset. (Caption probability: 0.23)\n", - "\t\t2: the sun sets over the city of paris, with the eiffel tower in the distance. (Caption probability: 0.19)\n", - "\t\t3: the sun sets over the eiffel tower in paris. (Caption probability: 0.17)\n", + "\t\t1: the setting sun is reflected in an orange setting sky over paris. (Caption probability: 0.28)\n", + "\t\t2: the sun rising above the eiffel tower over paris. (Caption probability: 0.23)\n", + "\t\t3: the sun setting over the eiffel tower and rooftops. (Caption probability: 0.15)\n", "\n", "\n", "Image: Wedges\n", "\tTop 3 captions ranked by CLIP:\n", - "\t\t1: a basket of baked fries with a sauce in it. (Caption probability: 0.60)\n", - "\t\t2: cooked french fries with ketchup and dip sitting in napkin. (Caption probability: 0.16)\n", - "\t\t3: some french fries with dipping sauce on the side. (Caption probability: 0.08)\n", + "\t\t1: sweet potato fries with ketchup served in bowl. (Caption probability: 0.73)\n", + "\t\t2: this is a plate of sweet potato fries with ketchup. (Caption probability: 0.16)\n", + "\t\t3: sweet potato fries and a dipping sauce are on the tray. (Caption probability: 0.06)\n", "\n", "\n", "Image: Hamsters\n", "\tTop 3 captions ranked by CLIP:\n", - "\t\t1: a person petting two small hamsters while in their home. (Caption probability: 0.51)\n", - "\t\t2: a woman holding two small white baby animals. (Caption probability: 0.23)\n", - "\t\t3: a hand holding a small mouse that looks tiny. (Caption probability: 0.09)\n", + "\t\t1: person holding two small animals in their hands. (Caption probability: 0.62)\n", + "\t\t2: a person's hand holding a small hamster in front of them. (Caption probability: 0.20)\n", + "\t\t3: a person holding a small animal in their hands. (Caption probability: 0.09)\n", "\n", "\n" ] } ] }, + { + "cell_type": "markdown", + "source": [ + "# Conclusion\n", + "\n", + "After running the pipeline, you can see the captions generated by the BLIP model and ranked by the CLIP model with all of our pre/postprocessing logic applied.\n", + "As you can see, running multi-model inference is easy with the power of Beam.\n" + ], + "metadata": { + "id": "gPCMXWgOtM_0" + } + }, { "cell_type": "markdown", "source": [ diff --git a/examples/notebooks/beam-ml/run_inference_with_tensorflow_hub.ipynb b/examples/notebooks/beam-ml/run_inference_with_tensorflow_hub.ipynb index 63f1f7ccd02d..08a6d3e64b4e 100644 --- a/examples/notebooks/beam-ml/run_inference_with_tensorflow_hub.ipynb +++ b/examples/notebooks/beam-ml/run_inference_with_tensorflow_hub.ipynb @@ -40,7 +40,7 @@ "metadata": { "id": "fFjof1NgAJwu" }, - "execution_count": 1, + "execution_count": null, "outputs": [] }, { @@ -104,7 +104,10 @@ "cell_type": "markdown", "source": [ "## Use TensorFlow Hub's trained model URL\n", - "To use TensorFlow Hub's trained model URL, pass the model URL to the `model_uri` field of `TFModelHandler` class." + "To use TensorFlow Hub's trained model URL, pass the model URL to the `model_uri` field of `TFModelHandler` class.\n", + "\n", + "**Note:** Only models that you save in the [TF2 format](https://www.tensorflow.org/tutorials/keras/save_and_load#save_the_entire_model) are compatible with `TFModelHandler`.\n", + "To see TF2 models, go to the [TF2 section of the TensorFlow Hub](https://tfhub.dev/s?subtype=module,placeholder&tf-version=tf2)." ], "metadata": { "id": "dVLTtFxDuJT_" @@ -120,7 +123,7 @@ "metadata": { "id": "H4-ZvkcTv7MO" }, - "execution_count": 3, + "execution_count": null, "outputs": [] }, { @@ -132,7 +135,7 @@ "metadata": { "id": "n3M6FNaUwBbl" }, - "execution_count": 4, + "execution_count": null, "outputs": [] }, { @@ -154,7 +157,7 @@ "id": "q23ip_HkwL3G", "outputId": "051bfa77-ce1f-4ee2-abcd-26ae7f037180" }, - "execution_count": 5, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -187,7 +190,7 @@ "metadata": { "id": "QLFCEisBwPlz" }, - "execution_count": 6, + "execution_count": null, "outputs": [] }, { @@ -230,7 +233,7 @@ "id": "MSKMc_s6wSUH", "outputId": "73695bae-75ae-4f02-a0a5-750531b8f90b" }, - "execution_count": 8, + "execution_count": null, "outputs": [ { "output_type": "stream", @@ -249,4 +252,4 @@ ] } ] -} +} \ No newline at end of file diff --git a/examples/notebooks/tour-of-beam/dataframes.ipynb b/examples/notebooks/interactive-overview/dataframes.ipynb similarity index 100% rename from examples/notebooks/tour-of-beam/dataframes.ipynb rename to examples/notebooks/interactive-overview/dataframes.ipynb diff --git a/examples/notebooks/tour-of-beam/getting-started.ipynb b/examples/notebooks/interactive-overview/getting-started.ipynb similarity index 100% rename from examples/notebooks/tour-of-beam/getting-started.ipynb rename to examples/notebooks/interactive-overview/getting-started.ipynb diff --git a/examples/notebooks/tour-of-beam/reading-and-writing-data.ipynb b/examples/notebooks/interactive-overview/reading-and-writing-data.ipynb similarity index 100% rename from examples/notebooks/tour-of-beam/reading-and-writing-data.ipynb rename to examples/notebooks/interactive-overview/reading-and-writing-data.ipynb diff --git a/examples/notebooks/tour-of-beam/windowing.ipynb b/examples/notebooks/interactive-overview/windowing.ipynb similarity index 100% rename from examples/notebooks/tour-of-beam/windowing.ipynb rename to examples/notebooks/interactive-overview/windowing.ipynb diff --git a/gradle.properties b/gradle.properties index ccccee1420d4..a5fb7ebbf512 100644 --- a/gradle.properties +++ b/gradle.properties @@ -30,8 +30,8 @@ signing.gnupg.useLegacyGpg=true # buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy. # To build a custom Beam version make sure you change it in both places, see # https://github.com/apache/beam/issues/21302. -version=2.49.0-SNAPSHOT -sdk_version=2.49.0.dev +version=2.50.0-SNAPSHOT +sdk_version=2.50.0.dev javaVersion=1.8 @@ -41,4 +41,4 @@ docker_image_default_repo_prefix=beam_ # supported flink versions flink_versions=1.12,1.13,1.14,1.15,1.16 # supported python versions -python_versions=3.7,3.8,3.9,3.10,3.11 +python_versions=3.8,3.9,3.10,3.11 diff --git a/learning/beamdoc/CombinePerKeyExample.java b/learning/beamdoc/CombinePerKeyExample.java new file mode 100644 index 000000000000..1db85a7d0ecd --- /dev/null +++ b/learning/beamdoc/CombinePerKeyExample.java @@ -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. + */ +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +import org.apache.beam.sdk.transforms.Combine; +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.Sum; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.sdk.values.PCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: CombinePerKey +// description: Demonstration of Combine.perKey transform usage. +// multifile: false +// default_example: false +// context_line: 48 +// categories: +// - Core Transforms +// complexity: BASIC +// tags: +// - transforms +// - numbers +// - distinct + +public class CombinePerKeyExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + + // [START main_section] + // PCollection is grouped by key and the Double values associated with each key + // are combined into a Double. + PCollection> salesRecords = + pipeline.apply( + Create.of( + KV.of("Apples", 2.0), + KV.of("Apples", 3.0), + KV.of("Apples", 5.0), + KV.of("Oranges", 4.0), + KV.of("Oranges", 8.0))); + PCollection> totalSalesPerPerson = + salesRecords.apply(Combine.perKey(Sum.ofDoubles())); + // [END main_section] + // Log values + totalSalesPerPerson.apply( + ParDo.of(new LogOutput<>("PCollection numbers after Combine.perKey transform: "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/learning/beamdoc/FlattenExample.java b/learning/beamdoc/FlattenExample.java new file mode 100644 index 000000000000..453701a66fca --- /dev/null +++ b/learning/beamdoc/FlattenExample.java @@ -0,0 +1,77 @@ +/* + * 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. + */ +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +import org.apache.beam.sdk.transforms.Create; +import org.apache.beam.sdk.transforms.DoFn; +import org.apache.beam.sdk.transforms.Flatten; +import org.apache.beam.sdk.transforms.ParDo; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.PCollectionList; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: Flatten +// description: Demonstration of Flatten transform usage. +// multifile: false +// default_example: false +// context_line: 46 +// categories: +// - Core Transforms +// complexity: BASIC +// tags: +// - transforms +// - numbers + +public class FlattenExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + // [START main_section] + // Flatten takes a PCollectionList of PCollection objects of a given type. + // Returns a single PCollection that contains all of the elements in the PCollection objects in + // that list. + PCollection pc1 = pipeline.apply(Create.of("Hello")); + PCollection pc2 = pipeline.apply(Create.of("World", "Beam")); + PCollection pc3 = pipeline.apply(Create.of("Is", "Fun")); + PCollectionList collections = PCollectionList.of(pc1).and(pc2).and(pc3); + + PCollection merged = collections.apply(Flatten.pCollections()); + // [END main_section] + // Log values + merged.apply(ParDo.of(new LogOutput<>("PCollection numbers after Flatten transform: "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/learning/beamdoc/GroupByKeyExample.java b/learning/beamdoc/GroupByKeyExample.java new file mode 100644 index 000000000000..c8b2dd8dc2d9 --- /dev/null +++ b/learning/beamdoc/GroupByKeyExample.java @@ -0,0 +1,77 @@ +/* + * 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. + */ +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +import org.apache.beam.sdk.transforms.Create; +import org.apache.beam.sdk.transforms.DoFn; +import org.apache.beam.sdk.transforms.GroupByKey; +import org.apache.beam.sdk.transforms.ParDo; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.sdk.values.PCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: GroupByKey +// description: Demonstration of GroupByKey transform usage. +// multifile: false +// default_example: false +// context_line: 46 +// categories: +// - Core Transforms +// complexity: BASIC +// tags: +// - transforms +// - strings +// - pairs +// - group + +public class GroupByKeyExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + // [START main_section] + PCollection> pt = + pipeline.apply( + Create.of( + KV.of("a", "apple"), + KV.of("a", "avocado"), + KV.of("b", "banana"), + KV.of("c", "cherry"))); + PCollection>> result = pt.apply(GroupByKey.create()); + // [END main_section] + result.apply(ParDo.of(new LogOutput<>("PCollection pairs after GroupByKey transform: "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/learning/beamdoc/WithKeysExample.java b/learning/beamdoc/WithKeysExample.java new file mode 100644 index 000000000000..6d77583b96ca --- /dev/null +++ b/learning/beamdoc/WithKeysExample.java @@ -0,0 +1,80 @@ +/* + * 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. + */ +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +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.transforms.WithKeys; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.sdk.values.PCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// beam-playground: +// name: WithKeys +// description: Demonstration of WithKeys transform usage. +// multifile: false +// default_example: false +// context_line: 48 +// categories: +// - Core Transforms +// complexity: BASIC +// tags: +// - transforms +// - strings +// - pairs + +public class WithKeysExample { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + Pipeline pipeline = Pipeline.create(options); + // [START main_section] + PCollection words = pipeline.apply(Create.of("Hello", "World", "Beam", "is", "fun")); + PCollection> lengthAndWord = + words.apply( + WithKeys.of( + new SerializableFunction() { + @Override + public Integer apply(String s) { + return s.length(); + } + })); + // [END main_section] + lengthAndWord.apply( + ParDo.of(new LogOutput<>("PCollection elements after WithKeys transform: "))); + pipeline.run(); + } + + static class LogOutput extends DoFn { + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + private final String prefix; + + public LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + c.element()); + c.output(c.element()); + } + } +} diff --git a/learning/katas/java/Common Transforms/Aggregation/Count/src/org/apache/beam/learning/katas/commontransforms/aggregation/count/Task.java b/learning/katas/java/Common Transforms/Aggregation/Count/src/org/apache/beam/learning/katas/commontransforms/aggregation/count/Task.java index ac8c03810ae9..16d823dd8652 100644 --- a/learning/katas/java/Common Transforms/Aggregation/Count/src/org/apache/beam/learning/katas/commontransforms/aggregation/count/Task.java +++ b/learning/katas/java/Common Transforms/Aggregation/Count/src/org/apache/beam/learning/katas/commontransforms/aggregation/count/Task.java @@ -22,7 +22,7 @@ // name: AggregationCount // description: Task from katas to count the number of elements. // multifile: false -// context_line: 37 +// context_line: 43 // categories: // - Combiners // complexity: BASIC diff --git a/learning/katas/java/Common Transforms/Aggregation/Max/src/org/apache/beam/learning/katas/commontransforms/aggregation/max/Task.java b/learning/katas/java/Common Transforms/Aggregation/Max/src/org/apache/beam/learning/katas/commontransforms/aggregation/max/Task.java index a31cce342548..75af9f9d6cbc 100644 --- a/learning/katas/java/Common Transforms/Aggregation/Max/src/org/apache/beam/learning/katas/commontransforms/aggregation/max/Task.java +++ b/learning/katas/java/Common Transforms/Aggregation/Max/src/org/apache/beam/learning/katas/commontransforms/aggregation/max/Task.java @@ -22,7 +22,7 @@ // name: AggregationMax // description: Task from katas to compute the maximum of elements. // multifile: false -// context_line: 37 +// context_line: 43 // categories: // - Combiners // complexity: BASIC diff --git a/learning/katas/java/Common Transforms/Aggregation/Mean/src/org/apache/beam/learning/katas/commontransforms/aggregation/mean/Task.java b/learning/katas/java/Common Transforms/Aggregation/Mean/src/org/apache/beam/learning/katas/commontransforms/aggregation/mean/Task.java index 526c39353255..ab67d9c0a9f1 100644 --- a/learning/katas/java/Common Transforms/Aggregation/Mean/src/org/apache/beam/learning/katas/commontransforms/aggregation/mean/Task.java +++ b/learning/katas/java/Common Transforms/Aggregation/Mean/src/org/apache/beam/learning/katas/commontransforms/aggregation/mean/Task.java @@ -22,7 +22,7 @@ // name: AggregationMean // description: Task from katas to count mean value of the given pipeline with numbers. // multifile: false -// context_line: 37 +// context_line: 43 // categories: // - Combiners // complexity: BASIC diff --git a/learning/katas/java/Common Transforms/Aggregation/Min/src/org/apache/beam/learning/katas/commontransforms/aggregation/min/Task.java b/learning/katas/java/Common Transforms/Aggregation/Min/src/org/apache/beam/learning/katas/commontransforms/aggregation/min/Task.java index 019366a5c840..47ee390d661e 100644 --- a/learning/katas/java/Common Transforms/Aggregation/Min/src/org/apache/beam/learning/katas/commontransforms/aggregation/min/Task.java +++ b/learning/katas/java/Common Transforms/Aggregation/Min/src/org/apache/beam/learning/katas/commontransforms/aggregation/min/Task.java @@ -22,7 +22,7 @@ // name: AggregationMin // description: Task from katas to compute the minimum of elements. // multifile: false -// context_line: 37 +// context_line: 43 // categories: // - Combiners // complexity: BASIC diff --git a/learning/katas/java/Common Transforms/Aggregation/Sum/src/org/apache/beam/learning/katas/commontransforms/aggregation/sum/Task.java b/learning/katas/java/Common Transforms/Aggregation/Sum/src/org/apache/beam/learning/katas/commontransforms/aggregation/sum/Task.java index 8c4af74a0b5b..7ae17f9603f8 100644 --- a/learning/katas/java/Common Transforms/Aggregation/Sum/src/org/apache/beam/learning/katas/commontransforms/aggregation/sum/Task.java +++ b/learning/katas/java/Common Transforms/Aggregation/Sum/src/org/apache/beam/learning/katas/commontransforms/aggregation/sum/Task.java @@ -22,7 +22,7 @@ // name: AggregationSum // description: Task from katas to compute the sum of all elements. // multifile: false -// context_line: 37 +// context_line: 43 // categories: // - Combiners // complexity: BASIC diff --git a/learning/katas/java/Common Transforms/Filter/Filter/src/org/apache/beam/learning/katas/commontransforms/filter/filter/Task.java b/learning/katas/java/Common Transforms/Filter/Filter/src/org/apache/beam/learning/katas/commontransforms/filter/filter/Task.java index 818392842892..afa2e8edb617 100644 --- a/learning/katas/java/Common Transforms/Filter/Filter/src/org/apache/beam/learning/katas/commontransforms/filter/filter/Task.java +++ b/learning/katas/java/Common Transforms/Filter/Filter/src/org/apache/beam/learning/katas/commontransforms/filter/filter/Task.java @@ -22,7 +22,7 @@ // name: Filter // description: Task from katas to implement a filter function that filters out odd numbers. // multifile: false -// context_line: 37 +// context_line: 43 // categories: // - Filtering // complexity: BASIC diff --git a/learning/katas/java/Common Transforms/Filter/ParDo/src/org/apache/beam/learning/katas/commontransforms/filter/pardo/Task.java b/learning/katas/java/Common Transforms/Filter/ParDo/src/org/apache/beam/learning/katas/commontransforms/filter/pardo/Task.java index 34c2d3eaed90..e3c8179ae72f 100644 --- a/learning/katas/java/Common Transforms/Filter/ParDo/src/org/apache/beam/learning/katas/commontransforms/filter/pardo/Task.java +++ b/learning/katas/java/Common Transforms/Filter/ParDo/src/org/apache/beam/learning/katas/commontransforms/filter/pardo/Task.java @@ -22,7 +22,7 @@ // name: FilterParDo // description: Task from katas to implement a filter function that filters out the even numbers by using DoFn. // multifile: false -// context_line: 38 +// context_line: 44 // categories: // - Filtering // complexity: BASIC diff --git a/learning/katas/java/Common Transforms/WithKeys/WithKeys/src/org/apache/beam/learning/katas/commontransforms/withkeys/Task.java b/learning/katas/java/Common Transforms/WithKeys/WithKeys/src/org/apache/beam/learning/katas/commontransforms/withkeys/Task.java index 0ce6e9585e32..34e728b839c1 100644 --- a/learning/katas/java/Common Transforms/WithKeys/WithKeys/src/org/apache/beam/learning/katas/commontransforms/withkeys/Task.java +++ b/learning/katas/java/Common Transforms/WithKeys/WithKeys/src/org/apache/beam/learning/katas/commontransforms/withkeys/Task.java @@ -22,12 +22,12 @@ // name: WithKeys // description: Task from katas to convert each fruit name into a KV of its first letter and itself. // multifile: false -// context_line: 40 +// context_line: 46 // categories: // - Combiners // complexity: BASIC // tags: -// - transform +// - transforms // - strings import static org.apache.beam.sdk.values.TypeDescriptors.strings; diff --git a/learning/katas/java/Core Transforms/Branching/Branching/src/org/apache/beam/learning/katas/coretransforms/branching/Task.java b/learning/katas/java/Core Transforms/Branching/Branching/src/org/apache/beam/learning/katas/coretransforms/branching/Task.java index 4bad2c5d34ab..82cf90e0b716 100644 --- a/learning/katas/java/Core Transforms/Branching/Branching/src/org/apache/beam/learning/katas/coretransforms/branching/Task.java +++ b/learning/katas/java/Core Transforms/Branching/Branching/src/org/apache/beam/learning/katas/coretransforms/branching/Task.java @@ -23,14 +23,14 @@ // description: Task from katas to branch out the numbers to two different transforms, one transform // is multiplying each number by 5 and the other transform is multiplying each number by 10. // multifile: false -// context_line: 41 +// context_line: 48 // categories: // - Branching // - Core Transforms // complexity: BASIC // tags: // - branch -// - transform +// - transforms // - numbers import static org.apache.beam.sdk.values.TypeDescriptors.integers; diff --git a/learning/katas/java/Core Transforms/CoGroupByKey/CoGroupByKey/src/org/apache/beam/learning/katas/coretransforms/cogroupbykey/Task.java b/learning/katas/java/Core Transforms/CoGroupByKey/CoGroupByKey/src/org/apache/beam/learning/katas/coretransforms/cogroupbykey/Task.java index 4dc413d25d68..aa1e828df444 100644 --- a/learning/katas/java/Core Transforms/CoGroupByKey/CoGroupByKey/src/org/apache/beam/learning/katas/coretransforms/cogroupbykey/Task.java +++ b/learning/katas/java/Core Transforms/CoGroupByKey/CoGroupByKey/src/org/apache/beam/learning/katas/coretransforms/cogroupbykey/Task.java @@ -22,7 +22,7 @@ // name: JoinPCollections // description: Task from katas that joins two PCollections. // multifile: true -// context_line: 48 +// context_line: 54 // categories: // - Combiners // - Core Transforms diff --git a/learning/katas/java/Core Transforms/Combine/BinaryCombineFn Lambda/src/org/apache/beam/learning/katas/coretransforms/combine/binarycombinefnlambda/Task.java b/learning/katas/java/Core Transforms/Combine/BinaryCombineFn Lambda/src/org/apache/beam/learning/katas/coretransforms/combine/binarycombinefnlambda/Task.java index 81882cfa7540..29c13e0ccec0 100644 --- a/learning/katas/java/Core Transforms/Combine/BinaryCombineFn Lambda/src/org/apache/beam/learning/katas/coretransforms/combine/binarycombinefnlambda/Task.java +++ b/learning/katas/java/Core Transforms/Combine/BinaryCombineFn Lambda/src/org/apache/beam/learning/katas/coretransforms/combine/binarycombinefnlambda/Task.java @@ -22,13 +22,13 @@ // name: BinaryCombineFnLambda // description: Task from katas to implement the summation of BigIntegers using lambda. // multifile: false -// context_line: 39 +// context_line: 45 // categories: // - Combiners // - Core Transforms // complexity: BASIC // tags: -// - transform +// - transforms // - numbers import java.math.BigInteger; diff --git a/learning/katas/java/Core Transforms/Combine/BinaryCombineFn/src/org/apache/beam/learning/katas/coretransforms/combine/binarycombinefn/Task.java b/learning/katas/java/Core Transforms/Combine/BinaryCombineFn/src/org/apache/beam/learning/katas/coretransforms/combine/binarycombinefn/Task.java index dc18dcc816d1..4379fd88d20d 100644 --- a/learning/katas/java/Core Transforms/Combine/BinaryCombineFn/src/org/apache/beam/learning/katas/coretransforms/combine/binarycombinefn/Task.java +++ b/learning/katas/java/Core Transforms/Combine/BinaryCombineFn/src/org/apache/beam/learning/katas/coretransforms/combine/binarycombinefn/Task.java @@ -22,13 +22,13 @@ // name: BinaryCombineFn // description: Task from katas to implement the summation of BigIntegers. // multifile: false -// context_line: 40 +// context_line: 46 // categories: // - Combiners // - Core Transforms // complexity: BASIC // tags: -// - transform +// - transforms // - numbers import java.math.BigInteger; diff --git a/learning/katas/java/Core Transforms/Combine/Combine PerKey/src/org/apache/beam/learning/katas/coretransforms/combine/combineperkey/Task.java b/learning/katas/java/Core Transforms/Combine/Combine PerKey/src/org/apache/beam/learning/katas/coretransforms/combine/combineperkey/Task.java index 0c6b9c0bd09d..29cc98580f1e 100644 --- a/learning/katas/java/Core Transforms/Combine/Combine PerKey/src/org/apache/beam/learning/katas/coretransforms/combine/combineperkey/Task.java +++ b/learning/katas/java/Core Transforms/Combine/Combine PerKey/src/org/apache/beam/learning/katas/coretransforms/combine/combineperkey/Task.java @@ -22,7 +22,7 @@ // name: CombinePerKey // description: Task from katas to implement the summation of scores per player. // multifile: false -// context_line: 40 +// context_line: 51 // categories: // - Combiners // - Core Transforms diff --git a/learning/katas/java/Core Transforms/Combine/CombineFn/src/org/apache/beam/learning/katas/coretransforms/combine/combinefn/Task.java b/learning/katas/java/Core Transforms/Combine/CombineFn/src/org/apache/beam/learning/katas/coretransforms/combine/combinefn/Task.java index e5efbbd69255..e72d046b8dc8 100644 --- a/learning/katas/java/Core Transforms/Combine/CombineFn/src/org/apache/beam/learning/katas/coretransforms/combine/combinefn/Task.java +++ b/learning/katas/java/Core Transforms/Combine/CombineFn/src/org/apache/beam/learning/katas/coretransforms/combine/combinefn/Task.java @@ -22,7 +22,7 @@ // name: CombineFn // description: Task from katas averaging. // multifile: false -// context_line: 41 +// context_line: 48 // categories: // - Combiners // - Core Transforms diff --git a/learning/katas/java/Core Transforms/Combine/Simple Function/src/org/apache/beam/learning/katas/coretransforms/combine/simple/Task.java b/learning/katas/java/Core Transforms/Combine/Simple Function/src/org/apache/beam/learning/katas/coretransforms/combine/simple/Task.java index 1d415452f51a..fe58cbc9a825 100644 --- a/learning/katas/java/Core Transforms/Combine/Simple Function/src/org/apache/beam/learning/katas/coretransforms/combine/simple/Task.java +++ b/learning/katas/java/Core Transforms/Combine/Simple Function/src/org/apache/beam/learning/katas/coretransforms/combine/simple/Task.java @@ -22,7 +22,7 @@ // name: FilterSimpleFunction // description: Task from katas to implement the summation of numbers. // multifile: false -// context_line: 39 +// context_line: 46 // categories: // - Combiners // - Core Transforms diff --git a/learning/katas/java/Core Transforms/Composite Transform/Composite Transform/src/org/apache/beam/learning/katas/coretransforms/composite/Task.java b/learning/katas/java/Core Transforms/Composite Transform/Composite Transform/src/org/apache/beam/learning/katas/coretransforms/composite/Task.java index 84f9311b5d7c..7ccefe70a69b 100644 --- a/learning/katas/java/Core Transforms/Composite Transform/Composite Transform/src/org/apache/beam/learning/katas/coretransforms/composite/Task.java +++ b/learning/katas/java/Core Transforms/Composite Transform/Composite Transform/src/org/apache/beam/learning/katas/coretransforms/composite/Task.java @@ -23,7 +23,7 @@ // description: Task from katas to implement a composite transform "ExtractAndMultiplyNumbers" // that extracts numbers from comma separated line and then multiplies each number by 10. // multifile: false -// context_line: 46 +// context_line: 54 // categories: // - Combiners // - Flatten diff --git a/learning/katas/java/Core Transforms/Flatten/Flatten/src/org/apache/beam/learning/katas/coretransforms/flatten/Task.java b/learning/katas/java/Core Transforms/Flatten/Flatten/src/org/apache/beam/learning/katas/coretransforms/flatten/Task.java index b96221b68a7b..1426399caf8a 100644 --- a/learning/katas/java/Core Transforms/Flatten/Flatten/src/org/apache/beam/learning/katas/coretransforms/flatten/Task.java +++ b/learning/katas/java/Core Transforms/Flatten/Flatten/src/org/apache/beam/learning/katas/coretransforms/flatten/Task.java @@ -22,14 +22,14 @@ // name: Flatten // description: Task from katas that merges two PCollections of words into a single PCollection. // multifile: false -// context_line: 40 +// context_line: 47 // categories: // - Combiners // - Flatten // - Core Transforms // complexity: BASIC // tags: -// - transform +// - transforms // - join // - strings diff --git a/learning/katas/java/Core Transforms/GroupByKey/GroupByKey/src/org/apache/beam/learning/katas/coretransforms/groupbykey/Task.java b/learning/katas/java/Core Transforms/GroupByKey/GroupByKey/src/org/apache/beam/learning/katas/coretransforms/groupbykey/Task.java index c7d79a20c0fa..7277da4f811e 100644 --- a/learning/katas/java/Core Transforms/GroupByKey/GroupByKey/src/org/apache/beam/learning/katas/coretransforms/groupbykey/Task.java +++ b/learning/katas/java/Core Transforms/GroupByKey/GroupByKey/src/org/apache/beam/learning/katas/coretransforms/groupbykey/Task.java @@ -22,13 +22,13 @@ // name: GroupByKey // description: Task from katas that groups words by its first letter. // multifile: false -// context_line: 43 +// context_line: 50 // categories: // - Combiners // - Core Transforms // complexity: BASIC // tags: -// - transform +// - transforms // - map // - strings diff --git a/learning/katas/java/Core Transforms/Map/MapElements/src/org/apache/beam/learning/katas/coretransforms/map/mapelements/Task.java b/learning/katas/java/Core Transforms/Map/MapElements/src/org/apache/beam/learning/katas/coretransforms/map/mapelements/Task.java index efecf681ca9b..f90f5f01627c 100644 --- a/learning/katas/java/Core Transforms/Map/MapElements/src/org/apache/beam/learning/katas/coretransforms/map/mapelements/Task.java +++ b/learning/katas/java/Core Transforms/Map/MapElements/src/org/apache/beam/learning/katas/coretransforms/map/mapelements/Task.java @@ -22,12 +22,12 @@ // name: Map // description: Task from katas to implement a simple map function that multiplies all input elements by 5. // multifile: false -// context_line: 38 +// context_line: 45 // categories: // - Core Transforms // complexity: BASIC // tags: -// - transform +// - transforms // - map // - numbers diff --git a/learning/katas/java/Core Transforms/Map/ParDo OneToMany/src/org/apache/beam/learning/katas/coretransforms/map/pardoonetomany/Task.java b/learning/katas/java/Core Transforms/Map/ParDo OneToMany/src/org/apache/beam/learning/katas/coretransforms/map/pardoonetomany/Task.java index 9d472b0b21ae..d429adb54776 100644 --- a/learning/katas/java/Core Transforms/Map/ParDo OneToMany/src/org/apache/beam/learning/katas/coretransforms/map/pardoonetomany/Task.java +++ b/learning/katas/java/Core Transforms/Map/ParDo OneToMany/src/org/apache/beam/learning/katas/coretransforms/map/pardoonetomany/Task.java @@ -22,13 +22,13 @@ // name: MapParDoOneToMany // description: Task from katas that maps each input sentence into words split by whitespace (" "). // multifile: false -// context_line: 39 +// context_line: 45 // categories: // - Flatten // - Core Transforms // complexity: BASIC // tags: -// - transform +// - transforms // - strings import org.apache.beam.learning.katas.util.Log; diff --git a/learning/katas/java/Core Transforms/Map/ParDo/src/org/apache/beam/learning/katas/coretransforms/map/pardo/Task.java b/learning/katas/java/Core Transforms/Map/ParDo/src/org/apache/beam/learning/katas/coretransforms/map/pardo/Task.java index 608c9cdb350b..43aafd86069e 100644 --- a/learning/katas/java/Core Transforms/Map/ParDo/src/org/apache/beam/learning/katas/coretransforms/map/pardo/Task.java +++ b/learning/katas/java/Core Transforms/Map/ParDo/src/org/apache/beam/learning/katas/coretransforms/map/pardo/Task.java @@ -22,12 +22,12 @@ // name: MapPardo // description: Task from katas that maps the input element by multiplying it by 10. // multifile: false -// context_line: 38 +// context_line: 44 // categories: // - Core Transforms // complexity: BASIC // tags: -// - transform +// - transforms // - numbers import org.apache.beam.learning.katas.util.Log; diff --git a/learning/katas/java/Core Transforms/Partition/Partition/src/org/apache/beam/learning/katas/coretransforms/partition/Task.java b/learning/katas/java/Core Transforms/Partition/Partition/src/org/apache/beam/learning/katas/coretransforms/partition/Task.java index cc3a87a35cb2..917c6cc555bf 100644 --- a/learning/katas/java/Core Transforms/Partition/Partition/src/org/apache/beam/learning/katas/coretransforms/partition/Task.java +++ b/learning/katas/java/Core Transforms/Partition/Partition/src/org/apache/beam/learning/katas/coretransforms/partition/Task.java @@ -23,14 +23,14 @@ // description: Task from katas that splits a PCollection of numbers into two PCollections. The first PCollection // contains numbers greater than 100, and the second PCollection contains the remaining numbers. // multifile: false -// context_line: 41 +// context_line: 48 // categories: // - Core Transforms // - Multiple Outputs // complexity: BASIC // tags: // - split -// - transform +// - transforms // - numbers import org.apache.beam.learning.katas.util.Log; diff --git a/learning/katas/java/Core Transforms/Side Input/Side Input/src/org/apache/beam/learning/katas/coretransforms/sideinput/Task.java b/learning/katas/java/Core Transforms/Side Input/Side Input/src/org/apache/beam/learning/katas/coretransforms/sideinput/Task.java index 8504373b7f7e..95d94901bb3e 100644 --- a/learning/katas/java/Core Transforms/Side Input/Side Input/src/org/apache/beam/learning/katas/coretransforms/sideinput/Task.java +++ b/learning/katas/java/Core Transforms/Side Input/Side Input/src/org/apache/beam/learning/katas/coretransforms/sideinput/Task.java @@ -19,16 +19,16 @@ package org.apache.beam.learning.katas.coretransforms.sideinput; // beam-playground: -// name: SideInput -// description: Task from katas to enrich each Person with the country based on the city he/she lives in. -// multifile: true -// context_line: 38 -// categories: -// - Side Input -// complexity: BASIC -// tags: -// - transform -// - strings +// name: SideInput +// description: Task from katas to enrich each Person with the country based on the city he/she lives in. +// multifile: true +// context_line: 48 +// categories: +// - Side Input +// complexity: BASIC +// tags: +// - transforms +// - strings import java.util.Map; import org.apache.beam.learning.katas.util.Log; diff --git a/learning/katas/java/Core Transforms/Side Output/Side Output/src/org/apache/beam/learning/katas/coretransforms/sideoutput/Task.java b/learning/katas/java/Core Transforms/Side Output/Side Output/src/org/apache/beam/learning/katas/coretransforms/sideoutput/Task.java index b8d450f9d943..ab60d0e89566 100644 --- a/learning/katas/java/Core Transforms/Side Output/Side Output/src/org/apache/beam/learning/katas/coretransforms/sideoutput/Task.java +++ b/learning/katas/java/Core Transforms/Side Output/Side Output/src/org/apache/beam/learning/katas/coretransforms/sideoutput/Task.java @@ -22,14 +22,14 @@ // name: SideOutput // description: Task from katas to implement additional output to your ParDo for numbers bigger than 100. // multifile: false -// context_line: 43 +// context_line: 50 // categories: // - Combiners // - Core Transforms // - Multiple Outputs // complexity: BASIC // tags: -// - transform +// - transforms // - numbers // - output diff --git a/learning/katas/java/Examples/Word Count/Word Count/src/org/apache/beam/learning/katas/examples/wordcount/Task.java b/learning/katas/java/Examples/Word Count/Word Count/src/org/apache/beam/learning/katas/examples/wordcount/Task.java index d4760ebde65f..3791bb8fb56c 100644 --- a/learning/katas/java/Examples/Word Count/Word Count/src/org/apache/beam/learning/katas/examples/wordcount/Task.java +++ b/learning/katas/java/Examples/Word Count/Word Count/src/org/apache/beam/learning/katas/examples/wordcount/Task.java @@ -22,13 +22,13 @@ // name: WordCountKata // description: Task from katas to create a pipeline that counts the number of words. // multifile: false -// context_line: 43 +// context_line: 50 // categories: // - Combiners // complexity: BASIC // tags: // - count -// - transform +// - transforms // - numbers import java.util.Arrays; diff --git a/learning/katas/java/Introduction/Hello Beam/Hello Beam/src/org/apache/beam/learning/katas/intro/hello/Task.java b/learning/katas/java/Introduction/Hello Beam/Hello Beam/src/org/apache/beam/learning/katas/intro/hello/Task.java index 108ce58bc618..4f5242dfd3ff 100644 --- a/learning/katas/java/Introduction/Hello Beam/Hello Beam/src/org/apache/beam/learning/katas/intro/hello/Task.java +++ b/learning/katas/java/Introduction/Hello Beam/Hello Beam/src/org/apache/beam/learning/katas/intro/hello/Task.java @@ -22,14 +22,12 @@ // name: Hello Beam // description: Task from katas to create a simple pipeline that takes a hardcoded input element "Hello Beam". // multifile: false -// context_line: 37 +// context_line: 41 // categories: -// - Testing // - Quickstart // complexity: BASIC // tags: -// - test -// - hellobeam +// - pipeline import org.apache.beam.learning.katas.util.Log; import org.apache.beam.sdk.Pipeline; diff --git a/learning/katas/java/Triggers/Early Triggers/Early Triggers/src/org/apache/beam/learning/katas/triggers/earlytriggers/Task.java b/learning/katas/java/Triggers/Early Triggers/Early Triggers/src/org/apache/beam/learning/katas/triggers/earlytriggers/Task.java index 08cbcd853dc1..4cd9164f9d7d 100644 --- a/learning/katas/java/Triggers/Early Triggers/Early Triggers/src/org/apache/beam/learning/katas/triggers/earlytriggers/Task.java +++ b/learning/katas/java/Triggers/Early Triggers/Early Triggers/src/org/apache/beam/learning/katas/triggers/earlytriggers/Task.java @@ -22,7 +22,7 @@ // name: EarlyTriggers // description: Task from katas to count events using early triggers // multifile: true -// context_line: 42 +// context_line: 50 // categories: // - Streaming // complexity: MEDIUM diff --git a/learning/katas/java/Triggers/Event Time Triggers/Event Time Triggers/src/org/apache/beam/learning/katas/triggers/eventtimetriggers/Task.java b/learning/katas/java/Triggers/Event Time Triggers/Event Time Triggers/src/org/apache/beam/learning/katas/triggers/eventtimetriggers/Task.java index 0474a9896d99..20e2e39adbe9 100644 --- a/learning/katas/java/Triggers/Event Time Triggers/Event Time Triggers/src/org/apache/beam/learning/katas/triggers/eventtimetriggers/Task.java +++ b/learning/katas/java/Triggers/Event Time Triggers/Event Time Triggers/src/org/apache/beam/learning/katas/triggers/eventtimetriggers/Task.java @@ -22,7 +22,7 @@ // name: EventTimeTriggers // description: Task from katas to count events with event time triggers // multifile: true -// context_line: 42 +// context_line: 49 // categories: // - Streaming // complexity: MEDIUM diff --git a/learning/katas/java/Triggers/Window Accumulation Mode/Window Accumulation Mode/src/org/apache/beam/learning/katas/triggers/windowaccummode/Task.java b/learning/katas/java/Triggers/Window Accumulation Mode/Window Accumulation Mode/src/org/apache/beam/learning/katas/triggers/windowaccummode/Task.java index 826fb622a427..6aadb8048043 100644 --- a/learning/katas/java/Triggers/Window Accumulation Mode/Window Accumulation Mode/src/org/apache/beam/learning/katas/triggers/windowaccummode/Task.java +++ b/learning/katas/java/Triggers/Window Accumulation Mode/Window Accumulation Mode/src/org/apache/beam/learning/katas/triggers/windowaccummode/Task.java @@ -22,7 +22,7 @@ // name: WindowAccumulationMode // description: Task from katas to count events using ACCUMULATING as accumulation mode // multifile: true -// context_line: 42 +// context_line: 51 // categories: // - Streaming // complexity: MEDIUM diff --git a/learning/katas/java/Windowing/Adding Timestamp/ParDo/src/org/apache/beam/learning/katas/windowing/addingtimestamp/pardo/Task.java b/learning/katas/java/Windowing/Adding Timestamp/ParDo/src/org/apache/beam/learning/katas/windowing/addingtimestamp/pardo/Task.java index ec35270e03a7..fcdebe4e6c8c 100644 --- a/learning/katas/java/Windowing/Adding Timestamp/ParDo/src/org/apache/beam/learning/katas/windowing/addingtimestamp/pardo/Task.java +++ b/learning/katas/java/Windowing/Adding Timestamp/ParDo/src/org/apache/beam/learning/katas/windowing/addingtimestamp/pardo/Task.java @@ -22,13 +22,13 @@ // name: WindowingAddTimestamp // description: Task from katas to assign each element a timestamp based on the `Event.timestamp`. // multifile: true -// context_line: 39 +// context_line: 46 // categories: // - Streaming // complexity: MEDIUM // tags: // - timestamp -// - transform +// - transforms // - event import org.apache.beam.learning.katas.util.Log; diff --git a/learning/katas/java/Windowing/Adding Timestamp/WithTimestamps/src/org/apache/beam/learning/katas/windowing/addingtimestamp/withtimestamps/Task.java b/learning/katas/java/Windowing/Adding Timestamp/WithTimestamps/src/org/apache/beam/learning/katas/windowing/addingtimestamp/withtimestamps/Task.java index 6d2dbec4c4e9..6b31356d12b7 100644 --- a/learning/katas/java/Windowing/Adding Timestamp/WithTimestamps/src/org/apache/beam/learning/katas/windowing/addingtimestamp/withtimestamps/Task.java +++ b/learning/katas/java/Windowing/Adding Timestamp/WithTimestamps/src/org/apache/beam/learning/katas/windowing/addingtimestamp/withtimestamps/Task.java @@ -22,13 +22,13 @@ // name: WithTimestamps // description: Task from katas to assign each element a timestamp using `WithTimestamps`. // multifile: true -// context_line: 38 +// context_line: 45 // categories: // - Streaming // complexity: MEDIUM // tags: // - timestamp -// - transform +// - transforms // - event import org.apache.beam.learning.katas.util.Log; diff --git a/learning/katas/java/Windowing/Fixed Time Window/Fixed Time Window/src/org/apache/beam/learning/katas/windowing/fixedwindow/Task.java b/learning/katas/java/Windowing/Fixed Time Window/Fixed Time Window/src/org/apache/beam/learning/katas/windowing/fixedwindow/Task.java index 64b725a6179b..d0705462d681 100644 --- a/learning/katas/java/Windowing/Fixed Time Window/Fixed Time Window/src/org/apache/beam/learning/katas/windowing/fixedwindow/Task.java +++ b/learning/katas/java/Windowing/Fixed Time Window/Fixed Time Window/src/org/apache/beam/learning/katas/windowing/fixedwindow/Task.java @@ -22,7 +22,7 @@ // name: FixedTimeWindow // description: Task from katas to count the number of events that happened based on fixed window with 1-day duration. // multifile: false -// context_line: 44 +// context_line: 52 // categories: // - Combiners // - Streaming diff --git a/learning/katas/python/Common Transforms/Aggregation/Count/task.py b/learning/katas/python/Common Transforms/Aggregation/Count/task.py index a4e5b0cb53ee..915d5608d22c 100644 --- a/learning/katas/python/Common Transforms/Aggregation/Count/task.py +++ b/learning/katas/python/Common Transforms/Aggregation/Count/task.py @@ -18,7 +18,7 @@ # name: AggregationCount # description: Task from katas to count the number of elements. # multifile: false -# context_line: 29 +# context_line: 31 # categories: # - Combiners # complexity: BASIC diff --git a/learning/katas/python/Common Transforms/Aggregation/Largest/task.py b/learning/katas/python/Common Transforms/Aggregation/Largest/task.py index fbbe17223742..7d0d12d6d5c8 100644 --- a/learning/katas/python/Common Transforms/Aggregation/Largest/task.py +++ b/learning/katas/python/Common Transforms/Aggregation/Largest/task.py @@ -18,7 +18,7 @@ # name: AggregationLargest # description: Task from katas to compute a list of the two largest elements. # multifile: false -# context_line: 29 +# context_line: 31 # categories: # - Combiners # complexity: BASIC diff --git a/learning/katas/python/Common Transforms/Aggregation/Mean/task.py b/learning/katas/python/Common Transforms/Aggregation/Mean/task.py index 024f1b02d14c..c64291b1733a 100644 --- a/learning/katas/python/Common Transforms/Aggregation/Mean/task.py +++ b/learning/katas/python/Common Transforms/Aggregation/Mean/task.py @@ -18,7 +18,7 @@ # name: AggregationMean # description: Task from katas to count mean value of the given pipeline with numbers. # multifile: false -# context_line: 29 +# context_line: 31 # categories: # - Combiners # complexity: BASIC diff --git a/learning/katas/python/Common Transforms/Aggregation/Smallest/task.py b/learning/katas/python/Common Transforms/Aggregation/Smallest/task.py index 9b2ec87586de..95246153315b 100644 --- a/learning/katas/python/Common Transforms/Aggregation/Smallest/task.py +++ b/learning/katas/python/Common Transforms/Aggregation/Smallest/task.py @@ -18,7 +18,7 @@ # name: AggregationSmallest # description: Task from katas to compute the smallest of elements. # multifile: false -# context_line: 29 +# context_line: 31 # categories: # - Combiners # complexity: BASIC diff --git a/learning/katas/python/Common Transforms/Aggregation/Sum/task.py b/learning/katas/python/Common Transforms/Aggregation/Sum/task.py index a5c8c997279f..866166b9bd4e 100644 --- a/learning/katas/python/Common Transforms/Aggregation/Sum/task.py +++ b/learning/katas/python/Common Transforms/Aggregation/Sum/task.py @@ -18,7 +18,7 @@ # name: AggregationSum # description: Task from katas to compute the sum of all elements. # multifile: false -# context_line: 29 +# context_line: 31 # categories: # - Combiners # complexity: BASIC diff --git a/learning/katas/python/Common Transforms/Filter/Filter/task.py b/learning/katas/python/Common Transforms/Filter/Filter/task.py index 756e7a7d22a9..13a6ae6c9d94 100644 --- a/learning/katas/python/Common Transforms/Filter/Filter/task.py +++ b/learning/katas/python/Common Transforms/Filter/Filter/task.py @@ -18,7 +18,7 @@ # name: Filter # description: Task from katas to implement a filter function that filters out odd numbers. # multifile: false -# context_line: 29 +# context_line: 31 # categories: # - Filtering # complexity: BASIC diff --git a/learning/katas/python/Common Transforms/Filter/ParDo/task.py b/learning/katas/python/Common Transforms/Filter/ParDo/task.py index f6f148342072..52b67b7e0d2d 100644 --- a/learning/katas/python/Common Transforms/Filter/ParDo/task.py +++ b/learning/katas/python/Common Transforms/Filter/ParDo/task.py @@ -18,7 +18,7 @@ # name: FilterParDo # description: Task from katas to implement a filter function that filters out the even numbers. # multifile: false -# context_line: 30 +# context_line: 39 # categories: # - Filtering # complexity: BASIC diff --git a/learning/katas/python/Common Transforms/WithKeys/WithKeys/task.py b/learning/katas/python/Common Transforms/WithKeys/WithKeys/task.py index 35c44e7b3043..71a4d8a53358 100644 --- a/learning/katas/python/Common Transforms/WithKeys/WithKeys/task.py +++ b/learning/katas/python/Common Transforms/WithKeys/WithKeys/task.py @@ -18,7 +18,7 @@ # name: WithKeys # description: Task from katas to convert each fruit name into a KV of its first letter and itself. # multifile: false -# context_line: 29 +# context_line: 31 # categories: # - Core Transforms # complexity: BASIC diff --git a/learning/katas/python/Core Transforms/Branching/Branching/task.py b/learning/katas/python/Core Transforms/Branching/Branching/task.py index 53ffdf0723ac..1426f020fbf8 100644 --- a/learning/katas/python/Core Transforms/Branching/Branching/task.py +++ b/learning/katas/python/Core Transforms/Branching/Branching/task.py @@ -19,7 +19,7 @@ # description: Task from katas to branch out the numbers to two different transforms, one transform # is multiplying each number by 5 and the other transform is multiplying each number by 10. # multifile: false -# context_line: 31 +# context_line: 33 # categories: # - Branching # - Multiple Outputs diff --git a/learning/katas/python/Core Transforms/CoGroupByKey/CoGroupByKey/task.py b/learning/katas/python/Core Transforms/CoGroupByKey/CoGroupByKey/task.py index 636cc79d17bc..7a41208edb1a 100644 --- a/learning/katas/python/Core Transforms/CoGroupByKey/CoGroupByKey/task.py +++ b/learning/katas/python/Core Transforms/CoGroupByKey/CoGroupByKey/task.py @@ -19,7 +19,7 @@ # description: Task from katas to implement a CoGroupByKey transform that join words by its first # alphabetical letter, and then produces the string representation of the WordsAlphabet model. # multifile: false -# context_line: 31 +# context_line: 62 # categories: # - Combiners # complexity: MEDIUM diff --git a/learning/katas/python/Core Transforms/Combine/Combine PerKey/task.py b/learning/katas/python/Core Transforms/Combine/Combine PerKey/task.py index 9a112a725a7a..84b254218be3 100644 --- a/learning/katas/python/Core Transforms/Combine/Combine PerKey/task.py +++ b/learning/katas/python/Core Transforms/Combine/Combine PerKey/task.py @@ -18,7 +18,7 @@ # name: CombinePerKey # description: Task from katas to implement the summation of scores per player. # multifile: false -# context_line: 30 +# context_line: 37 # categories: # - Combiners # complexity: BASIC diff --git a/learning/katas/python/Core Transforms/Combine/CombineFn/task.py b/learning/katas/python/Core Transforms/Combine/CombineFn/task.py index 1ff506247765..f04eb1a3d653 100644 --- a/learning/katas/python/Core Transforms/Combine/CombineFn/task.py +++ b/learning/katas/python/Core Transforms/Combine/CombineFn/task.py @@ -18,13 +18,13 @@ # name: CombineFn # description: Task from katas averaging. # multifile: false -# context_line: 30 +# context_line: 50 # categories: # - Combiners # complexity: BASIC # tags: # - count -# - nunbers +# - numbers import apache_beam as beam diff --git a/learning/katas/python/Core Transforms/Combine/Simple Function/task.py b/learning/katas/python/Core Transforms/Combine/Simple Function/task.py index 7ac6768c1d34..8b3cda05f091 100644 --- a/learning/katas/python/Core Transforms/Combine/Simple Function/task.py +++ b/learning/katas/python/Core Transforms/Combine/Simple Function/task.py @@ -18,7 +18,7 @@ # name: CombineSimpleFunction # description: Task from katas to implement the summation of numbers. # multifile: false -# context_line: 30 +# context_line: 42 # categories: # - Combiners # complexity: BASIC diff --git a/learning/katas/python/Core Transforms/Composite Transform/Composite Transform/task.py b/learning/katas/python/Core Transforms/Composite Transform/Composite Transform/task.py index 66960ab1c4b3..bbf7b50fcfdc 100644 --- a/learning/katas/python/Core Transforms/Composite Transform/Composite Transform/task.py +++ b/learning/katas/python/Core Transforms/Composite Transform/Composite Transform/task.py @@ -19,7 +19,7 @@ # description: Task from katas to implement a composite transform "ExtractAndMultiplyNumbers" # that extracts numbers from comma separated line and then multiplies each number by 10. # multifile: false -# context_line: 31 +# context_line: 43 # categories: # - Flatten # complexity: BASIC diff --git a/learning/katas/python/Core Transforms/Flatten/Flatten/task.py b/learning/katas/python/Core Transforms/Flatten/Flatten/task.py index 0d3cfb26be46..ae0f5c81d958 100644 --- a/learning/katas/python/Core Transforms/Flatten/Flatten/task.py +++ b/learning/katas/python/Core Transforms/Flatten/Flatten/task.py @@ -18,7 +18,7 @@ # name: Flatten # description: Task from katas that merges two PCollections of words into a single PCollection. # multifile: false -# context_line: 29 +# context_line: 31 # categories: # - Flatten # complexity: BASIC diff --git a/learning/katas/python/Core Transforms/GroupByKey/GroupByKey/task.py b/learning/katas/python/Core Transforms/GroupByKey/GroupByKey/task.py index e47136554538..7e5d3fb954f9 100644 --- a/learning/katas/python/Core Transforms/GroupByKey/GroupByKey/task.py +++ b/learning/katas/python/Core Transforms/GroupByKey/GroupByKey/task.py @@ -18,7 +18,7 @@ # name: GroupByKey # description: Task from katas that groups words by its first letter. # multifile: false -# context_line: 29 +# context_line: 32 # categories: # - Combiners # complexity: BASIC diff --git a/learning/katas/python/Core Transforms/Map/FlatMap/task.py b/learning/katas/python/Core Transforms/Map/FlatMap/task.py index 3b9e876d6f20..c80c1e382869 100644 --- a/learning/katas/python/Core Transforms/Map/FlatMap/task.py +++ b/learning/katas/python/Core Transforms/Map/FlatMap/task.py @@ -19,7 +19,7 @@ # description: Task from katas to implement a function that maps each input sentence # into words split by whitespace (" "). # multifile: false -# context_line: 30 +# context_line: 32 # categories: # - Core Transforms # complexity: BASIC diff --git a/learning/katas/python/Core Transforms/Map/Map/task.py b/learning/katas/python/Core Transforms/Map/Map/task.py index aa6714ba9489..7432d0dc1077 100644 --- a/learning/katas/python/Core Transforms/Map/Map/task.py +++ b/learning/katas/python/Core Transforms/Map/Map/task.py @@ -18,7 +18,7 @@ # name: Map # description: Task from katas to implement a simple map function that multiplies all input elements by 5. # multifile: false -# context_line: 29 +# context_line: 31 # categories: # - Core Transforms # complexity: BASIC diff --git a/learning/katas/python/Core Transforms/Map/ParDo OneToMany/task.py b/learning/katas/python/Core Transforms/Map/ParDo OneToMany/task.py index cadd56b53021..54f35d5ba7b8 100644 --- a/learning/katas/python/Core Transforms/Map/ParDo OneToMany/task.py +++ b/learning/katas/python/Core Transforms/Map/ParDo OneToMany/task.py @@ -19,12 +19,12 @@ # description: Task from katas is a ParDo that maps each input sentence into # words splitter by whitespace (" "). # multifile: false -# context_line: 31 +# context_line: 40 # categories: # - Core Transforms # complexity: BASIC # tags: -# - transform +# - transforms # - strings import apache_beam as beam diff --git a/learning/katas/python/Core Transforms/Map/ParDo/task.py b/learning/katas/python/Core Transforms/Map/ParDo/task.py index b6a0aed8d99d..b77411f8d6ae 100644 --- a/learning/katas/python/Core Transforms/Map/ParDo/task.py +++ b/learning/katas/python/Core Transforms/Map/ParDo/task.py @@ -18,12 +18,12 @@ # name: MapPardo # description: Task from katas is simple ParDo that maps the input element by multiplying it by 10. # multifile: false -# context_line: 30 +# context_line: 38 # categories: # - Core Transforms # complexity: BASIC # tags: -# - transform +# - transforms # - numbers import apache_beam as beam diff --git a/learning/katas/python/Core Transforms/Partition/Partition/task.py b/learning/katas/python/Core Transforms/Partition/Partition/task.py index b06a1662e55c..9902bc34fb84 100644 --- a/learning/katas/python/Core Transforms/Partition/Partition/task.py +++ b/learning/katas/python/Core Transforms/Partition/Partition/task.py @@ -19,7 +19,7 @@ # description: Task from katas that splits a PCollection of numbers into two PCollections. The first PCollection # contains numbers greater than 100, and the second PCollection contains the remaining numbers. # multifile: false -# context_line: 31 +# context_line: 40 # categories: # - Multiple Outputs # complexity: BASIC diff --git a/learning/katas/python/Core Transforms/Side Input/Side Input/task.py b/learning/katas/python/Core Transforms/Side Input/Side Input/task.py index 5943907b5ab3..10fbfe4d0a93 100644 --- a/learning/katas/python/Core Transforms/Side Input/Side Input/task.py +++ b/learning/katas/python/Core Transforms/Side Input/Side Input/task.py @@ -18,12 +18,12 @@ # name: SideInput # description: Task from katas to enrich each Person with the country based on the city he/she lives in. # multifile: false -# context_line: 38 +# context_line: 48 # categories: # - Side Input # complexity: MEDIUM # tags: -# - transform +# - transforms # - map # - strings diff --git a/learning/katas/python/Core Transforms/Side Output/Side Output/task.py b/learning/katas/python/Core Transforms/Side Output/Side Output/task.py index f6dad94a5671..9634d10add7b 100644 --- a/learning/katas/python/Core Transforms/Side Output/Side Output/task.py +++ b/learning/katas/python/Core Transforms/Side Output/Side Output/task.py @@ -18,13 +18,13 @@ # name: SideOutput # description: Task from katas to implement additional output to your ParDo for numbers bigger than 100. # multifile: false -# context_line: 31 +# context_line: 48 # categories: # - Filtering # - Multiple Outputs # complexity: BASIC # tags: -# - transform +# - transforms # - map # - output # - strings diff --git a/learning/katas/python/Examples/Word Count/Word Count/task.py b/learning/katas/python/Examples/Word Count/Word Count/task.py index fb3bf9c23863..b487439126f1 100644 --- a/learning/katas/python/Examples/Word Count/Word Count/task.py +++ b/learning/katas/python/Examples/Word Count/Word Count/task.py @@ -18,7 +18,7 @@ # name: WordCountKata # description: Task from katas to create a pipeline that counts the number of words. # multifile: false -# context_line: 32 +# context_line: 39 # categories: # - Combiners # complexity: BASIC @@ -26,8 +26,8 @@ # - count # - map # - combine -# - string -# - number +# - strings +# - numbers import apache_beam as beam diff --git a/learning/katas/python/IO/TextIO/ReadFromText/task.py b/learning/katas/python/IO/TextIO/ReadFromText/task.py index fc9d51565790..a48c834a4774 100644 --- a/learning/katas/python/IO/TextIO/ReadFromText/task.py +++ b/learning/katas/python/IO/TextIO/ReadFromText/task.py @@ -20,7 +20,7 @@ # multifile: true # files: # - name: countries.txt -# context_line: 33 +# context_line: 35 # categories: # - IO # complexity: BASIC diff --git a/learning/katas/python/Introduction/Hello Beam/Hello Beam/task.py b/learning/katas/python/Introduction/Hello Beam/Hello Beam/task.py index bed032039ef7..0c9779c5f93e 100644 --- a/learning/katas/python/Introduction/Hello Beam/Hello Beam/task.py +++ b/learning/katas/python/Introduction/Hello Beam/Hello Beam/task.py @@ -20,11 +20,10 @@ # multifile: false # context_line: 30 # categories: -# - Testing # - Quickstart # complexity: BASIC # tags: -# - hellobeam +# - pipeline import apache_beam as beam diff --git a/learning/katas/python/Streaming/Timestamps/Add Timestamps/task.py b/learning/katas/python/Streaming/Timestamps/Add Timestamps/task.py index 51e53dd74e38..93488975df97 100644 --- a/learning/katas/python/Streaming/Timestamps/Add Timestamps/task.py +++ b/learning/katas/python/Streaming/Timestamps/Add Timestamps/task.py @@ -18,7 +18,7 @@ # name: WindowingParDo # description: Task from katas to assign each element a timestamp based on the `Event.timestamp`. # multifile: false -# context_line: 34 +# context_line: 52 # categories: # - Streaming # complexity: MEDIUM diff --git a/learning/katas/python/Streaming/Triggers/Early Triggers/task.py b/learning/katas/python/Streaming/Triggers/Early Triggers/task.py index 7dd22836be03..c79d5f0d3510 100644 --- a/learning/katas/python/Streaming/Triggers/Early Triggers/task.py +++ b/learning/katas/python/Streaming/Triggers/Early Triggers/task.py @@ -23,7 +23,7 @@ # multifile: true # files: # - name: generate_event.py -# context_line: 36 +# context_line: 62 # categories: # - Streaming # complexity: MEDIUM diff --git a/learning/katas/python/Streaming/Triggers/Event Time Triggers/task.py b/learning/katas/python/Streaming/Triggers/Event Time Triggers/task.py index b32a453560f7..f428ed4f1ade 100644 --- a/learning/katas/python/Streaming/Triggers/Event Time Triggers/task.py +++ b/learning/katas/python/Streaming/Triggers/Event Time Triggers/task.py @@ -23,7 +23,7 @@ # multifile: true # files: # - name: generate_event.py -# context_line: 36 +# context_line: 54 # categories: # - Streaming # complexity: MEDIUM diff --git a/learning/katas/python/Streaming/Triggers/Window Accumulation Modes/task.py b/learning/katas/python/Streaming/Triggers/Window Accumulation Modes/task.py index 3cbe9927a605..a4cff902b9fa 100644 --- a/learning/katas/python/Streaming/Triggers/Window Accumulation Modes/task.py +++ b/learning/katas/python/Streaming/Triggers/Window Accumulation Modes/task.py @@ -22,7 +22,7 @@ # multifile: true # files: # - name: generate_event.py -# context_line: 36 +# context_line: 60 # categories: # - Streaming # complexity: ADVANCED diff --git a/learning/katas/python/Streaming/Windows/Fixed Windows/task.py b/learning/katas/python/Streaming/Windows/Fixed Windows/task.py index 3bf218e6b5e6..0eaabd03b18d 100644 --- a/learning/katas/python/Streaming/Windows/Fixed Windows/task.py +++ b/learning/katas/python/Streaming/Windows/Fixed Windows/task.py @@ -18,7 +18,7 @@ # name: WindowingFixedTime # description: Task from katas to count the number of events that happened based on fixed window with 1-day duration. # multifile: false -# context_line: 35 +# context_line: 39 # categories: # - Windowing # - Combiners diff --git a/learning/tour-of-beam/cloudbuild/scripts/tob_deploy_infra_backend.sh b/learning/tour-of-beam/cloudbuild/scripts/tob_deploy_infra_backend.sh index d97148874126..7467992d443d 100644 --- a/learning/tour-of-beam/cloudbuild/scripts/tob_deploy_infra_backend.sh +++ b/learning/tour-of-beam/cloudbuild/scripts/tob_deploy_infra_backend.sh @@ -18,6 +18,7 @@ # under the License. export DEBIAN_FRONTEND=noninteractive +export FLUTTER_VERSION=3.10.4 apt-get -qq update @@ -37,9 +38,9 @@ unzip terraform_1.4.2_linux_amd64.zip mv terraform /usr/local/bin/terraform -wget -nv https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_3.10.2-stable.tar.xz +wget -nv https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_$FLUTTER_VERSION-stable.tar.xz -tar xf flutter_linux_3.10.2-stable.tar.xz +tar xf flutter_linux_$FLUTTER_VERSION-stable.tar.xz git config --global --add safe.directory /usr/local/bin/flutter diff --git a/learning/tour-of-beam/frontend/integration_test/tour_page_test.dart b/learning/tour-of-beam/frontend/integration_test/tour_page_test.dart index 581fb49f1cef..bb6846c28e09 100644 --- a/learning/tour-of-beam/frontend/integration_test/tour_page_test.dart +++ b/learning/tour-of-beam/frontend/integration_test/tour_page_test.dart @@ -16,6 +16,9 @@ * limitations under the License. */ +// ignore_for_file: avoid_print + +import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:get_it/get_it.dart'; @@ -23,34 +26,45 @@ import 'package:integration_test/integration_test.dart'; import 'package:playground_components/playground_components.dart'; import 'package:playground_components_dev/playground_components_dev.dart'; import 'package:tour_of_beam/cache/content_tree.dart'; +import 'package:tour_of_beam/cache/sdk.dart'; +import 'package:tour_of_beam/cache/unit_content.dart'; import 'package:tour_of_beam/components/builders/content_tree.dart'; -import 'package:tour_of_beam/models/group.dart'; +import 'package:tour_of_beam/models/content_tree.dart'; import 'package:tour_of_beam/models/module.dart'; +import 'package:tour_of_beam/models/parent_node.dart'; import 'package:tour_of_beam/models/unit.dart'; import 'package:tour_of_beam/pages/tour/screen.dart'; import 'package:tour_of_beam/pages/tour/state.dart'; import 'package:tour_of_beam/pages/tour/widgets/playground.dart'; import 'package:tour_of_beam/pages/tour/widgets/unit.dart'; import 'package:tour_of_beam/pages/tour/widgets/unit_content.dart'; +import 'package:tour_of_beam/state.dart'; import 'common/common.dart'; import 'common/common_finders.dart'; +const _sdk = Sdk.java; + void main() { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); testWidgets( 'ToB miscellaneous ui', (wt) async { await init(wt); - await wt.tapAndSettle(find.text(Sdk.java.title)); + await wt.tapAndSettle(find.outlinedButtonWithText(_sdk.title)); await wt.tapAndSettle(find.startTourButton()); await _checkContentTreeBuildsProperly(wt); - await _checkContentTreeScrollsProperly(wt); await _checkHighlightsSelectedUnit(wt); - // TODO(nausharipov): fix tests - // await _checkRunCodeWorks(wt); - // await _checkResizeUnitContent(wt); + await _checkRunCodeWorks(wt); + await _checkResizeUnitContent(wt); + await _checkSdkChanges(wt); + + expect( + ExamplesLoader.failedToLoadExamples, + isEmpty, + reason: 'Failed to load some examples.', + ); }, ); } @@ -59,29 +73,28 @@ Future _checkContentTreeBuildsProperly(WidgetTester wt) async { final modules = _getModules(wt); for (final module in modules) { - await _checkModule(module, wt); + await _checkParent(module, wt); } } List _getModules(WidgetTester wt) { final contentTreeCache = GetIt.instance.get(); - final controller = getContentTreeController(wt); - final contentTree = contentTreeCache.getContentTree(controller.sdk); + final contentTree = contentTreeCache.getContentTree(_sdk); return contentTree?.nodes ?? (throw Exception('Cannot load modules')); } -Future _checkModule(ModuleModel module, WidgetTester wt) async { - if (!_getExpandedIds(wt).contains(module.id)) { - await wt.ensureVisible(find.byKey(Key(module.id))); - await wt.tapAndSettle(find.byKey(Key(module.id))); +Future _checkParent(ParentNodeModel node, WidgetTester wt) async { + if (!_getExpandedIds(wt).contains(node.id)) { + await wt.ensureVisible(find.byKey(Key(node.id))); + await wt.tapAndSettle(find.byKey(Key(node.id))); } - for (final node in module.nodes) { - if (node is UnitModel) { - await _checkNode(node, wt); + for (final child in node.nodes) { + if (child is UnitModel) { + await _checkNode(child, wt); } - if (node is GroupModel) { - await _checkGroup(node, wt); + if (child is ParentNodeModel) { + await _checkParent(child, wt); } } } @@ -108,13 +121,12 @@ Future _checkUnitContentLoadsProperly( ) async { await wt.tapAndSettle(find.byKey(Key(unit.id))); - // TODO(nausharipov): fix the test. - // final hasSnippet = _getTourNotifier(wt).isUnitContainsSnippet; + final hasSnippet = _getTourNotifier(wt).isPlaygroundShown; - // expect( - // find.byType(PlaygroundWidget), - // hasSnippet ? findsOneWidget : findsNothing, - // ); + expect( + find.byType(PlaygroundWidget), + hasSnippet ? findsOneWidget : findsNothing, + ); expect( find.descendant( @@ -125,28 +137,6 @@ Future _checkUnitContentLoadsProperly( ); } -Future _checkGroup(GroupModel group, WidgetTester wt) async { - await wt.ensureVisible(find.byKey(Key(group.id))); - await wt.tapAndSettle(find.byKey(Key(group.id))); - - for (final n in group.nodes) { - if (n is GroupModel) { - await _checkGroup(n, wt); - } - if (n is UnitModel) { - await _checkNode(n, wt); - } - } -} - -Future _checkContentTreeScrollsProperly(WidgetTester wt) async { - final modules = _getModules(wt); - final lastNode = modules.expand((m) => m.nodes).whereType().last; - - await wt.ensureVisible(find.byKey(Key(lastNode.id))); - await wt.pumpAndSettle(); -} - Future _checkHighlightsSelectedUnit(WidgetTester wt) async { final controller = getContentTreeController(wt); final selectedUnit = controller.currentNode; @@ -185,7 +175,7 @@ public class MyClass { } '''; - await _selectExampleWithSnippet(wt); + await _selectUnitWithSnippet(wt); await wt.pumpAndSettle(); await wt.enterText(find.snippetCodeField(), code); @@ -230,7 +220,7 @@ Future _checkResizeUnitContent(WidgetTester wt) async { expectSimilar(startHandlePosition.dx, movedHandlePosition.dx - 100); } -Future _selectExampleWithSnippet(WidgetTester wt) async { +Future _selectUnitWithSnippet(WidgetTester wt) async { final tourNotifier = _getTourNotifier(wt); final modules = _getModules(wt); @@ -238,7 +228,7 @@ Future _selectExampleWithSnippet(WidgetTester wt) async { for (final node in module.nodes) { if (node is UnitModel) { await _checkNode(node, wt); - if (tourNotifier.isUnitContainsSnippet) { + if (tourNotifier.isPlaygroundShown) { return; } } @@ -259,3 +249,99 @@ Set _getExpandedIds(WidgetTester wt) { final controller = getContentTreeController(wt); return controller.expandedIds; } + +Future _checkSdkChanges(WidgetTester wt) async { + await _selectUnitWithSnippetsInAllSdks(wt); + await _checkSnippetChangesOnSdkChanging(wt); +} + +Future _selectUnitWithSnippetsInAllSdks(WidgetTester wt) async { + final unitWithSnippets = await _findUnitWithSnippetsInAllSdks(wt); + + if (unitWithSnippets == null) { + fail('No unit with snippets in all sdks'); + } + + final controller = getContentTreeController(wt); + controller.onNodePressed(unitWithSnippets); + await wt.pumpAndSettle(); +} + +Future _findUnitWithSnippetsInAllSdks(WidgetTester wt) async { + final commonUnits = await _getCommonUnitsInAllSdks(wt); + for (final unit in commonUnits) { + if (await _hasSnippetsInAllSdks(unit)) { + return unit; + } + } + return null; +} + +Future _hasSnippetsInAllSdks(UnitModel unit) async { + final unitContentCache = GetIt.instance.get(); + final sdks = GetIt.instance.get().getSdks(); + for (final sdk in sdks) { + final unitContent = await unitContentCache.getUnitContent(sdk.id, unit.id); + if (unitContent.taskSnippetId == null) { + return false; + } + } + return true; +} + +Future> _getCommonUnitsInAllSdks(WidgetTester wt) async { + final contentTrees = await _loadAllContentTrees(wt); + final sdkUnits = List>.empty(growable: true); + for (final tree in contentTrees) { + sdkUnits.add(tree.getUnits().toSet()); + } + + // Identifies and stores the common units across all lists within + // the 'sdkUnits' list by iteratively removing elements from the first list + // that don't exist in the subsequent lists. + final commonUnitTitles = sdkUnits.first; + for (final units in sdkUnits.skip(1)) { + commonUnitTitles.removeWhere((u) => !units.contains(u)); + } + + return commonUnitTitles; +} + +Future> _loadAllContentTrees(WidgetTester wt) async { + final sdkCache = GetIt.instance.get(); + final contentTreeCache = GetIt.instance.get(); + final sdks = sdkCache.getSdks(); + final nullableTrees = await Future.wait( + sdks.map((sdk) async => contentTreeCache.getContentTree(sdk)), + ); + + return nullableTrees.whereNotNull().toList(growable: false); +} + +Future _checkSnippetChangesOnSdkChanging(WidgetTester wt) async { + final defaultSdk = _getTourNotifier(wt).playgroundController.sdk; + final sdkCache = GetIt.instance.get(); + + for (final sdk in sdkCache.getSdks()) { + if (sdk == defaultSdk) { + continue; + } + + await _setSdk(sdk.title, wt); + + final selectedExample = + _getTourNotifier(wt).playgroundController.selectedExample; + final appNotifier = GetIt.instance.get(); + final actualSdk = selectedExample?.sdk; + expect(actualSdk, appNotifier.sdk); + } + + await _setSdk(defaultSdk!.title, wt); +} + +Future _setSdk(String title, WidgetTester wt) async { + await wt.tapAndSettle(find.sdkDropdown()); + await wt.tapAndSettle( + find.dropdownMenuItemWithText(title).first, + ); +} diff --git a/learning/tour-of-beam/frontend/integration_test/welcome_page_test.dart b/learning/tour-of-beam/frontend/integration_test/welcome_page_test.dart index 4af4029991bc..6e54d02188c9 100644 --- a/learning/tour-of-beam/frontend/integration_test/welcome_page_test.dart +++ b/learning/tour-of-beam/frontend/integration_test/welcome_page_test.dart @@ -52,18 +52,7 @@ Future _checkSdksLoadedCorrectly(WidgetTester wt) async { ); } - // Until we select an SDK the dropdown is not shown. - expect( - find.sdkDropdown(), - findsNothing, - ); - - var button = wt.widget(find.startTourButton()); - expect(button.onPressed, isNull); // Verify it is disabled. - - await wt.tapAndSettle(find.outlinedButtonWithText(sdks[0].title)); - - button = wt.widget(find.startTourButton()); + final button = wt.widget(find.startTourButton()); expect(button.onPressed, isNotNull); // Verify it is enabled. await wt.tapAndSettle(find.sdkDropdown()); @@ -105,10 +94,6 @@ void _checkModulesDisplayed() { final appNotifier = GetIt.instance.get(); final sdkId = appNotifier.sdk; - if (sdkId == null) { - throw Exception('sdkId is null'); - } - final contentTree = contentTreeCache.getContentTree(sdkId); if (contentTree == null) { throw Exception('contentTree is null'); diff --git a/learning/tour-of-beam/frontend/lib/cache/unit_content.dart b/learning/tour-of-beam/frontend/lib/cache/unit_content.dart index e474f499b54f..63e5f60e2d9f 100644 --- a/learning/tour-of-beam/frontend/lib/cache/unit_content.dart +++ b/learning/tour-of-beam/frontend/lib/cache/unit_content.dart @@ -34,7 +34,7 @@ class UnitContentCache extends Cache { String unitId, ) async { final future = _futures[sdkId]?[unitId]; - if (future == null || _unitContents[sdkId]![unitId] == null) { + if (future == null || _unitContents[sdkId]?[unitId] == null) { await _loadUnitContent(sdkId, unitId); } diff --git a/learning/tour-of-beam/frontend/lib/cache/unit_progress.dart b/learning/tour-of-beam/frontend/lib/cache/unit_progress.dart index db72d000331a..a13f9c4df849 100644 --- a/learning/tour-of-beam/frontend/lib/cache/unit_progress.dart +++ b/learning/tour-of-beam/frontend/lib/cache/unit_progress.dart @@ -75,7 +75,7 @@ class UnitProgressCache extends ChangeNotifier { List _getUnitProgress() { if (_future == null) { - unawaited(loadUnitProgress(GetIt.instance.get().sdk!)); + unawaited(loadUnitProgress(GetIt.instance.get().sdk)); } return _unitProgress; } @@ -84,16 +84,14 @@ class UnitProgressCache extends ChangeNotifier { Future completeUnit(String sdkId, String unitId) async { try { - addUpdatingUnitId(unitId); + _addUpdatingUnitId(unitId); await _getUserProgressRepository().completeUnit(sdkId, unitId); } finally { - await loadUnitProgress(GetIt.instance.get().sdk!); - clearUpdatingUnitId(unitId); + await loadUnitProgress(GetIt.instance.get().sdk); + _clearUpdatingUnitId(unitId); } } - Set getUpdatingUnitIds() => _updatingUnitIds; - Set getCompletedUnits() { _completedUnitIds.clear(); for (final unitProgress in _getUnitProgress()) { @@ -104,12 +102,12 @@ class UnitProgressCache extends ChangeNotifier { return _completedUnitIds; } - void addUpdatingUnitId(String unitId) { + void _addUpdatingUnitId(String unitId) { _updatingUnitIds.add(unitId); notifyListeners(); } - void clearUpdatingUnitId(String unitId) { + void _clearUpdatingUnitId(String unitId) { _updatingUnitIds.remove(unitId); notifyListeners(); } @@ -125,10 +123,6 @@ class UnitProgressCache extends ChangeNotifier { return getCompletedUnits().contains(unitId); } - String? getUnitSavedSnippetId(String? unitId) { - return _unitProgressByUnitId[unitId]?.userSnippetId; - } - UnitCompletion _getUnitCompletion(String unitId) { final authNotifier = GetIt.instance.get(); if (!authNotifier.isAuthenticated) { diff --git a/learning/tour-of-beam/frontend/lib/components/footer.dart b/learning/tour-of-beam/frontend/lib/components/footer.dart index daba2dbe6e96..91ebf08f539c 100644 --- a/learning/tour-of-beam/frontend/lib/components/footer.dart +++ b/learning/tour-of-beam/frontend/lib/components/footer.dart @@ -21,6 +21,7 @@ import 'package:flutter/material.dart'; import 'package:get_it/get_it.dart'; import 'package:playground_components/playground_components.dart'; +import '../constants/links.dart'; import '../constants/sizes.dart'; import '../state.dart'; @@ -44,6 +45,7 @@ class Footer extends StatelessWidget { children: [ FeedbackWidget( controller: GetIt.instance.get(), + feedbackFormUrl: tobFeedbackGoogleFormsUrl, title: 'ui.feedbackTitle'.tr(), ), ReportIssueButton(playgroundController: playgroundController), @@ -90,13 +92,9 @@ class _BeamVersion extends StatelessWidget { const _BeamVersion(); Future _getBeamSdkVersion() async { - final sdk = GetIt.instance.get().sdk; - if (sdk == null) { - return null; - } final runnerVersion = await GetIt.instance .get() - .getRunnerVersion(sdk); + .getRunnerVersion(GetIt.instance.get().sdk); return runnerVersion.beamSdkVersion; } diff --git a/learning/tour-of-beam/frontend/lib/components/logo.dart b/learning/tour-of-beam/frontend/lib/components/logo.dart index 913678c76bd5..ef3aeef72679 100644 --- a/learning/tour-of-beam/frontend/lib/components/logo.dart +++ b/learning/tour-of-beam/frontend/lib/components/logo.dart @@ -24,9 +24,9 @@ class Logo extends StatelessWidget { @override Widget build(BuildContext context) { - return Row( + return const Row( mainAxisSize: MainAxisSize.min, - children: const [ + children: [ BeamLogo(), _Text(), ], diff --git a/learning/tour-of-beam/frontend/lib/components/profile/user_menu.dart b/learning/tour-of-beam/frontend/lib/components/profile/user_menu.dart index f3f633b0028f..c50e20acc294 100644 --- a/learning/tour-of-beam/frontend/lib/components/profile/user_menu.dart +++ b/learning/tour-of-beam/frontend/lib/components/profile/user_menu.dart @@ -16,12 +16,15 @@ * limitations under the License. */ +import 'dart:async'; + import 'package:easy_localization/easy_localization.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:get_it/get_it.dart'; import 'package:playground_components/playground_components.dart'; +import 'package:url_launcher/url_launcher.dart'; import '../../assets/assets.gen.dart'; import '../../auth/notifier.dart'; @@ -104,17 +107,13 @@ class _Buttons extends StatelessWidget { children: [ _IconLabel( isSvg: false, - onTap: () {}, + onTap: () { + unawaited(launchUrl(Uri.parse(BeamLinks.website))); + }, iconPath: Assets.png.profileWebsite.path, label: 'ui.toWebsite'.tr(), ), const BeamDivider(), - _IconLabel( - onTap: () {}, - iconPath: Assets.svg.profileAbout, - label: 'ui.about'.tr(), - ), - const BeamDivider(), _IconLabel( onTap: () async { await authNotifier.logOut(); diff --git a/learning/tour-of-beam/frontend/lib/components/scaffold.dart b/learning/tour-of-beam/frontend/lib/components/scaffold.dart index 6a4df44a1714..da41b8cfbfa4 100644 --- a/learning/tour-of-beam/frontend/lib/components/scaffold.dart +++ b/learning/tour-of-beam/frontend/lib/components/scaffold.dart @@ -126,15 +126,12 @@ class _SdkSelector extends StatelessWidget { return AnimatedBuilder( animation: appNotifier, builder: (context, child) { - final sdk = appNotifier.sdk; - return sdk == null - ? Container() - : SdkDropdown( - value: sdk, - onChanged: (value) { - appNotifier.sdk = value; - }, - ); + return SdkDropdown( + value: appNotifier.sdk, + onChanged: (value) { + appNotifier.sdk = value; + }, + ); }, ); } diff --git a/learning/tour-of-beam/frontend/lib/constants/links.dart b/learning/tour-of-beam/frontend/lib/constants/links.dart new file mode 100644 index 000000000000..de299ca23d4b --- /dev/null +++ b/learning/tour-of-beam/frontend/lib/constants/links.dart @@ -0,0 +1,20 @@ +/* + * 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. + */ + +const tobFeedbackGoogleFormsUrl = + 'https://docs.google.com/forms/d/e/1FAIpQLSdI3yTmsCtk_neVPt0zQOPSmxDBlz3uX2AcmUpoNT6iGEwkUQ/viewform?usp=sharing'; diff --git a/sdks/python/test-suites/direct/py37/build.gradle b/learning/tour-of-beam/frontend/lib/constants/params.dart similarity index 69% rename from sdks/python/test-suites/direct/py37/build.gradle rename to learning/tour-of-beam/frontend/lib/constants/params.dart index bf99f72d429c..306a73fdef38 100644 --- a/sdks/python/test-suites/direct/py37/build.gradle +++ b/learning/tour-of-beam/frontend/lib/constants/params.dart @@ -4,21 +4,18 @@ * 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 + * "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, + * 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' } -applyPythonNature() +import 'package:playground_components/playground_components.dart'; -// Required to setup a Python 3 virtualenv and task names. -pythonVersion = '3.7' -apply from: '../common.gradle' +const defaultSdk = Sdk.java; diff --git a/learning/tour-of-beam/frontend/lib/locator.dart b/learning/tour-of-beam/frontend/lib/locator.dart index fedfa528c05a..bad29192fdd1 100644 --- a/learning/tour-of-beam/frontend/lib/locator.dart +++ b/learning/tour-of-beam/frontend/lib/locator.dart @@ -32,8 +32,6 @@ import 'router/page_factory.dart'; import 'router/route_information_parser.dart'; import 'state.dart'; -final _client = CloudFunctionsTobClient(); - Future initializeServiceLocator() async { await _initializeRepositories(); _initializeAuth(); diff --git a/learning/tour-of-beam/frontend/lib/main.dart b/learning/tour-of-beam/frontend/lib/main.dart index 7d8555acb005..913e70f7ac43 100644 --- a/learning/tour-of-beam/frontend/lib/main.dart +++ b/learning/tour-of-beam/frontend/lib/main.dart @@ -96,6 +96,7 @@ class TourOfBeamApp extends StatelessWidget { localizationsDelegates: context.localizationDelegates, supportedLocales: context.supportedLocales, locale: context.locale, + title: 'Tour of Beam', ); }, ), diff --git a/learning/tour-of-beam/frontend/lib/models/node.dart b/learning/tour-of-beam/frontend/lib/models/node.dart index 9450ad073b24..1780bdef1d12 100644 --- a/learning/tour-of-beam/frontend/lib/models/node.dart +++ b/learning/tour-of-beam/frontend/lib/models/node.dart @@ -16,6 +16,8 @@ * limitations under the License. */ +import 'package:equatable/equatable.dart'; + import '../repositories/models/node.dart'; import '../repositories/models/node_type_enum.dart'; import 'group.dart'; @@ -23,7 +25,7 @@ import 'parent_node.dart'; import 'unit.dart'; /// The data class for any Tour of Beam node of a content tree. -abstract class NodeModel { +abstract class NodeModel with EquatableMixin { final String id; final String title; final NodeModel? parent; @@ -60,6 +62,13 @@ abstract class NodeModel { } } + @override + List get props => [ + id, + title, + parent, + ]; + NodeModel? getLastNodeFromBreadcrumbIds(List breadcrumbIds); List getUnits(); diff --git a/learning/tour-of-beam/frontend/lib/pages/tour/controllers/content_tree.dart b/learning/tour-of-beam/frontend/lib/pages/tour/controllers/content_tree.dart index 5f1aa1320663..32f76a1a1300 100644 --- a/learning/tour-of-beam/frontend/lib/pages/tour/controllers/content_tree.dart +++ b/learning/tour-of-beam/frontend/lib/pages/tour/controllers/content_tree.dart @@ -18,7 +18,6 @@ import 'package:flutter/widgets.dart'; import 'package:get_it/get_it.dart'; -import 'package:playground_components/playground_components.dart'; import '../../../cache/content_tree.dart'; @@ -28,7 +27,6 @@ import '../../../models/unit.dart'; import '../../../state.dart'; class ContentTreeController extends ChangeNotifier { - final Sdk initialSdk; List _breadcrumbIds; NodeModel? _currentNode; final _contentTreeCache = GetIt.instance.get(); @@ -40,7 +38,6 @@ class ContentTreeController extends ChangeNotifier { Set get expandedIds => _expandedIds; ContentTreeController({ - required this.initialSdk, List initialBreadcrumbIds = const [], }) : _breadcrumbIds = initialBreadcrumbIds { _expandedIds.addAll(initialBreadcrumbIds); @@ -49,7 +46,6 @@ class ContentTreeController extends ChangeNotifier { _onContentTreeCacheChange(); } - Sdk get sdk => GetIt.instance.get().sdk ?? initialSdk; List get breadcrumbIds => _breadcrumbIds; NodeModel? get currentNode => _currentNode; @@ -109,7 +105,9 @@ class ContentTreeController extends ChangeNotifier { } void _onContentTreeCacheChange() { - final contentTree = _contentTreeCache.getContentTree(sdk); + final contentTree = _contentTreeCache.getContentTree( + GetIt.instance.get().sdk, + ); if (contentTree == null) { return; } diff --git a/learning/tour-of-beam/frontend/lib/pages/tour/page.dart b/learning/tour-of-beam/frontend/lib/pages/tour/page.dart index 929b280fa790..08a4a6ad8392 100644 --- a/learning/tour-of-beam/frontend/lib/pages/tour/page.dart +++ b/learning/tour-of-beam/frontend/lib/pages/tour/page.dart @@ -18,7 +18,6 @@ import 'package:app_state/app_state.dart'; import 'package:flutter/widgets.dart'; -import 'package:playground_components/playground_components.dart'; import 'screen.dart'; import 'state.dart'; @@ -28,12 +27,10 @@ class TourPage extends StatefulMaterialPage { /// Called when navigating to the page programmatically. TourPage({ - required Sdk sdk, List breadcrumbIds = const [], }) : super( key: const ValueKey(classFactoryKey), state: TourNotifier( - initialSdk: sdk, initialBreadcrumbIds: breadcrumbIds, ), createScreen: TourScreen.new, @@ -44,7 +41,6 @@ class TourPage extends StatefulMaterialPage { final breadcrumbIds = state['breadcrumbIds']; return TourPage( - sdk: Sdk.parseOrCreate(state['sdkId']), breadcrumbIds: breadcrumbIds is List ? breadcrumbIds.cast() : const [], ); diff --git a/learning/tour-of-beam/frontend/lib/pages/tour/screen.dart b/learning/tour-of-beam/frontend/lib/pages/tour/screen.dart index 75cc77e6b9c4..c9cc88fa3d4e 100644 --- a/learning/tour-of-beam/frontend/lib/pages/tour/screen.dart +++ b/learning/tour-of-beam/frontend/lib/pages/tour/screen.dart @@ -44,7 +44,7 @@ class TourScreen extends StatelessWidget { return TobShortcutsManager( tourNotifier: tourNotifier, child: TobScaffold( - playgroundController: tourNotifier.isUnitContainsSnippet + playgroundController: tourNotifier.isPlaygroundShown ? tourNotifier.playgroundController : null, child: @@ -87,23 +87,36 @@ class _UnitContentWidget extends StatelessWidget { return AnimatedBuilder( animation: tourNotifier, builder: (context, widget) { - return !tourNotifier.isUnitContainsSnippet - ? UnitContentWidget(tourNotifier) - : SplitView( - direction: Axis.horizontal, - dragHandleKey: TourScreen.dragHandleKey, - first: UnitContentWidget(tourNotifier), - second: tourNotifier.isSnippetLoading - ? const Center(child: CircularProgressIndicator()) - : PlaygroundWidget( - tourNotifier: tourNotifier, - ), - ); + return tourNotifier.isPlaygroundShown + ? _UnitContentWithPlaygroundSplitView(tourNotifier) + : UnitContentWidget(tourNotifier); }, ); } } +class _UnitContentWithPlaygroundSplitView extends StatelessWidget { + final TourNotifier tourNotifier; + const _UnitContentWithPlaygroundSplitView(this.tourNotifier); + + @override + Widget build(BuildContext context) { + final isPlaygroundLoading = tourNotifier.currentUnitContent == null || + tourNotifier.isSnippetLoading; + + return SplitView( + direction: Axis.horizontal, + dragHandleKey: TourScreen.dragHandleKey, + first: UnitContentWidget(tourNotifier), + second: isPlaygroundLoading + ? const Center(child: CircularProgressIndicator()) + : PlaygroundWidget( + tourNotifier: tourNotifier, + ), + ); + } +} + class _NarrowTour extends StatelessWidget { final TourNotifier tourNotifier; diff --git a/learning/tour-of-beam/frontend/lib/pages/tour/state.dart b/learning/tour-of-beam/frontend/lib/pages/tour/state.dart index 00d2f2fcddc0..3094a5e19917 100644 --- a/learning/tour-of-beam/frontend/lib/pages/tour/state.dart +++ b/learning/tour-of-beam/frontend/lib/pages/tour/state.dart @@ -30,6 +30,7 @@ import '../../cache/unit_progress.dart'; import '../../enums/save_code_status.dart'; import '../../enums/snippet_type.dart'; import '../../models/event_context.dart'; +import '../../models/node.dart'; import '../../models/unit.dart'; import '../../models/unit_content.dart'; import '../../services/analytics/events/unit_closed.dart'; @@ -49,22 +50,19 @@ class TourNotifier extends ChangeNotifier with PageStateMixin { final _unitContentCache = GetIt.instance.get(); final _unitProgressCache = GetIt.instance.get(); UnitContentModel? _currentUnitContent; + bool _isPlaygroundShown = false; DateTime? _currentUnitOpenedAt; TobEventContext _tobEventContext = TobEventContext.empty; TobEventContext get tobEventContext => _tobEventContext; TourNotifier({ - required Sdk initialSdk, List initialBreadcrumbIds = const [], }) : contentTreeController = ContentTreeController( - initialSdk: initialSdk, initialBreadcrumbIds: initialBreadcrumbIds, ), - playgroundController = _createPlaygroundController(initialSdk.id) { - _appNotifier.sdk ??= initialSdk; + playgroundController = _createPlaygroundController() { contentTreeController.addListener(_onUnitChanged); - _unitContentCache.addListener(_onUnitChanged); _appNotifier.addListener(_onAppNotifierChanged); _authNotifier.addListener(_onAuthChanged); _saveCodeDebounced = _saveCode.debounced( @@ -84,17 +82,17 @@ class TourNotifier extends ChangeNotifier with PageStateMixin { @override PagePath get path => TourPath( - sdkId: contentTreeController.sdk.id, + sdkId: GetIt.instance.get().sdk.id, breadcrumbIds: contentTreeController.breadcrumbIds, ); bool get isAuthenticated => _authNotifier.isAuthenticated; - Sdk get currentSdk => _appNotifier.sdk!; + Sdk get currentSdk => _appNotifier.sdk; String? get currentUnitId => _currentUnitContent?.id; UnitContentModel? get currentUnitContent => _currentUnitContent; - bool get hasSolution => currentUnitContent?.solutionSnippetId != null; + bool get hasSolution => _currentUnitContent?.solutionSnippetId != null; bool get isCodeSaved => _unitProgressCache.hasSavedSnippet(currentUnitId); SnippetType _snippetType = SnippetType.original; @@ -109,7 +107,7 @@ class TourNotifier extends ChangeNotifier with PageStateMixin { notifyListeners(); } - bool get isUnitContainsSnippet => currentUnitContent?.taskSnippetId != null; + bool get isPlaygroundShown => _isPlaygroundShown; bool get isSnippetLoading => _isLoadingSnippet; Future _onAuthChanged() async { @@ -125,10 +123,10 @@ class TourNotifier extends ChangeNotifier with PageStateMixin { Future _onAppNotifierChanged() async { playgroundController.setSdk(currentSdk); _listenToCurrentSnippetEditingController(); - - await _unitProgressCache.loadUnitProgress(currentSdk); - _trySetSnippetType(SnippetType.saved); - await _loadSnippetByType(); + final currentNode = contentTreeController.currentNode; + if (currentNode != null) { + await _loadUnit(currentNode); + } } Future _onUnitChanged() async { @@ -137,20 +135,29 @@ class TourNotifier extends ChangeNotifier with PageStateMixin { if (currentNode is! UnitModel) { await _emptyPlayground(); } else { - _setUnitContent(null); - notifyListeners(); + await _loadUnit(currentNode); + } + notifyListeners(); + } - final content = await _unitContentCache.getUnitContent( - currentSdk.id, - currentNode.id, - ); + Future _loadUnit(NodeModel node) async { + _setUnitContent(null); + notifyListeners(); - _setUnitContent(content); - await _unitProgressCache.loadUnitProgress(currentSdk); - _trySetSnippetType(SnippetType.saved); - await _loadSnippetByType(); + final content = await _unitContentCache.getUnitContent( + currentSdk.id, + node.id, + ); + + _setUnitContent(content); + await _unitProgressCache.loadUnitProgress(currentSdk); + + if (content != _currentUnitContent) { + return; // Changed while waiting. } - notifyListeners(); + + _trySetSnippetType(SnippetType.saved); + await _loadSnippetByType(); } void _setUnitContent(UnitContentModel? unitContent) { @@ -163,6 +170,9 @@ class TourNotifier extends ChangeNotifier with PageStateMixin { } _currentUnitContent = unitContent; + if (_currentUnitContent != null) { + _isPlaygroundShown = _currentUnitContent!.taskSnippetId != null; + } if (_currentUnitContent != null) { _trackUnitOpened(_currentUnitContent!.id); @@ -349,7 +359,7 @@ class TourNotifier extends ChangeNotifier with PageStateMixin { // Playground controller. - static PlaygroundController _createPlaygroundController(String initialSdkId) { + static PlaygroundController _createPlaygroundController() { final playgroundController = PlaygroundController( codeClient: GetIt.instance.get(), exampleCache: ExampleCache( @@ -362,7 +372,9 @@ class TourNotifier extends ChangeNotifier with PageStateMixin { playgroundController.examplesLoader.loadIfNew( ExamplesLoadingDescriptor( descriptors: [ - EmptyExampleLoadingDescriptor(sdk: Sdk.parseOrCreate(initialSdkId)), + EmptyExampleLoadingDescriptor( + sdk: GetIt.instance.get().sdk, + ), ], ), ), @@ -373,7 +385,6 @@ class TourNotifier extends ChangeNotifier with PageStateMixin { @override Future dispose() async { - _unitContentCache.removeListener(_onUnitChanged); contentTreeController.removeListener(_onUnitChanged); _appNotifier.removeListener(_onAppNotifierChanged); _authNotifier.removeListener(_onAuthChanged); diff --git a/learning/tour-of-beam/frontend/lib/pages/tour/widgets/content_tree.dart b/learning/tour-of-beam/frontend/lib/pages/tour/widgets/content_tree.dart index 9fd96b5e93bd..587dc2756967 100644 --- a/learning/tour-of-beam/frontend/lib/pages/tour/widgets/content_tree.dart +++ b/learning/tour-of-beam/frontend/lib/pages/tour/widgets/content_tree.dart @@ -16,6 +16,7 @@ * limitations under the License. */ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get_it/get_it.dart'; import 'package:playground_components/playground_components.dart'; @@ -23,7 +24,6 @@ import 'package:playground_components/playground_components.dart'; import '../../../components/builders/content_tree.dart'; import '../../../state.dart'; import '../controllers/content_tree.dart'; -import 'content_tree_title.dart'; import 'module.dart'; // TODO(nausharipov): make it collapsible @@ -41,7 +41,7 @@ class ContentTreeWidget extends StatelessWidget { child: AnimatedBuilder( animation: GetIt.instance.get(), builder: (context, child) => ContentTreeBuilder( - sdk: controller.sdk, + sdk: GetIt.instance.get().sdk, builder: (context, contentTree, child) { if (contentTree == null) { return const Center(child: CircularProgressIndicator()); @@ -53,7 +53,7 @@ class ContentTreeWidget extends StatelessWidget { ), child: Column( children: [ - const ContentTreeTitleWidget(), + const _Title(), ...contentTree.nodes.map( (module) => ModuleWidget( module: module, @@ -70,3 +70,23 @@ class ContentTreeWidget extends StatelessWidget { ); } } + +class _Title extends StatelessWidget { + const _Title(); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: BeamSizes.size12), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'pages.tour.summaryTitle', + style: Theme.of(context).textTheme.headlineLarge, + ).tr(), + ], + ), + ); + } +} diff --git a/learning/tour-of-beam/frontend/lib/pages/tour/widgets/markdown/code_builder.dart b/learning/tour-of-beam/frontend/lib/pages/tour/widgets/markdown/code_builder.dart index b770f777a7eb..62e7ab6aab76 100644 --- a/learning/tour-of-beam/frontend/lib/pages/tour/widgets/markdown/code_builder.dart +++ b/learning/tour-of-beam/frontend/lib/pages/tour/widgets/markdown/code_builder.dart @@ -50,7 +50,13 @@ class _CodeBlock extends StatelessWidget { controller: scrollController, padding: const EdgeInsets.all(BeamSizes.size10), scrollDirection: Axis.horizontal, - child: Text(text), + child: Text( + text, + style: Theme.of(context) + .extension()! + .markdownStyle + .code, + ), ), ), ); @@ -76,7 +82,13 @@ class _InlineCode extends StatelessWidget { ), child: Text( text, - style: TextStyle(color: Theme.of(context).primaryColor), + style: Theme.of(context) + .extension()! + .markdownStyle + .p! + .copyWith( + color: Theme.of(context).primaryColor, + ), ), ); } diff --git a/learning/tour-of-beam/frontend/lib/pages/tour/widgets/playground.dart b/learning/tour-of-beam/frontend/lib/pages/tour/widgets/playground.dart index 67616650fdd6..1d0ee5829486 100644 --- a/learning/tour-of-beam/frontend/lib/pages/tour/widgets/playground.dart +++ b/learning/tour-of-beam/frontend/lib/pages/tour/widgets/playground.dart @@ -57,6 +57,7 @@ class PlaygroundWidget extends StatelessWidget { SplitView( direction: Axis.vertical, first: SnippetEditor( + autofocus: true, controller: snippetController, isEditable: true, ), diff --git a/learning/tour-of-beam/frontend/lib/pages/tour/widgets/unit_content.dart b/learning/tour-of-beam/frontend/lib/pages/tour/widgets/unit_content.dart index 777ae3011ca9..866538c53ee1 100644 --- a/learning/tour-of-beam/frontend/lib/pages/tour/widgets/unit_content.dart +++ b/learning/tour-of-beam/frontend/lib/pages/tour/widgets/unit_content.dart @@ -128,7 +128,7 @@ class _Title extends StatelessWidget { ), child: Text( title, - style: Theme.of(context).textTheme.headlineLarge, + style: Theme.of(context).textTheme.titleLarge, textAlign: TextAlign.start, ), ); @@ -196,7 +196,15 @@ class _SnippetTypeSwitcher extends StatelessWidget { title: 'pages.tour.solution'.tr(), value: SnippetType.solution, onChanged: () async { - await _setSnippetByType(SnippetType.solution); + final confirmed = await ConfirmDialog.show( + context: context, + confirmButtonText: 'pages.tour.showSolution'.tr(), + subtitle: 'pages.tour.solveYourself'.tr(), + title: 'pages.tour.solution'.tr(), + ); + if (confirmed) { + await _setSnippetByType(SnippetType.solution); + } }, ), if (tourNotifier.hasSolution || tourNotifier.isCodeSaved) @@ -285,7 +293,7 @@ class _ContentFooter extends StatelessWidget { themeData.extension()?.secondaryBackgroundColor, ), width: double.infinity, - padding: const EdgeInsets.all(BeamSizes.size20), + padding: const EdgeInsets.all(BeamSizes.size10), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ diff --git a/learning/tour-of-beam/frontend/lib/pages/welcome/screen.dart b/learning/tour-of-beam/frontend/lib/pages/welcome/screen.dart index eab7557ac565..a15b05bbc7c2 100644 --- a/learning/tour-of-beam/frontend/lib/pages/welcome/screen.dart +++ b/learning/tour-of-beam/frontend/lib/pages/welcome/screen.dart @@ -16,6 +16,8 @@ * limitations under the License. */ +import 'dart:async'; + import 'package:app_state/app_state.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/gestures.dart'; @@ -60,10 +62,10 @@ class _WideWelcome extends StatelessWidget { @override Widget build(BuildContext context) { - return IntrinsicHeight( + return const IntrinsicHeight( child: Row( crossAxisAlignment: CrossAxisAlignment.start, - children: const [ + children: [ Expanded( child: _SdkSelection(), ), @@ -83,8 +85,8 @@ class _NarrowWelcome extends StatelessWidget { @override Widget build(BuildContext context) { - return Column( - children: const [ + return const Column( + children: [ _SdkSelection(), _TourSummary(), ], @@ -157,7 +159,7 @@ class _SdkSelection extends StatelessWidget { if (sdk == null) { return; } - await GetIt.instance.get().push(TourPage(sdk: sdk)); + await GetIt.instance.get().push(TourPage()); } } @@ -171,9 +173,6 @@ class _TourSummary extends StatelessWidget { animation: appNotifier, builder: (context, child) { final sdk = appNotifier.sdk; - if (sdk == null) { - return Container(); - } return Padding( padding: const EdgeInsets.symmetric( @@ -259,7 +258,7 @@ class _IntroTextBody extends StatelessWidget { .copyWith(color: Theme.of(context).primaryColor), recognizer: TapGestureRecognizer() ..onTap = () { - _openLoginDialog(context); + unawaited(_openLoginDialog(context)); }, ), TextSpan(text: '\n\n${'pages.welcome.selectLanguage'.tr()}'), @@ -269,8 +268,8 @@ class _IntroTextBody extends StatelessWidget { ); } - void _openLoginDialog(BuildContext context) { - showDialog( + Future _openLoginDialog(BuildContext context) async { + await showDialog( context: context, builder: (context) => Dialog( child: LoginContent( diff --git a/learning/tour-of-beam/frontend/lib/state.dart b/learning/tour-of-beam/frontend/lib/state.dart index e690e398faea..3209d48a55ac 100644 --- a/learning/tour-of-beam/frontend/lib/state.dart +++ b/learning/tour-of-beam/frontend/lib/state.dart @@ -22,6 +22,7 @@ import 'package:flutter/material.dart'; import 'package:playground_components/playground_components.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'constants/params.dart'; import 'constants/storage_keys.dart'; class AppNotifier extends ChangeNotifier { @@ -31,21 +32,17 @@ class AppNotifier extends ChangeNotifier { unawaited(_readSdk()); } - Sdk? get sdk => _sdk; + Sdk get sdk => _sdk ?? defaultSdk; - set sdk(Sdk? newValue) { + set sdk(Sdk newValue) { _sdk = newValue; unawaited(_writeSdk(newValue)); notifyListeners(); } - Future _writeSdk(Sdk? value) async { + Future _writeSdk(Sdk value) async { final preferences = await SharedPreferences.getInstance(); - if (value != null) { - await preferences.setString(StorageKeys.sdkId, value.id); - } else { - await preferences.remove(StorageKeys.sdkId); - } + await preferences.setString(StorageKeys.sdkId, value.id); } Future _readSdk() async { diff --git a/learning/tour-of-beam/frontend/pubspec.lock b/learning/tour-of-beam/frontend/pubspec.lock index 0fa33cd6c6d5..5cde8a54211f 100644 --- a/learning/tour-of-beam/frontend/pubspec.lock +++ b/learning/tour-of-beam/frontend/pubspec.lock @@ -450,10 +450,10 @@ packages: dependency: transitive description: name: flutter_code_editor - sha256: "5cd0337a24155dcac85d4f5b0cc8fa022ab19785a968a86726cdc62e363ee428" + sha256: d4f94719d3f4dc3f40b0b80c980e3b550069c413542b6c0521bff8267f57eefb url: "https://pub.dev" source: hosted - version: "0.2.23" + version: "0.3.0" flutter_driver: dependency: transitive description: flutter @@ -1417,4 +1417,4 @@ packages: version: "3.1.2" sdks: dart: ">=3.0.2 <4.0.0" - flutter: ">=3.10.2" + flutter: ">=3.10.4" diff --git a/learning/tour-of-beam/frontend/pubspec.yaml b/learning/tour-of-beam/frontend/pubspec.yaml index 45004337ca55..75e699b36f67 100644 --- a/learning/tour-of-beam/frontend/pubspec.yaml +++ b/learning/tour-of-beam/frontend/pubspec.yaml @@ -24,7 +24,7 @@ version: 0.1.0 environment: sdk: '>=3.0.2 <4.0.0' - flutter: '>=3.10.2' + flutter: '>=3.10.4' dependencies: app_state: ^0.9.3 diff --git a/learning/tour-of-beam/learning-content/content-info.yaml b/learning/tour-of-beam/learning-content/content-info.yaml index c85d2456c399..05ab3b69d3c7 100644 --- a/learning/tour-of-beam/learning-content/content-info.yaml +++ b/learning/tour-of-beam/learning-content/content-info.yaml @@ -28,4 +28,8 @@ content: - schema-based-transforms - windowing - triggers - - io \ No newline at end of file + - io + - splittable-dofn + - cross-language + - final-challenge + \ No newline at end of file diff --git a/learning/tour-of-beam/learning-content/core-transforms/motivating-challenge-3/go-solution/main.go b/learning/tour-of-beam/learning-content/core-transforms/motivating-challenge-3/go-solution/main.go index fd29b17656bf..5bcb47b53610 100644 --- a/learning/tour-of-beam/learning-content/core-transforms/motivating-challenge-3/go-solution/main.go +++ b/learning/tour-of-beam/learning-content/core-transforms/motivating-challenge-3/go-solution/main.go @@ -20,7 +20,7 @@ // name: CoreTransformsSolution3 // description: Core Transforms third motivating challenge. // multifile: false -// context_line: 52 +// context_line: 51 // categories: // - Quickstart // complexity: BASIC diff --git a/learning/tour-of-beam/learning-content/cross-language/module-info.yaml b/learning/tour-of-beam/learning-content/cross-language/module-info.yaml new file mode 100644 index 000000000000..ad4f5583f941 --- /dev/null +++ b/learning/tour-of-beam/learning-content/cross-language/module-info.yaml @@ -0,0 +1,28 @@ +# +# 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. +# + +sdk: + - Java + - Python +id: cross-language +name: Cross-Language Transforms +complexity: ADVANCED +content: +- sql-transform +- multi-pipeline diff --git a/learning/tour-of-beam/learning-content/cross-language/multi-pipeline/description.md b/learning/tour-of-beam/learning-content/cross-language/multi-pipeline/description.md new file mode 100644 index 000000000000..ae6ce9cf004a --- /dev/null +++ b/learning/tour-of-beam/learning-content/cross-language/multi-pipeline/description.md @@ -0,0 +1,415 @@ + + +### Multi pipeline + +Apache Beam is a popular open-source platform for building batch and streaming data processing pipelines. One of the key features of Apache Beam is its ability to support multi-language pipelines. With Apache Beam, you can write different parts of your pipeline in different programming languages, and they can all work together seamlessly. + +Apache Beam supports multiple programming languages, including Java, Python, and Go. With multi-language support, you can use a combination of supported languages in a single pipeline. This makes it possible to use the language that best suits your needs for each part of the pipeline. + +To build a multi-language pipeline with Apache Beam, you can use the following approach: + +* Define your pipeline using Apache Beam's SDK in your preferred programming language. This defines the data processing steps that need to be executed. + +* Use Apache Beam's language-specific SDKs to implement the data processing steps in the appropriate programming languages. For example, you could use Java to process some data, Python to process some other data, and Go to perform a specific computation. + +* Use Apache Beam's cross-language support to connect the different parts of your pipeline. Apache Beam provides a standard data model and serialization format so that data can be passed seamlessly between different languages. + +Using Apache Beam's multi-language support, you can take advantage of the strengths of different programming languages while building a unified data processing pipeline. This can be especially useful when working with large datasets and re-using existing components. + +To create a multi-language pipeline in Apache Beam, follow these steps: + +* Choose your SDKs: First, decide which programming languages and corresponding SDKs you'd like to use. Apache Beam currently supports Python, Java, and Go SDKs. + +* Set up the dependencies: Make sure you have installed the necessary dependencies for each language. For instance, you'll need the Beam Python SDK for Python or the Beam Java SDK for Java. + +* Create a pipeline: Using the primary language of your choice, create a pipeline object using the respective SDK. This pipeline will serve as the main entry point for your multi-language pipeline. + +* Use cross-language transforms: To execute transforms written in other languages, use the ExternalTransform class (in Python) or the External class (in Java). This allows you to use a transform written in another language as if it were a native transform in your main pipeline. You'll need to provide the appropriate expansion service address for the language of the transform. + +{{if (eq .Sdk "java")}} + +#### Start an expansion service + +When building a job for a multi-language pipeline, Beam uses an expansion service to expand composite transforms. Therefore, you must have at least one expansion service per remote SDK. + +In most cases, if you have a supported version of Python installed on your system, you can let `PythonExternalTransform` handle the details of creating and starting up the expansion service. But if you want to customize the environment or use transforms not available in the default Beam SDK, you might need to run your own expansion service. + +For example, to start the standard expansion service for a Python transform, ExpansionServiceServicer, follow these steps: + +* Activate a new virtual environment following these instructions. + +* Install Apache Beam with gcp and dataframe packages. +``` +pip install 'apache-beam[gcp,dataframe]' +``` +* Run the following command +``` +python -m apache_beam.runners.portability.expansion_service_main -p --fully_qualified_name_glob "*" +``` + +The command runs `expansion_service_main.py`, which starts the standard expansion service. When you use Gradle to run your Java pipeline, you can specify the expansion service with the `expansionService` option. For example: `--expansionService=localhost:`. + +#### Run Java program + +``` +private String getModelLoaderScript() { + String s = "from apache_beam.ml.inference.sklearn_inference import SklearnModelHandlerNumpy\n"; + s = s + "from apache_beam.ml.inference.base import KeyedModelHandler\n"; + s = s + "def get_model_handler(model_uri):\n"; + s = s + " return KeyedModelHandler(SklearnModelHandlerNumpy(model_uri))\n"; + + return s; +} + +void runExample(SklearnMnistClassificationOptions options, String expansionService) { + // Schema of the output PCollection Row type to be provided to the RunInference transform. + Schema schema = + Schema.of( + Schema.Field.of("example", Schema.FieldType.array(Schema.FieldType.INT64)), + Schema.Field.of("inference", FieldType.STRING)); + + Pipeline pipeline = Pipeline.create(options); + PCollection>> col = + pipeline + .apply(TextIO.read().from(options.getInput())) + .apply(Filter.by(new FilterNonRecordsFn())) + .apply(MapElements.via(new RecordsToLabeledPixelsFn())); + + col.apply(RunInference.ofKVs(getModelLoaderScript(), schema, VarLongCoder.of()) + .withKwarg("model_uri", options.getModelPath()) + .withExpansionService(expansionService)) + .apply(MapElements.via(new FormatOutput())) + .apply(TextIO.write().to("out.txt")); + + pipeline.run().waitUntilFinish(); +} +``` + +> **Note**. Python extension service may not work on Windows. The **extension service** and the **Java pipeline** must run in the same environment. If the **extension service** is running in a **docker** container, you should run **Java pipeline** inside it. + +#### Run in docker + +Run **extension service** and **java program**: +``` +# Use an official Java base image +FROM openjdk:11 + +# Install Python +RUN apt-get update && \ + apt-get install -y python python-pip + +# Set the working directory +WORKDIR /app + +# Copy Java and Python source files to the working directory +COPY src /app/src +COPY scripts /app/scripts + +# Install Python dependencies +RUN pip install --upgrade pip \ +RUN pip install apache-beam==2.46.0 \ +RUN pip install --default-timeout=100 torch \ +RUN pip install torchvision \ +RUN pip install pandas \ +RUN pip install scikit-learn + +RUN wget https://repo1.maven.org/maven2/org/springframework/spring-expression/$SPRING_VERSION/spring-expression-$SPRING_VERSION.jar &&\ + mv spring-expression-$SPRING_VERSION.jar /opt/apache/beam/jars/spring-expression.jar + +# Compile the Java program +RUN javac -d /app/bin /app/src/MyJavaProgram.java + +# Set the entrypoint to run both the Java program and Python script +ENTRYPOINT ["bash", "-c", "java -cp /app/bin MyJavaProgram && python -m apache_beam.runners.portability.expansion_service_main -p 9090 --fully_qualified_name_glob=*"] +``` +{{end}} + + +{{if (eq .Sdk "python")}} + + +Write own java service +``` +import autovalue.shaded.com.google.auto.service.AutoService; +import autovalue.shaded.com.google.common.collect.ImmutableMap; +import org.apache.beam.sdk.expansion.ExternalTransformRegistrar; +import org.apache.beam.sdk.transforms.Count; +import org.apache.beam.sdk.transforms.ExternalTransformBuilder; +import org.apache.beam.sdk.transforms.PTransform; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.sdk.values.PCollection; + +import java.util.Map; + +public class Task { + static class JavaCount extends PTransform, PCollection>> { + + public JavaCount() { + } + + @Override + public PCollection> expand(PCollection input) { + return input + .apply( + "JavaCount", Count.perElement()); + } + } + + static class JavaCountBuilder implements + ExternalTransformBuilder, PCollection>> { + + @Override + public PTransform, PCollection>> buildExternal( + JavaCountConfiguration configuration) { + return new JavaCount(); + } + } + + static class JavaCountConfiguration { + + } + + @AutoService(ExternalTransformRegistrar.class) + public class JavaCountRegistrar implements ExternalTransformRegistrar { + + final String URN = "my.beam.transform.javacount"; + + @Override + public Map> knownBuilderInstances() { + return ImmutableMap.of(URN, new JavaCountBuilder()); + } + } +} +``` + +Build jar: +``` +mvn clean +mvn package -DskipTests +cd target +java -jar java-count-bundled-0.1.jar 12345 +``` + +Python pipeline: +``` +import logging +import re +import typing + +import apache_beam as beam +from apache_beam.io import ReadFromText +from apache_beam.io import WriteToText +from apache_beam.transforms.external import ImplicitSchemaPayloadBuilder +from apache_beam.options.pipeline_options import PipelineOptions + + +class WordExtractingDoFn(beam.DoFn): + """Parse each line of input text into words.""" + def process(self, element): + """Returns an iterator over the words of this element. + The element is a line of text. If the line is blank, note that, too. + Args: + element: the element being processed + Returns: + The processed element. + """ + return re.findall(r'[\w\']+', element, re.UNICODE) + + +def run(input_path, output_path, pipeline_args): + pipeline_options = PipelineOptions(pipeline_args) + + with beam.Pipeline(options=pipeline_options) as p: + lines = p | 'Read' >> ReadFromText(input_path).with_output_types(str) + words = lines | 'Split' >> (beam.ParDo(WordExtractingDoFn()).with_output_types(str)) + + java_output = ( + words + | 'JavaCount' >> beam.ExternalTransform( + 'my.beam.transform.javacount', + None, + "localhost:12345")) + + def format(kv): + key, value = kv + return '%s:%s' % (key, value) + + output = java_output | 'Format' >> beam.Map(format) + output | 'Write' >> WriteToText(output_path) + + +if __name__ == '__main__': + logging.getLogger().setLevel(logging.INFO) + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument( + '--input', + dest='input', + required=True, + help='Input file') + parser.add_argument( + '--output', + dest='output', + required=True, + help='Output file') + known_args, pipeline_args = parser.parse_known_args() + + run( + known_args.input, + known_args.output, + pipeline_args) +``` + +Run program +``` +python javacount.py --runner DirectRunner --environment_type=DOCKER --input input.txt --output output.txt --sdk_harness_container_image_overrides ".*java.*,chamikaramj/beam_java11_sdk:latest" +``` +{{end}} + +### Playground exercise + +{{if (eq .Sdk "java")}} + +You can use `RunInterface` which is used in Python for machine learning. + +Defining arguments: +``` +public interface SklearnMnistClassificationOptions extends PipelineOptions { + @Description("Path to an input file that contains labels and pixels to feed into the model") + @Default.String("gs://apache-beam-samples/multi-language/mnist/example_input.csv") + String getInput(); + + void setInput(String value); + + @Description("Path for storing the output") + @Required + String getOutput(); + + void setOutput(String value); + + @Description( + "Path to a model file that contains the pickled file of a scikit-learn model trained on MNIST data") + @Default.String("gs://apache-beam-samples/multi-language/mnist/example_model") + String getModelPath(); + + void setModelPath(String value); + /** Set this option to specify Python expansion service URL. */ + @Description("URL of Python expansion service") + @Default.String("") + String getExpansionService(); + + void setExpansionService(String value); +} +``` + +Run function: +``` +void runExample(SklearnMnistClassificationOptions options, String expansionService) { + // Schema of the output PCollection Row type to be provided to the RunInference transform. + Schema schema = + Schema.of( + Schema.Field.of("example", Schema.FieldType.array(Schema.FieldType.INT64)), + Schema.Field.of("inference", FieldType.STRING)); + Pipeline pipeline = Pipeline.create(options); + + PCollection>> col = + pipeline + .apply(TextIO.read().from(options.getInput())) + .apply(Filter.by(new FilterNonRecordsFn())) + .apply(MapElements.via(new RecordsToLabeledPixelsFn())); + + col.apply( + RunInference.ofKVs(getModelLoaderScript(), schema, VarLongCoder.of()) + .withKwarg("model_uri", options.getModelPath()) + .withExpansionService(expansionService)) + .apply(MapElements.via(new FormatOutput())) + .apply(TextIO.write().to(options.getOutput())); + + pipeline.run().waitUntilFinish(); +} +``` +{{end}} + +{{if (eq .Sdk "python")}} +You can write your own transform to be executed in python. + +Prefix **Logic**: +``` +public class JavaPrefix extends PTransform, PCollection> { + + final String prefix; + + public JavaPrefix(String prefix) { + this.prefix = prefix; + } + + class AddPrefixDoFn extends DoFn { + + @ProcessElement + public void process(@Element String input, OutputReceiver o) { + o.output(prefix + input); + } + } + + @Override + public PCollection expand(PCollection input) { + return input + .apply( + "AddPrefix", + ParDo.of(new AddPrefixDoFn())); + } +} +``` + +Prefix **Builder**: +``` +public class JavaPrefixBuilder implements + ExternalTransformBuilder, PCollection> { + + @Override + public PTransform, PCollection> buildExternal( + JavaPrefixConfiguration configuration) { + return new JavaPrefix(configuration.prefix); + } +} +``` + +Prefix **Configuration**: +``` +public class JavaPrefixConfiguration { + + String prefix; + + public void setPrefix(String prefix) { + this.prefix = prefix; + } +} +``` + +Prefix **Register**: +``` +@AutoService(ExternalTransformRegistrar.class) +public class JavaPrefixRegistrar implements ExternalTransformRegistrar { + +final String URN = "my.beam.transform.javaprefix"; + +@Override +public Map> knownBuilderInstances() { +return ImmutableMap.of(URN,new JavaPrefixBuilder()); + } +} +``` +{{end}} \ No newline at end of file diff --git a/learning/tour-of-beam/learning-content/cross-language/multi-pipeline/java-example/Task.java b/learning/tour-of-beam/learning-content/cross-language/multi-pipeline/java-example/Task.java new file mode 100644 index 000000000000..aef8f189abc5 --- /dev/null +++ b/learning/tour-of-beam/learning-content/cross-language/multi-pipeline/java-example/Task.java @@ -0,0 +1,135 @@ +/* + * 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. + */ + +// beam-playground: +// name: multi-pipeline +// description: Multi pipeline example. +// multifile: false +// context_line: 33 +// categories: +// - Quickstart +// complexity: ADVANCED +// never_run: true +// tags: +// - hellobeam + +public class Task { + public static final String TOKENIZER_PATTERN = "[^\\p{L}]+"; + + // Extract the words and create the rows for counting. + static class ExtractWordsFn extends DoFn { + public static final Schema SCHEMA = + Schema.of( + Schema.Field.of("word", Schema.FieldType.STRING), + Schema.Field.of("count", Schema.FieldType.INT32)); + private final Counter emptyLines = Metrics.counter(ExtractWordsFn.class, "emptyLines"); + private final Distribution lineLenDist = + Metrics.distribution(ExtractWordsFn.class, "lineLenDistro"); + + @ProcessElement + public void processElement(@Element String element, OutputReceiver receiver) { + lineLenDist.update(element.length()); + if (element.trim().isEmpty()) { + emptyLines.inc(); + } + + // Split the line into words. + String[] words = element.split(TOKENIZER_PATTERN, -1); + + // Output each word encountered into the output PCollection. + for (String word : words) { + if (!word.isEmpty()) { + receiver.output( + Row.withSchema(SCHEMA) + .withFieldValue("word", word) + .withFieldValue("count", 1) + .build()); + } + } + } + } + + /** + * A SimpleFunction that converts a counted row into a printable string. + */ + public static class FormatAsTextFn extends SimpleFunction { + @Override + public String apply(Row input) { + return input.getString("word") + ": " + input.getInt32("count"); + } + } + + /** + * Options supported by {@link PythonDataframeWordCount}. + */ + public interface WordCountOptions extends PipelineOptions { + + /** + * By default, this example reads from a public dataset containing the text of King Lear. Set + * this option to choose a different input file or glob. + */ + @Description("Path of the file to read from") + @Default.String("gs://apache-beam-samples/shakespeare/kinglear.txt") + String getInputFile(); + + void setInputFile(String value); + + /** + * Set this required option to specify where to write the output. + */ + @Description("Path of the file to write to") + @Required + String getOutput(); + + void setOutput(String value); + + /** + * Set this option to specify Python expansion service URL. + */ + @Description("URL of Python expansion service") + String getExpansionService(); + + void setExpansionService(String value); + } + + static void runWordCount(WordCountOptions options) { + options.setOutput("input.txt"); + Pipeline p = Pipeline.create(options); + + p.apply("ReadLines", TextIO.read().from(options.getInputFile())) + .apply(ParDo.of(new ExtractWordsFn())) + .setRowSchema(ExtractWordsFn.SCHEMA) + .apply( + PythonExternalTransform., PCollection>from( + "apache_beam.dataframe.transforms.DataframeTransform", + options.getExpansionService()) + .withKwarg("func", PythonCallableSource.of("lambda df: df.groupby('word').sum()")) + .withKwarg("include_indexes", true)) + .apply(MapElements.via(new FormatAsTextFn())) + .apply("WriteCounts", TextIO.write().to(options.getOutput())); + + p.run().waitUntilFinish(); + } + + public static void main(String[] args) { + WordCountOptions options = + PipelineOptionsFactory.fromArgs(args).withValidation().as(WordCountOptions.class); + + runWordCount(options); + } +} \ No newline at end of file diff --git a/learning/tour-of-beam/learning-content/cross-language/multi-pipeline/python-example/input.txt b/learning/tour-of-beam/learning-content/cross-language/multi-pipeline/python-example/input.txt new file mode 100644 index 000000000000..d8f56193d0ab --- /dev/null +++ b/learning/tour-of-beam/learning-content/cross-language/multi-pipeline/python-example/input.txt @@ -0,0 +1,24 @@ + + +aaa +aaa +bbb +bbb +ccc +ccc +ddd +eee +fff +jjj \ No newline at end of file diff --git a/learning/tour-of-beam/learning-content/cross-language/multi-pipeline/python-example/output.log b/learning/tour-of-beam/learning-content/cross-language/multi-pipeline/python-example/output.log new file mode 100644 index 000000000000..ef7704cb0c90 --- /dev/null +++ b/learning/tour-of-beam/learning-content/cross-language/multi-pipeline/python-example/output.log @@ -0,0 +1,21 @@ + + +aaa:2 +bbb:2 +ccc:2 +ddd:1 +jjj:1 +fff:1 +eee:1 \ No newline at end of file diff --git a/learning/tour-of-beam/learning-content/cross-language/multi-pipeline/python-example/task.py b/learning/tour-of-beam/learning-content/cross-language/multi-pipeline/python-example/task.py new file mode 100644 index 000000000000..00edd12850d1 --- /dev/null +++ b/learning/tour-of-beam/learning-content/cross-language/multi-pipeline/python-example/task.py @@ -0,0 +1,96 @@ +# 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. + +# beam-playground: +# name: multi-pipeline +# description: Multi pipeline example. +# multifile: false +# context_line: 35 +# categories: +# - Quickstart +# complexity: ADVANCED +# never_run: true +# tags: +# - hellobeam + +import logging +import re +import typing + +import apache_beam as beam +from apache_beam.io import ReadFromText +from apache_beam.io import WriteToText +from apache_beam.transforms.external import ImplicitSchemaPayloadBuilder +from apache_beam.options.pipeline_options import PipelineOptions + + +class WordExtractingDoFn(beam.DoFn): + """Parse each line of input text into words.""" + def process(self, element): + """Returns an iterator over the words of this element. + The element is a line of text. If the line is blank, note that, too. + Args: + element: the element being processed + Returns: + The processed element. + """ + return re.findall(r'[\w\']+', element, re.UNICODE) + + +def run(input_path, output_path, pipeline_args): + pipeline_options = PipelineOptions(pipeline_args) + + with beam.Pipeline(options=pipeline_options) as p: + lines = p | 'Read' >> ReadFromText(input_path).with_output_types(str) + words = lines | 'Split' >> (beam.ParDo(WordExtractingDoFn()).with_output_types(str)) + + java_output = (words + | 'JavaCount' >> beam.ExternalTransform( + 'my.beam.transform.javacount', + None, + "localhost:12345")) + + def format(kv): + key, value = kv + return '%s:%s' % (key, value) + + output = java_output | 'Format' >> beam.Map(format) + output | 'Write' >> WriteToText(output_path) + + +if __name__ == '__main__': + logging.getLogger().setLevel(logging.INFO) + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument( + '--input', + dest='input', + default='input.txt', + required=True, + help='Input file') + parser.add_argument( + '--output', + dest='output', + default='output.txt', + required=True, + help='Output file') + known_args, pipeline_args = parser.parse_known_args() + + run( + known_args.input, + known_args.output, + pipeline_args) diff --git a/learning/tour-of-beam/learning-content/cross-language/multi-pipeline/unit-info.yaml b/learning/tour-of-beam/learning-content/cross-language/multi-pipeline/unit-info.yaml new file mode 100644 index 000000000000..f86b7d7d18a0 --- /dev/null +++ b/learning/tour-of-beam/learning-content/cross-language/multi-pipeline/unit-info.yaml @@ -0,0 +1,28 @@ +# +# 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. +# + +sdk: + - Java + - Python +id: multi-pipeline +name: Multi pipeline +complexity: ADVANCED +taskName: multi-pipeline + + diff --git a/learning/tour-of-beam/learning-content/cross-language/sql-transform/description.md b/learning/tour-of-beam/learning-content/cross-language/sql-transform/description.md new file mode 100644 index 000000000000..3109518bf2b7 --- /dev/null +++ b/learning/tour-of-beam/learning-content/cross-language/sql-transform/description.md @@ -0,0 +1,128 @@ + + +### Sql transform + +In Apache Beam, you can use **SQL** transforms to query and manipulate your data within the pipeline using SQL-like syntax. This is particularly useful if you're already familiar with SQL and want to leverage that knowledge while processing data in your Apache Beam pipeline. + +Apache Beam **SQL** is built on top of Calcite, an open-source SQL parser, and optimizer framework. + +To use **SQL** transforms in Apache Beam, you'll need to perform the following steps: + +* Create a `PCollection` of rows. Apache Beam performs SQL operations on `PCollection` objects. You'll need to convert your data into a `PCollection` of rows, which requires defining a schema that describes the structure of your data. + +* Apply the SQL transform. Once you have your `PCollection`, you can apply a SQL transform using the `SqlTransform.query()` method. You'll need to provide the SQL query you want to execute on your data. + +{{if (eq .Sdk "java")}} +Add the necessary dependencies to your project. For Java, you'll need to include the `beam-sdks-java-extensions-sql` dependency in your build configuration. + +``` +import org.apache.beam.sdk.extensions.sql.SqlTransform; +import org.apache.beam.sdk.schemas.Schema; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.Row; + +// Define the schema for your data +Schema schema = Schema.builder() + .addField("id", Schema.FieldType.INT32) + .addField("name", Schema.FieldType.STRING) + .build(); + +// Assume input is a PCollection with the above schema +PCollection input = pipeline.apply(Create.of( + Row.withSchema(schema).addValues(1, "Josh").build(), + Row.withSchema(schema).addValues(103, "Anna").build() + ).withRowSchema(schema)); + + +// Apply the SQL transform +PCollection result = input.apply( + SqlTransform.query("SELECT id, name FROM PCOLLECTION WHERE id > 100")); +``` +{{end}} + +{{if (eq .Sdk "python")}} +``` +import apache_beam as beam +from apache_beam.transforms.sql import SqlTransform + +# Define a sample input data as a list of dictionaries +input_data = [ + {'id': 1, 'name': 'Alice'}, + {'id': 2, 'name': 'Bob'}, + {'id': 101, 'name': 'Carol'}, + {'id': 102, 'name': 'David'}, +] + +# Create a pipeline +with beam.Pipeline() as p: + # Read input data and convert it to a PCollection of Rows + input_rows = ( + p | 'Create input data' >> beam.Create(input_data) + | 'Convert to Rows' >> beam.Map(lambda x: beam.Row(id=int(x['id']), name=str(x['name']))) + ) + + # Apply the SQL transform + filtered_rows = input_rows | SqlTransform("SELECT id, name FROM PCOLLECTION WHERE id > 100") + + # Print the results + filtered_rows | 'Print results' >> beam.Map(print) +``` +{{end}} + +### Playground exercise + +{{if (eq .Sdk "java")}} +You can use your own classes instead of `Schema`. Here we have created several customer. And we make a query using `SqlTransform` transformation: +``` +@DefaultSchema(JavaBeanSchema.class) +public class Customer implements Serializable { + private int id; + private String name; + private String countryOfResidence; + + public Customer(int id, String name, String countryOfResidence) { + this.id = id; + this.name = name; + this.countryOfResidence = countryOfResidence; + } +} + +PCollection customers = pipeline.apply(Create.of( + new Customer(1, "Foo", "Wonderland"), + new Customer(2, "Bar", "Super Kingdom"), + new Customer(3, "Baz", "Wonderland"), + new Customer(4, "Grault", "Wonderland"), + new Customer(5, "Qux", "Super Kingdom"))); + +PCollection customersFromWonderland = + customers.apply( + SqlTransform.query( + "SELECT id, name " + + " FROM PCOLLECTION " + + " WHERE countryOfResidence = 'Wonderland'")); +``` +{{end}} + +{{if (eq .Sdk "python")}} +You can use your `typing.NamedTuple` instead of `beam.Row`: +``` +Purchase = typing.NamedTuple('Purchase', + [('item_name', unicode), ('price', float)]) +coders.registry.register_coder(Purchase, coders.RowCoder) +with Pipeline() as p: + purchases = (p | beam.io... + | beam.Map(..).with_output_types(Purchase)) +``` +{{end}} \ No newline at end of file diff --git a/learning/tour-of-beam/learning-content/cross-language/sql-transform/java-example/Task.java b/learning/tour-of-beam/learning-content/cross-language/sql-transform/java-example/Task.java new file mode 100644 index 000000000000..75a6dd033f18 --- /dev/null +++ b/learning/tour-of-beam/learning-content/cross-language/sql-transform/java-example/Task.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. + */ + +// beam-playground: +// name: sql-transform +// description: Sql transform +// multifile: false +// context_line: 33 +// categories: +// - Quickstart +// complexity: ADVANCED +// tags: +// - hellobeam + +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.extensions.sql.SqlTransform; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +import org.apache.beam.sdk.schemas.Schema; +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.values.PCollection; +import org.apache.beam.sdk.values.Row; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Task { + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.create(); + + // Create the Pipeline object with the options we defined above + Pipeline pipeline = Pipeline.create(options); + + Schema schema = Schema.builder() + .addField("id", Schema.FieldType.INT32) + .addField("name", Schema.FieldType.STRING) + .build(); + + PCollection input = pipeline.apply(Create.of( + Row.withSchema(schema).addValues(1, "Josh").build(), + Row.withSchema(schema).addValues(103, "Anna").build() + ).withRowSchema(schema)); + + PCollection result = input + .apply(SqlTransform.query("SELECT id, name FROM PCOLLECTION where id > 100")); + + result.apply(ParDo.of(new LogOutput<>("Sql result"))); + + pipeline.run().waitUntilFinish(); + + } + + static class LogOutput extends DoFn { + + private static final Logger LOG = LoggerFactory.getLogger(LogOutput.class); + + private final String prefix; + + public LogOutput() { + this.prefix = "Processing element"; + } + + LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + ": {}", c.element()); + c.output(c.element()); + } + } +} \ No newline at end of file diff --git a/learning/tour-of-beam/learning-content/cross-language/sql-transform/java-example/output.log b/learning/tour-of-beam/learning-content/cross-language/sql-transform/java-example/output.log new file mode 100644 index 000000000000..247de1073f75 --- /dev/null +++ b/learning/tour-of-beam/learning-content/cross-language/sql-transform/java-example/output.log @@ -0,0 +1,17 @@ + + +Sql result: Row: +id:103 +name:Anna \ No newline at end of file diff --git a/learning/tour-of-beam/learning-content/cross-language/sql-transform/python-example/output.log b/learning/tour-of-beam/learning-content/cross-language/sql-transform/python-example/output.log new file mode 100644 index 000000000000..94683beb1d1a --- /dev/null +++ b/learning/tour-of-beam/learning-content/cross-language/sql-transform/python-example/output.log @@ -0,0 +1,17 @@ + + + +id=101, name='Carol' +id=102, name='David' \ No newline at end of file diff --git a/learning/tour-of-beam/learning-content/cross-language/sql-transform/python-example/task.py b/learning/tour-of-beam/learning-content/cross-language/sql-transform/python-example/task.py new file mode 100644 index 000000000000..a65108d75d49 --- /dev/null +++ b/learning/tour-of-beam/learning-content/cross-language/sql-transform/python-example/task.py @@ -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. + +# beam-playground: +# name: sql-transform +# description: Sql transform +# multifile: false +# context_line: 35 +# categories: +# - Quickstart +# complexity: BASIC +# never_run: true +# tags: +# - hellobeam + +import apache_beam as beam +from apache_beam.transforms.sql import SqlTransform + +# Define a sample input data as a list of dictionaries +input_data = [ + {'id': 1, 'name': 'Alice'}, + {'id': 2, 'name': 'Bob'}, + {'id': 101, 'name': 'Carol'}, + {'id': 102, 'name': 'David'}, +] + +# Create a pipeline +with beam.Pipeline() as pipeline: + # Read input data and convert it to a PCollection of Rows + input_rows = ( + pipeline + | 'Create input data' >> beam.Create(input_data) + | 'Convert to Rows' >> beam.Map(lambda x: beam.Row(id=int(x['id']), name=str(x['name']))) + ) + + # Apply the SQL transform + filtered_rows = input_rows | SqlTransform("SELECT id, name FROM PCOLLECTION WHERE id > 100") + + # Print the results + filtered_rows | 'Print results' >> beam.Map(print) diff --git a/learning/tour-of-beam/learning-content/cross-language/sql-transform/unit-info.yaml b/learning/tour-of-beam/learning-content/cross-language/sql-transform/unit-info.yaml new file mode 100644 index 000000000000..85d5d321bb23 --- /dev/null +++ b/learning/tour-of-beam/learning-content/cross-language/sql-transform/unit-info.yaml @@ -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. +# + +sdk: + - Java + - Python +id: sql-transform +name: Sql transform +complexity: ADVANCED +taskName: sql-transform diff --git a/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/description.md b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/description.md new file mode 100644 index 000000000000..aa3978bb27ea --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/description.md @@ -0,0 +1,27 @@ + +### Final challenge 1 + +You’re given a csv file with purchase transactions. Write a Beam pipeline to prepare a report every 30 seconds. The report needs to be created only for transactions where quantity is more than 20. + +Report should consist of two files named "**price_more_than_10.txt**" and "**price_less_than_10.txt**": + +* Total transactions amount grouped by **ProductNo** for products with **price** greater than 10 +* Total transactions amount grouped by **ProductNo** for products with **price** less than 10 + +Example rows from input file: + +| TransactionNo | Date | ProductNo | ProductName | Price | Quantity | CustomerNo | Country | +|---------------|-----------|-----------|-------------------------------------|-------|----------|------------|----------------| +| 581482 | 12/9/2019 | 22485 | Set Of 2 Wooden Market Crates | 21 | 47 | 17490 | United Kingdom | +| 581475 | 12/9/2019 | 22596 | Christmas Star Wish List Chalkboard | 10.65 | 36 | 13069 | United Kingdom | +| 581475 | 12/9/2019 | 23235 | Storage Tin Vintage Leaf | 11.53 | 12 | 13069 | United Kingdom | \ No newline at end of file diff --git a/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/go-challenge/input.csv b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/go-challenge/input.csv new file mode 100644 index 000000000000..85854a2d4358 --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/go-challenge/input.csv @@ -0,0 +1,1500 @@ +TransactionNo,Date,ProductNo,ProductName,Price,Quantity,CustomerNo,Country +581482,12/9/2019,22485,Set Of 2 Wooden Market Crates,21.47,12,17490,United Kingdom +581475,12/9/2019,22596,Christmas Star Wish List Chalkboard,10.65,36,13069,United Ki +581475,12/9/2019,23235,Storage Tin Vintage Leaf,11.53,12,13069,United Kingdom +581475,12/9/2019,23272,Tree T-Light Holder Willie Winkie,10.65,12,13069,United King +581475,12/9/2019,23239,Set Of 4 Knick Knack Tins Poppies,11.94,6,13069,United Kingd +581475,12/9/2019,21705,Bag 500g Swirly Marbles,10.65,24,13069,United Kingdom +581475,12/9/2019,22118,Joy Wooden Block Letters,11.53,18,13069,United Kingdom +581475,12/9/2019,22119,Peace Wooden Block Letters,12.25,12,13069,United Kingdom +581475,12/9/2019,22217,T-Light Holder Hanging Lace,10.65,12,13069,United Kingdom +581475,12/9/2019,22216,T-Light Holder White Lace,10.55,24,13069,United Kingdom +581475,12/9/2019,22380,Toy Tidy Spaceboy,11.06,20,13069,United Kingdom +581475,12/9/2019,22442,Grow Your Own Flowers Set Of 3,12.25,12,13069,United Kingdom +581475,12/9/2019,22664,Toy Tidy Dolly Girl Design,11.06,20,13069,United Kingdom +581475,12/9/2019,22721,Set Of 3 Cake Tins Sketchbook,12.25,12,13069,United Kingdom +581475,12/9/2019,22723,Set Of 6 Herb Tins Sketchbook,11.53,12,13069,United Kingdom +581475,12/9/2019,22785,Squarecushion Cover Pink Union Jack,11.53,12,13069,United Ki +581475,12/9/2019,22955,36 Foil Star Cake Cases,11.06,24,13069,United Kingdom +581475,12/9/2019,23141,Triple Wire Hook Pink Heart,11.06,12,13069,United Kingdom +581475,12/9/2019,22956,36 Foil Heart Cake Cases,11.06,24,13069,United Kingdom +581475,12/9/2019,22581,Wood Stocking Christmas Scandispot,10.55,48,13069,United Kin +581476,12/9/2019,23198,Pantry Magnetic Shopping List,11.53,48,12433,Norway +581476,12/9/2019,23197,Sketchbook Magnetic Shopping List,11.74,24,12433,Norway +581476,12/9/2019,23184,Bull Dog Bottle Opener,15.32,8,12433,Norway +581476,12/9/2019,23168,Classic Cafe Sugar Dispenser,11.53,12,12433,Norway +581476,12/9/2019,23167,Small Ceramic Top Storage Jar,10.96,96,12433,Norway +581476,12/9/2019,23166,Medium Ceramic Top Storage Jar,11.32,48,12433,Norway +581476,12/9/2019,23165,Large Ceramic Top Storage Jar,11.74,48,12433,Norway +581476,12/9/2019,23004,Travel Card Wallet Pantry,10.68,48,12433,Norway +581476,12/9/2019,23002,Travel Card Wallet Skulls,10.68,24,12433,Norway +581476,12/9/2019,23000,Travel Card Wallet Transport,10.68,24,12433,Norway +581476,12/9/2019,22998,Travel Card Wallet Keep Calm,10.68,72,12433,Norway +581476,12/9/2019,22994,Travel Card Wallet Retrospot,10.68,48,12433,Norway +581476,12/9/2019,22835,Hot Water Bottle I Am So Poorly,15.32,8,12433,Norway +581476,12/9/2019,22730,Alarm Clock Bakelike Ivory,14.09,4,12433,Norway +581476,12/9/2019,22728,Alarm Clock Bakelike Pink,14.09,8,12433,Norway +581476,12/9/2019,22727,Alarm Clock Bakelike Red,14.09,8,12433,Norway +581476,12/9/2019,22726,Alarm Clock Bakelike Green,14.09,4,12433,Norway +581476,12/9/2019,22720,Set Of 3 Cake Tins Pantry Design,14.61,16,12433,Norway +581476,12/9/2019,22693,Grow A Flytrap Or Sunflower In Tin,11.34,192,12433,Norway +581476,12/9/2019,22670,French Wc Sign Blue Metal,11.53,24,12433,Norway +581476,12/9/2019,22667,Recipe Box Retrospot,12.86,24,12433,Norway +581476,12/9/2019,22666,Recipe Box Pantry Yellow Design,12.86,24,12433,Norway +581476,12/9/2019,22631,Circus Parade Lunch Box,12.25,12,12433,Norway +581476,12/9/2019,22628,Picnic Boxes Set Of 3 Retrospot,15.32,16,12433,Norway +581476,12/9/2019,22467,Gumball Coat Rack,12.86,6,12433,Norway +581476,12/9/2019,22197,Popcorn Holder,10.99,100,12433,Norway +581476,12/9/2019,22114,Hot Water Bottle Tea And Sympathy,14.61,8,12433,Norway +581476,12/9/2019,22112,Chocolate Hot Water Bottle,15.32,9,12433,Norway +581476,12/9/2019,21908,Chocolate This Way Metal Sign,12.40,36,12433,Norway +581476,12/9/2019,21874,Gin And Tonic Mug,11.74,36,12433,Norway +581476,12/9/2019,21872,Glamorous Mug,11.53,12,12433,Norway +581476,12/9/2019,21871,Save The Planet Mug,11.74,36,12433,Norway +581476,12/9/2019,21533,Retrospot Large Milk Jug,15.32,6,12433,Norway +581476,12/9/2019,21481,Fawn Blue Hot Water Bottle,14.09,12,12433,Norway +581476,12/9/2019,21479,White Skull Hot Water Bottle,14.61,4,12433,Norway +581476,12/9/2019,21248,Door Hanger Mum + Dads Room,11.74,12,12433,Norway +581476,12/9/2019,21216,Set 3 Retrospot Tea/Coffee/Sugar,14.61,24,12433,Norway +581476,12/9/2019,21181,Please One Person Metal Sign,12.15,48,12433,Norway +581476,12/9/2019,21175,Gin And Tonic Diet Metal Sign,12.38,48,12433,Norway +581476,12/9/2019,21169,You're Confusing Me Metal Sign,11.74,48,12433,Norway +581476,12/9/2019,21162,Toxic Area Door Hanger,10.65,24,12433,Norway +581476,12/9/2019,21159,Moody Boy Door Hanger,10.65,24,12433,Norway +581476,12/9/2019,21158,Moody Girl Door Hanger,10.65,24,12433,Norway +581476,12/9/2019,21154,Red Retrospot Oven Glove,11.53,10,12433,Norway +581476,12/9/2019,16016,Large Chinese Style Scissor,11.12,40,12433,Norway +581476,12/9/2019,16014,Small Chinese Style Scissor,10.68,60,12433,Norway +581476,12/9/2019,16008,Small Folding Scissor(Pointed Edge),10.37,240,12433,Norway +581476,12/9/2019,85152,Hand Over The Chocolate Sign,12.15,48,12433,Norway +581476,12/9/2019,84596F,Small Marshmallows Pink Bowl,10.68,32,12433,Norway +581476,12/9/2019,84596B,Small Dolly Mix Design Orange Bowl,10.68,16,12433,Norway +581476,12/9/2019,84510A,Set Of 4 English Rose Coasters,11.53,20,12433,Norway +581476,12/9/2019,82600,N0 Singing Metal Sign,12.15,48,12433,Norway +581476,12/9/2019,82581,Toilet Metal Sign,10.81,48,12433,Norway +581476,12/9/2019,72232,Feng Shui Pillar Candle,10.44,144,12433,Norway +581476,12/9/2019,47559B,Tea Time Oven Glove,11.53,10,12433,Norway +581476,12/9/2019,47504H,English Rose Spirit Level,11.06,36,12433,Norway +581476,12/9/2019,23493,Vintage Doily Travel Sewing Kit,12.25,30,12433,Norway +581476,12/9/2019,23430,Blue Retro Kitchen Wall Clock,18.60,2,12433,Norway +581476,12/9/2019,23429,Red Retro Kitchen Wall Clock,18.60,2,12433,Norway +581476,12/9/2019,23428,Ivory Retro Kitchen Wall Clock,18.60,2,12433,Norway +581476,12/9/2019,23358,Hot Stuff Hot Water Bottle,11.53,18,12433,Norway +581476,12/9/2019,23293,Set Of 12 Fairy Cake Baking Cases,11.10,32,12433,Norway +581476,12/9/2019,23243,Set Of Tea Coffee Sugar Tins Pantry,15.32,12,12433,Norway +581476,12/9/2019,23240,Set Of 4 Knick Knack Tins Doily,14.50,6,12433,Norway +581477,12/9/2019,48111,Doormat 3 Smiley Cats,17.51,10,13426,United Kingdom +581477,12/9/2019,22464,Hanging Metal Heart Lantern,11.06,12,13426,United Kingdom +581477,12/9/2019,20982,12 Pencils Tall Tube Skulls,11.12,12,13426,United Kingdom +581477,12/9/2019,20981,12 Pencils Tall Tube Woodland,11.12,12,13426,United Kingdom +581477,12/9/2019,23424,Gingham Recipe Book Box,15.32,8,13426,United Kingdom +581477,12/9/2019,23338,Egg Frying Pan Red,12.15,48,13426,United Kingdom +581477,12/9/2019,84970L,Single Heart Zinc T-Light Holder,11.53,12,13426,United King +581477,12/9/2019,22457,Natural Slate Heart Chalkboard,13.27,6,13426,United Kingdom +581477,12/9/2019,22469,Heart Of Wicker Small,11.94,12,13426,United Kingdom +581477,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,11.12,12,13426,United Ki +581478,12/9/2019,84947,Antique Silver Tea Glass Engraved,11.53,24,17364,United King +581478,12/9/2019,23503,Playing Cards Keep Calm & Carry On,11.53,12,17364,United Kin +581478,12/9/2019,23445,Ice Cream Bubbles,11.10,20,17364,United Kingdom +581478,12/9/2019,23530,Wall Art Only One Person,15.32,12,17364,United Kingdom +581478,12/9/2019,84997C,Childrens Cutlery Polkadot Blue,14.50,4,17364,United Kingdo +581478,12/9/2019,84997D,Childrens Cutlery Polkadot Pink,14.50,4,17364,United Kingdo +581478,12/9/2019,84077,World War 2 Gliders Asstd Designs,10.55,48,17364,United King +581478,12/9/2019,22749,Feltcraft Princess Charlotte Doll,14.09,4,17364,United Kingd +581478,12/9/2019,23127,Feltcraft Girl Nicole Kit,15.32,4,17364,United Kingdom +581478,12/9/2019,23126,Feltcraft Girl Amelie Kit,15.32,4,17364,United Kingdom +581478,12/9/2019,22747,Poppy's Playhouse Bathroom,12.40,6,17364,United Kingdom +581478,12/9/2019,22078,Ribbon Reel Lace Design,12.40,10,17364,United Kingdom +581478,12/9/2019,84946,Antique Silver T-Light Glass,11.53,12,17364,United Kingdom +581478,12/9/2019,22791,T-Light Glass Fluted Antique,11.53,12,17364,United Kingdom +581478,12/9/2019,21326,Aged Glass Silver T-Light Holder,10.92,12,17364,United Kingd +581478,12/9/2019,22170,Picture Frame Wood Triple Portrait,17.17,8,17364,United King +581478,12/9/2019,23082,Set 6 Paper Table Lantern Hearts,14.09,6,17364,United Kingdo +581478,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,11.12,24,17364,United Ki +581479,12/9/2019,22087,Paper Bunting White Lace,13.27,10,17364,United Kingdom +581480,12/9/2019,23464,Vintage Zinc Watering Can Small,15.32,4,14441,United Kingdom +581480,12/9/2019,22411,Jumbo Shopper Vintage Red Paisley,12.38,10,14441,United King +581480,12/9/2019,84029E,Red Woolly Hottie White Heart,14.61,8,14441,United Kingdom +581480,12/9/2019,22633,Hand Warmer Union Jack,12.40,12,14441,United Kingdom +581480,12/9/2019,23355,Hot Water Bottle Keep Calm,15.32,12,14441,United Kingdom +581480,12/9/2019,84029G,Knitted Union Flag Hot Water Bottle,14.61,12,14441,United K +581480,12/9/2019,22112,Chocolate Hot Water Bottle,15.32,6,14441,United Kingdom +581480,12/9/2019,84347,Rotating Silver Angels T-Light Hldr,12.86,18,14441,United Ki +581481,12/9/2019,21115,Rose Caravan Doorstop,12.25,8,17490,United Kingdom +581481,12/9/2019,22059,Ceramic Strawberry Design Mug,10.65,24,17490,United Kingdom +581481,12/9/2019,22072,Red Retrospot Tea Cup And Saucer,11.53,24,17490,United Kingd +581481,12/9/2019,22123,Ping Microwave Apron,11.06,24,17490,United Kingdom +581481,12/9/2019,22476,Empire Union Jack Tv Dinner Tray,12.25,8,17490,United Kingdo +581481,12/9/2019,22495,Set Of 2 Round Tins Camembert,11.06,12,17490,United Kingdom +581481,12/9/2019,22496,Set Of 2 Round Tins Dutch Cheese,11.06,12,17490,United Kingd +581481,12/9/2019,22513,Doorstop Football Design,11.06,8,17490,United Kingdom +581481,12/9/2019,22500,Set Of 2 Tins Jardin De Provence,11.53,12,17490,United Kingd +581481,12/9/2019,22664,Toy Tidy Dolly Girl Design,11.06,20,17490,United Kingdom +581481,12/9/2019,22721,Set Of 3 Cake Tins Sketchbook,12.25,12,17490,United Kingdom +581481,12/9/2019,22785,Squarecushion Cover Pink Union Jack,11.53,12,17490,United Ki +581481,12/9/2019,23178,Jam Clock Magnet,11.53,12,17490,United Kingdom +581481,12/9/2019,23302,Kneeling Mat Housework Design,11.06,24,17490,United Kingdom +581481,12/9/2019,23533,Wall Art Garden Haven,12.25,6,17490,United Kingdom +581481,12/9/2019,84819,Danish Rose Round Sewing Box,11.06,16,17490,United Kingdom +581482,12/9/2019,22371,Airline Bag Vintage Tokyo 78,14.30,12,17490,United Kingdom +581482,12/9/2019,21875,Kings Choice Mug,11.34,36,17490,United Kingdom +581482,12/9/2019,23251,Vintage Red Enamel Trim Mug,11.32,96,17490,United Kingdom +581482,12/9/2019,23300,Gardeners Kneeling Pad Cup Of Tea,11.74,48,17490,United King +581482,12/9/2019,22138,Baking Set 9 Piece Retrospot,14.61,24,17490,United Kingdom +581483,12/9/2019,23843,Paper Craft Little Birdie,12.38,80995,16446,United Kingdom +581485,12/9/2019,22617,Baking Set Spaceboy Design,15.32,18,17389,United Kingdom +581485,12/9/2019,20749,Assorted Colour Mini Cases,16.76,84,17389,United Kingdom +581486,12/9/2019,22910,Paper Chain Kit Vintage Christmas,13.27,12,17001,United King +581486,12/9/2019,22086,Paper Chain Kit 50'S Christmas,13.27,12,17001,United Kingdom +581486,12/9/2019,23351,Roll Wrap 50'S Christmas,6.19,12,17001,United Kingdom +581486,12/9/2019,23352,Roll Wrap 50'S Red Christmas,6.19,12,17001,United Kingdom +581486,12/9/2019,22727,Alarm Clock Bakelike Red,6.19,8,17001,United Kingdom +581486,12/9/2019,22730,Alarm Clock Bakelike Ivory,6.19,4,17001,United Kingdom +581486,12/9/2019,22491,Pack Of 12 Coloured Pencils,6.04,12,17001,United Kingdom +581486,12/9/2019,22561,Wooden School Colouring Set,6.04,12,17001,United Kingdom +581486,12/9/2019,22489,Pack Of 12 Traditional Crayons,6.04,24,17001,United Kingdom +581486,12/9/2019,22560,Traditional Modelling Clay,6.04,24,17001,United Kingdom +581486,12/9/2019,22139,Retrospot Tea Set Ceramic 11 Pc,6.04,6,17001,United Kingdom +581486,12/9/2019,23344,Jumbo Bag 50'S Christmas,6.19,20,17001,United Kingdom +581486,12/9/2019,23203,Jumbo Bag Vintage Doily,6.19,20,17001,United Kingdom +581486,12/9/2019,85099B,Jumbo Bag Red Retrospot,6.19,10,17001,United Kingdom +581486,12/9/2019,23201,Jumbo Bag Alphabet,6.19,20,17001,United Kingdom +581486,12/9/2019,23207,Lunch Bag Alphabet Design,6.19,10,17001,United Kingdom +581487,12/9/2019,21137,Black Record Cover Frame,6.04,120,15694,United Kingdom +581488,12/9/2019,23118,Parisienne Jewellery Drawer,6.04,16,17428,United Kingdom +581488,12/9/2019,23111,Parisienne Sewing Box,6.04,16,17428,United Kingdom +581488,12/9/2019,22179,Set 10 Night Owl Lights,6.04,24,17428,United Kingdom +581489,12/9/2019,22061,Large Cake Stand Hanging Strawbery,7.24,48,16954,United King +581489,12/9/2019,22182,Cake Stand Victorian Filigree Small,7.24,24,16954,United Kin +581491,12/9/2019,23571,Traditional Naughts & Crosses,7.24,12,12433,Norway +581492,12/9/2019,23369,Set 36 Colour Pencils Love London,6.19,2,15492,United Kingdo +581492,12/9/2019,23370,Set 36 Colouring Pencils Doily,6.19,2,15492,United Kingdom +581492,12/9/2019,23371,Set 36 Colour Pencils Spaceboy,6.19,3,15492,United Kingdom +581492,12/9/2019,23372,Set 36 Colour Pencils Dolly Girl,6.19,1,15492,United Kingdom +581492,12/9/2019,23376,Pack Of 12 Vintage Christmas Tissue,6.19,3,15492,United King +581492,12/9/2019,23377,Pack Of 12 Dolly Girl Tissues,6.19,6,15492,United Kingdom +581492,12/9/2019,23378,Pack Of 12 50'S Christmas Tissues,6.19,9,15492,United Kingdo +581492,12/9/2019,23379,Pack Of 12 Red Apple Tissues,6.19,4,15492,United Kingdom +581492,12/9/2019,23380,Pack Of 12 Vintage Doily Tissues,6.19,3,15492,United Kingdom +581492,12/9/2019,23381,Pack Of 12 Vintage Leaf Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,23382,Box Of 6 Christmas Cake Decorations,6.19,4,15492,United King +581492,12/9/2019,23391,I Love London Mini Backpack,6.19,2,15492,United Kingdom +581492,12/9/2019,23392,Spaceboy Rocket Lolly Makers,6.19,2,15492,United Kingdom +581492,12/9/2019,23399,Home Sweet Home Hanging Heart,6.19,4,15492,United Kingdom +581492,12/9/2019,23405,Home Sweet Home 2 Drawer Cabinet,6.19,3,15492,United Kingdom +581492,12/9/2019,23418,Lavender Toilette Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,23426,Metal Sign Drop Your Pants,6.19,1,15492,United Kingdom +581492,12/9/2019,23434,3 Raffia Ribbons 50'S Christmas,6.19,9,15492,United Kingdom +581492,12/9/2019,23435,3 Raffia Ribbons Vintage Christmas,6.04,3,15492,United Kingd +581492,12/9/2019,23439,Hand Warmer Red Love Heart,6.19,1,15492,United Kingdom +581492,12/9/2019,23451,Square Mini Portrait Frame,6.19,1,15492,United Kingdom +581492,12/9/2019,23467,Vintage Zinc Planter,6.19,1,15492,United Kingdom +581492,12/9/2019,23469,Card Holder Love Bird Small,6.19,3,15492,United Kingdom +581492,12/9/2019,23480,Mini Lights Woodland Mushrooms,6.19,2,15492,United Kingdom +581492,12/9/2019,23493,Vintage Doily Travel Sewing Kit,6.19,3,15492,United Kingdom +581492,12/9/2019,23494,Vintage Doily Deluxe Sewing Kit,6.19,1,15492,United Kingdom +581492,12/9/2019,23495,Set Of 3 Pantry Wooden Spoons,6.19,1,15492,United Kingdom +581492,12/9/2019,23497,Classic Chrome Bicycle Bell,6.19,4,15492,United Kingdom +581492,12/9/2019,23498,Classic Bicycle Clips,6.19,2,15492,United Kingdom +581492,12/9/2019,23501,Key Ring Baseball Boot Union Jack,6.19,3,15492,United Kingdo +581492,12/9/2019,23506,Mini Playing Cards Spaceboy,6.04,1,15492,United Kingdom +581492,12/9/2019,23508,Mini Playing Cards Dolly Girl,6.04,2,15492,United Kingdom +581492,12/9/2019,23510,Mini Playing Cards Gymkhana,6.04,1,15492,United Kingdom +581492,12/9/2019,23521,Wall Art Cat And Bird,6.04,1,15492,United Kingdom +581492,12/9/2019,23526,Wall Art Dog Licence,6.04,4,15492,United Kingdom +581492,12/9/2019,23530,Wall Art Only One Person,6.04,2,15492,United Kingdom +581492,12/9/2019,23534,Wall Art Stop For Tea,6.19,6,15492,United Kingdom +581492,12/9/2019,23535,Wall Art Bicycle Safety,6.19,4,15492,United Kingdom +581492,12/9/2019,23536,Wall Art Village Show,6.19,1,15492,United Kingdom +581492,12/9/2019,23538,Wall Art Vintage Heart,6.19,1,15492,United Kingdom +581492,12/9/2019,23551,Pack Of 12 Paisley Park Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,23552,Bicycle Puncture Repair Kit,6.19,12,15492,United Kingdom +581492,12/9/2019,23555,Landmark Frame Notting Hill,6.19,1,15492,United Kingdom +581492,12/9/2019,23559,Woodland Bunnies Lolly Makers,6.19,5,15492,United Kingdom +581492,12/9/2019,23561,Set Of 6 Ribbons Party,6.19,1,15492,United Kingdom +581492,12/9/2019,23564,Egg Cup Milkmaid Ingrid,6.19,2,15492,United Kingdom +581492,12/9/2019,23565,Egg Cup Milkmaid Helga,6.19,2,15492,United Kingdom +581492,12/9/2019,23567,Egg Cup Henrietta Hen Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,23569,Tradtional Alphabet Stamp Set,6.19,2,15492,United Kingdom +581492,12/9/2019,23570,Traditional Pick Up Sticks Game,6.19,7,15492,United Kingdom +581492,12/9/2019,23571,Traditional Naughts & Crosses,6.19,2,15492,United Kingdom +581492,12/9/2019,23575,Snack Tray Paisley Park,6.19,3,15492,United Kingdom +581492,12/9/2019,23579,Snack Tray I Love London,6.19,1,15492,United Kingdom +581492,12/9/2019,23611,Set 10 Cards Red Riding Hood 17214,6.19,3,15492,United Kingd +581492,12/9/2019,23616,Set 10 Cards Jingle Bells 17217,6.19,1,15492,United Kingdom +581492,12/9/2019,23621,Set 10 Cards David's Madonna 17074,6.19,3,15492,United Kingd +581492,12/9/2019,23635,Set 10 Cards Christmas Holly 17259,6.19,1,15492,United Kingd +581492,12/9/2019,23644,Set 10 Cards Christmas Tree 16955,6.19,1,15492,United Kingdo +581492,12/9/2019,23660,Henrietta Hen Mug,6.19,1,15492,United Kingdom +581492,12/9/2019,23661,Milk Maids Mug,6.19,1,15492,United Kingdom +581492,12/9/2019,35095A,Blue Victorian Fabric Oval Box,6.19,1,15492,United Kingdom +581492,12/9/2019,35095B,Red Victorian Fabric Oval Box,6.19,1,15492,United Kingdom +581492,12/9/2019,35646,Vintage Bead Pink Evening Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,35648,Vintage Bead Pink Purse,6.19,2,15492,United Kingdom +581492,12/9/2019,35953,Folkart Star Christmas Decorations,6.19,12,15492,United King +581492,12/9/2019,35964,Folkart Clip On Stars,6.19,4,15492,United Kingdom +581492,12/9/2019,35970,Zinc Folkart Sleigh Bells,6.04,1,15492,United Kingdom +581492,12/9/2019,46118,Funky Monkey Cushion Cover,6.19,1,15492,United Kingdom +581492,12/9/2019,46776A,Woven Bubble Gum Cushion Cover,7.24,2,15492,United Kingdom +581492,12/9/2019,46776B,Woven Berries Cushion Cover,7.24,3,15492,United Kingdom +581492,12/9/2019,46776C,Woven Frost Cushion Cover,7.24,1,15492,United Kingdom +581492,12/9/2019,46776D,Woven Sunset Cushion Cover,7.24,2,15492,United Kingdom +581492,12/9/2019,46776E,Woven Candy Cushion Cover,7.24,5,15492,United Kingdom +581492,12/9/2019,46776F,Woven Rose Garden Cushion Cover,7.24,6,15492,United Kingdom +581492,12/9/2019,47310M,Small Pop Box Funky Monkey,6.19,1,15492,United Kingdom +581492,12/9/2019,47480,Hanging Photo Clip Rope Ladder,6.19,3,15492,United Kingdom +581492,12/9/2019,47504H,English Rose Spirit Level,7.24,1,15492,United Kingdom +581492,12/9/2019,47559B,Tea Time Oven Glove,7.24,3,15492,United Kingdom +581492,12/9/2019,47563A,Retro Longboard Ironing Board Cover,7.24,2,15492,United Kin +581492,12/9/2019,47566,Party Bunting,7.24,2,15492,United Kingdom +581492,12/9/2019,47590B,Pink Happy Birthday Bunting,7.24,1,15492,United Kingdom +581492,12/9/2019,51014A,Feather Pen Hot Pink,7.24,2,15492,United Kingdom +581492,12/9/2019,51014L,Feather Pen Light Pink,7.24,1,15492,United Kingdom +581492,12/9/2019,71270,Photo Clip Line,7.24,1,15492,United Kingdom +581492,12/9/2019,72349B,Set/6 Purple Butterfly T-Lights,6.39,1,15492,United Kingdom +581492,12/9/2019,72741,Grand Chocolatecandle,7.24,3,15492,United Kingdom +581492,12/9/2019,72800E,4 Ivory Dinner Candles Silver Flock,7.24,3,15492,United Kin +581492,12/9/2019,79321,Chilli Lights,6.19,1,15492,United Kingdom +581492,12/9/2019,82484,Wood Black Board Ant White Finish,6.19,2,15492,United Kingdo +581492,12/9/2019,82567,Airline Lounge Metal Sign,6.19,2,15492,United Kingdom +581492,12/9/2019,82582,Area Patrolled Metal Sign,6.19,1,15492,United Kingdom +581492,12/9/2019,82600,N0 Singing Metal Sign,6.19,1,15492,United Kingdom +581492,12/9/2019,84031A,Charlie+Lola Red Hot Water Bottle,6.19,4,15492,United Kingd +581492,12/9/2019,84077,World War 2 Gliders Asstd Designs,6.19,1,15492,United Kingdo +581492,12/9/2019,84249A,Greeting Card Square Doughnuts,6.19,1,15492,United Kingdom +581492,12/9/2019,84347,Rotating Silver Angels T-Light Hldr,6.19,2,15492,United King +581492,12/9/2019,84375,Set Of 20 Kids Cookie Cutters,6.19,1,15492,United Kingdom +581492,12/9/2019,84378,Set Of 3 Heart Cookie Cutters,6.19,4,15492,United Kingdom +581492,12/9/2019,84519B,Carrot Charlie+Lola Coaster Set,6.19,1,15492,United Kingdom +581492,12/9/2019,84559A,3d Sheet Of Dog Stickers,6.19,2,15492,United Kingdom +581492,12/9/2019,84568,Girls Alphabet Iron On Patches,6.19,31,15492,United Kingdom +581492,12/9/2019,84569D,Pack 6 Heart/Ice-Cream Patches,6.19,1,15492,United Kingdom +581492,12/9/2019,84596B,Small Dolly Mix Design Orange Bowl,6.19,4,15492,United King +581492,12/9/2019,84596F,Small Marshmallows Pink Bowl,6.19,4,15492,United Kingdom +581492,12/9/2019,84598,Boys Alphabet Iron On Patches,6.19,5,15492,United Kingdom +581492,12/9/2019,84692,Box Of 24 Cocktail Parasols,6.19,1,15492,United Kingdom +581492,12/9/2019,84755,Colour Glass T-Light Holder Hanging,6.19,4,15492,United King +581492,12/9/2019,84828,Jungle Popsicles Ice Lolly Moulds,6.19,1,15492,United Kingdo +581492,12/9/2019,84879,Assorted Colour Bird Ornament,6.19,16,15492,United Kingdom +581492,12/9/2019,84923,Pink Butterfly Handbag W Bobbles,6.04,3,15492,United Kingdom +581492,12/9/2019,84946,Antique Silver T-Light Glass,6.04,18,15492,United Kingdom +581492,12/9/2019,84970S,Hanging Heart Zinc T-Light Holder,6.04,3,15492,United Kingd +581492,12/9/2019,84978,Hanging Heart Jar T-Light Holder,6.04,4,15492,United Kingdom +581492,12/9/2019,84991,60 Teatime Fairy Cake Cases,6.04,1,15492,United Kingdom +581492,12/9/2019,84997A,Childrens Cutlery Polkadot Green,6.04,1,15492,United Kingdo +581492,12/9/2019,84997B,Childrens Cutlery Retrospot Red,6.04,1,15492,United Kingdom +581492,12/9/2019,20733,Gold Mini Tape Measure,6.04,3,15492,United Kingdom +581492,12/9/2019,20777,Chrysanthemum Notebook,6.19,2,15492,United Kingdom +581492,12/9/2019,20782,Camouflage Ear Muff Headphones,6.19,1,15492,United Kingdom +581492,12/9/2019,20914,Set/5 Red Retrospot Lid Glass Bowls,6.19,2,15492,United King +581492,12/9/2019,20931,Blue Pot Plant Candle,6.19,1,15492,United Kingdom +581492,12/9/2019,20970,Pink Floral Feltcraft Shoulder Bag,6.19,1,15492,United Kingd +581492,12/9/2019,20971,Pink Blue Felt Craft Trinket Box,6.19,2,15492,United Kingdom +581492,12/9/2019,20972,Pink Cream Felt Craft Trinket Box,6.19,3,15492,United Kingdo +581492,12/9/2019,20973,12 Pencil Small Tube Woodland,6.19,4,15492,United Kingdom +581492,12/9/2019,20978,36 Pencils Tube Skulls,6.19,1,15492,United Kingdom +581492,12/9/2019,20979,36 Pencils Tube Red Retrospot,6.19,3,15492,United Kingdom +581492,12/9/2019,20982,12 Pencils Tall Tube Skulls,6.19,2,15492,United Kingdom +581492,12/9/2019,20983,12 Pencils Tall Tube Red Retrospot,6.19,4,15492,United Kingd +581492,12/9/2019,20985,Heart Calculator,6.19,1,15492,United Kingdom +581492,12/9/2019,20986,Blue Calculator Ruler,6.19,1,15492,United Kingdom +581492,12/9/2019,21000,Rose Du Sud Cosmetics Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,21012,Antique All Glass Candlestick,6.19,3,15492,United Kingdom +581492,12/9/2019,21015,Dark Bird House Tree Decoration,6.19,8,15492,United Kingdom +581492,12/9/2019,21026,Space Owl,6.19,1,15492,United Kingdom +581492,12/9/2019,21035,Set/2 Red Retrospot Tea Towels,6.19,1,15492,United Kingdom +581492,12/9/2019,21064,Boom Box Speaker Boys,6.19,4,15492,United Kingdom +581492,12/9/2019,21065,Boom Box Speaker Girls,6.19,2,15492,United Kingdom +581492,12/9/2019,21098,Christmas Toilet Roll,6.19,1,15492,United Kingdom +581492,12/9/2019,21123,Set/10 Ivory Polkadot Party Candles,6.19,1,15492,United King +581492,12/9/2019,21125,Set 6 Football Celebration Candles,6.19,1,15492,United Kingd +581492,12/9/2019,21126,Set Of 6 Girls Celebration Candles,6.19,1,15492,United Kingd +581492,12/9/2019,21137,Black Record Cover Frame,6.19,17,15492,United Kingdom +581492,12/9/2019,21154,Red Retrospot Oven Glove,6.19,2,15492,United Kingdom +581492,12/9/2019,21158,Moody Girl Door Hanger,6.19,1,15492,United Kingdom +581492,12/9/2019,21162,Toxic Area Door Hanger,6.19,1,15492,United Kingdom +581492,12/9/2019,21166,Cook With Wine Metal Sign,6.19,2,15492,United Kingdom +581492,12/9/2019,21172,Party Metal Sign,6.19,1,15492,United Kingdom +581492,12/9/2019,21174,Pottering In The Shed Metal Sign,6.19,2,15492,United Kingdom +581492,12/9/2019,21175,Gin And Tonic Diet Metal Sign,6.19,2,15492,United Kingdom +581492,12/9/2019,21200,Multicolour Honeycomb Paper Garland,6.04,6,15492,United King +581492,12/9/2019,21201,Tropical Honeycomb Paper Garland,6.04,4,15492,United Kingdom +581492,12/9/2019,21212,Pack Of 72 Retrospot Cake Cases,6.04,2,15492,United Kingdom +581492,12/9/2019,21213,Pack Of 72 Skull Cake Cases,6.04,2,15492,United Kingdom +581492,12/9/2019,21220,Set/4 Badges Dogs,6.19,2,15492,United Kingdom +581492,12/9/2019,21224,Set/4 Skull Badges,6.19,1,15492,United Kingdom +581492,12/9/2019,21232,Strawberry Ceramic Trinket Pot,6.19,1,15492,United Kingdom +581492,12/9/2019,21257,Victorian Sewing Box Medium,6.19,2,15492,United Kingdom +581492,12/9/2019,21258,Victorian Sewing Box Large,6.19,1,15492,United Kingdom +581492,12/9/2019,21259,Victorian Sewing Box Small,6.19,1,15492,United Kingdom +581492,12/9/2019,21313,Glass Heart T-Light Holder,6.19,1,15492,United Kingdom +581492,12/9/2019,21314,Small Glass Heart Trinket Pot,6.19,2,15492,United Kingdom +581492,12/9/2019,21328,Balloons Writing Set,6.19,2,15492,United Kingdom +581492,12/9/2019,21329,Dinosaurs Writing Set,6.19,2,15492,United Kingdom +581492,12/9/2019,21356,Toast Its - Fairy Flower,6.19,16,15492,United Kingdom +581492,12/9/2019,21378,Small Tall Camphor Wood Toadstool,6.19,2,15492,United Kingdo +581492,12/9/2019,21379,Camphor Wood Portobello Mushroom,6.19,1,15492,United Kingdom +581492,12/9/2019,21383,Pack Of 12 Sticky Bunnies,6.19,1,15492,United Kingdom +581492,12/9/2019,21402,Red Egg Spoon,6.19,1,15492,United Kingdom +581492,12/9/2019,21408,Spotty Pink Duck Doorstop,6.19,2,15492,United Kingdom +581492,12/9/2019,21411,Gingham Heart Doorstop Red,6.19,1,15492,United Kingdom +581492,12/9/2019,21467,Cherry Crochet Food Cover,6.19,1,15492,United Kingdom +581492,12/9/2019,21471,Strawberry Raffia Food Cover,6.19,2,15492,United Kingdom +581492,12/9/2019,21479,White Skull Hot Water Bottle,6.19,2,15492,United Kingdom +581492,12/9/2019,21481,Fawn Blue Hot Water Bottle,6.19,3,15492,United Kingdom +581492,12/9/2019,21484,Chick Grey Hot Water Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,21485,Retrospot Heart Hot Water Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,21494,Rotating Leaves T-Light Holder,6.19,11,15492,United Kingdom +581492,12/9/2019,21506,Fancy Font Birthday Card,6.19,3,15492,United Kingdom +581492,12/9/2019,21507,Elephant Birthday Card,7.24,1,15492,United Kingdom +581492,12/9/2019,21508,Vintage Kid Dolly Card,7.24,1,15492,United Kingdom +581492,12/9/2019,21509,Cowboys And Indians Birthday Card,7.24,2,15492,United Kingdo +581492,12/9/2019,21528,Dairy Maid Traditional Teapot,7.24,1,15492,United Kingdom +581492,12/9/2019,21544,Skulls Water Transfer Tattoos,7.24,2,15492,United Kingdom +581492,12/9/2019,21558,Skull Lunch Box With Cutlery,6.39,1,15492,United Kingdom +581492,12/9/2019,21559,Strawberry Lunch Box With Cutlery,7.24,1,15492,United Kingdo +581492,12/9/2019,21615,4 Lavender Botanical Dinner Candles,7.24,2,15492,United King +581492,12/9/2019,21616,4 Pear Botanical Dinner Candles,7.24,6,15492,United Kingdom +581492,12/9/2019,21620,Set Of 4 Rose Botanical Candles,7.24,5,15492,United Kingdom +581492,12/9/2019,21642,Assorted Tutti Frutti Pen,7.24,4,15492,United Kingdom +581492,12/9/2019,21648,Assorted Tutti Frutti Small Purse,7.24,2,15492,United Kingdo +581492,12/9/2019,21650,Assorted Tutti Frutti Bracelet,7.24,14,15492,United Kingdom +581492,12/9/2019,21675,Butterflies Stickers,6.19,2,15492,United Kingdom +581492,12/9/2019,21677,Hearts Stickers,6.19,1,15492,United Kingdom +581492,12/9/2019,21678,Paisley Pattern Stickers,6.19,2,15492,United Kingdom +581492,12/9/2019,21680,Woodland Stickers,6.19,1,15492,United Kingdom +581492,12/9/2019,21703,Bag 125g Swirly Marbles,6.19,1,15492,United Kingdom +581492,12/9/2019,21704,Bag 250g Swirly Marbles,6.19,1,15492,United Kingdom +581492,12/9/2019,21716,Boys Vintage Tin Seaside Bucket,6.19,1,15492,United Kingdom +581492,12/9/2019,21718,Red Metal Beach Spade,6.19,1,15492,United Kingdom +581492,12/9/2019,21724,Panda And Bunnies Sticker Sheet,6.19,1,15492,United Kingdom +581492,12/9/2019,21731,Red Toadstool Led Night Light,6.19,6,15492,United Kingdom +581492,12/9/2019,21739,Cosy Slipper Shoes Small Green,6.19,2,15492,United Kingdom +581492,12/9/2019,21774,Decorative Cats Bathroom Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,21786,Polkadot Rain Hat,6.19,3,15492,United Kingdom +581492,12/9/2019,21787,Rain Poncho Retrospot,6.19,2,15492,United Kingdom +581492,12/9/2019,21790,Vintage Snap Cards,6.19,5,15492,United Kingdom +581492,12/9/2019,21791,Vintage Heads And Tails Card Game,6.19,1,15492,United Kingdo +581492,12/9/2019,21808,Christmas Garland Stars Trees,6.19,3,15492,United Kingdom +581492,12/9/2019,21810,Christmas Hanging Star With Bell,6.19,25,15492,United Kingdo +581492,12/9/2019,21812,Garland With Hearts And Bells,6.19,7,15492,United Kingdom +581492,12/9/2019,21813,Garland With Stars And Bells,6.19,3,15492,United Kingdom +581492,12/9/2019,21822,Glitter Christmas Tree With Bells,6.19,12,15492,United Kingd +581492,12/9/2019,21828,Eight Piece Snake Set,6.19,1,15492,United Kingdom +581492,12/9/2019,21832,Chocolate Calculator,6.19,1,15492,United Kingdom +581492,12/9/2019,21833,Camouflage Led Torch,6.04,2,15492,United Kingdom +581492,12/9/2019,21871,Save The Planet Mug,6.19,1,15492,United Kingdom +581492,12/9/2019,21874,Gin And Tonic Mug,6.19,2,15492,United Kingdom +581492,12/9/2019,21876,Pottering Mug,6.19,4,15492,United Kingdom +581492,12/9/2019,21879,Hearts Gift Tape,6.19,1,15492,United Kingdom +581492,12/9/2019,21889,Wooden Box Of Dominoes,6.19,3,15492,United Kingdom +581492,12/9/2019,21890,S/6 Wooden Skittles In Cotton Bag,6.19,1,15492,United Kingdo +581492,12/9/2019,21892,Traditional Wooden Catch Cup Game,6.19,1,15492,United Kingdo +581492,12/9/2019,21900,Key Fob Shed,6.19,4,15492,United Kingdom +581492,12/9/2019,21901,Key Fob Back Door,6.19,2,15492,United Kingdom +581492,12/9/2019,21902,Key Fob Front Door,6.19,1,15492,United Kingdom +581492,12/9/2019,21905,More Butter Metal Sign,6.19,1,15492,United Kingdom +581492,12/9/2019,21906,Pharmacie First Aid Tin,6.19,1,15492,United Kingdom +581492,12/9/2019,21914,Blue Harmonica In Box,6.19,2,15492,United Kingdom +581492,12/9/2019,21916,Set 12 Retro White Chalk Sticks,6.19,2,15492,United Kingdom +581492,12/9/2019,21930,Jumbo Storage Bag Skulls,6.19,1,15492,United Kingdom +581492,12/9/2019,21931,Jumbo Storage Bag Suki,6.19,1,15492,United Kingdom +581492,12/9/2019,21932,Scandinavian Paisley Picnic Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,21934,Skull Shoulder Bag,6.19,3,15492,United Kingdom +581492,12/9/2019,21935,Suki Shoulder Bag,6.19,9,15492,United Kingdom +581492,12/9/2019,21936,Red Retrospot Picnic Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,21942,Skulls Design Flannel,6.19,2,15492,United Kingdom +581492,12/9/2019,21945,Strawberries Design Flannel,6.19,2,15492,United Kingdom +581492,12/9/2019,21947,Set Of 6 Heart Chopsticks,6.19,1,15492,United Kingdom +581492,12/9/2019,21949,Set Of 6 Strawberry Chopsticks,6.19,2,15492,United Kingdom +581492,12/9/2019,21967,Pack Of 12 Skull Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,21976,Pack Of 60 Mushroom Cake Cases,6.19,3,15492,United Kingdom +581492,12/9/2019,21977,Pack Of 60 Pink Paisley Cake Cases,6.19,2,15492,United Kingd +581492,12/9/2019,21980,Pack Of 12 Red Retrospot Tissues,6.19,2,15492,United Kingdom +581492,12/9/2019,21981,Pack Of 12 Woodland Tissues,6.19,4,15492,United Kingdom +581492,12/9/2019,21982,Pack Of 12 Suki Tissues,6.19,2,15492,United Kingdom +581492,12/9/2019,21983,Pack Of 12 Blue Paisley Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,21984,Pack Of 12 Pink Paisley Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,21986,Pack Of 12 Pink Polkadot Tissues,6.19,3,15492,United Kingdom +581492,12/9/2019,21989,Pack Of 20 Skull Paper Napkins,6.19,2,15492,United Kingdom +581492,12/9/2019,21990,Modern Floral Stationery Set,6.19,8,15492,United Kingdom +581492,12/9/2019,21993,Floral Folk Stationery Set,6.19,8,15492,United Kingdom +581492,12/9/2019,22024,Rainy Ladies Birthday Card,6.19,3,15492,United Kingdom +581492,12/9/2019,22025,Ring Of Roses Birthday Card,6.19,3,15492,United Kingdom +581492,12/9/2019,22026,Banquet Birthday Card,6.19,4,15492,United Kingdom +581492,12/9/2019,22027,Tea Party Birthday Card,6.19,2,15492,United Kingdom +581492,12/9/2019,22028,Penny Farthing Birthday Card,6.19,1,15492,United Kingdom +581492,12/9/2019,22029,Spaceboy Birthday Card,6.19,4,15492,United Kingdom +581492,12/9/2019,22031,Botanical Lavender Birthday Card,6.19,1,15492,United Kingdom +581492,12/9/2019,22037,Robot Birthday Card,6.19,4,15492,United Kingdom +581492,12/9/2019,22064,Pink Doughnut Trinket Pot,6.19,1,15492,United Kingdom +581492,12/9/2019,22065,Christmas Pudding Trinket Pot,6.19,2,15492,United Kingdom +581492,12/9/2019,22068,Black Pirate Treasure Chest,6.19,1,15492,United Kingdom +581492,12/9/2019,22070,Small Red Retrospot Mug In Box,6.19,3,15492,United Kingdom +581492,12/9/2019,22071,Small White Retrospot Mug In Box,6.19,1,15492,United Kingdom +581492,12/9/2019,22074,6 Ribbons Shimmering Pinks,6.19,1,15492,United Kingdom +581492,12/9/2019,22075,6 Ribbons Elegant Christmas,6.19,8,15492,United Kingdom +581492,12/9/2019,22076,6 Ribbons Empire,6.19,4,15492,United Kingdom +581492,12/9/2019,22083,Paper Chain Kit Retrospot,6.19,1,15492,United Kingdom +581492,12/9/2019,22085,Paper Chain Kit Skulls,6.19,1,15492,United Kingdom +581492,12/9/2019,22086,Paper Chain Kit 50'S Christmas,6.19,38,15492,United Kingdom +581492,12/9/2019,22091,Empire Tissue Box,6.19,1,15492,United Kingdom +581492,12/9/2019,22099,Caravan Square Tissue Box,6.19,3,15492,United Kingdom +581492,12/9/2019,22104,Mirror Mosaic Candle Plate,6.19,4,15492,United Kingdom +581492,12/9/2019,22106,Mirror Mosaic Hurricane Lamp,6.19,1,15492,United Kingdom +581492,12/9/2019,22107,Pizza Plate In Box,6.19,10,15492,United Kingdom +581492,12/9/2019,22108,Ping! Microwave Plate,6.04,2,15492,United Kingdom +581492,12/9/2019,22109,Full English Breakfast Plate,6.04,2,15492,United Kingdom +581492,12/9/2019,22110,Bird House Hot Water Bottle,6.04,3,15492,United Kingdom +581492,12/9/2019,22111,Scottie Dog Hot Water Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,22112,Chocolate Hot Water Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,22114,Hot Water Bottle Tea And Sympathy,6.19,4,15492,United Kingdo +581492,12/9/2019,22116,Metal Sign His Dinner Is Served,6.19,2,15492,United Kingdom +581492,12/9/2019,22121,Noel Wooden Block Letters,6.19,1,15492,United Kingdom +581492,12/9/2019,22123,Ping Microwave Apron,6.19,1,15492,United Kingdom +581492,12/9/2019,22124,Set Of 2 Tea Towels Ping Microwave,6.19,1,15492,United Kingd +581492,12/9/2019,22129,Party Cones Candy Decoration,6.19,3,15492,United Kingdom +581492,12/9/2019,22134,Mini Ladle Love Heart Red,6.19,1,15492,United Kingdom +581492,12/9/2019,15036,Assorted Colours Silk Fan,6.19,1,15492,United Kingdom +581492,12/9/2019,15039,Sandalwood Fan,6.19,1,15492,United Kingdom +581492,12/9/2019,15058C,Ice Cream Design Garden Parasol,6.19,1,15492,United Kingdom +581492,12/9/2019,16218,Cartoon Pencil Sharpeners,6.19,5,15492,United Kingdom +581492,12/9/2019,16225,Rattle Snake Eggs,6.19,1,15492,United Kingdom +581492,12/9/2019,16235,Recycled Pencil With Rabbit Eraser,6.19,3,15492,United Kingd +581492,12/9/2019,16237,Sleeping Cat Erasers,6.19,1,15492,United Kingdom +581492,12/9/2019,17038,Porcelain Budah Incense Holder,6.19,1,15492,United Kingdom +581492,12/9/2019,17084N,Fairy Dreams Incense,6.19,1,15492,United Kingdom +581492,12/9/2019,20659,Economy Luggage Tag,6.19,7,15492,United Kingdom +581492,12/9/2019,20665,Red Retrospot Purse,6.19,2,15492,United Kingdom +581492,12/9/2019,20668,Disco Ball Christmas Decoration,6.19,1,15492,United Kingdom +581492,12/9/2019,20718,Red Retrospot Shopper Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,20719,Woodland Charlotte Bag,6.19,7,15492,United Kingdom +581492,12/9/2019,20723,Strawberry Charlotte Bag,6.19,2,15492,United Kingdom +581492,12/9/2019,20724,Red Retrospot Charlotte Bag,6.19,4,15492,United Kingdom +581492,12/9/2019,22135,Mini Ladle Love Heart Pink,6.19,6,15492,United Kingdom +581492,12/9/2019,22138,Baking Set 9 Piece Retrospot,6.19,1,15492,United Kingdom +581492,12/9/2019,22141,Christmas Craft Tree Top Angel,6.19,2,15492,United Kingdom +581492,12/9/2019,22150,3 Stripey Mice Feltcraft,7.24,2,15492,United Kingdom +581492,12/9/2019,22153,Angel Decoration Stars On Dress,7.24,2,15492,United Kingdom +581492,12/9/2019,22154,Angel Decoration 3 Buttons,7.24,3,15492,United Kingdom +581492,12/9/2019,22155,Star Decoration Rustic,7.24,7,15492,United Kingdom +581492,12/9/2019,22156,Heart Decoration With Pearls,7.24,4,15492,United Kingdom +581492,12/9/2019,22163,Heart String Memo Holder Hanging,7.24,9,15492,United Kingdom +581492,12/9/2019,22165,Diamante Heart Shaped Wall Mirror,7.24,1,15492,United Kingdo +581492,12/9/2019,22167,Oval Wall Mirror Diamante,7.24,1,15492,United Kingdom +581492,12/9/2019,22170,Picture Frame Wood Triple Portrait,7.24,1,15492,United Kingd +581492,12/9/2019,22173,Metal 4 Hook Hanger French Chateau,7.24,2,15492,United Kingd +581492,12/9/2019,22174,Photo Cube,6.19,7,15492,United Kingdom +581492,12/9/2019,22178,Victorian Glass Hanging T-Light,6.19,5,15492,United Kingdom +581492,12/9/2019,22186,Red Star Card Holder,7.24,2,15492,United Kingdom +581492,12/9/2019,22190,Local Cafe Mug,7.24,3,15492,United Kingdom +581492,12/9/2019,22193,Red Diner Wall Clock,7.24,1,15492,United Kingdom +581492,12/9/2019,22195,Large Heart Measuring Spoons,7.24,1,15492,United Kingdom +581492,12/9/2019,22196,Small Heart Measuring Spoons,7.24,11,15492,United Kingdom +581492,12/9/2019,22197,Popcorn Holder,7.24,34,15492,United Kingdom +581492,12/9/2019,22199,Frying Pan Red Retrospot,7.24,1,15492,United Kingdom +581492,12/9/2019,22209,Wood Stamp Set Happy Birthday,7.24,1,15492,United Kingdom +581492,12/9/2019,22212,Four Hook White Lovebirds,7.24,1,15492,United Kingdom +581492,12/9/2019,22219,Lovebird Hanging Decoration White,7.24,4,15492,United Kingdo +581492,12/9/2019,22224,White Lovebird Lantern,7.24,4,15492,United Kingdom +581492,12/9/2019,22227,Hanging Heart Mirror Decoration,7.24,1,15492,United Kingdom +581492,12/9/2019,22260,Felt Egg Cosy Blue Rabbit,6.39,2,15492,United Kingdom +581492,12/9/2019,22261,Felt Egg Cosy White Rabbit,7.24,1,15492,United Kingdom +581492,12/9/2019,22264,Felt Farm Animal White Bunny,7.24,1,15492,United Kingdom +581492,12/9/2019,22273,Feltcraft Doll Molly,7.24,2,15492,United Kingdom +581492,12/9/2019,22277,Cosmetic Bag Vintage Rose Paisley,7.24,1,15492,United Kingdo +581492,12/9/2019,22279,Pocket Bag Blue Paisley Red Spot,7.24,5,15492,United Kingdom +581492,12/9/2019,22280,Pocket Bag Pink Paisely Brown Spot,7.24,4,15492,United Kingd +581492,12/9/2019,22300,Coffee Mug Dog + Ball Design,7.24,1,15492,United Kingdom +581492,12/9/2019,22301,Coffee Mug Cat + Bird Design,7.24,1,15492,United Kingdom +581492,12/9/2019,22307,Gold Mug Bone China Tree Of Life,7.24,1,15492,United Kingdom +581492,12/9/2019,22308,Tea Cosy Blue Stripe,7.24,2,15492,United Kingdom +581492,12/9/2019,22309,Tea Cosy Red Stripe,7.24,2,15492,United Kingdom +581492,12/9/2019,22324,Blue Polkadot Kids Bag,7.24,2,15492,United Kingdom +581492,12/9/2019,22326,Round Snack Boxes Set Of4 Woodland,7.24,3,15492,United Kingd +581492,12/9/2019,22327,Round Snack Boxes Set Of 4 Skulls,7.24,2,15492,United Kingdo +581492,12/9/2019,22329,Round Container Set Of 5 Retrospot,6.19,2,15492,United Kingd +581492,12/9/2019,22338,Star Decoration Painted Zinc,6.19,4,15492,United Kingdom +581492,12/9/2019,22340,Noel Garland Painted Zinc,6.19,17,15492,United Kingdom +581492,12/9/2019,22342,Home Garland Painted Zinc,6.19,7,15492,United Kingdom +581492,12/9/2019,22348,Tea Bag Plate Red Retrospot,6.19,3,15492,United Kingdom +581492,12/9/2019,22355,Charlotte Bag Suki Design,6.19,3,15492,United Kingdom +581492,12/9/2019,22356,Charlotte Bag Pink Polkadot,6.19,1,15492,United Kingdom +581492,12/9/2019,22357,Kings Choice Biscuit Tin,6.19,2,15492,United Kingdom +581492,12/9/2019,22358,Kings Choice Tea Caddy,6.19,1,15492,United Kingdom +581492,12/9/2019,22361,Glass Jar Daisy Fresh Cotton Wool,6.19,2,15492,United Kingdo +581492,12/9/2019,22362,Glass Jar Peacock Bath Salts,6.19,2,15492,United Kingdom +581492,12/9/2019,22367,Childrens Apron Spaceboy Design,6.19,1,15492,United Kingdom +581492,12/9/2019,22372,Airline Bag Vintage World Champion,6.19,1,15492,United Kingd +581492,12/9/2019,22374,Airline Bag Vintage Jet Set Red,6.19,1,15492,United Kingdom +581492,12/9/2019,85014B,Red Retrospot Umbrella,6.19,1,15492,United Kingdom +581492,12/9/2019,85032C,Curious Images Gift Wrap Set,6.19,1,15492,United Kingdom +581492,12/9/2019,85038,6 Chocolate Love Heart T-Lights,6.19,1,15492,United Kingdom +581492,12/9/2019,85039A,Set/4 Red Mini Rose Candle In Bowl,6.19,5,15492,United King +581492,12/9/2019,85039B,S/4 Ivory Mini Rose Candle In Bowl,6.19,4,15492,United King +581492,12/9/2019,85040A,S/4 Pink Flower Candles In Bowl,6.19,1,15492,United Kingdom +581492,12/9/2019,85048,15cm Christmas Glass Ball 20 Lights,6.19,2,15492,United King +581492,12/9/2019,85049C,Romantic Pinks Ribbons,6.19,1,15492,United Kingdom +581492,12/9/2019,85049G,Chocolate Box Ribbons,6.19,1,15492,United Kingdom +581492,12/9/2019,85049H,Urban Black Ribbons,6.19,2,15492,United Kingdom +581492,12/9/2019,85053,French Enamel Candleholder,6.19,1,15492,United Kingdom +581492,12/9/2019,85059,French Enamel Water Basin,6.19,1,15492,United Kingdom +581492,12/9/2019,85066,Cream Sweetheart Mini Chest,6.19,1,15492,United Kingdom +581492,12/9/2019,85094,Candy Spot Egg Warmer Rabbit,6.19,2,15492,United Kingdom +581492,12/9/2019,85114C,Red Enchanted Forest Placemat,6.19,1,15492,United Kingdom +581492,12/9/2019,85123A,Cream Hanging Heart T-Light Holder,6.19,3,15492,United King +581492,12/9/2019,85131B,Beaded Crystal Heart Green On Stick,6.19,1,15492,United Kin +581492,12/9/2019,85131D,Beaded Crystal Heart Pink On Stick,6.19,2,15492,United King +581492,12/9/2019,85152,Hand Over The Chocolate Sign,6.19,1,15492,United Kingdom +581492,12/9/2019,85168B,Black Baroque Carriage Clock,6.19,3,15492,United Kingdom +581492,12/9/2019,85169C,Eau De Nil Love Bird Candle,6.19,1,15492,United Kingdom +581492,12/9/2019,85170C,Set/6 Eau De Nil Bird T-Lights,6.19,1,15492,United Kingdom +581492,12/9/2019,85173,Set/6 Frog Prince T-Light Candles,6.19,1,15492,United Kingdo +581492,12/9/2019,85177,Basket Of Flowers Sewing Kit,6.19,1,15492,United Kingdom +581492,12/9/2019,85178,Victorian Sewing Kit,6.19,1,15492,United Kingdom +581492,12/9/2019,85179A,Green Bitty Light Chain,6.19,4,15492,United Kingdom +581492,12/9/2019,85199S,Small Hanging Ivory/Red Wood Bird,6.19,9,15492,United Kingd +581492,12/9/2019,85227,Set Of 6 3d Kit Cards For Kids,6.19,3,15492,United Kingdom +581492,12/9/2019,90003C,Midnight Blue Pair Heart Hair Slide,6.19,1,15492,United Kin +581492,12/9/2019,90003E,Green Pair Heart Hair Slides,6.19,2,15492,United Kingdom +581492,12/9/2019,90010A,Midnight Blue Glass/Silver Bracelet,6.04,1,15492,United Kin +581492,12/9/2019,90013A,Midnight Blue Vintage Earrings,6.19,3,15492,United Kingdom +581492,12/9/2019,90013C,Green Vintage Earrings,6.19,2,15492,United Kingdom +581492,12/9/2019,90014A,Silver Mop Orbit Necklace,6.19,1,15492,United Kingdom +581492,12/9/2019,90016B,Gold/Mop Pendant Orbit Necklace,6.19,1,15492,United Kingdom +581492,12/9/2019,90018B,Gold Mop Orbit Drop Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90019B,Gold Mop Orbit Bracelet,6.19,1,15492,United Kingdom +581492,12/9/2019,90027D,Glass Bead Hoop Earrings Amethyst,6.19,1,15492,United Kingd +581492,12/9/2019,90030B,Red Kukui Coconut Seed Necklace,6.19,1,15492,United Kingdom +581492,12/9/2019,90055,Cracked Glaze Earrings Brown,6.19,1,15492,United Kingdom +581492,12/9/2019,90059A,Diamante Hair Grip Pack/2 Crystal,6.19,1,15492,United Kingd +581492,12/9/2019,90059D,Diamante Hair Grip Pack/2 Peridot,6.19,2,15492,United Kingd +581492,12/9/2019,90059E,Diamante Hair Grip Pack/2 Ruby,6.04,1,15492,United Kingdom +581492,12/9/2019,90059F,Diamante Hair Grip Pack/2 Lt Rose,6.19,1,15492,United Kingd +581492,12/9/2019,90072,Ruby Drop Chandelier Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90086,Crystal Frog Phone Charm,6.19,1,15492,United Kingdom +581492,12/9/2019,90120B,Blue Murano Twist Bracelet,6.19,2,15492,United Kingdom +581492,12/9/2019,90120C,Green Murano Twist Bracelet,6.19,1,15492,United Kingdom +581492,12/9/2019,90130B,Turq Stone/Crystal Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90130C,Green Stone/Crystal Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90134,Old Rose Combo Bead Necklace,6.19,1,15492,United Kingdom +581492,12/9/2019,90138,White/Pink Mini Crystals Necklace,6.19,1,15492,United Kingdo +581492,12/9/2019,90141B,Ivory Pendant Triple Shell Necklace,6.19,1,15492,United Kin +581492,12/9/2019,90145,Silver Hoop Earrings With Flower,6.19,1,15492,United Kingdom +581492,12/9/2019,90155,Resin Necklace W Pastel Beads,6.19,1,15492,United Kingdom +581492,12/9/2019,90161D,Ant Copper Pink Boudicca Bracelet,6.19,1,15492,United Kingd +581492,12/9/2019,90163A,Pink Rosebud & Pearl Necklace,6.19,2,15492,United Kingdom +581492,12/9/2019,90165B,White Rosebud Pearl Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90168,2 Daisies Hair Comb,6.19,1,15492,United Kingdom +581492,12/9/2019,90169,Daisy Hair Comb,6.19,1,15492,United Kingdom +581492,12/9/2019,90170,Daisy Hair Band,6.19,1,15492,United Kingdom +581492,12/9/2019,90174,Butterfly Hair Band,6.19,2,15492,United Kingdom +581492,12/9/2019,90175A,White Glass Chunky Charm Bracelet,6.19,2,15492,United Kingd +581492,12/9/2019,90175D,Tigris Eye Chunky Charm Bracelet,6.19,1,15492,United Kingdo +581492,12/9/2019,90177A,Classic Diamante Earrings Jet,6.19,1,15492,United Kingdom +581492,12/9/2019,90177C,Drop Diamante Earrings Crystal,6.19,1,15492,United Kingdom +581492,12/9/2019,90181B,Amethyst Glass/Shell/Pearl Necklace,6.04,1,15492,United Kin +581492,12/9/2019,90182C,Black 3 Bead Drop Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90183A,Amber Drop Earrings W Long Beads,6.19,2,15492,United Kingdo +581492,12/9/2019,90183C,Black Drop Earrings W Long Beads,6.19,1,15492,United Kingdo +581492,12/9/2019,90184C,Black Chunky Bead Bracelet W Strap,6.19,1,15492,United King +581492,12/9/2019,90185B,Amethyst Diamante Expandable Ring,6.19,1,15492,United Kingd +581492,12/9/2019,90188,Drop Earrings W Flower & Leaf,6.19,2,15492,United Kingdom +581492,12/9/2019,90191,Silver Lariat 40cm,6.19,2,15492,United Kingdom +581492,12/9/2019,90192,Jade Drop Earrings W Filigree,6.19,1,15492,United Kingdom +581492,12/9/2019,90198A,Vintage Rose Bead Bracelet Raspberr,6.19,2,15492,United Kin +581492,12/9/2019,90200A,Purple Sweetheart Bracelet,6.19,1,15492,United Kingdom +581492,12/9/2019,90201A,Purple Enamel Flower Ring,6.19,2,15492,United Kingdom +581492,12/9/2019,90201B,Black Enamel Flower Ring,6.19,1,15492,United Kingdom +581492,12/9/2019,90201C,Red Enamel Flower Ring,6.19,1,15492,United Kingdom +581492,12/9/2019,90201D,Green Enamel Flower Ring,6.19,1,15492,United Kingdom +581492,12/9/2019,90202C,Green Enamel Flower Hair Tie,6.19,1,15492,United Kingdom +581492,12/9/2019,90202D,Pink Enamel Flower Hair Tie,6.19,1,15492,United Kingdom +581492,12/9/2019,90206C,Crystal Diamante Star Brooch,6.19,1,15492,United Kingdom +581492,12/9/2019,90208,Pair Of Pink Flower Cluster Slide,6.19,1,15492,United Kingdo +581492,12/9/2019,90210A,Grey Acrylic Faceted Bangle,6.19,1,15492,United Kingdom +581492,12/9/2019,22378,Wall Tidy Retrospot,6.19,2,15492,United Kingdom +581492,12/9/2019,22379,Recycling Bag Retrospot,6.19,1,15492,United Kingdom +581492,12/9/2019,22380,Toy Tidy Spaceboy,6.19,2,15492,United Kingdom +581492,12/9/2019,22396,Magnets Pack Of 4 Retro Photo,6.19,1,15492,United Kingdom +581492,12/9/2019,22411,Jumbo Shopper Vintage Red Paisley,6.19,1,15492,United Kingdo +581492,12/9/2019,22418,10 Colour Spaceboy Pen,6.19,3,15492,United Kingdom +581492,12/9/2019,22419,Lipstick Pen Red,6.19,3,15492,United Kingdom +581492,12/9/2019,22420,Lipstick Pen Baby Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,22421,Lipstick Pen Fuschia,6.19,2,15492,United Kingdom +581492,12/9/2019,22422,Toothpaste Tube Pen,6.19,4,15492,United Kingdom +581492,12/9/2019,22437,Set Of 9 Black Skull Balloons,7.24,1,15492,United Kingdom +581492,12/9/2019,22441,Grow Your Own Basil In Enamel Mug,7.24,1,15492,United Kingdo +581492,12/9/2019,22446,Pin Cushion Babushka Pink,7.24,7,15492,United Kingdom +581492,12/9/2019,22457,Natural Slate Heart Chalkboard,7.24,1,15492,United Kingdom +581492,12/9/2019,22464,Hanging Metal Heart Lantern,7.24,1,15492,United Kingdom +581492,12/9/2019,22466,Fairy Tale Cottage Night Light,7.24,1,15492,United Kingdom +581492,12/9/2019,22467,Gumball Coat Rack,7.24,1,15492,United Kingdom +581492,12/9/2019,22478,Birdhouse Garden Marker,7.24,1,15492,United Kingdom +581492,12/9/2019,22486,Plasmatronic Lamp,7.24,1,15492,United Kingdom +581492,12/9/2019,22488,Natural Slate Rectangle Chalkboard,7.24,1,15492,United Kingd +581492,12/9/2019,22489,Pack Of 12 Traditional Crayons,7.24,5,15492,United Kingdom +581492,12/9/2019,22495,Set Of 2 Round Tins Camembert,7.24,1,15492,United Kingdom +581492,12/9/2019,22540,Mini Jigsaw Circus Parade,7.24,1,15492,United Kingdom +581492,12/9/2019,22544,Mini Jigsaw Spaceboy,7.24,1,15492,United Kingdom +581492,12/9/2019,22549,Picture Dominoes,7.24,3,15492,United Kingdom +581492,12/9/2019,22551,Plasters In Tin Spaceboy,7.24,2,15492,United Kingdom +581492,12/9/2019,22553,Plasters In Tin Skulls,7.24,2,15492,United Kingdom +581492,12/9/2019,22554,Plasters In Tin Woodland Animals,7.24,3,15492,United Kingdom +581492,12/9/2019,22555,Plasters In Tin Strongman,7.24,3,15492,United Kingdom +581492,12/9/2019,22557,Plasters In Tin Vintage Paisley,7.24,2,15492,United Kingdom +581492,12/9/2019,22558,Clothes Pegs Retrospot Pack 24,7.24,3,15492,United Kingdom +581492,12/9/2019,22560,Traditional Modelling Clay,7.24,5,15492,United Kingdom +581492,12/9/2019,22565,Feltcraft Hairbands Pink And White,7.24,4,15492,United Kingd +581492,12/9/2019,22566,Feltcraft Hairband Pink And Purple,7.24,3,15492,United Kingd +581492,12/9/2019,22571,Rocking Horse Red Christmas,7.24,4,15492,United Kingdom +581492,12/9/2019,22573,Star Wooden Christmas Decoration,6.39,2,15492,United Kingdom +581492,12/9/2019,22574,Heart Wooden Christmas Decoration,7.24,5,15492,United Kingdo +581492,12/9/2019,22576,Swallow Wooden Christmas Decoration,7.24,3,15492,United King +581492,12/9/2019,22577,Wooden Heart Christmas Scandinavian,7.24,4,15492,United King +581492,12/9/2019,22578,Wooden Star Christmas Scandinavian,7.24,19,15492,United King +581492,12/9/2019,22580,Advent Calendar Gingham Sack,7.24,9,15492,United Kingdom +581492,12/9/2019,22581,Wood Stocking Christmas Scandispot,7.24,11,15492,United King +581492,12/9/2019,22585,Pack Of 6 Birdy Gift Tags,7.24,2,15492,United Kingdom +581492,12/9/2019,22586,Feltcraft Hairband Pink And Blue,7.24,2,15492,United Kingdom +581492,12/9/2019,22589,Cardholder Gingham Star,7.24,6,15492,United Kingdom +581492,12/9/2019,22591,Cardholder Gingham Christmas Tree,7.24,1,15492,United Kingdo +581492,12/9/2019,22592,Cardholder Holly Wreath Metal,7.24,3,15492,United Kingdom +581492,12/9/2019,22593,Christmas Gingham Star,6.39,2,15492,United Kingdom +581492,12/9/2019,22594,Christmas Gingham Tree,7.24,3,15492,United Kingdom +581492,12/9/2019,22597,Musical Zinc Heart Decoration,7.24,9,15492,United Kingdom +581492,12/9/2019,22598,Christmas Musical Zinc Tree,7.24,4,15492,United Kingdom +581492,12/9/2019,22599,Christmas Musical Zinc Star,6.19,5,15492,United Kingdom +581492,12/9/2019,22600,Christmas Retrospot Star Wood,6.19,2,15492,United Kingdom +581492,12/9/2019,22601,Christmas Retrospot Angel Wood,6.19,3,15492,United Kingdom +581492,12/9/2019,22602,Retrospot Wooden Heart Decoration,6.19,3,15492,United Kingdo +581492,12/9/2019,22608,Pens Assorted Funky Jeweled,6.19,3,15492,United Kingdom +581492,12/9/2019,22614,Pack Of 12 Spaceboy Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,22615,Pack Of 12 Circus Parade Tissues,6.19,4,15492,United Kingdom +581492,12/9/2019,22616,Pack Of 12 London Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,22619,Set Of 6 Soldier Skittles,6.19,4,15492,United Kingdom +581492,12/9/2019,22620,4 Traditional Spinning Tops,6.19,3,15492,United Kingdom +581492,12/9/2019,22621,Traditional Knitting Nancy,6.19,2,15492,United Kingdom +581492,12/9/2019,22629,Spaceboy Lunch Box,6.19,1,15492,United Kingdom +581492,12/9/2019,22630,Dolly Girl Lunch Box,6.19,1,15492,United Kingdom +581492,12/9/2019,22632,Hand Warmer Red Retrospot,6.19,1,15492,United Kingdom +581492,12/9/2019,22633,Hand Warmer Union Jack,6.19,1,15492,United Kingdom +581492,12/9/2019,22634,Childs Breakfast Set Spaceboy,6.19,1,15492,United Kingdom +581492,12/9/2019,22650,Ceramic Pirate Chest Money Bank,6.19,2,15492,United Kingdom +581492,12/9/2019,22651,Gentleman Shirt Repair Kit,6.19,1,15492,United Kingdom +581492,12/9/2019,22653,Button Box,6.19,16,15492,United Kingdom +581492,12/9/2019,22654,Deluxe Sewing Kit,6.19,2,15492,United Kingdom +581492,12/9/2019,22659,Lunch Box I Love London,6.19,1,15492,United Kingdom +581492,12/9/2019,22666,Recipe Box Pantry Yellow Design,6.19,5,15492,United Kingdom +581492,12/9/2019,22693,Grow A Flytrap Or Sunflower In Tin,6.19,3,15492,United Kingd +581492,12/9/2019,22694,Wicker Star,6.19,1,15492,United Kingdom +581492,12/9/2019,22697,Green Regency Teacup And Saucer,6.19,1,15492,United Kingdom +581492,12/9/2019,22699,Roses Regency Teacup And Saucer,6.19,2,15492,United Kingdom +581492,12/9/2019,22701,Pink Dog Bowl,6.19,5,15492,United Kingdom +581492,12/9/2019,22703,Pink Cat Bowl,6.19,6,15492,United Kingdom +581492,12/9/2019,22712,Card Dolly Girl,6.19,1,15492,United Kingdom +581492,12/9/2019,22713,Card I Love London,6.19,1,15492,United Kingdom +581492,12/9/2019,22714,Card Birthday Cowboy,6.19,2,15492,United Kingdom +581492,12/9/2019,22716,Card Circus Parade,6.19,3,15492,United Kingdom +581492,12/9/2019,22717,Card Dog And Ball,6.19,1,15492,United Kingdom +581492,12/9/2019,22720,Set Of 3 Cake Tins Pantry Design,6.19,2,15492,United Kingdom +581492,12/9/2019,22725,Alarm Clock Bakelike Chocolate,6.19,1,15492,United Kingdom +581492,12/9/2019,22726,Alarm Clock Bakelike Green,6.19,4,15492,United Kingdom +581492,12/9/2019,22727,Alarm Clock Bakelike Red,6.19,4,15492,United Kingdom +581492,12/9/2019,22730,Alarm Clock Bakelike Ivory,6.19,1,15492,United Kingdom +581492,12/9/2019,22741,Funky Diva Pen,6.19,4,15492,United Kingdom +581492,12/9/2019,22745,Poppy's Playhouse Bedroom,6.19,2,15492,United Kingdom +581492,12/9/2019,22748,Poppy's Playhouse Kitchen,6.19,1,15492,United Kingdom +581492,12/9/2019,22749,Feltcraft Princess Charlotte Doll,6.19,1,15492,United Kingdo +581492,12/9/2019,22751,Feltcraft Princess Olivia Doll,6.19,2,15492,United Kingdom +581492,12/9/2019,22753,Small Yellow Babushka Notebook,6.19,1,15492,United Kingdom +581492,12/9/2019,22754,Small Red Babushka Notebook,6.19,1,15492,United Kingdom +581492,12/9/2019,22757,Large Red Babushka Notebook,6.19,3,15492,United Kingdom +581492,12/9/2019,22758,Large Purple Babushka Notebook,6.19,2,15492,United Kingdom +581492,12/9/2019,22763,Key Cabinet Ma Campagne,6.19,1,15492,United Kingdom +581492,12/9/2019,22768,Family Photo Frame Cornice,6.19,2,15492,United Kingdom +581492,12/9/2019,22776,Sweetheart 3 Tier Cake Stand,6.19,1,15492,United Kingdom +581492,12/9/2019,22795,Sweetheart Recipe Book Stand,6.19,1,15492,United Kingdom +581492,12/9/2019,22798,Antique Glass Dressing Table Pot,6.19,3,15492,United Kingdom +581492,12/9/2019,22800,Antique Tall Swirlglass Trinket Pot,6.19,3,15492,United King +581492,12/9/2019,22809,Set Of 6 T-Lights Santa,6.19,1,15492,United Kingdom +581492,12/9/2019,22811,Set Of 6 T-Lights Cacti,6.19,1,15492,United Kingdom +581492,12/9/2019,22814,Card Party Games,6.19,9,15492,United Kingdom +581492,12/9/2019,22815,Card Psychedelic Apples,6.19,18,15492,United Kingdom +581492,12/9/2019,22816,Card Motorbike Santa,6.19,2,15492,United Kingdom +581492,12/9/2019,22817,Card Suki Birthday,6.19,5,15492,United Kingdom +581492,12/9/2019,22818,Card Christmas Village,7.24,6,15492,United Kingdom +581492,12/9/2019,22819,Birthday Card Retro Spot,7.24,3,15492,United Kingdom +581492,12/9/2019,22835,Hot Water Bottle I Am So Poorly,7.24,3,15492,United Kingdom +581492,12/9/2019,22865,Hand Warmer Owl Design,7.24,2,15492,United Kingdom +581492,12/9/2019,22866,Hand Warmer Scotty Dog Design,7.24,3,15492,United Kingdom +581492,12/9/2019,22867,Hand Warmer Bird Design,7.24,4,15492,United Kingdom +581492,12/9/2019,22881,Number Tile Vintage Font 2,7.24,1,15492,United Kingdom +581492,12/9/2019,22885,Number Tile Vintage Font 6,7.24,1,15492,United Kingdom +581492,12/9/2019,22888,Number Tile Vintage Font 9,7.24,1,15492,United Kingdom +581492,12/9/2019,22890,Novelty Biscuits Cake Stand 3 Tier,7.24,1,15492,United Kingd +581492,12/9/2019,22898,Childrens Apron Apples Design,7.24,1,15492,United Kingdom +581492,12/9/2019,22899,Children's Apron Dolly Girl,7.24,2,15492,United Kingdom +581492,12/9/2019,22900,Set 2 Tea Towels I Love London,7.24,3,15492,United Kingdom +581492,12/9/2019,22905,Calendar In Season Design,7.24,1,15492,United Kingdom +581492,12/9/2019,22907,Pack Of 20 Napkins Pantry Design,6.39,1,15492,United Kingdom +581492,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,7.24,5,15492,United King +581492,12/9/2019,22910,Paper Chain Kit Vintage Christmas,7.24,7,15492,United Kingdo +581492,12/9/2019,22914,Blue Coat Rack Paris Fashion,7.24,1,15492,United Kingdom +581492,12/9/2019,22922,Fridge Magnets Us Diner Assorted,7.24,6,15492,United Kingdom +581492,12/9/2019,22924,Fridge Magnets La Vie En Rose,7.24,6,15492,United Kingdom +581492,12/9/2019,22928,Yellow Giant Garden Thermometer,7.24,1,15492,United Kingdom +581492,12/9/2019,22940,Feltcraft Christmas Fairy,6.19,1,15492,United Kingdom +581492,12/9/2019,22941,Christmas Lights 10 Reindeer,6.19,2,15492,United Kingdom +581492,12/9/2019,22943,Christmas Lights 10 Vintage Baubles,6.19,1,15492,United King +581492,12/9/2019,22948,Metal Decoration Naughty Children,6.19,4,15492,United Kingdo +581492,12/9/2019,22951,60 Cake Cases Dolly Girl Design,6.19,2,15492,United Kingdom +581492,12/9/2019,22952,60 Cake Cases Vintage Christmas,6.19,2,15492,United Kingdom +581492,12/9/2019,22955,36 Foil Star Cake Cases,6.19,1,15492,United Kingdom +581492,12/9/2019,22960,Jam Making Set With Jars,6.19,2,15492,United Kingdom +581492,12/9/2019,22961,Jam Making Set Printed,6.19,9,15492,United Kingdom +581492,12/9/2019,22962,Jam Jar With Pink Lid,6.19,3,15492,United Kingdom +581492,12/9/2019,22963,Jam Jar With Green Lid,6.19,3,15492,United Kingdom +581492,12/9/2019,22964,3 Piece Spaceboy Cookie Cutter Set,6.19,1,15492,United Kingd +581492,12/9/2019,22965,3 Traditional Biscuit Cutters Set,6.19,1,15492,United Kingdo +581492,12/9/2019,22966,Gingerbread Man Cookie Cutter,6.19,4,15492,United Kingdom +581492,12/9/2019,22969,Homemade Jam Scented Candles,6.19,6,15492,United Kingdom +581492,12/9/2019,22975,Spaceboy Childrens Egg Cup,6.19,2,15492,United Kingdom +581492,12/9/2019,22976,Circus Parade Childrens Egg Cup,6.19,1,15492,United Kingdom +581492,12/9/2019,22977,Dolly Girl Childrens Egg Cup,6.19,1,15492,United Kingdom +581492,12/9/2019,22979,Pantry Washing Up Brush,6.19,2,15492,United Kingdom +581492,12/9/2019,22980,Pantry Scrubbing Brush,6.19,1,15492,United Kingdom +581492,12/9/2019,22982,Pantry Pastry Brush,6.19,3,15492,United Kingdom +581492,12/9/2019,22983,Card Billboard Font,6.19,1,15492,United Kingdom +581492,12/9/2019,22984,Card Gingham Rose,6.19,1,15492,United Kingdom +581492,12/9/2019,22988,Soldiers Egg Cup,6.19,1,15492,United Kingdom +581492,12/9/2019,22989,Set 2 Pantry Design Tea Towels,6.19,2,15492,United Kingdom +581492,12/9/2019,22992,Revolver Wooden Ruler,6.19,3,15492,United Kingdom +581492,12/9/2019,22993,Set Of 4 Pantry Jelly Moulds,6.19,3,15492,United Kingdom +581492,12/9/2019,22995,Travel Card Wallet Suki,6.19,4,15492,United Kingdom +581492,12/9/2019,22996,Travel Card Wallet Vintage Ticket,6.19,5,15492,United Kingdo +581492,12/9/2019,22997,Travel Card Wallet Union Jack,6.19,1,15492,United Kingdom +581492,12/9/2019,22998,Travel Card Wallet Keep Calm,6.19,4,15492,United Kingdom +581492,12/9/2019,22999,Travel Card Wallet Vintage Leaf,6.19,1,15492,United Kingdom +581492,12/9/2019,23005,Travel Card Wallet I Love London,6.19,4,15492,United Kingdom +581492,12/9/2019,23007,Spaceboy Baby Gift Set,6.19,1,15492,United Kingdom +581492,12/9/2019,23009,I Love London Baby Gift Set,6.19,2,15492,United Kingdom +581492,12/9/2019,23012,Glass Apothecary Bottle Perfume,6.19,1,15492,United Kingdom +581492,12/9/2019,23013,Glass Apothecary Bottle Tonic,6.19,2,15492,United Kingdom +581492,12/9/2019,23014,Glass Apothecary Bottle Elixir,6.19,1,15492,United Kingdom +581492,12/9/2019,23050,Recycled Acapulco Mat Green,6.19,1,15492,United Kingdom +581492,12/9/2019,23051,Recycled Acapulco Mat Blue,6.19,1,15492,United Kingdom +581492,12/9/2019,23052,Recycled Acapulco Mat Turquoise,6.19,5,15492,United Kingdom +581492,12/9/2019,23053,Recycled Acapulco Mat Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,23054,Recycled Acapulco Mat Lavender,6.19,1,15492,United Kingdom +581492,12/9/2019,23074,Embossed Heart Trinket Box,6.19,1,15492,United Kingdom +581492,12/9/2019,23076,Ice Cream Sundae Lip Gloss,6.19,3,15492,United Kingdom +581492,12/9/2019,23077,Doughnut Lip Gloss,6.19,3,15492,United Kingdom +581492,12/9/2019,23082,Set 6 Paper Table Lantern Hearts,6.19,1,15492,United Kingdom +581492,12/9/2019,23083,Set 6 Paper Table Lantern Stars,6.19,1,15492,United Kingdom +581492,12/9/2019,23084,Rabbit Night Light,6.19,57,15492,United Kingdom +581492,12/9/2019,23088,Zinc Heart Flower T-Light Holder,6.19,1,15492,United Kingdom +581492,12/9/2019,23089,Glass Bon Bon Jar,6.19,4,15492,United Kingdom +581492,12/9/2019,23093,Small Parisienne Heart Photo Frame,6.19,3,15492,United Kingd +581492,12/9/2019,23103,Jingle Bell Heart Decoration,6.19,2,15492,United Kingdom +581492,12/9/2019,23110,Parisienne Key Cabinet,6.19,1,15492,United Kingdom +581492,12/9/2019,23111,Parisienne Sewing Box,6.19,1,15492,United Kingdom +581492,12/9/2019,23112,Parisienne Curio Cabinet,6.19,1,15492,United Kingdom +581492,12/9/2019,23118,Parisienne Jewellery Drawer,6.19,1,15492,United Kingdom +581492,12/9/2019,23158,Set Of 5 Lucky Cat Magnets,6.19,1,15492,United Kingdom +581492,12/9/2019,23165,Large Ceramic Top Storage Jar,6.19,2,15492,United Kingdom +581492,12/9/2019,23166,Medium Ceramic Top Storage Jar,6.19,2,15492,United Kingdom +581492,12/9/2019,23168,Classic Cafe Sugar Dispenser,6.19,2,15492,United Kingdom +581492,12/9/2019,23171,Regency Tea Plate Green,6.19,1,15492,United Kingdom +581492,12/9/2019,23172,Regency Tea Plate Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,23173,Regency Teapot Roses,6.19,1,15492,United Kingdom +581492,12/9/2019,23175,Regency Milk Jug Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,23177,Treasure Island Book Box,6.19,1,15492,United Kingdom +581492,12/9/2019,23183,Mother's Kitchen Spoon Rest,6.19,3,15492,United Kingdom +581492,12/9/2019,23184,Bull Dog Bottle Opener,6.19,2,15492,United Kingdom +581492,12/9/2019,23188,Vintage 2 Metre Folding Ruler,6.19,1,15492,United Kingdom +581492,12/9/2019,23191,Bundle Of 3 Retro Note Books,6.19,1,15492,United Kingdom +581492,12/9/2019,23194,Gymkhana Treasure Book Box,6.19,1,15492,United Kingdom +581492,12/9/2019,23196,Vintage Leaf Magnetic Notepad,6.19,1,15492,United Kingdom +581492,12/9/2019,23197,Sketchbook Magnetic Shopping List,6.19,2,15492,United Kingdo +581492,12/9/2019,23198,Pantry Magnetic Shopping List,6.19,2,15492,United Kingdom +581492,12/9/2019,23204,Charlotte Bag Apples Design,6.19,6,15492,United Kingdom +581492,12/9/2019,23205,Charlotte Bag Vintage Alphabet,6.19,3,15492,United Kingdom +581492,12/9/2019,23212,Heart Wreath Decoration With Bell,6.19,7,15492,United Kingdo +581492,12/9/2019,23213,Star Wreath Decoration With Bell,6.19,7,15492,United Kingdom +581492,12/9/2019,23220,Reindeer Heart Decoration Gold,6.19,2,15492,United Kingdom +581492,12/9/2019,23224,Cherub Heart Decoration Gold,6.19,1,15492,United Kingdom +581492,12/9/2019,23229,Vintage Donkey Tail Game,6.19,2,15492,United Kingdom +581492,12/9/2019,23234,Biscuit Tin Vintage Christmas,6.19,4,15492,United Kingdom +581492,12/9/2019,23241,Treasure Tin Gymkhana Design,6.19,3,15492,United Kingdom +581492,12/9/2019,23243,Set Of Tea Coffee Sugar Tins Pantry,6.19,1,15492,United King +581492,12/9/2019,23245,Set Of 3 Regency Cake Tins,6.19,7,15492,United Kingdom +581492,12/9/2019,23247,Biscuit Tin 50'S Christmas,6.19,3,15492,United Kingdom +581492,12/9/2019,23264,Set Of 3 Wooden Sleigh Decorations,6.19,3,15492,United Kingd +581492,12/9/2019,23265,Set Of 3 Wooden Tree Decorations,6.19,3,15492,United Kingdom +581492,12/9/2019,23266,Set Of 3 Wooden Stocking Decoration,6.19,2,15492,United King +581492,12/9/2019,23274,Star T-Light Holder Willie Winkie,6.19,3,15492,United Kingdo +581492,12/9/2019,23275,Set Of 3 Hanging Owls Ollie Beak,6.19,2,15492,United Kingdom +581492,12/9/2019,23280,Folding Butterfly Mirror Hot Pink,6.19,2,15492,United Kingdo +581492,12/9/2019,23284,Doormat Keep Calm And Come In,6.19,1,15492,United Kingdom +581492,12/9/2019,23285,Pink Vintage Spot Beaker,6.19,1,15492,United Kingdom +581492,12/9/2019,23287,Red Vintage Spot Beaker,6.19,1,15492,United Kingdom +581492,12/9/2019,23290,Spaceboy Childrens Bowl,6.19,1,15492,United Kingdom +581492,12/9/2019,23292,Spaceboy Childrens Cup,6.19,1,15492,United Kingdom +581492,12/9/2019,23293,Set Of 12 Fairy Cake Baking Cases,6.19,3,15492,United Kingdo +581492,12/9/2019,23294,Set Of 6 Snack Loaf Baking Cases,6.19,1,15492,United Kingdom +581492,12/9/2019,23295,Set Of 12 Mini Loaf Baking Cases,6.19,4,15492,United Kingdom +581492,12/9/2019,23298,Spotty Bunting,6.19,2,15492,United Kingdom +581492,12/9/2019,23299,Food Cover With Beads Set 2,6.19,1,15492,United Kingdom +581492,12/9/2019,23300,Gardeners Kneeling Pad Cup Of Tea,6.19,3,15492,United Kingdo +581492,12/9/2019,23301,Gardeners Kneeling Pad Keep Calm,6.19,6,15492,United Kingdom +581492,12/9/2019,23307,Set Of 60 Pantry Design Cake Cases,6.19,7,15492,United Kingd +581492,12/9/2019,23308,Set Of 60 Vintage Leaf Cake Cases,6.19,1,15492,United Kingdo +581492,12/9/2019,23309,Set Of 60 I Love London Cake Cases,6.19,2,15492,United Kingd +581492,12/9/2019,23310,Bubblegum Ring Assorted,6.19,4,15492,United Kingdom +581492,12/9/2019,23311,Vintage Christmas Stocking,6.19,1,15492,United Kingdom +581492,12/9/2019,23312,Vintage Christmas Gift Sack,6.19,6,15492,United Kingdom +581492,12/9/2019,23313,Vintage Christmas Bunting,6.19,4,15492,United Kingdom +581492,12/9/2019,23314,Vintage Christmas Tablecloth,6.19,1,15492,United Kingdom +581492,12/9/2019,23319,Box Of 6 Mini 50'S Crackers,6.19,3,15492,United Kingdom +581492,12/9/2019,23322,Large White Heart Of Wicker,6.19,1,15492,United Kingdom +581492,12/9/2019,23323,White Wicker Star,6.19,6,15492,United Kingdom +581492,12/9/2019,23328,Set 6 School Milk Bottles In Crate,6.19,5,15492,United Kingd +581492,12/9/2019,23332,Ivory Wicker Heart Large,6.19,1,15492,United Kingdom +581492,12/9/2019,23334,Ivory Wicker Heart Small,6.19,1,15492,United Kingdom +581492,12/9/2019,23336,Egg Frying Pan Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,23340,Vintage Christmas Cake Frill,6.19,3,15492,United Kingdom +581492,12/9/2019,23345,Dolly Girl Beaker,6.19,1,15492,United Kingdom +581492,12/9/2019,23347,I Love London Beaker,6.19,1,15492,United Kingdom +581492,12/9/2019,23349,Roll Wrap Vintage Christmas,6.19,2,15492,United Kingdom +581492,12/9/2019,23351,Roll Wrap 50'S Christmas,6.19,5,15492,United Kingdom +581492,12/9/2019,23352,Roll Wrap 50'S Red Christmas,6.19,1,15492,United Kingdom +581492,12/9/2019,23353,6 Gift Tags Vintage Christmas,6.19,3,15492,United Kingdom +581492,12/9/2019,23354,6 Gift Tags 50'S Christmas,6.19,4,15492,United Kingdom +581492,12/9/2019,23357,Hot Water Bottle Sex Bomb,6.19,1,15492,United Kingdom +581492,12/9/2019,23358,Hot Stuff Hot Water Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,23365,Set 12 Colour Pencils Love London,6.19,1,15492,United Kingdo +581492,12/9/2019,23366,Set 12 Colouring Pencils Doily,6.04,5,15492,United Kingdom +581492,12/9/2019,23367,Set 12 Colour Pencils Spaceboy,6.04,10,15492,United Kingdom +581492,12/9/2019,23368,Set 12 Colour Pencils Dolly Girl,6.19,2,15492,United Kingdom +581492,12/9/2019,23581,Jumbo Bag Paisley Park,6.19,3,15492,United Kingdom +581492,12/9/2019,21928,Jumbo Bag Scandinavian Blue Paisley,6.19,2,15492,United King +581492,12/9/2019,21929,Jumbo Bag Pink Vintage Paisley,6.19,1,15492,United Kingdom +581492,12/9/2019,85099C,Jumbo Bag Baroque Black White,6.19,7,15492,United Kingdom +581492,12/9/2019,23199,Jumbo Bag Apples,6.19,2,15492,United Kingdom +581492,12/9/2019,23200,Jumbo Bag Pears,6.19,1,15492,United Kingdom +581492,12/9/2019,23202,Jumbo Bag Vintage Leaf,6.19,2,15492,United Kingdom +581492,12/9/2019,23343,Jumbo Bag Vintage Christmas,6.19,4,15492,United Kingdom +581492,12/9/2019,23344,Jumbo Bag 50'S Christmas,6.19,5,15492,United Kingdom +581492,12/9/2019,23583,Lunch Bag Paisley Park,6.19,2,15492,United Kingdom +581492,12/9/2019,20727,Lunch Bag Black Skull,6.04,2,15492,United Kingdom +581492,12/9/2019,20728,Lunch Bag Cars Blue,6.04,1,15492,United Kingdom +581492,12/9/2019,20725,Lunch Bag Red Retrospot,6.19,1,15492,United Kingdom +581492,12/9/2019,20726,Lunch Bag Woodland,6.19,1,15492,United Kingdom +581492,12/9/2019,22662,Lunch Bag Dolly Girl Design,6.19,1,15492,United Kingdom +581492,12/9/2019,23206,Lunch Bag Apple Design,6.19,3,15492,United Kingdom +581492,12/9/2019,23208,Lunch Bag Vintage Leaf Design,6.19,3,15492,United Kingdom +581492,12/9/2019,23375,50'S Christmas Paper Gift Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,23437,50'S Christmas Gift Bag Large,6.19,1,15492,United Kingdom +581492,12/9/2019,22821,Gift Bag Psychedelic Apples,7.24,3,15492,United Kingdom +581493,12/9/2019,79190B,Retro Plastic Polka Tray,7.24,15,12423,Belgium +581493,12/9/2019,79190A,Retro Plastic 70'S Tray,7.24,15,12423,Belgium +581493,12/9/2019,22915,Assorted Bottle Top Magnets,7.24,12,12423,Belgium +581493,12/9/2019,22151,Place Setting White Heart,7.24,24,12423,Belgium +581493,12/9/2019,22632,Hand Warmer Red Retrospot,7.24,12,12423,Belgium +581493,12/9/2019,22865,Hand Warmer Owl Design,7.24,12,12423,Belgium +581493,12/9/2019,20718,Red Retrospot Shopper Bag,7.24,10,12423,Belgium +581493,12/9/2019,79190B,Retro Plastic Polka Tray,7.24,12,12423,Belgium +581493,12/9/2019,71459,Hanging Jam Jar T-Light Holders,7.24,12,12423,Belgium +581493,12/9/2019,84945,Multi Colour Silver T-Light Holder,7.24,12,12423,Belgium +581493,12/9/2019,22356,Charlotte Bag Pink Polkadot,7.24,10,12423,Belgium +581493,12/9/2019,20724,Red Retrospot Charlotte Bag,7.24,10,12423,Belgium +581493,12/9/2019,23204,Charlotte Bag Apples Design,7.24,10,12423,Belgium +581493,12/9/2019,21108,Fairy Cake Flannel Assorted Colour,7.24,18,12423,Belgium +581493,12/9/2019,22252,Birdcage Decoration Tealight Holder,7.24,12,12423,Belgium +581493,12/9/2019,22807,Set Of 6 T-Lights Toadstools,6.19,6,12423,Belgium +581494,12/9/2019,23084,Rabbit Night Light,6.19,24,12518,Germany +581494,12/9/2019,21559,Strawberry Lunch Box With Cutlery,6.19,6,12518,Germany +581494,12/9/2019,21506,Fancy Font Birthday Card,6.19,12,12518,Germany +581494,12/9/2019,22716,Card Circus Parade,6.19,12,12518,Germany +581494,12/9/2019,22556,Plasters In Tin Circus Parade,6.19,12,12518,Germany +581494,12/9/2019,22328,Round Snack Boxes Set Of 4 Fruits,6.19,6,12518,Germany +581494,12/9/2019,22730,Alarm Clock Bakelike Ivory,6.19,4,12518,Germany +581494,12/9/2019,22633,Hand Warmer Union Jack,6.19,12,12518,Germany +581494,12/9/2019,22326,Round Snack Boxes Set Of4 Woodland,6.19,6,12518,Germany +581494,12/9/2019,10125,Mini Funky Design Tapes,6.19,20,12518,Germany +581494,12/9/2019,23367,Set 12 Colour Pencils Spaceboy,6.19,24,12518,Germany +581494,12/9/2019,22551,Plasters In Tin Spaceboy,6.04,12,12518,Germany +581494,12/9/2019,22554,Plasters In Tin Woodland Animals,6.04,12,12518,Germany +581494,12/9/2019,22549,Picture Dominoes,6.19,12,12518,Germany +581494,12/9/2019,23388,Woodland Mini Backpack,6.19,4,12518,Germany +581494,12/9/2019,23390,Dolly Girl Mini Backpack,6.19,4,12518,Germany +581494,12/9/2019,23389,Spaceboy Mini Backpack,6.19,4,12518,Germany +581495,12/9/2019,23535,Wall Art Bicycle Safety,6.19,12,14051,United Kingdom +581495,12/9/2019,22699,Roses Regency Teacup And Saucer,6.19,12,14051,United Kingdom +581495,12/9/2019,22698,Pink Regency Teacup And Saucer,6.19,12,14051,United Kingdom +581495,12/9/2019,22697,Green Regency Teacup And Saucer,6.19,12,14051,United Kingdom +581495,12/9/2019,22633,Hand Warmer Union Jack,6.04,18,14051,United Kingdom +581495,12/9/2019,15056N,Edwardian Parasol Natural,6.19,36,14051,United Kingdom +581495,12/9/2019,23439,Hand Warmer Red Love Heart,6.19,36,14051,United Kingdom +581495,12/9/2019,48138,Doormat Union Flag,6.19,10,14051,United Kingdom +581495,12/9/2019,21523,Doormat Fancy Font Home Sweet Home,6.19,10,14051,United King +581495,12/9/2019,21877,Home Sweet Home Mug,6.19,12,14051,United Kingdom +581495,12/9/2019,21871,Save The Planet Mug,6.19,18,14051,United Kingdom +581495,12/9/2019,22798,Antique Glass Dressing Table Pot,6.19,36,14051,United Kingdo +581495,12/9/2019,23173,Regency Teapot Roses,6.19,6,14051,United Kingdom +581495,12/9/2019,22423,Regency Cakestand 3 Tier,6.19,10,14051,United Kingdom +581496,12/9/2019,22664,Toy Tidy Dolly Girl Design,6.19,20,16558,United Kingdom +581496,12/9/2019,22721,Set Of 3 Cake Tins Sketchbook,6.19,12,16558,United Kingdom +581496,12/9/2019,72800E,4 Ivory Dinner Candles Silver Flock,6.19,12,16558,United Ki +581496,12/9/2019,23313,Vintage Christmas Bunting,6.19,10,16558,United Kingdom +581496,12/9/2019,22952,60 Cake Cases Vintage Christmas,6.19,24,16558,United Kingdom +581496,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,6.04,12,16558,United Kin +581496,12/9/2019,23298,Spotty Bunting,6.19,3,16558,United Kingdom +581496,12/9/2019,23598,Paper Bunting Vintage Party,6.19,6,16558,United Kingdom +581496,12/9/2019,16169E,Wrap 50'S Christmas,6.19,25,16558,United Kingdom +581496,12/9/2019,23351,Roll Wrap 50'S Christmas,6.19,12,16558,United Kingdom +581496,12/9/2019,23350,Roll Wrap Vintage Spot,6.19,24,16558,United Kingdom +581496,12/9/2019,22865,Hand Warmer Owl Design,6.19,24,16558,United Kingdom +581496,12/9/2019,22632,Hand Warmer Red Retrospot,6.19,12,16558,United Kingdom +581496,12/9/2019,22835,Hot Water Bottle I Am So Poorly,6.19,4,16558,United Kingdom +581496,12/9/2019,22112,Chocolate Hot Water Bottle,6.19,6,16558,United Kingdom +581496,12/9/2019,23355,Hot Water Bottle Keep Calm,6.19,4,16558,United Kingdom +581496,12/9/2019,22314,Office Mug Warmer Choc+Blue,6.19,24,16558,United Kingdom +581496,12/9/2019,22313,Office Mug Warmer Pink,6.19,12,16558,United Kingdom +581496,12/9/2019,23084,Rabbit Night Light,6.19,18,16558,United Kingdom +581496,12/9/2019,20831,Gold Photo Frame,6.19,12,16558,United Kingdom +581496,12/9/2019,21115,Rose Caravan Doorstop,6.19,8,16558,United Kingdom +581496,12/9/2019,21462,Nursery A B C Painted Letters,7.24,8,16558,United Kingdom +581496,12/9/2019,22076,6 Ribbons Empire,7.24,24,16558,United Kingdom +581496,12/9/2019,22190,Local Cafe Mug,7.24,24,16558,United Kingdom +581496,12/9/2019,22215,Cake Stand White Two Tier Lace,7.24,6,16558,United Kingdom +581496,12/9/2019,22220,Cake Stand Lovebird 2 Tier White,7.24,6,16558,United Kingdom +581496,12/9/2019,22464,Hanging Metal Heart Lantern,7.24,12,16558,United Kingdom +581496,12/9/2019,22465,Hanging Metal Star Lantern,7.24,12,16558,United Kingdom +581496,12/9/2019,22539,Mini Jigsaw Dolly Girl,7.24,48,16558,United Kingdom +581496,12/9/2019,22544,Mini Jigsaw Spaceboy,7.24,48,16558,United Kingdom +581496,12/9/2019,23438,Red Spot Gift Bag Large,6.19,12,16558,United Kingdom +581496,12/9/2019,23437,50'S Christmas Gift Bag Large,6.19,12,16558,United Kingdom +581497,12/9/2019,20719,Woodland Charlotte Bag,6.19,33,17497,United Kingdom +581497,12/9/2019,20723,Strawberry Charlotte Bag,6.19,42,17497,United Kingdom +581497,12/9/2019,20724,Red Retrospot Charlotte Bag,6.19,55,17497,United Kingdom +581497,12/9/2019,21212,Pack Of 72 Retrospot Cake Cases,7.24,7,17497,United Kingdom +581497,12/9/2019,21238,Red Retrospot Cup,7.24,8,17497,United Kingdom +581497,12/9/2019,21242,Red Retrospot Plate,7.24,2,17497,United Kingdom +581497,12/9/2019,21479,White Skull Hot Water Bottle,7.24,25,17497,United Kingdom +581497,12/9/2019,21481,Fawn Blue Hot Water Bottle,7.24,1,17497,United Kingdom +581497,12/9/2019,21481,Fawn Blue Hot Water Bottle,7.24,1,17497,United Kingdom +581497,12/9/2019,21484,Chick Grey Hot Water Bottle,7.24,1,17497,United Kingdom +581497,12/9/2019,21668,Red Stripe Ceramic Drawer Knob,7.24,1,17497,United Kingdom +581497,12/9/2019,21670,Blue Spot Ceramic Drawer Knob,7.24,1,17497,United Kingdom +581497,12/9/2019,21671,Red Spot Ceramic Drawer Knob,7.24,1,17497,United Kingdom +581497,12/9/2019,21672,White Spot Red Ceramic Drawer Knob,7.24,6,17497,United Kingd +581497,12/9/2019,21673,White Spot Blue Ceramic Drawer Knob,7.24,1,17497,United King +581497,12/9/2019,21714,Citronella Candle Garden Pot,7.24,2,17497,United Kingdom +581497,12/9/2019,22110,Bird House Hot Water Bottle,7.24,7,17497,United Kingdom +581497,12/9/2019,22111,Scottie Dog Hot Water Bottle,7.24,5,17497,United Kingdom +581497,12/9/2019,22112,Chocolate Hot Water Bottle,7.24,13,17497,United Kingdom +581497,12/9/2019,22114,Hot Water Bottle Tea And Sympathy,7.24,48,17497,United Kingd +581497,12/9/2019,22197,Popcorn Holder,7.24,68,17497,United Kingdom +581497,12/9/2019,22355,Charlotte Bag Suki Design,7.24,110,17497,United Kingdom +581497,12/9/2019,22356,Charlotte Bag Pink Polkadot,7.24,25,17497,United Kingdom +581497,12/9/2019,22356,Charlotte Bag Pink Polkadot,7.24,1,17497,United Kingdom +581497,12/9/2019,22423,Regency Cakestand 3 Tier,7.24,8,17497,United Kingdom +581497,12/9/2019,22725,Alarm Clock Bakelike Chocolate,7.24,3,17497,United Kingdom +581497,12/9/2019,22726,Alarm Clock Bakelike Green,7.24,1,17497,United Kingdom +581497,12/9/2019,22727,Alarm Clock Bakelike Red,7.24,10,17497,United Kingdom +581497,12/9/2019,22730,Alarm Clock Bakelike Ivory,7.24,5,17497,United Kingdom +581497,12/9/2019,22735,Ribbon Reel Socks And Mittens,7.24,2,17497,United Kingdom +581497,12/9/2019,22736,Ribbon Reel Making Snowmen,7.24,3,17497,United Kingdom +581497,12/9/2019,22738,Ribbon Reel Snowy Village,7.24,1,17497,United Kingdom +581497,12/9/2019,22805,Blue Drawer Knob Acrylic Edwardian,7.24,1,17497,United Kingd +581497,12/9/2019,22835,Hot Water Bottle I Am So Poorly,7.24,4,17497,United Kingdom +581497,12/9/2019,22895,Set Of 2 Tea Towels Apple And Pears,7.24,1,17497,United King +581497,12/9/2019,22896,Peg Bag Apples Design,7.24,2,17497,United Kingdom +581497,12/9/2019,22898,Childrens Apron Apples Design,7.24,2,17497,United Kingdom +581497,12/9/2019,22943,Christmas Lights 10 Vintage Baubles,7.24,1,17497,United King +581497,12/9/2019,23084,Rabbit Night Light,6.19,37,17497,United Kingdom +581497,12/9/2019,23168,Classic Cafe Sugar Dispenser,6.19,1,17497,United Kingdom +581497,12/9/2019,23204,Charlotte Bag Apples Design,6.04,13,17497,United Kingdom +581497,12/9/2019,23205,Charlotte Bag Vintage Alphabet,6.04,8,17497,United Kingdom +581497,12/9/2019,23301,Gardeners Kneeling Pad Keep Calm,6.19,1,17497,United Kingdom +581497,12/9/2019,23355,Hot Water Bottle Keep Calm,6.19,36,17497,United Kingdom +581497,12/9/2019,23356,Love Hot Water Bottle,6.19,1,17497,United Kingdom +581497,12/9/2019,23357,Hot Water Bottle Sex Bomb,6.19,2,17497,United Kingdom +581497,12/9/2019,23358,Hot Stuff Hot Water Bottle,6.19,2,17497,United Kingdom +581497,12/9/2019,35970,Zinc Folkart Sleigh Bells,6.19,2,17497,United Kingdom +581497,12/9/2019,47566,Party Bunting,6.19,5,17497,United Kingdom +581497,12/9/2019,82583,Hot Baths Metal Sign,6.19,4,17497,United Kingdom +581497,12/9/2019,84029G,Knitted Union Flag Hot Water Bottle,6.19,11,17497,United Ki +581497,12/9/2019,84997C,Childrens Cutlery Polkadot Blue,6.19,3,17497,United Kingdom +581497,12/9/2019,85049G,Chocolate Box Ribbons,6.19,2,17497,United Kingdom +581497,12/9/2019,20727,Lunch Bag Black Skull,6.19,8,17497,United Kingdom +581497,12/9/2019,22383,Lunch Bag Suki Design,7.24,2,17497,United Kingdom +581497,12/9/2019,23206,Lunch Bag Apple Design,6.04,3,17497,United Kingdom +581497,12/9/2019,23206,Lunch Bag Apple Design,6.04,1,17497,United Kingdom +581497,12/9/2019,23207,Lunch Bag Alphabet Design,6.19,1,17497,United Kingdom +581497,12/9/2019,23208,Lunch Bag Vintage Leaf Design,6.19,3,17497,United Kingdom +581498,12/9/2019,20669,Red Heart Luggage Tag,6.19,3,14498,United Kingdom +581498,12/9/2019,20679,Edwardian Parasol Red,6.19,5,14498,United Kingdom +581498,12/9/2019,20717,Strawberry Shopper Bag,6.19,1,14498,United Kingdom +581498,12/9/2019,20718,Red Retrospot Shopper Bag,6.19,1,14498,United Kingdom +581498,12/9/2019,20750,Red Retrospot Mini Cases,6.19,1,14498,United Kingdom +581498,12/9/2019,20961,Strawberry Bath Sponge,6.19,1,14498,United Kingdom +581498,12/9/2019,20963,Apple Bath Sponge,6.19,1,14498,United Kingdom +581498,12/9/2019,21115,Rose Caravan Doorstop,6.19,1,14498,United Kingdom +581498,12/9/2019,21125,Set 6 Football Celebration Candles,6.19,3,14498,United Kingd +581498,12/9/2019,21137,Black Record Cover Frame,6.19,4,14498,United Kingdom +581498,12/9/2019,21155,Red Retrospot Peg Bag,6.19,4,14498,United Kingdom +581498,12/9/2019,21166,Cook With Wine Metal Sign,6.19,3,14498,United Kingdom +581498,12/9/2019,21169,You're Confusing Me Metal Sign,6.19,2,14498,United Kingdom +581498,12/9/2019,21174,Pottering In The Shed Metal Sign,6.19,2,14498,United Kingdom +581498,12/9/2019,21181,Please One Person Metal Sign,6.19,6,14498,United Kingdom +581498,12/9/2019,21216,Set 3 Retrospot Tea/Coffee/Sugar,6.19,2,14498,United Kingdom +581498,12/9/2019,21217,Red Retrospot Round Cake Tins,6.19,3,14498,United Kingdom +581498,12/9/2019,21218,Red Spotty Biscuit Tin,6.19,4,14498,United Kingdom +581498,12/9/2019,21232,Strawberry Ceramic Trinket Pot,6.19,13,14498,United Kingdom +581498,12/9/2019,21239,Pink Polkadot Cup,6.19,1,14498,United Kingdom +581498,12/9/2019,21257,Victorian Sewing Box Medium,6.19,3,14498,United Kingdom +581498,12/9/2019,21327,Skulls Writing Set,6.19,1,14498,United Kingdom +581498,12/9/2019,21328,Balloons Writing Set,6.19,1,14498,United Kingdom +581498,12/9/2019,21329,Dinosaurs Writing Set,6.19,1,14498,United Kingdom +581498,12/9/2019,21411,Gingham Heart Doorstop Red,6.19,1,14498,United Kingdom +581498,12/9/2019,21430,Set/3 Red Gingham Rose Storage Box,6.19,3,14498,United Kingd +581498,12/9/2019,21494,Rotating Leaves T-Light Holder,6.19,7,14498,United Kingdom +581498,12/9/2019,21523,Doormat Fancy Font Home Sweet Home,6.19,1,14498,United Kingd +581498,12/9/2019,21557,Set Of 6 Funky Beakers,6.19,1,14498,United Kingdom +581498,12/9/2019,21558,Skull Lunch Box With Cutlery,6.19,1,14498,United Kingdom +581498,12/9/2019,21731,Red Toadstool Led Night Light,6.19,9,14498,United Kingdom +581498,12/9/2019,21754,Home Building Block Word,6.19,2,14498,United Kingdom +581498,12/9/2019,21790,Vintage Snap Cards,6.19,1,14498,United Kingdom +581498,12/9/2019,21843,Red Retrospot Cake Stand,6.19,5,14498,United Kingdom +581498,12/9/2019,21864,Union Jack Flag Passport Cover,6.19,2,14498,United Kingdom +581498,12/9/2019,21874,Gin And Tonic Mug,6.19,2,14498,United Kingdom +581498,12/9/2019,21876,Pottering Mug,6.19,4,14498,United Kingdom +581498,12/9/2019,21890,S/6 Wooden Skittles In Cotton Bag,6.19,1,14498,United Kingdo +581498,12/9/2019,21912,Vintage Snakes & Ladders,6.19,1,14498,United Kingdom +581498,12/9/2019,21916,Set 12 Retro White Chalk Sticks,6.19,7,14498,United Kingdom +581498,12/9/2019,21930,Jumbo Storage Bag Skulls,6.19,2,14498,United Kingdom +581498,12/9/2019,21931,Jumbo Storage Bag Suki,6.19,6,14498,United Kingdom +581498,12/9/2019,21934,Skull Shoulder Bag,6.19,1,14498,United Kingdom +581498,12/9/2019,21935,Suki Shoulder Bag,6.19,7,14498,United Kingdom +581498,12/9/2019,21942,Skulls Design Flannel,6.19,1,14498,United Kingdom +581498,12/9/2019,21955,Doormat Union Jack Guns And Roses,6.19,1,14498,United Kingdo +581498,12/9/2019,21977,Pack Of 60 Pink Paisley Cake Cases,6.19,1,14498,United Kingd +581498,12/9/2019,21983,Pack Of 12 Blue Paisley Tissues,6.19,1,14498,United Kingdom +581498,12/9/2019,21987,Pack Of 6 Skull Paper Cups,6.19,2,14498,United Kingdom +581498,12/9/2019,21989,Pack Of 20 Skull Paper Napkins,6.19,1,14498,United Kingdom +581498,12/9/2019,22041,"Record Frame 7"" Single Size",6.19,2,14498,United Kingdom +581498,12/9/2019,22059,Ceramic Strawberry Design Mug,6.19,1,14498,United Kingdom +581498,12/9/2019,22069,Brown Pirate Treasure Chest,6.19,3,14498,United Kingdom +581498,12/9/2019,22077,6 Ribbons Rustic Charm,6.19,2,14498,United Kingdom +581498,12/9/2019,22083,Paper Chain Kit Retrospot,6.19,2,14498,United Kingdom +581498,12/9/2019,22086,Paper Chain Kit 50'S Christmas,6.19,52,14498,United Kingdom +581498,12/9/2019,22099,Caravan Square Tissue Box,6.19,2,14498,United Kingdom +581498,12/9/2019,22114,Hot Water Bottle Tea And Sympathy,6.19,4,14498,United Kingdo +581498,12/9/2019,22139,Retrospot Tea Set Ceramic 11 Pc,6.19,2,14498,United Kingdom +581498,12/9/2019,22141,Christmas Craft Tree Top Angel,6.19,7,14498,United Kingdom +581498,12/9/2019,22142,Christmas Craft White Fairy,6.19,2,14498,United Kingdom +581498,12/9/2019,22144,Christmas Craft Little Friends,6.19,8,14498,United Kingdom +581498,12/9/2019,22161,Heart Decoration Rustic Hanging,6.19,2,14498,United Kingdom +581498,12/9/2019,22173,Metal 4 Hook Hanger French Chateau,6.19,3,14498,United Kingd +581498,12/9/2019,22174,Photo Cube,6.19,3,14498,United Kingdom +581498,12/9/2019,22175,Pink Owl Soft Toy,6.19,1,14498,United Kingdom +581498,12/9/2019,22178,Victorian Glass Hanging T-Light,6.19,1,14498,United Kingdom +581498,12/9/2019,22179,Set 10 Night Owl Lights,6.19,1,14498,United Kingdom +581498,12/9/2019,22186,Red Star Card Holder,6.19,1,14498,United Kingdom +581498,12/9/2019,22187,Green Christmas Tree Card Holder,6.19,6,14498,United Kingdom +581498,12/9/2019,22193,Red Diner Wall Clock,6.19,1,14498,United Kingdom +581498,12/9/2019,22195,Large Heart Measuring Spoons,6.19,3,14498,United Kingdom +581498,12/9/2019,22196,Small Heart Measuring Spoons,6.19,2,14498,United Kingdom +581498,12/9/2019,22207,Frying Pan Union Flag,6.19,1,14498,United Kingdom +581498,12/9/2019,22278,Overnight Bag Vintage Rose Paisley,6.19,2,14498,United Kingd +581498,12/9/2019,22301,Coffee Mug Cat + Bird Design,6.19,2,14498,United Kingdom +581498,12/9/2019,22302,Coffee Mug Pears Design,6.19,4,14498,United Kingdom +581498,12/9/2019,22303,Coffee Mug Apples Design,6.19,4,14498,United Kingdom +581498,12/9/2019,22304,Coffee Mug Blue Paisley Design,6.19,1,14498,United Kingdom +581498,12/9/2019,22308,Tea Cosy Blue Stripe,6.19,2,14498,United Kingdom +581498,12/9/2019,22327,Round Snack Boxes Set Of 4 Skulls,6.19,4,14498,United Kingdo +581498,12/9/2019,22328,Round Snack Boxes Set Of 4 Fruits,6.19,4,14498,United Kingdo +581498,12/9/2019,22352,Lunch Box With Cutlery Retrospot,6.19,6,14498,United Kingdom +581498,12/9/2019,22357,Kings Choice Biscuit Tin,6.19,1,14498,United Kingdom +581498,12/9/2019,22358,Kings Choice Tea Caddy,6.19,1,14498,United Kingdom +581498,12/9/2019,22367,Childrens Apron Spaceboy Design,6.19,7,14498,United Kingdom +581498,12/9/2019,22371,Airline Bag Vintage Tokyo 78,6.19,1,14498,United Kingdom +581498,12/9/2019,22374,Airline Bag Vintage Jet Set Red,6.19,1,14498,United Kingdom +581498,12/9/2019,22378,Wall Tidy Retrospot,7.24,2,14498,United Kingdom +581498,12/9/2019,22379,Recycling Bag Retrospot,7.24,4,14498,United Kingdom +581498,12/9/2019,22381,Toy Tidy Pink Polkadot,7.24,1,14498,United Kingdom +581498,12/9/2019,22411,Jumbo Shopper Vintage Red Paisley,7.24,2,14498,United Kingdo +581498,12/9/2019,22422,Toothpaste Tube Pen,7.24,1,14498,United Kingdom +581498,12/9/2019,22424,Enamel Bread Bin Cream,7.24,1,14498,United Kingdom +581498,12/9/2019,22429,Enamel Measuring Jug Cream,7.24,1,14498,United Kingdom +581498,12/9/2019,22456,Natural Slate Chalkboard Large,7.24,4,14498,United Kingdom +581498,12/9/2019,22457,Natural Slate Heart Chalkboard,7.24,2,14498,United Kingdom +581498,12/9/2019,22471,Tv Dinner Tray Air Hostess,7.24,1,14498,United Kingdom +581498,12/9/2019,22474,Spaceboy Tv Dinner Tray,7.24,1,14498,United Kingdom +581498,12/9/2019,22488,Natural Slate Rectangle Chalkboard,7.24,2,14498,United Kingd +581498,12/9/2019,22498,Wooden Regatta Bunting,7.24,1,14498,United Kingdom +581498,12/9/2019,22507,Memo Board Retrospot Design,7.24,1,14498,United Kingdom +581498,12/9/2019,22526,Wheelbarrow For Children,7.24,1,14498,United Kingdom +581498,12/9/2019,22553,Plasters In Tin Skulls,7.24,1,14498,United Kingdom +581498,12/9/2019,22557,Plasters In Tin Vintage Paisley,7.24,1,14498,United Kingdom +581498,12/9/2019,22619,Set Of 6 Soldier Skittles,7.24,1,14498,United Kingdom +581498,12/9/2019,22622,Box Of Vintage Alphabet Blocks,7.24,1,14498,United Kingdom +581498,12/9/2019,22624,Ivory Kitchen Scales,7.24,1,14498,United Kingdom +581498,12/9/2019,22629,Spaceboy Lunch Box,7.24,2,14498,United Kingdom +581498,12/9/2019,22632,Hand Warmer Red Retrospot,7.24,1,14498,United Kingdom +581498,12/9/2019,22645,Ceramic Heart Fairy Cake Money Bank,7.24,4,14498,United King +581498,12/9/2019,22654,Deluxe Sewing Kit,6.19,2,14498,United Kingdom +581498,12/9/2019,22659,Lunch Box I Love London,6.19,1,14498,United Kingdom +581498,12/9/2019,22666,Recipe Box Pantry Yellow Design,6.19,11,14498,United Kingdom +581498,12/9/2019,22676,French Blue Metal Door Sign 1,6.04,1,14498,United Kingdom +581498,12/9/2019,22684,French Blue Metal Door Sign 9,6.04,1,14498,United Kingdom +581498,12/9/2019,22694,Wicker Star,6.04,1,14498,United Kingdom +581498,12/9/2019,22697,Green Regency Teacup And Saucer,6.04,6,14498,United Kingdom +581498,12/9/2019,22698,Pink Regency Teacup And Saucer,6.04,9,14498,United Kingdom +581498,12/9/2019,22699,Roses Regency Teacup And Saucer,6.19,6,14498,United Kingdom +581498,12/9/2019,22722,Set Of 6 Spice Tins Pantry Design,6.19,3,14498,United Kingdo +581498,12/9/2019,22733,3d Traditional Christmas Stickers,6.19,1,14498,United Kingdo +581498,12/9/2019,22734,Set Of 6 Ribbons Vintage Christmas,6.19,5,14498,United Kingd +581498,12/9/2019,22776,Sweetheart 3 Tier Cake Stand,6.19,1,14498,United Kingdom +581498,12/9/2019,22795,Sweetheart Recipe Book Stand,6.19,1,14498,United Kingdom +581498,12/9/2019,22807,Set Of 6 T-Lights Toadstools,6.19,2,14498,United Kingdom +581498,12/9/2019,22813,Pack 3 Boxes Bird Panettone,6.19,4,14498,United Kingdom +581498,12/9/2019,22838,3 Tier Cake Tin Red And Cream,6.19,1,14498,United Kingdom +581498,12/9/2019,22844,Vintage Cream Dog Food Container,6.19,2,14498,United Kingdom +581498,12/9/2019,22845,Vintage Cream Cat Food Container,6.19,1,14498,United Kingdom +581498,12/9/2019,22865,Hand Warmer Owl Design,6.19,1,14498,United Kingdom +581498,12/9/2019,22866,Hand Warmer Scotty Dog Design,6.19,2,14498,United Kingdom +581498,12/9/2019,22891,Tea For One Polkadot,6.19,1,14498,United Kingdom +581498,12/9/2019,22900,Set 2 Tea Towels I Love London,6.19,2,14498,United Kingdom +581498,12/9/2019,22910,Paper Chain Kit Vintage Christmas,6.19,5,14498,United Kingdo +581498,12/9/2019,22952,60 Cake Cases Vintage Christmas,6.19,7,14498,United Kingdom +581498,12/9/2019,22960,Jam Making Set With Jars,6.19,5,14498,United Kingdom +581498,12/9/2019,22961,Jam Making Set Printed,6.19,4,14498,United Kingdom +581498,12/9/2019,22966,Gingerbread Man Cookie Cutter,6.19,2,14498,United Kingdom +581498,12/9/2019,22993,Set Of 4 Pantry Jelly Moulds,6.19,2,14498,United Kingdom +581498,12/9/2019,23012,Glass Apothecary Bottle Perfume,6.19,1,14498,United Kingdom +581498,12/9/2019,23013,Glass Apothecary Bottle Tonic,6.19,1,14498,United Kingdom +581498,12/9/2019,23014,Glass Apothecary Bottle Elixir,7.24,2,14498,United Kingdom +581498,12/9/2019,23080,Red Metal Box Top Secret,7.24,5,14498,United Kingdom +581498,12/9/2019,23170,Regency Tea Plate Roses,7.24,4,14498,United Kingdom +581498,12/9/2019,23171,Regency Tea Plate Green,7.24,5,14498,United Kingdom +581498,12/9/2019,23172,Regency Tea Plate Pink,6.19,4,14498,United Kingdom +581498,12/9/2019,23181,Bull Dog Bottle Top Wall Clock,6.19,1,14498,United Kingdom +581498,12/9/2019,23196,Vintage Leaf Magnetic Notepad,6.19,1,14498,United Kingdom +581498,12/9/2019,23198,Pantry Magnetic Shopping List,6.19,2,14498,United Kingdom +581498,12/9/2019,23245,Set Of 3 Regency Cake Tins,6.19,5,14498,United Kingdom +581498,12/9/2019,23295,Set Of 12 Mini Loaf Baking Cases,6.19,1,14498,United Kingdom +581498,12/9/2019,23298,Spotty Bunting,6.19,1,14498,United Kingdom +581498,12/9/2019,23300,Gardeners Kneeling Pad Cup Of Tea,6.19,9,14498,United Kingdo +581498,12/9/2019,23301,Gardeners Kneeling Pad Keep Calm,6.19,32,14498,United Kingdo +581498,12/9/2019,23311,Vintage Christmas Stocking,6.19,6,14498,United Kingdom +581498,12/9/2019,23312,Vintage Christmas Gift Sack,6.19,3,14498,United Kingdom +581498,12/9/2019,23328,Set 6 School Milk Bottles In Crate,6.19,6,14498,United Kingd +581498,12/9/2019,23349,Roll Wrap Vintage Christmas,6.19,8,14498,United Kingdom +581498,12/9/2019,23351,Roll Wrap 50'S Christmas,6.19,22,14498,United Kingdom +581498,12/9/2019,23352,Roll Wrap 50'S Red Christmas,6.19,8,14498,United Kingdom +581498,12/9/2019,23353,6 Gift Tags Vintage Christmas,6.19,10,14498,United Kingdom +581498,12/9/2019,23354,6 Gift Tags 50'S Christmas,6.19,9,14498,United Kingdom +581498,12/9/2019,23368,Set 12 Colour Pencils Dolly Girl,6.19,3,14498,United Kingdom +581498,12/9/2019,23369,Set 36 Colour Pencils Love London,6.19,1,14498,United Kingdo +581498,12/9/2019,23370,Set 36 Colouring Pencils Doily,6.19,3,14498,United Kingdom +581498,12/9/2019,23382,Box Of 6 Christmas Cake Decorations,6.19,10,14498,United Kin +581498,12/9/2019,23388,Woodland Mini Backpack,6.19,1,14498,United Kingdom +581498,12/9/2019,23480,Mini Lights Woodland Mushrooms,7.24,1,14498,United Kingdom +581498,12/9/2019,23493,Vintage Doily Travel Sewing Kit,7.24,1,14498,United Kingdom +581498,12/9/2019,23494,Vintage Doily Deluxe Sewing Kit,7.24,1,14498,United Kingdom +581498,12/9/2019,23497,Classic Chrome Bicycle Bell,7.24,1,14498,United Kingdom +581498,12/9/2019,23501,Key Ring Baseball Boot Union Jack,7.24,1,14498,United Kingdo +581498,12/9/2019,23564,Egg Cup Milkmaid Ingrid,7.24,1,14498,United Kingdom +581498,12/9/2019,35970,Zinc Folkart Sleigh Bells,7.24,6,14498,United Kingdom +581498,12/9/2019,48138,Doormat Union Flag,7.24,1,14498,United Kingdom +581498,12/9/2019,71053,White Moroccan Metal Lantern,7.24,1,14498,United Kingdom +581498,12/9/2019,72349B,Set/6 Purple Butterfly T-Lights,7.24,2,14498,United Kingdom +581498,12/9/2019,79321,Chilli Lights,7.24,10,14498,United Kingdom +581498,12/9/2019,82001S,Silver Record Cover Frame,6.19,2,14498,United Kingdom +581498,12/9/2019,82482,Wooden Picture Frame White Finish,6.04,4,14498,United Kingdo +581498,12/9/2019,82552,Washroom Metal Sign,6.04,1,14498,United Kingdom +581498,12/9/2019,21171,Bathroom Metal Sign,6.19,1,14498,United Kingdom +581498,12/9/2019,82581,Toilet Metal Sign,6.19,1,14498,United Kingdom +581498,12/9/2019,82600,N0 Singing Metal Sign,6.19,4,14498,United Kingdom +581498,12/9/2019,84029E,Red Woolly Hottie White Heart,6.19,4,14498,United Kingdom +581498,12/9/2019,84032A,Charlie+Lola Pink Hot Water Bottle,6.19,4,14498,United King +581498,12/9/2019,84032B,Charlie + Lola Red Hot Water Bottle,6.19,3,14498,United Kin +581498,12/9/2019,84375,Set Of 20 Kids Cookie Cutters,6.19,3,14498,United Kingdom +581498,12/9/2019,84509A,Set Of 4 English Rose Placemats,6.19,1,14498,United Kingdom +581498,12/9/2019,84558A,3d Dog Picture Playing Cards,6.19,1,14498,United Kingdom +581498,12/9/2019,84832,Zinc Willie Winkie Candle Stick,6.19,26,14498,United Kingdom +581498,12/9/2019,84968E,Set Of 16 Vintage Black Cutlery,6.19,1,14498,United Kingdom +581498,12/9/2019,84970S,Hanging Heart Zinc T-Light Holder,6.19,1,14498,United Kingd +581498,12/9/2019,84997A,Childrens Cutlery Polkadot Green,6.19,2,14498,United Kingdo +581498,12/9/2019,84997B,Childrens Cutlery Retrospot Red,6.19,3,14498,United Kingdom +581498,12/9/2019,84997D,Childrens Cutlery Polkadot Pink,6.19,1,14498,United Kingdom +581498,12/9/2019,85038,6 Chocolate Love Heart T-Lights,6.19,1,14498,United Kingdom +581498,12/9/2019,85048,15cm Christmas Glass Ball 20 Lights,6.19,1,14498,United King +581498,12/9/2019,85049A,Traditional Christmas Ribbons,6.17,5,14498,United Kingdom +581498,12/9/2019,85049E,Scandinavian Reds Ribbons,6.19,4,14498,United Kingdom +581498,12/9/2019,85150,Ladies & Gentlemen Metal Sign,6.19,1,14498,United Kingdom +581498,12/9/2019,85174,S/4 Cacti Candles,6.19,1,14498,United Kingdom +581498,12/9/2019,20712,Jumbo Bag Woodland Animals,6.19,3,14498,United Kingdom +581498,12/9/2019,20713,Jumbo Bag Owls,6.19,8,14498,United Kingdom +581498,12/9/2019,21928,Jumbo Bag Scandinavian Blue Paisley,6.19,2,14498,United King +581498,12/9/2019,22386,Jumbo Bag Pink Polkadot,7.24,1,14498,United Kingdom +581498,12/9/2019,22663,Jumbo Bag Dolly Girl Design,6.19,2,14498,United Kingdom +581498,12/9/2019,23199,Jumbo Bag Apples,6.19,6,14498,United Kingdom +581498,12/9/2019,23201,Jumbo Bag Alphabet,6.19,6,14498,United Kingdom +581498,12/9/2019,85099B,Jumbo Bag Red Retrospot,6.19,5,14498,United Kingdom +581498,12/9/2019,85099C,Jumbo Bag Baroque Black White,6.19,4,14498,United Kingdom +581498,12/9/2019,20726,Lunch Bag Woodland,6.19,3,14498,United Kingdom +581498,12/9/2019,20728,Lunch Bag Cars Blue,6.19,4,14498,United Kingdom +581498,12/9/2019,22384,Lunch Bag Pink Polkadot,7.24,1,14498,United Kingdom +581498,12/9/2019,23437,50'S Christmas Gift Bag Large,7.24,1,14498,United Kingdom +581500,12/9/2019,82486,3 Drawer Antique White Wood Cabinet,7.24,4,15344,United King +581500,12/9/2019,85066,Cream Sweetheart Mini Chest,7.24,4,15344,United Kingdom +581500,12/9/2019,48187,Doormat New England,7.24,2,15344,United Kingdom +581501,12/9/2019,22319,Hairclips Forties Fabric Assorted,7.24,180,12985,United King +581501,12/9/2019,20704,Mr Robot Soft Toy,7.24,8,12985,United Kingdom +581501,12/9/2019,21564,Pink Heart Shape Love Bucket,6.19,24,12985,United Kingdom +581501,12/9/2019,21563,Red Heart Shape Love Bucket,7.24,24,12985,United Kingdom +581501,12/9/2019,22165,Diamante Heart Shaped Wall Mirror,7.24,12,12985,United Kingd +581501,12/9/2019,22299,Pig Keyring With Light & Sound,7.24,48,12985,United Kingdom +581501,12/9/2019,22447,Pin Cushion Babushka Blue,7.24,12,12985,United Kingdom +581501,12/9/2019,22442,Grow Your Own Flowers Set Of 3,7.24,12,12985,United Kingdom +581501,12/9/2019,22495,Set Of 2 Round Tins Camembert,7.24,12,12985,United Kingdom +581501,12/9/2019,22544,Mini Jigsaw Spaceboy,7.24,96,12985,United Kingdom +581501,12/9/2019,22695,Wicker Wreath Small,7.24,24,12985,United Kingdom +581501,12/9/2019,22785,Squarecushion Cover Pink Union Jack,7.24,12,12985,United Kin +581501,12/9/2019,22811,Set Of 6 T-Lights Cacti,7.24,12,12985,United Kingdom +581501,12/9/2019,22807,Set Of 6 T-Lights Toadstools,7.24,12,12985,United Kingdom +581501,12/9/2019,22942,Christmas Lights 10 Santas,7.24,12,12985,United Kingdom +581501,12/9/2019,22808,Set Of 6 T-Lights Easter Chicks,6.19,12,12985,United Kingdom +581501,12/9/2019,23143,Zinc Wire Kitchen Organiser,7.24,4,12985,United Kingdom +581501,12/9/2019,23151,Zinc Sweetheart Soap Dish,7.24,12,12985,United Kingdom +581501,12/9/2019,23425,Storage Tin Home Sweet Home,7.24,12,12985,United Kingdom +581501,12/9/2019,84356,Pompom Curtain,7.24,12,12985,United Kingdom +581501,12/9/2019,85173,Set/6 Frog Prince T-Light Candles,7.24,12,12985,United Kingd +581501,12/9/2019,21731,Red Toadstool Led Night Light,7.24,24,12985,United Kingdom +581501,12/9/2019,23480,Mini Lights Woodland Mushrooms,7.24,8,12985,United Kingdom +581501,12/9/2019,22545,Mini Jigsaw Bunnies,7.24,96,12985,United Kingdom +581502,12/9/2019,22087,Paper Bunting White Lace,7.24,6,15910,United Kingdom +581502,12/9/2019,21209,Multicolour Honeycomb Fan,7.24,5,15910,United Kingdom +581502,12/9/2019,20668,Disco Ball Christmas Decoration,7.24,24,15910,United Kingdom +581502,12/9/2019,21790,Vintage Snap Cards,7.24,6,15910,United Kingdom +581502,12/9/2019,23270,Set Of 2 Ceramic Painted Hearts,7.24,4,15910,United Kingdom +581502,12/9/2019,23103,Jingle Bell Heart Decoration,7.24,8,15910,United Kingdom +581502,12/9/2019,22576,Swallow Wooden Christmas Decoration,7.24,2,15910,United King +581502,12/9/2019,22153,Angel Decoration Stars On Dress,7.24,13,15910,United Kingdom +581502,12/9/2019,21810,Christmas Hanging Star With Bell,7.24,6,15910,United Kingdom +581502,12/9/2019,22155,Star Decoration Rustic,7.24,6,15910,United Kingdom +581502,12/9/2019,23210,White Rocking Horse Hand Painted,7.24,12,15910,United Kingdo +581502,12/9/2019,22573,Star Wooden Christmas Decoration,7.24,8,15910,United Kingdom +581502,12/9/2019,22075,6 Ribbons Elegant Christmas,7.24,4,15910,United Kingdom +581502,12/9/2019,85049A,Traditional Christmas Ribbons,7.24,4,15910,United Kingdom +581502,12/9/2019,22734,Set Of 6 Ribbons Vintage Christmas,7.24,4,15910,United Kingd +581502,12/9/2019,23274,Star T-Light Holder Willie Winkie,7.24,8,15910,United Kingdo +581502,12/9/2019,22153,Angel Decoration Stars On Dress,7.24,1,15910,United Kingdom +581502,12/9/2019,22596,Christmas Star Wish List Chalkboard,7.24,24,15910,United Kin +581502,12/9/2019,22952,60 Cake Cases Vintage Christmas,7.24,10,15910,United Kingdom +581502,12/9/2019,22141,Christmas Craft Tree Top Angel,7.24,3,15910,United Kingdom +581514,12/9/2019,22753,Small Yellow Babushka Notebook,7.24,12,17754,United Kingdom +581514,12/9/2019,22755,Small Purple Babushka Notebook,7.24,12,17754,United Kingdom +581514,12/9/2019,22754,Small Red Babushka Notebook,6.19,12,17754,United Kingdom +581514,12/9/2019,22721,Set Of 3 Cake Tins Sketchbook,6.19,4,17754,United Kingdom +581514,12/9/2019,22059,Ceramic Strawberry Design Mug,6.19,12,17754,United Kingdom +581514,12/9/2019,22199,Frying Pan Red Retrospot,6.19,13,17754,United Kingdom +581514,12/9/2019,22200,Frying Pan Pink Polkadot,6.19,2,17754,United Kingdom +581514,12/9/2019,84032A,Charlie+Lola Pink Hot Water Bottle,6.19,9,17754,United King +581514,12/9/2019,84032B,Charlie + Lola Red Hot Water Bottle,6.19,9,17754,United Kin +581514,12/9/2019,84031A,Charlie+Lola Red Hot Water Bottle,6.19,10,17754,United King +581514,12/9/2019,84031B,Charlie Lola Blue Hot Water Bottle,6.19,14,17754,United Kin +581514,12/9/2019,22646,Ceramic Strawberry Cake Money Bank,6.19,4,17754,United Kingd +581514,12/9/2019,22644,Ceramic Cherry Cake Money Bank,6.19,4,17754,United Kingdom +581514,12/9/2019,22645,Ceramic Heart Fairy Cake Money Bank,6.19,4,17754,United King +581514,12/9/2019,22394,Paperweight Kings Choice,6.04,12,17754,United Kingdom +581514,12/9/2019,17091J,Vanilla Incense In Tin,6.04,66,17754,United Kingdom +581514,12/9/2019,35471D,Set Of 3 Bird Light Pink Feather,6.04,12,17754,United Kingd +581514,12/9/2019,22075,6 Ribbons Elegant Christmas,6.04,24,17754,United Kingdom +581514,12/9/2019,17091J,Vanilla Incense In Tin,6.19,24,17754,United Kingdom +581514,12/9/2019,22069,Brown Pirate Treasure Chest,6.19,20,17754,United Kingdom +581514,12/9/2019,22068,Black Pirate Treasure Chest,6.19,14,17754,United Kingdom +581514,12/9/2019,22500,Set Of 2 Tins Jardin De Provence,6.19,4,17754,United Kingdom +581514,12/9/2019,22075,6 Ribbons Elegant Christmas,6.19,24,17754,United Kingdom +581514,12/9/2019,21705,Bag 500g Swirly Marbles,6.19,84,17754,United Kingdom +581516,12/9/2019,21109,Large Cake Towel Chocolate Spots,6.19,12,14422,United Kingdo +581516,12/9/2019,21111,Swiss Roll Towel Chocolate Spots,6.19,24,14422,United Kingdo +581516,12/9/2019,21705,Bag 500g Swirly Marbles,6.19,24,14422,United Kingdom +581516,12/9/2019,22185,Slate Tile Natural Hanging,6.19,12,14422,United Kingdom +581516,12/9/2019,22442,Grow Your Own Flowers Set Of 3,6.19,12,14422,United Kingdom +581516,12/9/2019,21620,Set Of 4 Rose Botanical Candles,6.19,12,14422,United Kingdom +581516,12/9/2019,84029G,Knitted Union Flag Hot Water Bottle,6.19,8,14422,United Kin +581516,12/9/2019,21485,Retrospot Heart Hot Water Bottle,6.19,3,14422,United Kingdom +581516,12/9/2019,22111,Scottie Dog Hot Water Bottle,6.19,6,14422,United Kingdom +581516,12/9/2019,23355,Hot Water Bottle Keep Calm,6.19,8,14422,United Kingdom +581516,12/9/2019,22112,Chocolate Hot Water Bottle,6.19,6,14422,United Kingdom +581516,12/9/2019,23356,Love Hot Water Bottle,6.19,6,14422,United Kingdom +581516,12/9/2019,21108,Fairy Cake Flannel Assorted Colour,6.19,18,14422,United King +581516,12/9/2019,22171,3 Hook Photo Shelf Antique White,6.19,4,14422,United Kingdom +581516,12/9/2019,23301,Gardeners Kneeling Pad Keep Calm,6.19,24,14422,United Kingdo +581538,12/9/2019,23193,Buffalo Bill Treasure Book Box,6.19,6,14446,United Kingdom +581538,12/9/2019,23194,Gymkhana Treasure Book Box,6.19,1,14446,United Kingdom +581538,12/9/2019,23084,Rabbit Night Light,6.19,2,14446,United Kingdom +581538,12/9/2019,22068,Black Pirate Treasure Chest,6.19,1,14446,United Kingdom +581538,12/9/2019,22956,36 Foil Heart Cake Cases,6.19,1,14446,United Kingdom +581538,12/9/2019,20936,Forked Cactus Candle,6.19,1,14446,United Kingdom +581538,12/9/2019,23040,Paper Lantern 9 Point Snow Star,6.19,1,14446,United Kingdom +581538,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,6.19,1,14446,United King +581538,12/9/2019,21222,Set/4 Badges Beetles,6.19,1,14446,United Kingdom +581538,12/9/2019,21220,Set/4 Badges Dogs,6.19,1,14446,United Kingdom +581538,12/9/2019,21224,Set/4 Skull Badges,6.19,1,14446,United Kingdom +581538,12/9/2019,85123A,Cream Hanging Heart T-Light Holder,6.19,1,14446,United King +581538,12/9/2019,22992,Revolver Wooden Ruler,6.19,1,14446,United Kingdom +581538,12/9/2019,79066K,Retro Mod Tray,6.19,1,14446,United Kingdom +581538,12/9/2019,84380,Set Of 3 Butterfly Cookie Cutters,6.19,1,14446,United Kingdo +581538,12/9/2019,23371,Set 36 Colour Pencils Spaceboy,6.19,1,14446,United Kingdom +581538,12/9/2019,22694,Wicker Star,6.19,1,14446,United Kingdom +581538,12/9/2019,22095,Lads Only Tissue Box,6.19,1,14446,United Kingdom +581538,12/9/2019,23275,Set Of 3 Hanging Owls Ollie Beak,6.19,1,14446,United Kingdom +581538,12/9/2019,21673,White Spot Blue Ceramic Drawer Knob,6.19,1,14446,United King +581538,12/9/2019,21670,Blue Spot Ceramic Drawer Knob,6.19,1,14446,United Kingdom +581538,12/9/2019,85071C,"Charlie+Lola""Extremely Busy"" Sign",6.19,1,14446,United K +581538,12/9/2019,23349,Roll Wrap Vintage Christmas,6.19,3,14446,United Kingdom +581538,12/9/2019,23034,Drawer Knob Ceramic Black,6.19,1,14446,United Kingdom +581538,12/9/2019,21669,Blue Stripe Ceramic Drawer Knob,6.19,1,14446,United Kingdom +581538,12/9/2019,23033,Drawer Knob Ceramic Red,6.19,1,14446,United Kingdom +581538,12/9/2019,21668,Red Stripe Ceramic Drawer Knob,6.19,1,14446,United Kingdom +581538,12/9/2019,23275,Set Of 3 Hanging Owls Ollie Beak,6.19,1,14446,United Kingdom +581538,12/9/2019,23318,Box Of 6 Mini Vintage Crackers,6.19,1,14446,United Kingdom +581538,12/9/2019,23382,Box Of 6 Christmas Cake Decorations,6.19,1,14446,United King +581538,12/9/2019,22469,Heart Of Wicker Small,6.19,1,14446,United Kingdom +581538,12/9/2019,22899,Children's Apron Dolly Girl,6.19,2,14446,United Kingdom +581538,12/9/2019,22367,Childrens Apron Spaceboy Design,6.19,1,14446,United Kingdom +581538,12/9/2019,22899,Children's Apron Dolly Girl,6.19,3,14446,United Kingdom +581538,12/9/2019,23527,Wall Art Animals And Nature,6.19,1,14446,United Kingdom +581538,12/9/2019,23524,Wall Art Horse & Pony,6.19,1,14446,United Kingdom +581538,12/9/2019,23525,Wall Art Buffalo Bill,6.19,1,14446,United Kingdom +581538,12/9/2019,84380,Set Of 3 Butterfly Cookie Cutters,6.19,4,14446,United Kingdo +581538,12/9/2019,23122,Party Charms 50 Pieces,7.24,1,14446,United Kingdom +581538,12/9/2019,21990,Modern Floral Stationery Set,7.24,1,14446,United Kingdom +581538,12/9/2019,21329,Dinosaurs Writing Set,7.24,1,14446,United Kingdom +581538,12/9/2019,21328,Balloons Writing Set,7.24,1,14446,United Kingdom +581538,12/9/2019,22561,Wooden School Colouring Set,7.24,1,14446,United Kingdom +581538,12/9/2019,84519A,Tomato Charlie+Lola Coaster Set,7.24,1,14446,United Kingdom +581538,12/9/2019,84519B,Carrot Charlie+Lola Coaster Set,7.24,1,14446,United Kingdom +581538,12/9/2019,35004B,Set Of 3 Black Flying Ducks,7.24,2,14446,United Kingdom +581538,12/9/2019,22068,Black Pirate Treasure Chest,7.24,1,14446,United Kingdom +581538,12/9/2019,23353,6 Gift Tags Vintage Christmas,6.19,1,14446,United Kingdom +581538,12/9/2019,21591,Cosy Hour Cigar Box Matches,6.19,1,14446,United Kingdom +581538,12/9/2019,22197,Popcorn Holder,6.19,4,14446,United Kingdom +581538,12/9/2019,23320,Giant 50'S Christmas Cracker,6.19,1,14446,United Kingdom +581538,12/9/2019,23349,Roll Wrap Vintage Christmas,6.19,1,14446,United Kingdom +581538,12/9/2019,22985,Wrap Billboard Fonts Design,6.19,25,14446,United Kingdom +581538,12/9/2019,23040,Paper Lantern 9 Point Snow Star,6.19,2,14446,United Kingdom +581538,12/9/2019,23040,Paper Lantern 9 Point Snow Star,6.19,3,14446,United Kingdom +581538,12/9/2019,21194,Pink Honeycomb Paper Fan,6.19,2,14446,United Kingdom +581538,12/9/2019,21208,Pastel Colour Honeycomb Fan,6.19,1,14446,United Kingdom +581538,12/9/2019,79190D,Retro Plastic Daisy Tray,6.19,1,14446,United Kingdom +581538,12/9/2019,79190B,Retro Plastic Polka Tray,6.19,1,14446,United Kingdom +581538,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,6.02,2,14446,United King +581538,12/9/2019,23318,Box Of 6 Mini Vintage Crackers,6.02,1,14446,United Kingdom +581538,12/9/2019,23319,Box Of 6 Mini 50'S Crackers,6.02,1,14446,United Kingdom +581538,12/9/2019,23537,Wall Art I Love London,6.19,1,14446,United Kingdom +581538,12/9/2019,22992,Revolver Wooden Ruler,6.19,1,14446,United Kingdom +581538,12/9/2019,22991,Giraffe Wooden Ruler,6.19,1,14446,United Kingdom +581538,12/9/2019,23190,Bundle Of 3 School Exercise Books,6.19,1,14446,United Kingdo +581538,12/9/2019,21194,Pink Honeycomb Paper Fan,6.19,1,14446,United Kingdom +581538,12/9/2019,35004B,Set Of 3 Black Flying Ducks,6.19,1,14446,United Kingdom +581538,12/9/2019,22694,Wicker Star,6.19,1,14446,United Kingdom +581538,12/9/2019,21355,Toast Its - I Love You,6.19,1,14446,United Kingdom +581538,12/9/2019,23343,Jumbo Bag Vintage Christmas,6.19,1,14446,United Kingdom +581538,12/9/2019,23343,Jumbo Bag Vintage Christmas,6.19,1,14446,United Kingdom +581538,12/9/2019,20727,Lunch Bag Black Skull,6.19,1,14446,United Kingdom +581538,12/9/2019,20725,Lunch Bag Red Retrospot,6.19,1,14446,United Kingdom +581566,12/9/2019,23404,Home Sweet Home Blackboard,6.19,144,18102,United Kingdom +581567,12/9/2019,21417,Cockle Shell Dish,6.19,84,16626,United Kingdom +581567,12/9/2019,22464,Hanging Metal Heart Lantern,6.19,24,16626,United Kingdom +581567,12/9/2019,22465,Hanging Metal Star Lantern,6.19,24,16626,United Kingdom +581567,12/9/2019,84971S,Small Heart Flowers Hook,6.19,48,16626,United Kingdom +581567,12/9/2019,22624,Ivory Kitchen Scales,6.19,2,16626,United Kingdom +581567,12/9/2019,22627,Mint Kitchen Scales,6.19,2,16626,United Kingdom +581567,12/9/2019,22625,Red Kitchen Scales,6.19,2,16626,United Kingdom +581567,12/9/2019,23355,Hot Water Bottle Keep Calm,6.19,4,16626,United Kingdom +581567,12/9/2019,21326,Aged Glass Silver T-Light Holder,6.19,144,16626,United Kingd +581567,12/9/2019,21479,White Skull Hot Water Bottle,6.19,4,16626,United Kingdom +581567,12/9/2019,23356,Love Hot Water Bottle,6.19,3,16626,United Kingdom +581567,12/9/2019,21137,Black Record Cover Frame,6.19,24,16626,United Kingdom +581570,12/9/2019,22141,Christmas Craft Tree Top Angel,6.19,6,12662,Germany +581570,12/9/2019,22175,Pink Owl Soft Toy,6.19,6,12662,Germany +581570,12/9/2019,21481,Fawn Blue Hot Water Bottle,6.19,4,12662,Germany +581570,12/9/2019,23570,Traditional Pick Up Sticks Game,6.19,12,12662,Germany +581570,12/9/2019,22326,Round Snack Boxes Set Of4 Woodland,6.19,6,12662,Germany +581570,12/9/2019,22331,Woodland Party Bag + Sticker Set,6.19,8,12662,Germany +581570,12/9/2019,22834,Hand Warmer Babushka Design,6.19,12,12662,Germany +581570,12/9/2019,21914,Blue Harmonica In Box,6.19,12,12662,Germany +581570,12/9/2019,22139,Retrospot Tea Set Ceramic 11 Pc,6.19,3,12662,Germany +581570,12/9/2019,23077,Doughnut Lip Gloss,6.19,20,12662,Germany +581570,12/9/2019,20750,Red Retrospot Mini Cases,6.19,2,12662,Germany +581570,12/9/2019,22505,Memo Board Cottage Design,6.19,4,12662,Germany +581571,12/9/2019,23326,Hanging Mini Coloured Bottles,6.19,6,15311,United Kingdom +581571,12/9/2019,21313,Glass Heart T-Light Holder,6.19,1,15311,United Kingdom +581571,12/9/2019,48187,Doormat New England,6.19,1,15311,United Kingdom +581571,12/9/2019,23317,Blue Refectory Clock,6.19,1,15311,United Kingdom +581571,12/9/2019,23197,Sketchbook Magnetic Shopping List,6.19,4,15311,United Kingdo +581571,12/9/2019,21012,Antique All Glass Candlestick,6.19,2,15311,United Kingdom +581571,12/9/2019,22227,Hanging Heart Mirror Decoration,6.19,10,15311,United Kingdom +581571,12/9/2019,22794,Sweetheart Wire Magazine Rack,6.19,1,15311,United Kingdom +581571,12/9/2019,23182,Toilet Sign Occupied Or Vacant,6.19,1,15311,United Kingdom +581571,12/9/2019,21755,Love Building Block Word,6.19,1,15311,United Kingdom +581571,12/9/2019,85053,French Enamel Candleholder,6.19,2,15311,United Kingdom +581571,12/9/2019,23110,Parisienne Key Cabinet,6.19,2,15311,United Kingdom +581571,12/9/2019,21169,You're Confusing Me Metal Sign,6.19,1,15311,United Kingdom +581571,12/9/2019,21258,Victorian Sewing Box Large,6.19,8,15311,United Kingdom +581571,12/9/2019,23168,Classic Cafe Sugar Dispenser,6.19,36,15311,United Kingdom +581571,12/9/2019,23167,Small Ceramic Top Storage Jar,6.19,96,15311,United Kingdom +581571,12/9/2019,21314,Small Glass Heart Trinket Pot,6.19,48,15311,United Kingdom +581571,12/9/2019,21137,Black Record Cover Frame,6.19,24,15311,United Kingdom +581571,12/9/2019,44234,Assorted Circular Mobile,6.19,1,15311,United Kingdom +581571,12/9/2019,84347,Rotating Silver Angels T-Light Hldr,6.19,24,15311,United Kin +581572,12/9/2019,23328,Set 6 School Milk Bottles In Crate,6.19,48,16705,United King +581572,12/9/2019,22627,Mint Kitchen Scales,6.19,4,16705,United Kingdom +581572,12/9/2019,22624,Ivory Kitchen Scales,6.19,4,16705,United Kingdom +581572,12/9/2019,23245,Set Of 3 Regency Cake Tins,6.19,4,16705,United Kingdom +581574,12/9/2019,22326,Round Snack Boxes Set Of4 Woodland,6.19,6,12526,Germany +581574,12/9/2019,22328,Round Snack Boxes Set Of 4 Fruits,6.19,6,12526,Germany +581574,12/9/2019,23238,Set Of 4 Knick Knack Tins London,6.19,6,12526,Germany +581574,12/9/2019,23237,Set Of 4 Knick Knack Tins Leaf,6.19,6,12526,Germany +581574,12/9/2019,21257,Victorian Sewing Box Medium,6.19,2,12526,Germany +581574,12/9/2019,21258,Victorian Sewing Box Large,6.19,2,12526,Germany +581574,12/9/2019,23111,Parisienne Sewing Box,6.19,2,12526,Germany +581574,12/9/2019,22077,6 Ribbons Rustic Charm,6.19,12,12526,Germany +581574,12/9/2019,22074,6 Ribbons Shimmering Pinks,6.19,12,12526,Germany +581574,12/9/2019,22621,Traditional Knitting Nancy,6.19,12,12526,Germany +581574,12/9/2019,23199,Jumbo Bag Apples,6.19,10,12526,Germany +581574,12/9/2019,23581,Jumbo Bag Paisley Park,6.19,10,12526,Germany +581578,12/9/2019,21124,Set/10 Blue Polkadot Party Candles,6.19,24,12713,Germany +581578,12/9/2019,21122,Set/10 Pink Polkadot Party Candles,6.19,24,12713,Germany +581578,12/9/2019,21121,Set/10 Red Polkadot Party Candles,6.19,24,12713,Germany +581578,12/9/2019,23389,Spaceboy Mini Backpack,6.04,4,12713,Germany +581578,12/9/2019,22556,Plasters In Tin Circus Parade,6.19,12,12713,Germany +581578,12/9/2019,22976,Circus Parade Childrens Egg Cup,6.19,12,12713,Germany +581578,12/9/2019,23255,Childrens Cutlery Circus Parade,7.24,12,12713,Germany +581578,12/9/2019,84997D,Childrens Cutlery Polkadot Pink,7.24,8,12713,Germany +581578,12/9/2019,84997B,Childrens Cutlery Retrospot Red,7.24,8,12713,Germany +581578,12/9/2019,84997C,Childrens Cutlery Polkadot Blue,7.24,8,12713,Germany +581578,12/9/2019,22555,Plasters In Tin Strongman,7.24,12,12713,Germany +581578,12/9/2019,21914,Blue Harmonica In Box,7.24,12,12713,Germany +581578,12/9/2019,22549,Picture Dominoes,7.24,24,12713,Germany +581578,12/9/2019,21918,Set 12 Kids Colour Chalk Sticks,7.24,24,12713,Germany +581578,12/9/2019,22992,Revolver Wooden Ruler,7.24,12,12713,Germany +581578,12/9/2019,22991,Giraffe Wooden Ruler,7.24,12,12713,Germany +581578,12/9/2019,23229,Vintage Donkey Tail Game,7.24,6,12713,Germany +581578,12/9/2019,22622,Box Of Vintage Alphabet Blocks,6.19,6,12713,Germany +581578,12/9/2019,21506,Fancy Font Birthday Card,6.19,12,12713,Germany +581578,12/9/2019,21507,Elephant Birthday Card,6.19,12,12713,Germany +581578,12/9/2019,23037,Candle Holder Silver Madeline,6.19,12,12713,Germany +581578,12/9/2019,23550,Wrap Alphabet Poster,6.19,25,12713,Germany +581578,12/9/2019,22711,Wrap Circus Parade,6.19,25,12713,Germany +581578,12/9/2019,21497,Fancy Fonts Birthday Wrap,6.19,25,12713,Germany +581578,12/9/2019,22704,Wrap Red Apples,6.19,25,12713,Germany +581578,12/9/2019,22585,Pack Of 6 Birdy Gift Tags,6.19,12,12713,Germany diff --git a/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/go-challenge/main.go b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/go-challenge/main.go new file mode 100644 index 000000000000..7161dcc40fc3 --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/go-challenge/main.go @@ -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. + */ + +// beam-playground: +// name: FinalChallenge1 +// description: Final challenge 1. +// multifile: true +// files: +// - name: input.csv +// context_line: 54 +// categories: +// - Quickstart +// complexity: ADVANCED +// tags: +// - hellobeam + +package main + +import ( + "context" + "github.com/apache/beam/sdks/v2/go/pkg/beam" + "github.com/apache/beam/sdks/v2/go/pkg/beam/io/textio" + "github.com/apache/beam/sdks/v2/go/pkg/beam/x/beamx" + "log" +) + +type Transaction struct { + ID int64 + Date string + ProductID string + ProductName string + Price float64 + Quantity int64 + CustomerID int64 + Country string +} + +func main() { + beam.Init() + p := beam.NewPipeline() + s := p.Root() + + file := textio.Read(s, "input.csv") + + textio.Write(s, "price_less_than_10.txt", file) + + if err := beamx.Run(context.Background(), p); err != nil { + log.Fatalf("Failed to execute job: %v", err) + } +} diff --git a/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/go-solution/input.csv b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/go-solution/input.csv new file mode 100644 index 000000000000..85854a2d4358 --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/go-solution/input.csv @@ -0,0 +1,1500 @@ +TransactionNo,Date,ProductNo,ProductName,Price,Quantity,CustomerNo,Country +581482,12/9/2019,22485,Set Of 2 Wooden Market Crates,21.47,12,17490,United Kingdom +581475,12/9/2019,22596,Christmas Star Wish List Chalkboard,10.65,36,13069,United Ki +581475,12/9/2019,23235,Storage Tin Vintage Leaf,11.53,12,13069,United Kingdom +581475,12/9/2019,23272,Tree T-Light Holder Willie Winkie,10.65,12,13069,United King +581475,12/9/2019,23239,Set Of 4 Knick Knack Tins Poppies,11.94,6,13069,United Kingd +581475,12/9/2019,21705,Bag 500g Swirly Marbles,10.65,24,13069,United Kingdom +581475,12/9/2019,22118,Joy Wooden Block Letters,11.53,18,13069,United Kingdom +581475,12/9/2019,22119,Peace Wooden Block Letters,12.25,12,13069,United Kingdom +581475,12/9/2019,22217,T-Light Holder Hanging Lace,10.65,12,13069,United Kingdom +581475,12/9/2019,22216,T-Light Holder White Lace,10.55,24,13069,United Kingdom +581475,12/9/2019,22380,Toy Tidy Spaceboy,11.06,20,13069,United Kingdom +581475,12/9/2019,22442,Grow Your Own Flowers Set Of 3,12.25,12,13069,United Kingdom +581475,12/9/2019,22664,Toy Tidy Dolly Girl Design,11.06,20,13069,United Kingdom +581475,12/9/2019,22721,Set Of 3 Cake Tins Sketchbook,12.25,12,13069,United Kingdom +581475,12/9/2019,22723,Set Of 6 Herb Tins Sketchbook,11.53,12,13069,United Kingdom +581475,12/9/2019,22785,Squarecushion Cover Pink Union Jack,11.53,12,13069,United Ki +581475,12/9/2019,22955,36 Foil Star Cake Cases,11.06,24,13069,United Kingdom +581475,12/9/2019,23141,Triple Wire Hook Pink Heart,11.06,12,13069,United Kingdom +581475,12/9/2019,22956,36 Foil Heart Cake Cases,11.06,24,13069,United Kingdom +581475,12/9/2019,22581,Wood Stocking Christmas Scandispot,10.55,48,13069,United Kin +581476,12/9/2019,23198,Pantry Magnetic Shopping List,11.53,48,12433,Norway +581476,12/9/2019,23197,Sketchbook Magnetic Shopping List,11.74,24,12433,Norway +581476,12/9/2019,23184,Bull Dog Bottle Opener,15.32,8,12433,Norway +581476,12/9/2019,23168,Classic Cafe Sugar Dispenser,11.53,12,12433,Norway +581476,12/9/2019,23167,Small Ceramic Top Storage Jar,10.96,96,12433,Norway +581476,12/9/2019,23166,Medium Ceramic Top Storage Jar,11.32,48,12433,Norway +581476,12/9/2019,23165,Large Ceramic Top Storage Jar,11.74,48,12433,Norway +581476,12/9/2019,23004,Travel Card Wallet Pantry,10.68,48,12433,Norway +581476,12/9/2019,23002,Travel Card Wallet Skulls,10.68,24,12433,Norway +581476,12/9/2019,23000,Travel Card Wallet Transport,10.68,24,12433,Norway +581476,12/9/2019,22998,Travel Card Wallet Keep Calm,10.68,72,12433,Norway +581476,12/9/2019,22994,Travel Card Wallet Retrospot,10.68,48,12433,Norway +581476,12/9/2019,22835,Hot Water Bottle I Am So Poorly,15.32,8,12433,Norway +581476,12/9/2019,22730,Alarm Clock Bakelike Ivory,14.09,4,12433,Norway +581476,12/9/2019,22728,Alarm Clock Bakelike Pink,14.09,8,12433,Norway +581476,12/9/2019,22727,Alarm Clock Bakelike Red,14.09,8,12433,Norway +581476,12/9/2019,22726,Alarm Clock Bakelike Green,14.09,4,12433,Norway +581476,12/9/2019,22720,Set Of 3 Cake Tins Pantry Design,14.61,16,12433,Norway +581476,12/9/2019,22693,Grow A Flytrap Or Sunflower In Tin,11.34,192,12433,Norway +581476,12/9/2019,22670,French Wc Sign Blue Metal,11.53,24,12433,Norway +581476,12/9/2019,22667,Recipe Box Retrospot,12.86,24,12433,Norway +581476,12/9/2019,22666,Recipe Box Pantry Yellow Design,12.86,24,12433,Norway +581476,12/9/2019,22631,Circus Parade Lunch Box,12.25,12,12433,Norway +581476,12/9/2019,22628,Picnic Boxes Set Of 3 Retrospot,15.32,16,12433,Norway +581476,12/9/2019,22467,Gumball Coat Rack,12.86,6,12433,Norway +581476,12/9/2019,22197,Popcorn Holder,10.99,100,12433,Norway +581476,12/9/2019,22114,Hot Water Bottle Tea And Sympathy,14.61,8,12433,Norway +581476,12/9/2019,22112,Chocolate Hot Water Bottle,15.32,9,12433,Norway +581476,12/9/2019,21908,Chocolate This Way Metal Sign,12.40,36,12433,Norway +581476,12/9/2019,21874,Gin And Tonic Mug,11.74,36,12433,Norway +581476,12/9/2019,21872,Glamorous Mug,11.53,12,12433,Norway +581476,12/9/2019,21871,Save The Planet Mug,11.74,36,12433,Norway +581476,12/9/2019,21533,Retrospot Large Milk Jug,15.32,6,12433,Norway +581476,12/9/2019,21481,Fawn Blue Hot Water Bottle,14.09,12,12433,Norway +581476,12/9/2019,21479,White Skull Hot Water Bottle,14.61,4,12433,Norway +581476,12/9/2019,21248,Door Hanger Mum + Dads Room,11.74,12,12433,Norway +581476,12/9/2019,21216,Set 3 Retrospot Tea/Coffee/Sugar,14.61,24,12433,Norway +581476,12/9/2019,21181,Please One Person Metal Sign,12.15,48,12433,Norway +581476,12/9/2019,21175,Gin And Tonic Diet Metal Sign,12.38,48,12433,Norway +581476,12/9/2019,21169,You're Confusing Me Metal Sign,11.74,48,12433,Norway +581476,12/9/2019,21162,Toxic Area Door Hanger,10.65,24,12433,Norway +581476,12/9/2019,21159,Moody Boy Door Hanger,10.65,24,12433,Norway +581476,12/9/2019,21158,Moody Girl Door Hanger,10.65,24,12433,Norway +581476,12/9/2019,21154,Red Retrospot Oven Glove,11.53,10,12433,Norway +581476,12/9/2019,16016,Large Chinese Style Scissor,11.12,40,12433,Norway +581476,12/9/2019,16014,Small Chinese Style Scissor,10.68,60,12433,Norway +581476,12/9/2019,16008,Small Folding Scissor(Pointed Edge),10.37,240,12433,Norway +581476,12/9/2019,85152,Hand Over The Chocolate Sign,12.15,48,12433,Norway +581476,12/9/2019,84596F,Small Marshmallows Pink Bowl,10.68,32,12433,Norway +581476,12/9/2019,84596B,Small Dolly Mix Design Orange Bowl,10.68,16,12433,Norway +581476,12/9/2019,84510A,Set Of 4 English Rose Coasters,11.53,20,12433,Norway +581476,12/9/2019,82600,N0 Singing Metal Sign,12.15,48,12433,Norway +581476,12/9/2019,82581,Toilet Metal Sign,10.81,48,12433,Norway +581476,12/9/2019,72232,Feng Shui Pillar Candle,10.44,144,12433,Norway +581476,12/9/2019,47559B,Tea Time Oven Glove,11.53,10,12433,Norway +581476,12/9/2019,47504H,English Rose Spirit Level,11.06,36,12433,Norway +581476,12/9/2019,23493,Vintage Doily Travel Sewing Kit,12.25,30,12433,Norway +581476,12/9/2019,23430,Blue Retro Kitchen Wall Clock,18.60,2,12433,Norway +581476,12/9/2019,23429,Red Retro Kitchen Wall Clock,18.60,2,12433,Norway +581476,12/9/2019,23428,Ivory Retro Kitchen Wall Clock,18.60,2,12433,Norway +581476,12/9/2019,23358,Hot Stuff Hot Water Bottle,11.53,18,12433,Norway +581476,12/9/2019,23293,Set Of 12 Fairy Cake Baking Cases,11.10,32,12433,Norway +581476,12/9/2019,23243,Set Of Tea Coffee Sugar Tins Pantry,15.32,12,12433,Norway +581476,12/9/2019,23240,Set Of 4 Knick Knack Tins Doily,14.50,6,12433,Norway +581477,12/9/2019,48111,Doormat 3 Smiley Cats,17.51,10,13426,United Kingdom +581477,12/9/2019,22464,Hanging Metal Heart Lantern,11.06,12,13426,United Kingdom +581477,12/9/2019,20982,12 Pencils Tall Tube Skulls,11.12,12,13426,United Kingdom +581477,12/9/2019,20981,12 Pencils Tall Tube Woodland,11.12,12,13426,United Kingdom +581477,12/9/2019,23424,Gingham Recipe Book Box,15.32,8,13426,United Kingdom +581477,12/9/2019,23338,Egg Frying Pan Red,12.15,48,13426,United Kingdom +581477,12/9/2019,84970L,Single Heart Zinc T-Light Holder,11.53,12,13426,United King +581477,12/9/2019,22457,Natural Slate Heart Chalkboard,13.27,6,13426,United Kingdom +581477,12/9/2019,22469,Heart Of Wicker Small,11.94,12,13426,United Kingdom +581477,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,11.12,12,13426,United Ki +581478,12/9/2019,84947,Antique Silver Tea Glass Engraved,11.53,24,17364,United King +581478,12/9/2019,23503,Playing Cards Keep Calm & Carry On,11.53,12,17364,United Kin +581478,12/9/2019,23445,Ice Cream Bubbles,11.10,20,17364,United Kingdom +581478,12/9/2019,23530,Wall Art Only One Person,15.32,12,17364,United Kingdom +581478,12/9/2019,84997C,Childrens Cutlery Polkadot Blue,14.50,4,17364,United Kingdo +581478,12/9/2019,84997D,Childrens Cutlery Polkadot Pink,14.50,4,17364,United Kingdo +581478,12/9/2019,84077,World War 2 Gliders Asstd Designs,10.55,48,17364,United King +581478,12/9/2019,22749,Feltcraft Princess Charlotte Doll,14.09,4,17364,United Kingd +581478,12/9/2019,23127,Feltcraft Girl Nicole Kit,15.32,4,17364,United Kingdom +581478,12/9/2019,23126,Feltcraft Girl Amelie Kit,15.32,4,17364,United Kingdom +581478,12/9/2019,22747,Poppy's Playhouse Bathroom,12.40,6,17364,United Kingdom +581478,12/9/2019,22078,Ribbon Reel Lace Design,12.40,10,17364,United Kingdom +581478,12/9/2019,84946,Antique Silver T-Light Glass,11.53,12,17364,United Kingdom +581478,12/9/2019,22791,T-Light Glass Fluted Antique,11.53,12,17364,United Kingdom +581478,12/9/2019,21326,Aged Glass Silver T-Light Holder,10.92,12,17364,United Kingd +581478,12/9/2019,22170,Picture Frame Wood Triple Portrait,17.17,8,17364,United King +581478,12/9/2019,23082,Set 6 Paper Table Lantern Hearts,14.09,6,17364,United Kingdo +581478,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,11.12,24,17364,United Ki +581479,12/9/2019,22087,Paper Bunting White Lace,13.27,10,17364,United Kingdom +581480,12/9/2019,23464,Vintage Zinc Watering Can Small,15.32,4,14441,United Kingdom +581480,12/9/2019,22411,Jumbo Shopper Vintage Red Paisley,12.38,10,14441,United King +581480,12/9/2019,84029E,Red Woolly Hottie White Heart,14.61,8,14441,United Kingdom +581480,12/9/2019,22633,Hand Warmer Union Jack,12.40,12,14441,United Kingdom +581480,12/9/2019,23355,Hot Water Bottle Keep Calm,15.32,12,14441,United Kingdom +581480,12/9/2019,84029G,Knitted Union Flag Hot Water Bottle,14.61,12,14441,United K +581480,12/9/2019,22112,Chocolate Hot Water Bottle,15.32,6,14441,United Kingdom +581480,12/9/2019,84347,Rotating Silver Angels T-Light Hldr,12.86,18,14441,United Ki +581481,12/9/2019,21115,Rose Caravan Doorstop,12.25,8,17490,United Kingdom +581481,12/9/2019,22059,Ceramic Strawberry Design Mug,10.65,24,17490,United Kingdom +581481,12/9/2019,22072,Red Retrospot Tea Cup And Saucer,11.53,24,17490,United Kingd +581481,12/9/2019,22123,Ping Microwave Apron,11.06,24,17490,United Kingdom +581481,12/9/2019,22476,Empire Union Jack Tv Dinner Tray,12.25,8,17490,United Kingdo +581481,12/9/2019,22495,Set Of 2 Round Tins Camembert,11.06,12,17490,United Kingdom +581481,12/9/2019,22496,Set Of 2 Round Tins Dutch Cheese,11.06,12,17490,United Kingd +581481,12/9/2019,22513,Doorstop Football Design,11.06,8,17490,United Kingdom +581481,12/9/2019,22500,Set Of 2 Tins Jardin De Provence,11.53,12,17490,United Kingd +581481,12/9/2019,22664,Toy Tidy Dolly Girl Design,11.06,20,17490,United Kingdom +581481,12/9/2019,22721,Set Of 3 Cake Tins Sketchbook,12.25,12,17490,United Kingdom +581481,12/9/2019,22785,Squarecushion Cover Pink Union Jack,11.53,12,17490,United Ki +581481,12/9/2019,23178,Jam Clock Magnet,11.53,12,17490,United Kingdom +581481,12/9/2019,23302,Kneeling Mat Housework Design,11.06,24,17490,United Kingdom +581481,12/9/2019,23533,Wall Art Garden Haven,12.25,6,17490,United Kingdom +581481,12/9/2019,84819,Danish Rose Round Sewing Box,11.06,16,17490,United Kingdom +581482,12/9/2019,22371,Airline Bag Vintage Tokyo 78,14.30,12,17490,United Kingdom +581482,12/9/2019,21875,Kings Choice Mug,11.34,36,17490,United Kingdom +581482,12/9/2019,23251,Vintage Red Enamel Trim Mug,11.32,96,17490,United Kingdom +581482,12/9/2019,23300,Gardeners Kneeling Pad Cup Of Tea,11.74,48,17490,United King +581482,12/9/2019,22138,Baking Set 9 Piece Retrospot,14.61,24,17490,United Kingdom +581483,12/9/2019,23843,Paper Craft Little Birdie,12.38,80995,16446,United Kingdom +581485,12/9/2019,22617,Baking Set Spaceboy Design,15.32,18,17389,United Kingdom +581485,12/9/2019,20749,Assorted Colour Mini Cases,16.76,84,17389,United Kingdom +581486,12/9/2019,22910,Paper Chain Kit Vintage Christmas,13.27,12,17001,United King +581486,12/9/2019,22086,Paper Chain Kit 50'S Christmas,13.27,12,17001,United Kingdom +581486,12/9/2019,23351,Roll Wrap 50'S Christmas,6.19,12,17001,United Kingdom +581486,12/9/2019,23352,Roll Wrap 50'S Red Christmas,6.19,12,17001,United Kingdom +581486,12/9/2019,22727,Alarm Clock Bakelike Red,6.19,8,17001,United Kingdom +581486,12/9/2019,22730,Alarm Clock Bakelike Ivory,6.19,4,17001,United Kingdom +581486,12/9/2019,22491,Pack Of 12 Coloured Pencils,6.04,12,17001,United Kingdom +581486,12/9/2019,22561,Wooden School Colouring Set,6.04,12,17001,United Kingdom +581486,12/9/2019,22489,Pack Of 12 Traditional Crayons,6.04,24,17001,United Kingdom +581486,12/9/2019,22560,Traditional Modelling Clay,6.04,24,17001,United Kingdom +581486,12/9/2019,22139,Retrospot Tea Set Ceramic 11 Pc,6.04,6,17001,United Kingdom +581486,12/9/2019,23344,Jumbo Bag 50'S Christmas,6.19,20,17001,United Kingdom +581486,12/9/2019,23203,Jumbo Bag Vintage Doily,6.19,20,17001,United Kingdom +581486,12/9/2019,85099B,Jumbo Bag Red Retrospot,6.19,10,17001,United Kingdom +581486,12/9/2019,23201,Jumbo Bag Alphabet,6.19,20,17001,United Kingdom +581486,12/9/2019,23207,Lunch Bag Alphabet Design,6.19,10,17001,United Kingdom +581487,12/9/2019,21137,Black Record Cover Frame,6.04,120,15694,United Kingdom +581488,12/9/2019,23118,Parisienne Jewellery Drawer,6.04,16,17428,United Kingdom +581488,12/9/2019,23111,Parisienne Sewing Box,6.04,16,17428,United Kingdom +581488,12/9/2019,22179,Set 10 Night Owl Lights,6.04,24,17428,United Kingdom +581489,12/9/2019,22061,Large Cake Stand Hanging Strawbery,7.24,48,16954,United King +581489,12/9/2019,22182,Cake Stand Victorian Filigree Small,7.24,24,16954,United Kin +581491,12/9/2019,23571,Traditional Naughts & Crosses,7.24,12,12433,Norway +581492,12/9/2019,23369,Set 36 Colour Pencils Love London,6.19,2,15492,United Kingdo +581492,12/9/2019,23370,Set 36 Colouring Pencils Doily,6.19,2,15492,United Kingdom +581492,12/9/2019,23371,Set 36 Colour Pencils Spaceboy,6.19,3,15492,United Kingdom +581492,12/9/2019,23372,Set 36 Colour Pencils Dolly Girl,6.19,1,15492,United Kingdom +581492,12/9/2019,23376,Pack Of 12 Vintage Christmas Tissue,6.19,3,15492,United King +581492,12/9/2019,23377,Pack Of 12 Dolly Girl Tissues,6.19,6,15492,United Kingdom +581492,12/9/2019,23378,Pack Of 12 50'S Christmas Tissues,6.19,9,15492,United Kingdo +581492,12/9/2019,23379,Pack Of 12 Red Apple Tissues,6.19,4,15492,United Kingdom +581492,12/9/2019,23380,Pack Of 12 Vintage Doily Tissues,6.19,3,15492,United Kingdom +581492,12/9/2019,23381,Pack Of 12 Vintage Leaf Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,23382,Box Of 6 Christmas Cake Decorations,6.19,4,15492,United King +581492,12/9/2019,23391,I Love London Mini Backpack,6.19,2,15492,United Kingdom +581492,12/9/2019,23392,Spaceboy Rocket Lolly Makers,6.19,2,15492,United Kingdom +581492,12/9/2019,23399,Home Sweet Home Hanging Heart,6.19,4,15492,United Kingdom +581492,12/9/2019,23405,Home Sweet Home 2 Drawer Cabinet,6.19,3,15492,United Kingdom +581492,12/9/2019,23418,Lavender Toilette Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,23426,Metal Sign Drop Your Pants,6.19,1,15492,United Kingdom +581492,12/9/2019,23434,3 Raffia Ribbons 50'S Christmas,6.19,9,15492,United Kingdom +581492,12/9/2019,23435,3 Raffia Ribbons Vintage Christmas,6.04,3,15492,United Kingd +581492,12/9/2019,23439,Hand Warmer Red Love Heart,6.19,1,15492,United Kingdom +581492,12/9/2019,23451,Square Mini Portrait Frame,6.19,1,15492,United Kingdom +581492,12/9/2019,23467,Vintage Zinc Planter,6.19,1,15492,United Kingdom +581492,12/9/2019,23469,Card Holder Love Bird Small,6.19,3,15492,United Kingdom +581492,12/9/2019,23480,Mini Lights Woodland Mushrooms,6.19,2,15492,United Kingdom +581492,12/9/2019,23493,Vintage Doily Travel Sewing Kit,6.19,3,15492,United Kingdom +581492,12/9/2019,23494,Vintage Doily Deluxe Sewing Kit,6.19,1,15492,United Kingdom +581492,12/9/2019,23495,Set Of 3 Pantry Wooden Spoons,6.19,1,15492,United Kingdom +581492,12/9/2019,23497,Classic Chrome Bicycle Bell,6.19,4,15492,United Kingdom +581492,12/9/2019,23498,Classic Bicycle Clips,6.19,2,15492,United Kingdom +581492,12/9/2019,23501,Key Ring Baseball Boot Union Jack,6.19,3,15492,United Kingdo +581492,12/9/2019,23506,Mini Playing Cards Spaceboy,6.04,1,15492,United Kingdom +581492,12/9/2019,23508,Mini Playing Cards Dolly Girl,6.04,2,15492,United Kingdom +581492,12/9/2019,23510,Mini Playing Cards Gymkhana,6.04,1,15492,United Kingdom +581492,12/9/2019,23521,Wall Art Cat And Bird,6.04,1,15492,United Kingdom +581492,12/9/2019,23526,Wall Art Dog Licence,6.04,4,15492,United Kingdom +581492,12/9/2019,23530,Wall Art Only One Person,6.04,2,15492,United Kingdom +581492,12/9/2019,23534,Wall Art Stop For Tea,6.19,6,15492,United Kingdom +581492,12/9/2019,23535,Wall Art Bicycle Safety,6.19,4,15492,United Kingdom +581492,12/9/2019,23536,Wall Art Village Show,6.19,1,15492,United Kingdom +581492,12/9/2019,23538,Wall Art Vintage Heart,6.19,1,15492,United Kingdom +581492,12/9/2019,23551,Pack Of 12 Paisley Park Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,23552,Bicycle Puncture Repair Kit,6.19,12,15492,United Kingdom +581492,12/9/2019,23555,Landmark Frame Notting Hill,6.19,1,15492,United Kingdom +581492,12/9/2019,23559,Woodland Bunnies Lolly Makers,6.19,5,15492,United Kingdom +581492,12/9/2019,23561,Set Of 6 Ribbons Party,6.19,1,15492,United Kingdom +581492,12/9/2019,23564,Egg Cup Milkmaid Ingrid,6.19,2,15492,United Kingdom +581492,12/9/2019,23565,Egg Cup Milkmaid Helga,6.19,2,15492,United Kingdom +581492,12/9/2019,23567,Egg Cup Henrietta Hen Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,23569,Tradtional Alphabet Stamp Set,6.19,2,15492,United Kingdom +581492,12/9/2019,23570,Traditional Pick Up Sticks Game,6.19,7,15492,United Kingdom +581492,12/9/2019,23571,Traditional Naughts & Crosses,6.19,2,15492,United Kingdom +581492,12/9/2019,23575,Snack Tray Paisley Park,6.19,3,15492,United Kingdom +581492,12/9/2019,23579,Snack Tray I Love London,6.19,1,15492,United Kingdom +581492,12/9/2019,23611,Set 10 Cards Red Riding Hood 17214,6.19,3,15492,United Kingd +581492,12/9/2019,23616,Set 10 Cards Jingle Bells 17217,6.19,1,15492,United Kingdom +581492,12/9/2019,23621,Set 10 Cards David's Madonna 17074,6.19,3,15492,United Kingd +581492,12/9/2019,23635,Set 10 Cards Christmas Holly 17259,6.19,1,15492,United Kingd +581492,12/9/2019,23644,Set 10 Cards Christmas Tree 16955,6.19,1,15492,United Kingdo +581492,12/9/2019,23660,Henrietta Hen Mug,6.19,1,15492,United Kingdom +581492,12/9/2019,23661,Milk Maids Mug,6.19,1,15492,United Kingdom +581492,12/9/2019,35095A,Blue Victorian Fabric Oval Box,6.19,1,15492,United Kingdom +581492,12/9/2019,35095B,Red Victorian Fabric Oval Box,6.19,1,15492,United Kingdom +581492,12/9/2019,35646,Vintage Bead Pink Evening Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,35648,Vintage Bead Pink Purse,6.19,2,15492,United Kingdom +581492,12/9/2019,35953,Folkart Star Christmas Decorations,6.19,12,15492,United King +581492,12/9/2019,35964,Folkart Clip On Stars,6.19,4,15492,United Kingdom +581492,12/9/2019,35970,Zinc Folkart Sleigh Bells,6.04,1,15492,United Kingdom +581492,12/9/2019,46118,Funky Monkey Cushion Cover,6.19,1,15492,United Kingdom +581492,12/9/2019,46776A,Woven Bubble Gum Cushion Cover,7.24,2,15492,United Kingdom +581492,12/9/2019,46776B,Woven Berries Cushion Cover,7.24,3,15492,United Kingdom +581492,12/9/2019,46776C,Woven Frost Cushion Cover,7.24,1,15492,United Kingdom +581492,12/9/2019,46776D,Woven Sunset Cushion Cover,7.24,2,15492,United Kingdom +581492,12/9/2019,46776E,Woven Candy Cushion Cover,7.24,5,15492,United Kingdom +581492,12/9/2019,46776F,Woven Rose Garden Cushion Cover,7.24,6,15492,United Kingdom +581492,12/9/2019,47310M,Small Pop Box Funky Monkey,6.19,1,15492,United Kingdom +581492,12/9/2019,47480,Hanging Photo Clip Rope Ladder,6.19,3,15492,United Kingdom +581492,12/9/2019,47504H,English Rose Spirit Level,7.24,1,15492,United Kingdom +581492,12/9/2019,47559B,Tea Time Oven Glove,7.24,3,15492,United Kingdom +581492,12/9/2019,47563A,Retro Longboard Ironing Board Cover,7.24,2,15492,United Kin +581492,12/9/2019,47566,Party Bunting,7.24,2,15492,United Kingdom +581492,12/9/2019,47590B,Pink Happy Birthday Bunting,7.24,1,15492,United Kingdom +581492,12/9/2019,51014A,Feather Pen Hot Pink,7.24,2,15492,United Kingdom +581492,12/9/2019,51014L,Feather Pen Light Pink,7.24,1,15492,United Kingdom +581492,12/9/2019,71270,Photo Clip Line,7.24,1,15492,United Kingdom +581492,12/9/2019,72349B,Set/6 Purple Butterfly T-Lights,6.39,1,15492,United Kingdom +581492,12/9/2019,72741,Grand Chocolatecandle,7.24,3,15492,United Kingdom +581492,12/9/2019,72800E,4 Ivory Dinner Candles Silver Flock,7.24,3,15492,United Kin +581492,12/9/2019,79321,Chilli Lights,6.19,1,15492,United Kingdom +581492,12/9/2019,82484,Wood Black Board Ant White Finish,6.19,2,15492,United Kingdo +581492,12/9/2019,82567,Airline Lounge Metal Sign,6.19,2,15492,United Kingdom +581492,12/9/2019,82582,Area Patrolled Metal Sign,6.19,1,15492,United Kingdom +581492,12/9/2019,82600,N0 Singing Metal Sign,6.19,1,15492,United Kingdom +581492,12/9/2019,84031A,Charlie+Lola Red Hot Water Bottle,6.19,4,15492,United Kingd +581492,12/9/2019,84077,World War 2 Gliders Asstd Designs,6.19,1,15492,United Kingdo +581492,12/9/2019,84249A,Greeting Card Square Doughnuts,6.19,1,15492,United Kingdom +581492,12/9/2019,84347,Rotating Silver Angels T-Light Hldr,6.19,2,15492,United King +581492,12/9/2019,84375,Set Of 20 Kids Cookie Cutters,6.19,1,15492,United Kingdom +581492,12/9/2019,84378,Set Of 3 Heart Cookie Cutters,6.19,4,15492,United Kingdom +581492,12/9/2019,84519B,Carrot Charlie+Lola Coaster Set,6.19,1,15492,United Kingdom +581492,12/9/2019,84559A,3d Sheet Of Dog Stickers,6.19,2,15492,United Kingdom +581492,12/9/2019,84568,Girls Alphabet Iron On Patches,6.19,31,15492,United Kingdom +581492,12/9/2019,84569D,Pack 6 Heart/Ice-Cream Patches,6.19,1,15492,United Kingdom +581492,12/9/2019,84596B,Small Dolly Mix Design Orange Bowl,6.19,4,15492,United King +581492,12/9/2019,84596F,Small Marshmallows Pink Bowl,6.19,4,15492,United Kingdom +581492,12/9/2019,84598,Boys Alphabet Iron On Patches,6.19,5,15492,United Kingdom +581492,12/9/2019,84692,Box Of 24 Cocktail Parasols,6.19,1,15492,United Kingdom +581492,12/9/2019,84755,Colour Glass T-Light Holder Hanging,6.19,4,15492,United King +581492,12/9/2019,84828,Jungle Popsicles Ice Lolly Moulds,6.19,1,15492,United Kingdo +581492,12/9/2019,84879,Assorted Colour Bird Ornament,6.19,16,15492,United Kingdom +581492,12/9/2019,84923,Pink Butterfly Handbag W Bobbles,6.04,3,15492,United Kingdom +581492,12/9/2019,84946,Antique Silver T-Light Glass,6.04,18,15492,United Kingdom +581492,12/9/2019,84970S,Hanging Heart Zinc T-Light Holder,6.04,3,15492,United Kingd +581492,12/9/2019,84978,Hanging Heart Jar T-Light Holder,6.04,4,15492,United Kingdom +581492,12/9/2019,84991,60 Teatime Fairy Cake Cases,6.04,1,15492,United Kingdom +581492,12/9/2019,84997A,Childrens Cutlery Polkadot Green,6.04,1,15492,United Kingdo +581492,12/9/2019,84997B,Childrens Cutlery Retrospot Red,6.04,1,15492,United Kingdom +581492,12/9/2019,20733,Gold Mini Tape Measure,6.04,3,15492,United Kingdom +581492,12/9/2019,20777,Chrysanthemum Notebook,6.19,2,15492,United Kingdom +581492,12/9/2019,20782,Camouflage Ear Muff Headphones,6.19,1,15492,United Kingdom +581492,12/9/2019,20914,Set/5 Red Retrospot Lid Glass Bowls,6.19,2,15492,United King +581492,12/9/2019,20931,Blue Pot Plant Candle,6.19,1,15492,United Kingdom +581492,12/9/2019,20970,Pink Floral Feltcraft Shoulder Bag,6.19,1,15492,United Kingd +581492,12/9/2019,20971,Pink Blue Felt Craft Trinket Box,6.19,2,15492,United Kingdom +581492,12/9/2019,20972,Pink Cream Felt Craft Trinket Box,6.19,3,15492,United Kingdo +581492,12/9/2019,20973,12 Pencil Small Tube Woodland,6.19,4,15492,United Kingdom +581492,12/9/2019,20978,36 Pencils Tube Skulls,6.19,1,15492,United Kingdom +581492,12/9/2019,20979,36 Pencils Tube Red Retrospot,6.19,3,15492,United Kingdom +581492,12/9/2019,20982,12 Pencils Tall Tube Skulls,6.19,2,15492,United Kingdom +581492,12/9/2019,20983,12 Pencils Tall Tube Red Retrospot,6.19,4,15492,United Kingd +581492,12/9/2019,20985,Heart Calculator,6.19,1,15492,United Kingdom +581492,12/9/2019,20986,Blue Calculator Ruler,6.19,1,15492,United Kingdom +581492,12/9/2019,21000,Rose Du Sud Cosmetics Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,21012,Antique All Glass Candlestick,6.19,3,15492,United Kingdom +581492,12/9/2019,21015,Dark Bird House Tree Decoration,6.19,8,15492,United Kingdom +581492,12/9/2019,21026,Space Owl,6.19,1,15492,United Kingdom +581492,12/9/2019,21035,Set/2 Red Retrospot Tea Towels,6.19,1,15492,United Kingdom +581492,12/9/2019,21064,Boom Box Speaker Boys,6.19,4,15492,United Kingdom +581492,12/9/2019,21065,Boom Box Speaker Girls,6.19,2,15492,United Kingdom +581492,12/9/2019,21098,Christmas Toilet Roll,6.19,1,15492,United Kingdom +581492,12/9/2019,21123,Set/10 Ivory Polkadot Party Candles,6.19,1,15492,United King +581492,12/9/2019,21125,Set 6 Football Celebration Candles,6.19,1,15492,United Kingd +581492,12/9/2019,21126,Set Of 6 Girls Celebration Candles,6.19,1,15492,United Kingd +581492,12/9/2019,21137,Black Record Cover Frame,6.19,17,15492,United Kingdom +581492,12/9/2019,21154,Red Retrospot Oven Glove,6.19,2,15492,United Kingdom +581492,12/9/2019,21158,Moody Girl Door Hanger,6.19,1,15492,United Kingdom +581492,12/9/2019,21162,Toxic Area Door Hanger,6.19,1,15492,United Kingdom +581492,12/9/2019,21166,Cook With Wine Metal Sign,6.19,2,15492,United Kingdom +581492,12/9/2019,21172,Party Metal Sign,6.19,1,15492,United Kingdom +581492,12/9/2019,21174,Pottering In The Shed Metal Sign,6.19,2,15492,United Kingdom +581492,12/9/2019,21175,Gin And Tonic Diet Metal Sign,6.19,2,15492,United Kingdom +581492,12/9/2019,21200,Multicolour Honeycomb Paper Garland,6.04,6,15492,United King +581492,12/9/2019,21201,Tropical Honeycomb Paper Garland,6.04,4,15492,United Kingdom +581492,12/9/2019,21212,Pack Of 72 Retrospot Cake Cases,6.04,2,15492,United Kingdom +581492,12/9/2019,21213,Pack Of 72 Skull Cake Cases,6.04,2,15492,United Kingdom +581492,12/9/2019,21220,Set/4 Badges Dogs,6.19,2,15492,United Kingdom +581492,12/9/2019,21224,Set/4 Skull Badges,6.19,1,15492,United Kingdom +581492,12/9/2019,21232,Strawberry Ceramic Trinket Pot,6.19,1,15492,United Kingdom +581492,12/9/2019,21257,Victorian Sewing Box Medium,6.19,2,15492,United Kingdom +581492,12/9/2019,21258,Victorian Sewing Box Large,6.19,1,15492,United Kingdom +581492,12/9/2019,21259,Victorian Sewing Box Small,6.19,1,15492,United Kingdom +581492,12/9/2019,21313,Glass Heart T-Light Holder,6.19,1,15492,United Kingdom +581492,12/9/2019,21314,Small Glass Heart Trinket Pot,6.19,2,15492,United Kingdom +581492,12/9/2019,21328,Balloons Writing Set,6.19,2,15492,United Kingdom +581492,12/9/2019,21329,Dinosaurs Writing Set,6.19,2,15492,United Kingdom +581492,12/9/2019,21356,Toast Its - Fairy Flower,6.19,16,15492,United Kingdom +581492,12/9/2019,21378,Small Tall Camphor Wood Toadstool,6.19,2,15492,United Kingdo +581492,12/9/2019,21379,Camphor Wood Portobello Mushroom,6.19,1,15492,United Kingdom +581492,12/9/2019,21383,Pack Of 12 Sticky Bunnies,6.19,1,15492,United Kingdom +581492,12/9/2019,21402,Red Egg Spoon,6.19,1,15492,United Kingdom +581492,12/9/2019,21408,Spotty Pink Duck Doorstop,6.19,2,15492,United Kingdom +581492,12/9/2019,21411,Gingham Heart Doorstop Red,6.19,1,15492,United Kingdom +581492,12/9/2019,21467,Cherry Crochet Food Cover,6.19,1,15492,United Kingdom +581492,12/9/2019,21471,Strawberry Raffia Food Cover,6.19,2,15492,United Kingdom +581492,12/9/2019,21479,White Skull Hot Water Bottle,6.19,2,15492,United Kingdom +581492,12/9/2019,21481,Fawn Blue Hot Water Bottle,6.19,3,15492,United Kingdom +581492,12/9/2019,21484,Chick Grey Hot Water Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,21485,Retrospot Heart Hot Water Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,21494,Rotating Leaves T-Light Holder,6.19,11,15492,United Kingdom +581492,12/9/2019,21506,Fancy Font Birthday Card,6.19,3,15492,United Kingdom +581492,12/9/2019,21507,Elephant Birthday Card,7.24,1,15492,United Kingdom +581492,12/9/2019,21508,Vintage Kid Dolly Card,7.24,1,15492,United Kingdom +581492,12/9/2019,21509,Cowboys And Indians Birthday Card,7.24,2,15492,United Kingdo +581492,12/9/2019,21528,Dairy Maid Traditional Teapot,7.24,1,15492,United Kingdom +581492,12/9/2019,21544,Skulls Water Transfer Tattoos,7.24,2,15492,United Kingdom +581492,12/9/2019,21558,Skull Lunch Box With Cutlery,6.39,1,15492,United Kingdom +581492,12/9/2019,21559,Strawberry Lunch Box With Cutlery,7.24,1,15492,United Kingdo +581492,12/9/2019,21615,4 Lavender Botanical Dinner Candles,7.24,2,15492,United King +581492,12/9/2019,21616,4 Pear Botanical Dinner Candles,7.24,6,15492,United Kingdom +581492,12/9/2019,21620,Set Of 4 Rose Botanical Candles,7.24,5,15492,United Kingdom +581492,12/9/2019,21642,Assorted Tutti Frutti Pen,7.24,4,15492,United Kingdom +581492,12/9/2019,21648,Assorted Tutti Frutti Small Purse,7.24,2,15492,United Kingdo +581492,12/9/2019,21650,Assorted Tutti Frutti Bracelet,7.24,14,15492,United Kingdom +581492,12/9/2019,21675,Butterflies Stickers,6.19,2,15492,United Kingdom +581492,12/9/2019,21677,Hearts Stickers,6.19,1,15492,United Kingdom +581492,12/9/2019,21678,Paisley Pattern Stickers,6.19,2,15492,United Kingdom +581492,12/9/2019,21680,Woodland Stickers,6.19,1,15492,United Kingdom +581492,12/9/2019,21703,Bag 125g Swirly Marbles,6.19,1,15492,United Kingdom +581492,12/9/2019,21704,Bag 250g Swirly Marbles,6.19,1,15492,United Kingdom +581492,12/9/2019,21716,Boys Vintage Tin Seaside Bucket,6.19,1,15492,United Kingdom +581492,12/9/2019,21718,Red Metal Beach Spade,6.19,1,15492,United Kingdom +581492,12/9/2019,21724,Panda And Bunnies Sticker Sheet,6.19,1,15492,United Kingdom +581492,12/9/2019,21731,Red Toadstool Led Night Light,6.19,6,15492,United Kingdom +581492,12/9/2019,21739,Cosy Slipper Shoes Small Green,6.19,2,15492,United Kingdom +581492,12/9/2019,21774,Decorative Cats Bathroom Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,21786,Polkadot Rain Hat,6.19,3,15492,United Kingdom +581492,12/9/2019,21787,Rain Poncho Retrospot,6.19,2,15492,United Kingdom +581492,12/9/2019,21790,Vintage Snap Cards,6.19,5,15492,United Kingdom +581492,12/9/2019,21791,Vintage Heads And Tails Card Game,6.19,1,15492,United Kingdo +581492,12/9/2019,21808,Christmas Garland Stars Trees,6.19,3,15492,United Kingdom +581492,12/9/2019,21810,Christmas Hanging Star With Bell,6.19,25,15492,United Kingdo +581492,12/9/2019,21812,Garland With Hearts And Bells,6.19,7,15492,United Kingdom +581492,12/9/2019,21813,Garland With Stars And Bells,6.19,3,15492,United Kingdom +581492,12/9/2019,21822,Glitter Christmas Tree With Bells,6.19,12,15492,United Kingd +581492,12/9/2019,21828,Eight Piece Snake Set,6.19,1,15492,United Kingdom +581492,12/9/2019,21832,Chocolate Calculator,6.19,1,15492,United Kingdom +581492,12/9/2019,21833,Camouflage Led Torch,6.04,2,15492,United Kingdom +581492,12/9/2019,21871,Save The Planet Mug,6.19,1,15492,United Kingdom +581492,12/9/2019,21874,Gin And Tonic Mug,6.19,2,15492,United Kingdom +581492,12/9/2019,21876,Pottering Mug,6.19,4,15492,United Kingdom +581492,12/9/2019,21879,Hearts Gift Tape,6.19,1,15492,United Kingdom +581492,12/9/2019,21889,Wooden Box Of Dominoes,6.19,3,15492,United Kingdom +581492,12/9/2019,21890,S/6 Wooden Skittles In Cotton Bag,6.19,1,15492,United Kingdo +581492,12/9/2019,21892,Traditional Wooden Catch Cup Game,6.19,1,15492,United Kingdo +581492,12/9/2019,21900,Key Fob Shed,6.19,4,15492,United Kingdom +581492,12/9/2019,21901,Key Fob Back Door,6.19,2,15492,United Kingdom +581492,12/9/2019,21902,Key Fob Front Door,6.19,1,15492,United Kingdom +581492,12/9/2019,21905,More Butter Metal Sign,6.19,1,15492,United Kingdom +581492,12/9/2019,21906,Pharmacie First Aid Tin,6.19,1,15492,United Kingdom +581492,12/9/2019,21914,Blue Harmonica In Box,6.19,2,15492,United Kingdom +581492,12/9/2019,21916,Set 12 Retro White Chalk Sticks,6.19,2,15492,United Kingdom +581492,12/9/2019,21930,Jumbo Storage Bag Skulls,6.19,1,15492,United Kingdom +581492,12/9/2019,21931,Jumbo Storage Bag Suki,6.19,1,15492,United Kingdom +581492,12/9/2019,21932,Scandinavian Paisley Picnic Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,21934,Skull Shoulder Bag,6.19,3,15492,United Kingdom +581492,12/9/2019,21935,Suki Shoulder Bag,6.19,9,15492,United Kingdom +581492,12/9/2019,21936,Red Retrospot Picnic Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,21942,Skulls Design Flannel,6.19,2,15492,United Kingdom +581492,12/9/2019,21945,Strawberries Design Flannel,6.19,2,15492,United Kingdom +581492,12/9/2019,21947,Set Of 6 Heart Chopsticks,6.19,1,15492,United Kingdom +581492,12/9/2019,21949,Set Of 6 Strawberry Chopsticks,6.19,2,15492,United Kingdom +581492,12/9/2019,21967,Pack Of 12 Skull Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,21976,Pack Of 60 Mushroom Cake Cases,6.19,3,15492,United Kingdom +581492,12/9/2019,21977,Pack Of 60 Pink Paisley Cake Cases,6.19,2,15492,United Kingd +581492,12/9/2019,21980,Pack Of 12 Red Retrospot Tissues,6.19,2,15492,United Kingdom +581492,12/9/2019,21981,Pack Of 12 Woodland Tissues,6.19,4,15492,United Kingdom +581492,12/9/2019,21982,Pack Of 12 Suki Tissues,6.19,2,15492,United Kingdom +581492,12/9/2019,21983,Pack Of 12 Blue Paisley Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,21984,Pack Of 12 Pink Paisley Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,21986,Pack Of 12 Pink Polkadot Tissues,6.19,3,15492,United Kingdom +581492,12/9/2019,21989,Pack Of 20 Skull Paper Napkins,6.19,2,15492,United Kingdom +581492,12/9/2019,21990,Modern Floral Stationery Set,6.19,8,15492,United Kingdom +581492,12/9/2019,21993,Floral Folk Stationery Set,6.19,8,15492,United Kingdom +581492,12/9/2019,22024,Rainy Ladies Birthday Card,6.19,3,15492,United Kingdom +581492,12/9/2019,22025,Ring Of Roses Birthday Card,6.19,3,15492,United Kingdom +581492,12/9/2019,22026,Banquet Birthday Card,6.19,4,15492,United Kingdom +581492,12/9/2019,22027,Tea Party Birthday Card,6.19,2,15492,United Kingdom +581492,12/9/2019,22028,Penny Farthing Birthday Card,6.19,1,15492,United Kingdom +581492,12/9/2019,22029,Spaceboy Birthday Card,6.19,4,15492,United Kingdom +581492,12/9/2019,22031,Botanical Lavender Birthday Card,6.19,1,15492,United Kingdom +581492,12/9/2019,22037,Robot Birthday Card,6.19,4,15492,United Kingdom +581492,12/9/2019,22064,Pink Doughnut Trinket Pot,6.19,1,15492,United Kingdom +581492,12/9/2019,22065,Christmas Pudding Trinket Pot,6.19,2,15492,United Kingdom +581492,12/9/2019,22068,Black Pirate Treasure Chest,6.19,1,15492,United Kingdom +581492,12/9/2019,22070,Small Red Retrospot Mug In Box,6.19,3,15492,United Kingdom +581492,12/9/2019,22071,Small White Retrospot Mug In Box,6.19,1,15492,United Kingdom +581492,12/9/2019,22074,6 Ribbons Shimmering Pinks,6.19,1,15492,United Kingdom +581492,12/9/2019,22075,6 Ribbons Elegant Christmas,6.19,8,15492,United Kingdom +581492,12/9/2019,22076,6 Ribbons Empire,6.19,4,15492,United Kingdom +581492,12/9/2019,22083,Paper Chain Kit Retrospot,6.19,1,15492,United Kingdom +581492,12/9/2019,22085,Paper Chain Kit Skulls,6.19,1,15492,United Kingdom +581492,12/9/2019,22086,Paper Chain Kit 50'S Christmas,6.19,38,15492,United Kingdom +581492,12/9/2019,22091,Empire Tissue Box,6.19,1,15492,United Kingdom +581492,12/9/2019,22099,Caravan Square Tissue Box,6.19,3,15492,United Kingdom +581492,12/9/2019,22104,Mirror Mosaic Candle Plate,6.19,4,15492,United Kingdom +581492,12/9/2019,22106,Mirror Mosaic Hurricane Lamp,6.19,1,15492,United Kingdom +581492,12/9/2019,22107,Pizza Plate In Box,6.19,10,15492,United Kingdom +581492,12/9/2019,22108,Ping! Microwave Plate,6.04,2,15492,United Kingdom +581492,12/9/2019,22109,Full English Breakfast Plate,6.04,2,15492,United Kingdom +581492,12/9/2019,22110,Bird House Hot Water Bottle,6.04,3,15492,United Kingdom +581492,12/9/2019,22111,Scottie Dog Hot Water Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,22112,Chocolate Hot Water Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,22114,Hot Water Bottle Tea And Sympathy,6.19,4,15492,United Kingdo +581492,12/9/2019,22116,Metal Sign His Dinner Is Served,6.19,2,15492,United Kingdom +581492,12/9/2019,22121,Noel Wooden Block Letters,6.19,1,15492,United Kingdom +581492,12/9/2019,22123,Ping Microwave Apron,6.19,1,15492,United Kingdom +581492,12/9/2019,22124,Set Of 2 Tea Towels Ping Microwave,6.19,1,15492,United Kingd +581492,12/9/2019,22129,Party Cones Candy Decoration,6.19,3,15492,United Kingdom +581492,12/9/2019,22134,Mini Ladle Love Heart Red,6.19,1,15492,United Kingdom +581492,12/9/2019,15036,Assorted Colours Silk Fan,6.19,1,15492,United Kingdom +581492,12/9/2019,15039,Sandalwood Fan,6.19,1,15492,United Kingdom +581492,12/9/2019,15058C,Ice Cream Design Garden Parasol,6.19,1,15492,United Kingdom +581492,12/9/2019,16218,Cartoon Pencil Sharpeners,6.19,5,15492,United Kingdom +581492,12/9/2019,16225,Rattle Snake Eggs,6.19,1,15492,United Kingdom +581492,12/9/2019,16235,Recycled Pencil With Rabbit Eraser,6.19,3,15492,United Kingd +581492,12/9/2019,16237,Sleeping Cat Erasers,6.19,1,15492,United Kingdom +581492,12/9/2019,17038,Porcelain Budah Incense Holder,6.19,1,15492,United Kingdom +581492,12/9/2019,17084N,Fairy Dreams Incense,6.19,1,15492,United Kingdom +581492,12/9/2019,20659,Economy Luggage Tag,6.19,7,15492,United Kingdom +581492,12/9/2019,20665,Red Retrospot Purse,6.19,2,15492,United Kingdom +581492,12/9/2019,20668,Disco Ball Christmas Decoration,6.19,1,15492,United Kingdom +581492,12/9/2019,20718,Red Retrospot Shopper Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,20719,Woodland Charlotte Bag,6.19,7,15492,United Kingdom +581492,12/9/2019,20723,Strawberry Charlotte Bag,6.19,2,15492,United Kingdom +581492,12/9/2019,20724,Red Retrospot Charlotte Bag,6.19,4,15492,United Kingdom +581492,12/9/2019,22135,Mini Ladle Love Heart Pink,6.19,6,15492,United Kingdom +581492,12/9/2019,22138,Baking Set 9 Piece Retrospot,6.19,1,15492,United Kingdom +581492,12/9/2019,22141,Christmas Craft Tree Top Angel,6.19,2,15492,United Kingdom +581492,12/9/2019,22150,3 Stripey Mice Feltcraft,7.24,2,15492,United Kingdom +581492,12/9/2019,22153,Angel Decoration Stars On Dress,7.24,2,15492,United Kingdom +581492,12/9/2019,22154,Angel Decoration 3 Buttons,7.24,3,15492,United Kingdom +581492,12/9/2019,22155,Star Decoration Rustic,7.24,7,15492,United Kingdom +581492,12/9/2019,22156,Heart Decoration With Pearls,7.24,4,15492,United Kingdom +581492,12/9/2019,22163,Heart String Memo Holder Hanging,7.24,9,15492,United Kingdom +581492,12/9/2019,22165,Diamante Heart Shaped Wall Mirror,7.24,1,15492,United Kingdo +581492,12/9/2019,22167,Oval Wall Mirror Diamante,7.24,1,15492,United Kingdom +581492,12/9/2019,22170,Picture Frame Wood Triple Portrait,7.24,1,15492,United Kingd +581492,12/9/2019,22173,Metal 4 Hook Hanger French Chateau,7.24,2,15492,United Kingd +581492,12/9/2019,22174,Photo Cube,6.19,7,15492,United Kingdom +581492,12/9/2019,22178,Victorian Glass Hanging T-Light,6.19,5,15492,United Kingdom +581492,12/9/2019,22186,Red Star Card Holder,7.24,2,15492,United Kingdom +581492,12/9/2019,22190,Local Cafe Mug,7.24,3,15492,United Kingdom +581492,12/9/2019,22193,Red Diner Wall Clock,7.24,1,15492,United Kingdom +581492,12/9/2019,22195,Large Heart Measuring Spoons,7.24,1,15492,United Kingdom +581492,12/9/2019,22196,Small Heart Measuring Spoons,7.24,11,15492,United Kingdom +581492,12/9/2019,22197,Popcorn Holder,7.24,34,15492,United Kingdom +581492,12/9/2019,22199,Frying Pan Red Retrospot,7.24,1,15492,United Kingdom +581492,12/9/2019,22209,Wood Stamp Set Happy Birthday,7.24,1,15492,United Kingdom +581492,12/9/2019,22212,Four Hook White Lovebirds,7.24,1,15492,United Kingdom +581492,12/9/2019,22219,Lovebird Hanging Decoration White,7.24,4,15492,United Kingdo +581492,12/9/2019,22224,White Lovebird Lantern,7.24,4,15492,United Kingdom +581492,12/9/2019,22227,Hanging Heart Mirror Decoration,7.24,1,15492,United Kingdom +581492,12/9/2019,22260,Felt Egg Cosy Blue Rabbit,6.39,2,15492,United Kingdom +581492,12/9/2019,22261,Felt Egg Cosy White Rabbit,7.24,1,15492,United Kingdom +581492,12/9/2019,22264,Felt Farm Animal White Bunny,7.24,1,15492,United Kingdom +581492,12/9/2019,22273,Feltcraft Doll Molly,7.24,2,15492,United Kingdom +581492,12/9/2019,22277,Cosmetic Bag Vintage Rose Paisley,7.24,1,15492,United Kingdo +581492,12/9/2019,22279,Pocket Bag Blue Paisley Red Spot,7.24,5,15492,United Kingdom +581492,12/9/2019,22280,Pocket Bag Pink Paisely Brown Spot,7.24,4,15492,United Kingd +581492,12/9/2019,22300,Coffee Mug Dog + Ball Design,7.24,1,15492,United Kingdom +581492,12/9/2019,22301,Coffee Mug Cat + Bird Design,7.24,1,15492,United Kingdom +581492,12/9/2019,22307,Gold Mug Bone China Tree Of Life,7.24,1,15492,United Kingdom +581492,12/9/2019,22308,Tea Cosy Blue Stripe,7.24,2,15492,United Kingdom +581492,12/9/2019,22309,Tea Cosy Red Stripe,7.24,2,15492,United Kingdom +581492,12/9/2019,22324,Blue Polkadot Kids Bag,7.24,2,15492,United Kingdom +581492,12/9/2019,22326,Round Snack Boxes Set Of4 Woodland,7.24,3,15492,United Kingd +581492,12/9/2019,22327,Round Snack Boxes Set Of 4 Skulls,7.24,2,15492,United Kingdo +581492,12/9/2019,22329,Round Container Set Of 5 Retrospot,6.19,2,15492,United Kingd +581492,12/9/2019,22338,Star Decoration Painted Zinc,6.19,4,15492,United Kingdom +581492,12/9/2019,22340,Noel Garland Painted Zinc,6.19,17,15492,United Kingdom +581492,12/9/2019,22342,Home Garland Painted Zinc,6.19,7,15492,United Kingdom +581492,12/9/2019,22348,Tea Bag Plate Red Retrospot,6.19,3,15492,United Kingdom +581492,12/9/2019,22355,Charlotte Bag Suki Design,6.19,3,15492,United Kingdom +581492,12/9/2019,22356,Charlotte Bag Pink Polkadot,6.19,1,15492,United Kingdom +581492,12/9/2019,22357,Kings Choice Biscuit Tin,6.19,2,15492,United Kingdom +581492,12/9/2019,22358,Kings Choice Tea Caddy,6.19,1,15492,United Kingdom +581492,12/9/2019,22361,Glass Jar Daisy Fresh Cotton Wool,6.19,2,15492,United Kingdo +581492,12/9/2019,22362,Glass Jar Peacock Bath Salts,6.19,2,15492,United Kingdom +581492,12/9/2019,22367,Childrens Apron Spaceboy Design,6.19,1,15492,United Kingdom +581492,12/9/2019,22372,Airline Bag Vintage World Champion,6.19,1,15492,United Kingd +581492,12/9/2019,22374,Airline Bag Vintage Jet Set Red,6.19,1,15492,United Kingdom +581492,12/9/2019,85014B,Red Retrospot Umbrella,6.19,1,15492,United Kingdom +581492,12/9/2019,85032C,Curious Images Gift Wrap Set,6.19,1,15492,United Kingdom +581492,12/9/2019,85038,6 Chocolate Love Heart T-Lights,6.19,1,15492,United Kingdom +581492,12/9/2019,85039A,Set/4 Red Mini Rose Candle In Bowl,6.19,5,15492,United King +581492,12/9/2019,85039B,S/4 Ivory Mini Rose Candle In Bowl,6.19,4,15492,United King +581492,12/9/2019,85040A,S/4 Pink Flower Candles In Bowl,6.19,1,15492,United Kingdom +581492,12/9/2019,85048,15cm Christmas Glass Ball 20 Lights,6.19,2,15492,United King +581492,12/9/2019,85049C,Romantic Pinks Ribbons,6.19,1,15492,United Kingdom +581492,12/9/2019,85049G,Chocolate Box Ribbons,6.19,1,15492,United Kingdom +581492,12/9/2019,85049H,Urban Black Ribbons,6.19,2,15492,United Kingdom +581492,12/9/2019,85053,French Enamel Candleholder,6.19,1,15492,United Kingdom +581492,12/9/2019,85059,French Enamel Water Basin,6.19,1,15492,United Kingdom +581492,12/9/2019,85066,Cream Sweetheart Mini Chest,6.19,1,15492,United Kingdom +581492,12/9/2019,85094,Candy Spot Egg Warmer Rabbit,6.19,2,15492,United Kingdom +581492,12/9/2019,85114C,Red Enchanted Forest Placemat,6.19,1,15492,United Kingdom +581492,12/9/2019,85123A,Cream Hanging Heart T-Light Holder,6.19,3,15492,United King +581492,12/9/2019,85131B,Beaded Crystal Heart Green On Stick,6.19,1,15492,United Kin +581492,12/9/2019,85131D,Beaded Crystal Heart Pink On Stick,6.19,2,15492,United King +581492,12/9/2019,85152,Hand Over The Chocolate Sign,6.19,1,15492,United Kingdom +581492,12/9/2019,85168B,Black Baroque Carriage Clock,6.19,3,15492,United Kingdom +581492,12/9/2019,85169C,Eau De Nil Love Bird Candle,6.19,1,15492,United Kingdom +581492,12/9/2019,85170C,Set/6 Eau De Nil Bird T-Lights,6.19,1,15492,United Kingdom +581492,12/9/2019,85173,Set/6 Frog Prince T-Light Candles,6.19,1,15492,United Kingdo +581492,12/9/2019,85177,Basket Of Flowers Sewing Kit,6.19,1,15492,United Kingdom +581492,12/9/2019,85178,Victorian Sewing Kit,6.19,1,15492,United Kingdom +581492,12/9/2019,85179A,Green Bitty Light Chain,6.19,4,15492,United Kingdom +581492,12/9/2019,85199S,Small Hanging Ivory/Red Wood Bird,6.19,9,15492,United Kingd +581492,12/9/2019,85227,Set Of 6 3d Kit Cards For Kids,6.19,3,15492,United Kingdom +581492,12/9/2019,90003C,Midnight Blue Pair Heart Hair Slide,6.19,1,15492,United Kin +581492,12/9/2019,90003E,Green Pair Heart Hair Slides,6.19,2,15492,United Kingdom +581492,12/9/2019,90010A,Midnight Blue Glass/Silver Bracelet,6.04,1,15492,United Kin +581492,12/9/2019,90013A,Midnight Blue Vintage Earrings,6.19,3,15492,United Kingdom +581492,12/9/2019,90013C,Green Vintage Earrings,6.19,2,15492,United Kingdom +581492,12/9/2019,90014A,Silver Mop Orbit Necklace,6.19,1,15492,United Kingdom +581492,12/9/2019,90016B,Gold/Mop Pendant Orbit Necklace,6.19,1,15492,United Kingdom +581492,12/9/2019,90018B,Gold Mop Orbit Drop Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90019B,Gold Mop Orbit Bracelet,6.19,1,15492,United Kingdom +581492,12/9/2019,90027D,Glass Bead Hoop Earrings Amethyst,6.19,1,15492,United Kingd +581492,12/9/2019,90030B,Red Kukui Coconut Seed Necklace,6.19,1,15492,United Kingdom +581492,12/9/2019,90055,Cracked Glaze Earrings Brown,6.19,1,15492,United Kingdom +581492,12/9/2019,90059A,Diamante Hair Grip Pack/2 Crystal,6.19,1,15492,United Kingd +581492,12/9/2019,90059D,Diamante Hair Grip Pack/2 Peridot,6.19,2,15492,United Kingd +581492,12/9/2019,90059E,Diamante Hair Grip Pack/2 Ruby,6.04,1,15492,United Kingdom +581492,12/9/2019,90059F,Diamante Hair Grip Pack/2 Lt Rose,6.19,1,15492,United Kingd +581492,12/9/2019,90072,Ruby Drop Chandelier Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90086,Crystal Frog Phone Charm,6.19,1,15492,United Kingdom +581492,12/9/2019,90120B,Blue Murano Twist Bracelet,6.19,2,15492,United Kingdom +581492,12/9/2019,90120C,Green Murano Twist Bracelet,6.19,1,15492,United Kingdom +581492,12/9/2019,90130B,Turq Stone/Crystal Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90130C,Green Stone/Crystal Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90134,Old Rose Combo Bead Necklace,6.19,1,15492,United Kingdom +581492,12/9/2019,90138,White/Pink Mini Crystals Necklace,6.19,1,15492,United Kingdo +581492,12/9/2019,90141B,Ivory Pendant Triple Shell Necklace,6.19,1,15492,United Kin +581492,12/9/2019,90145,Silver Hoop Earrings With Flower,6.19,1,15492,United Kingdom +581492,12/9/2019,90155,Resin Necklace W Pastel Beads,6.19,1,15492,United Kingdom +581492,12/9/2019,90161D,Ant Copper Pink Boudicca Bracelet,6.19,1,15492,United Kingd +581492,12/9/2019,90163A,Pink Rosebud & Pearl Necklace,6.19,2,15492,United Kingdom +581492,12/9/2019,90165B,White Rosebud Pearl Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90168,2 Daisies Hair Comb,6.19,1,15492,United Kingdom +581492,12/9/2019,90169,Daisy Hair Comb,6.19,1,15492,United Kingdom +581492,12/9/2019,90170,Daisy Hair Band,6.19,1,15492,United Kingdom +581492,12/9/2019,90174,Butterfly Hair Band,6.19,2,15492,United Kingdom +581492,12/9/2019,90175A,White Glass Chunky Charm Bracelet,6.19,2,15492,United Kingd +581492,12/9/2019,90175D,Tigris Eye Chunky Charm Bracelet,6.19,1,15492,United Kingdo +581492,12/9/2019,90177A,Classic Diamante Earrings Jet,6.19,1,15492,United Kingdom +581492,12/9/2019,90177C,Drop Diamante Earrings Crystal,6.19,1,15492,United Kingdom +581492,12/9/2019,90181B,Amethyst Glass/Shell/Pearl Necklace,6.04,1,15492,United Kin +581492,12/9/2019,90182C,Black 3 Bead Drop Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90183A,Amber Drop Earrings W Long Beads,6.19,2,15492,United Kingdo +581492,12/9/2019,90183C,Black Drop Earrings W Long Beads,6.19,1,15492,United Kingdo +581492,12/9/2019,90184C,Black Chunky Bead Bracelet W Strap,6.19,1,15492,United King +581492,12/9/2019,90185B,Amethyst Diamante Expandable Ring,6.19,1,15492,United Kingd +581492,12/9/2019,90188,Drop Earrings W Flower & Leaf,6.19,2,15492,United Kingdom +581492,12/9/2019,90191,Silver Lariat 40cm,6.19,2,15492,United Kingdom +581492,12/9/2019,90192,Jade Drop Earrings W Filigree,6.19,1,15492,United Kingdom +581492,12/9/2019,90198A,Vintage Rose Bead Bracelet Raspberr,6.19,2,15492,United Kin +581492,12/9/2019,90200A,Purple Sweetheart Bracelet,6.19,1,15492,United Kingdom +581492,12/9/2019,90201A,Purple Enamel Flower Ring,6.19,2,15492,United Kingdom +581492,12/9/2019,90201B,Black Enamel Flower Ring,6.19,1,15492,United Kingdom +581492,12/9/2019,90201C,Red Enamel Flower Ring,6.19,1,15492,United Kingdom +581492,12/9/2019,90201D,Green Enamel Flower Ring,6.19,1,15492,United Kingdom +581492,12/9/2019,90202C,Green Enamel Flower Hair Tie,6.19,1,15492,United Kingdom +581492,12/9/2019,90202D,Pink Enamel Flower Hair Tie,6.19,1,15492,United Kingdom +581492,12/9/2019,90206C,Crystal Diamante Star Brooch,6.19,1,15492,United Kingdom +581492,12/9/2019,90208,Pair Of Pink Flower Cluster Slide,6.19,1,15492,United Kingdo +581492,12/9/2019,90210A,Grey Acrylic Faceted Bangle,6.19,1,15492,United Kingdom +581492,12/9/2019,22378,Wall Tidy Retrospot,6.19,2,15492,United Kingdom +581492,12/9/2019,22379,Recycling Bag Retrospot,6.19,1,15492,United Kingdom +581492,12/9/2019,22380,Toy Tidy Spaceboy,6.19,2,15492,United Kingdom +581492,12/9/2019,22396,Magnets Pack Of 4 Retro Photo,6.19,1,15492,United Kingdom +581492,12/9/2019,22411,Jumbo Shopper Vintage Red Paisley,6.19,1,15492,United Kingdo +581492,12/9/2019,22418,10 Colour Spaceboy Pen,6.19,3,15492,United Kingdom +581492,12/9/2019,22419,Lipstick Pen Red,6.19,3,15492,United Kingdom +581492,12/9/2019,22420,Lipstick Pen Baby Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,22421,Lipstick Pen Fuschia,6.19,2,15492,United Kingdom +581492,12/9/2019,22422,Toothpaste Tube Pen,6.19,4,15492,United Kingdom +581492,12/9/2019,22437,Set Of 9 Black Skull Balloons,7.24,1,15492,United Kingdom +581492,12/9/2019,22441,Grow Your Own Basil In Enamel Mug,7.24,1,15492,United Kingdo +581492,12/9/2019,22446,Pin Cushion Babushka Pink,7.24,7,15492,United Kingdom +581492,12/9/2019,22457,Natural Slate Heart Chalkboard,7.24,1,15492,United Kingdom +581492,12/9/2019,22464,Hanging Metal Heart Lantern,7.24,1,15492,United Kingdom +581492,12/9/2019,22466,Fairy Tale Cottage Night Light,7.24,1,15492,United Kingdom +581492,12/9/2019,22467,Gumball Coat Rack,7.24,1,15492,United Kingdom +581492,12/9/2019,22478,Birdhouse Garden Marker,7.24,1,15492,United Kingdom +581492,12/9/2019,22486,Plasmatronic Lamp,7.24,1,15492,United Kingdom +581492,12/9/2019,22488,Natural Slate Rectangle Chalkboard,7.24,1,15492,United Kingd +581492,12/9/2019,22489,Pack Of 12 Traditional Crayons,7.24,5,15492,United Kingdom +581492,12/9/2019,22495,Set Of 2 Round Tins Camembert,7.24,1,15492,United Kingdom +581492,12/9/2019,22540,Mini Jigsaw Circus Parade,7.24,1,15492,United Kingdom +581492,12/9/2019,22544,Mini Jigsaw Spaceboy,7.24,1,15492,United Kingdom +581492,12/9/2019,22549,Picture Dominoes,7.24,3,15492,United Kingdom +581492,12/9/2019,22551,Plasters In Tin Spaceboy,7.24,2,15492,United Kingdom +581492,12/9/2019,22553,Plasters In Tin Skulls,7.24,2,15492,United Kingdom +581492,12/9/2019,22554,Plasters In Tin Woodland Animals,7.24,3,15492,United Kingdom +581492,12/9/2019,22555,Plasters In Tin Strongman,7.24,3,15492,United Kingdom +581492,12/9/2019,22557,Plasters In Tin Vintage Paisley,7.24,2,15492,United Kingdom +581492,12/9/2019,22558,Clothes Pegs Retrospot Pack 24,7.24,3,15492,United Kingdom +581492,12/9/2019,22560,Traditional Modelling Clay,7.24,5,15492,United Kingdom +581492,12/9/2019,22565,Feltcraft Hairbands Pink And White,7.24,4,15492,United Kingd +581492,12/9/2019,22566,Feltcraft Hairband Pink And Purple,7.24,3,15492,United Kingd +581492,12/9/2019,22571,Rocking Horse Red Christmas,7.24,4,15492,United Kingdom +581492,12/9/2019,22573,Star Wooden Christmas Decoration,6.39,2,15492,United Kingdom +581492,12/9/2019,22574,Heart Wooden Christmas Decoration,7.24,5,15492,United Kingdo +581492,12/9/2019,22576,Swallow Wooden Christmas Decoration,7.24,3,15492,United King +581492,12/9/2019,22577,Wooden Heart Christmas Scandinavian,7.24,4,15492,United King +581492,12/9/2019,22578,Wooden Star Christmas Scandinavian,7.24,19,15492,United King +581492,12/9/2019,22580,Advent Calendar Gingham Sack,7.24,9,15492,United Kingdom +581492,12/9/2019,22581,Wood Stocking Christmas Scandispot,7.24,11,15492,United King +581492,12/9/2019,22585,Pack Of 6 Birdy Gift Tags,7.24,2,15492,United Kingdom +581492,12/9/2019,22586,Feltcraft Hairband Pink And Blue,7.24,2,15492,United Kingdom +581492,12/9/2019,22589,Cardholder Gingham Star,7.24,6,15492,United Kingdom +581492,12/9/2019,22591,Cardholder Gingham Christmas Tree,7.24,1,15492,United Kingdo +581492,12/9/2019,22592,Cardholder Holly Wreath Metal,7.24,3,15492,United Kingdom +581492,12/9/2019,22593,Christmas Gingham Star,6.39,2,15492,United Kingdom +581492,12/9/2019,22594,Christmas Gingham Tree,7.24,3,15492,United Kingdom +581492,12/9/2019,22597,Musical Zinc Heart Decoration,7.24,9,15492,United Kingdom +581492,12/9/2019,22598,Christmas Musical Zinc Tree,7.24,4,15492,United Kingdom +581492,12/9/2019,22599,Christmas Musical Zinc Star,6.19,5,15492,United Kingdom +581492,12/9/2019,22600,Christmas Retrospot Star Wood,6.19,2,15492,United Kingdom +581492,12/9/2019,22601,Christmas Retrospot Angel Wood,6.19,3,15492,United Kingdom +581492,12/9/2019,22602,Retrospot Wooden Heart Decoration,6.19,3,15492,United Kingdo +581492,12/9/2019,22608,Pens Assorted Funky Jeweled,6.19,3,15492,United Kingdom +581492,12/9/2019,22614,Pack Of 12 Spaceboy Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,22615,Pack Of 12 Circus Parade Tissues,6.19,4,15492,United Kingdom +581492,12/9/2019,22616,Pack Of 12 London Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,22619,Set Of 6 Soldier Skittles,6.19,4,15492,United Kingdom +581492,12/9/2019,22620,4 Traditional Spinning Tops,6.19,3,15492,United Kingdom +581492,12/9/2019,22621,Traditional Knitting Nancy,6.19,2,15492,United Kingdom +581492,12/9/2019,22629,Spaceboy Lunch Box,6.19,1,15492,United Kingdom +581492,12/9/2019,22630,Dolly Girl Lunch Box,6.19,1,15492,United Kingdom +581492,12/9/2019,22632,Hand Warmer Red Retrospot,6.19,1,15492,United Kingdom +581492,12/9/2019,22633,Hand Warmer Union Jack,6.19,1,15492,United Kingdom +581492,12/9/2019,22634,Childs Breakfast Set Spaceboy,6.19,1,15492,United Kingdom +581492,12/9/2019,22650,Ceramic Pirate Chest Money Bank,6.19,2,15492,United Kingdom +581492,12/9/2019,22651,Gentleman Shirt Repair Kit,6.19,1,15492,United Kingdom +581492,12/9/2019,22653,Button Box,6.19,16,15492,United Kingdom +581492,12/9/2019,22654,Deluxe Sewing Kit,6.19,2,15492,United Kingdom +581492,12/9/2019,22659,Lunch Box I Love London,6.19,1,15492,United Kingdom +581492,12/9/2019,22666,Recipe Box Pantry Yellow Design,6.19,5,15492,United Kingdom +581492,12/9/2019,22693,Grow A Flytrap Or Sunflower In Tin,6.19,3,15492,United Kingd +581492,12/9/2019,22694,Wicker Star,6.19,1,15492,United Kingdom +581492,12/9/2019,22697,Green Regency Teacup And Saucer,6.19,1,15492,United Kingdom +581492,12/9/2019,22699,Roses Regency Teacup And Saucer,6.19,2,15492,United Kingdom +581492,12/9/2019,22701,Pink Dog Bowl,6.19,5,15492,United Kingdom +581492,12/9/2019,22703,Pink Cat Bowl,6.19,6,15492,United Kingdom +581492,12/9/2019,22712,Card Dolly Girl,6.19,1,15492,United Kingdom +581492,12/9/2019,22713,Card I Love London,6.19,1,15492,United Kingdom +581492,12/9/2019,22714,Card Birthday Cowboy,6.19,2,15492,United Kingdom +581492,12/9/2019,22716,Card Circus Parade,6.19,3,15492,United Kingdom +581492,12/9/2019,22717,Card Dog And Ball,6.19,1,15492,United Kingdom +581492,12/9/2019,22720,Set Of 3 Cake Tins Pantry Design,6.19,2,15492,United Kingdom +581492,12/9/2019,22725,Alarm Clock Bakelike Chocolate,6.19,1,15492,United Kingdom +581492,12/9/2019,22726,Alarm Clock Bakelike Green,6.19,4,15492,United Kingdom +581492,12/9/2019,22727,Alarm Clock Bakelike Red,6.19,4,15492,United Kingdom +581492,12/9/2019,22730,Alarm Clock Bakelike Ivory,6.19,1,15492,United Kingdom +581492,12/9/2019,22741,Funky Diva Pen,6.19,4,15492,United Kingdom +581492,12/9/2019,22745,Poppy's Playhouse Bedroom,6.19,2,15492,United Kingdom +581492,12/9/2019,22748,Poppy's Playhouse Kitchen,6.19,1,15492,United Kingdom +581492,12/9/2019,22749,Feltcraft Princess Charlotte Doll,6.19,1,15492,United Kingdo +581492,12/9/2019,22751,Feltcraft Princess Olivia Doll,6.19,2,15492,United Kingdom +581492,12/9/2019,22753,Small Yellow Babushka Notebook,6.19,1,15492,United Kingdom +581492,12/9/2019,22754,Small Red Babushka Notebook,6.19,1,15492,United Kingdom +581492,12/9/2019,22757,Large Red Babushka Notebook,6.19,3,15492,United Kingdom +581492,12/9/2019,22758,Large Purple Babushka Notebook,6.19,2,15492,United Kingdom +581492,12/9/2019,22763,Key Cabinet Ma Campagne,6.19,1,15492,United Kingdom +581492,12/9/2019,22768,Family Photo Frame Cornice,6.19,2,15492,United Kingdom +581492,12/9/2019,22776,Sweetheart 3 Tier Cake Stand,6.19,1,15492,United Kingdom +581492,12/9/2019,22795,Sweetheart Recipe Book Stand,6.19,1,15492,United Kingdom +581492,12/9/2019,22798,Antique Glass Dressing Table Pot,6.19,3,15492,United Kingdom +581492,12/9/2019,22800,Antique Tall Swirlglass Trinket Pot,6.19,3,15492,United King +581492,12/9/2019,22809,Set Of 6 T-Lights Santa,6.19,1,15492,United Kingdom +581492,12/9/2019,22811,Set Of 6 T-Lights Cacti,6.19,1,15492,United Kingdom +581492,12/9/2019,22814,Card Party Games,6.19,9,15492,United Kingdom +581492,12/9/2019,22815,Card Psychedelic Apples,6.19,18,15492,United Kingdom +581492,12/9/2019,22816,Card Motorbike Santa,6.19,2,15492,United Kingdom +581492,12/9/2019,22817,Card Suki Birthday,6.19,5,15492,United Kingdom +581492,12/9/2019,22818,Card Christmas Village,7.24,6,15492,United Kingdom +581492,12/9/2019,22819,Birthday Card Retro Spot,7.24,3,15492,United Kingdom +581492,12/9/2019,22835,Hot Water Bottle I Am So Poorly,7.24,3,15492,United Kingdom +581492,12/9/2019,22865,Hand Warmer Owl Design,7.24,2,15492,United Kingdom +581492,12/9/2019,22866,Hand Warmer Scotty Dog Design,7.24,3,15492,United Kingdom +581492,12/9/2019,22867,Hand Warmer Bird Design,7.24,4,15492,United Kingdom +581492,12/9/2019,22881,Number Tile Vintage Font 2,7.24,1,15492,United Kingdom +581492,12/9/2019,22885,Number Tile Vintage Font 6,7.24,1,15492,United Kingdom +581492,12/9/2019,22888,Number Tile Vintage Font 9,7.24,1,15492,United Kingdom +581492,12/9/2019,22890,Novelty Biscuits Cake Stand 3 Tier,7.24,1,15492,United Kingd +581492,12/9/2019,22898,Childrens Apron Apples Design,7.24,1,15492,United Kingdom +581492,12/9/2019,22899,Children's Apron Dolly Girl,7.24,2,15492,United Kingdom +581492,12/9/2019,22900,Set 2 Tea Towels I Love London,7.24,3,15492,United Kingdom +581492,12/9/2019,22905,Calendar In Season Design,7.24,1,15492,United Kingdom +581492,12/9/2019,22907,Pack Of 20 Napkins Pantry Design,6.39,1,15492,United Kingdom +581492,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,7.24,5,15492,United King +581492,12/9/2019,22910,Paper Chain Kit Vintage Christmas,7.24,7,15492,United Kingdo +581492,12/9/2019,22914,Blue Coat Rack Paris Fashion,7.24,1,15492,United Kingdom +581492,12/9/2019,22922,Fridge Magnets Us Diner Assorted,7.24,6,15492,United Kingdom +581492,12/9/2019,22924,Fridge Magnets La Vie En Rose,7.24,6,15492,United Kingdom +581492,12/9/2019,22928,Yellow Giant Garden Thermometer,7.24,1,15492,United Kingdom +581492,12/9/2019,22940,Feltcraft Christmas Fairy,6.19,1,15492,United Kingdom +581492,12/9/2019,22941,Christmas Lights 10 Reindeer,6.19,2,15492,United Kingdom +581492,12/9/2019,22943,Christmas Lights 10 Vintage Baubles,6.19,1,15492,United King +581492,12/9/2019,22948,Metal Decoration Naughty Children,6.19,4,15492,United Kingdo +581492,12/9/2019,22951,60 Cake Cases Dolly Girl Design,6.19,2,15492,United Kingdom +581492,12/9/2019,22952,60 Cake Cases Vintage Christmas,6.19,2,15492,United Kingdom +581492,12/9/2019,22955,36 Foil Star Cake Cases,6.19,1,15492,United Kingdom +581492,12/9/2019,22960,Jam Making Set With Jars,6.19,2,15492,United Kingdom +581492,12/9/2019,22961,Jam Making Set Printed,6.19,9,15492,United Kingdom +581492,12/9/2019,22962,Jam Jar With Pink Lid,6.19,3,15492,United Kingdom +581492,12/9/2019,22963,Jam Jar With Green Lid,6.19,3,15492,United Kingdom +581492,12/9/2019,22964,3 Piece Spaceboy Cookie Cutter Set,6.19,1,15492,United Kingd +581492,12/9/2019,22965,3 Traditional Biscuit Cutters Set,6.19,1,15492,United Kingdo +581492,12/9/2019,22966,Gingerbread Man Cookie Cutter,6.19,4,15492,United Kingdom +581492,12/9/2019,22969,Homemade Jam Scented Candles,6.19,6,15492,United Kingdom +581492,12/9/2019,22975,Spaceboy Childrens Egg Cup,6.19,2,15492,United Kingdom +581492,12/9/2019,22976,Circus Parade Childrens Egg Cup,6.19,1,15492,United Kingdom +581492,12/9/2019,22977,Dolly Girl Childrens Egg Cup,6.19,1,15492,United Kingdom +581492,12/9/2019,22979,Pantry Washing Up Brush,6.19,2,15492,United Kingdom +581492,12/9/2019,22980,Pantry Scrubbing Brush,6.19,1,15492,United Kingdom +581492,12/9/2019,22982,Pantry Pastry Brush,6.19,3,15492,United Kingdom +581492,12/9/2019,22983,Card Billboard Font,6.19,1,15492,United Kingdom +581492,12/9/2019,22984,Card Gingham Rose,6.19,1,15492,United Kingdom +581492,12/9/2019,22988,Soldiers Egg Cup,6.19,1,15492,United Kingdom +581492,12/9/2019,22989,Set 2 Pantry Design Tea Towels,6.19,2,15492,United Kingdom +581492,12/9/2019,22992,Revolver Wooden Ruler,6.19,3,15492,United Kingdom +581492,12/9/2019,22993,Set Of 4 Pantry Jelly Moulds,6.19,3,15492,United Kingdom +581492,12/9/2019,22995,Travel Card Wallet Suki,6.19,4,15492,United Kingdom +581492,12/9/2019,22996,Travel Card Wallet Vintage Ticket,6.19,5,15492,United Kingdo +581492,12/9/2019,22997,Travel Card Wallet Union Jack,6.19,1,15492,United Kingdom +581492,12/9/2019,22998,Travel Card Wallet Keep Calm,6.19,4,15492,United Kingdom +581492,12/9/2019,22999,Travel Card Wallet Vintage Leaf,6.19,1,15492,United Kingdom +581492,12/9/2019,23005,Travel Card Wallet I Love London,6.19,4,15492,United Kingdom +581492,12/9/2019,23007,Spaceboy Baby Gift Set,6.19,1,15492,United Kingdom +581492,12/9/2019,23009,I Love London Baby Gift Set,6.19,2,15492,United Kingdom +581492,12/9/2019,23012,Glass Apothecary Bottle Perfume,6.19,1,15492,United Kingdom +581492,12/9/2019,23013,Glass Apothecary Bottle Tonic,6.19,2,15492,United Kingdom +581492,12/9/2019,23014,Glass Apothecary Bottle Elixir,6.19,1,15492,United Kingdom +581492,12/9/2019,23050,Recycled Acapulco Mat Green,6.19,1,15492,United Kingdom +581492,12/9/2019,23051,Recycled Acapulco Mat Blue,6.19,1,15492,United Kingdom +581492,12/9/2019,23052,Recycled Acapulco Mat Turquoise,6.19,5,15492,United Kingdom +581492,12/9/2019,23053,Recycled Acapulco Mat Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,23054,Recycled Acapulco Mat Lavender,6.19,1,15492,United Kingdom +581492,12/9/2019,23074,Embossed Heart Trinket Box,6.19,1,15492,United Kingdom +581492,12/9/2019,23076,Ice Cream Sundae Lip Gloss,6.19,3,15492,United Kingdom +581492,12/9/2019,23077,Doughnut Lip Gloss,6.19,3,15492,United Kingdom +581492,12/9/2019,23082,Set 6 Paper Table Lantern Hearts,6.19,1,15492,United Kingdom +581492,12/9/2019,23083,Set 6 Paper Table Lantern Stars,6.19,1,15492,United Kingdom +581492,12/9/2019,23084,Rabbit Night Light,6.19,57,15492,United Kingdom +581492,12/9/2019,23088,Zinc Heart Flower T-Light Holder,6.19,1,15492,United Kingdom +581492,12/9/2019,23089,Glass Bon Bon Jar,6.19,4,15492,United Kingdom +581492,12/9/2019,23093,Small Parisienne Heart Photo Frame,6.19,3,15492,United Kingd +581492,12/9/2019,23103,Jingle Bell Heart Decoration,6.19,2,15492,United Kingdom +581492,12/9/2019,23110,Parisienne Key Cabinet,6.19,1,15492,United Kingdom +581492,12/9/2019,23111,Parisienne Sewing Box,6.19,1,15492,United Kingdom +581492,12/9/2019,23112,Parisienne Curio Cabinet,6.19,1,15492,United Kingdom +581492,12/9/2019,23118,Parisienne Jewellery Drawer,6.19,1,15492,United Kingdom +581492,12/9/2019,23158,Set Of 5 Lucky Cat Magnets,6.19,1,15492,United Kingdom +581492,12/9/2019,23165,Large Ceramic Top Storage Jar,6.19,2,15492,United Kingdom +581492,12/9/2019,23166,Medium Ceramic Top Storage Jar,6.19,2,15492,United Kingdom +581492,12/9/2019,23168,Classic Cafe Sugar Dispenser,6.19,2,15492,United Kingdom +581492,12/9/2019,23171,Regency Tea Plate Green,6.19,1,15492,United Kingdom +581492,12/9/2019,23172,Regency Tea Plate Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,23173,Regency Teapot Roses,6.19,1,15492,United Kingdom +581492,12/9/2019,23175,Regency Milk Jug Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,23177,Treasure Island Book Box,6.19,1,15492,United Kingdom +581492,12/9/2019,23183,Mother's Kitchen Spoon Rest,6.19,3,15492,United Kingdom +581492,12/9/2019,23184,Bull Dog Bottle Opener,6.19,2,15492,United Kingdom +581492,12/9/2019,23188,Vintage 2 Metre Folding Ruler,6.19,1,15492,United Kingdom +581492,12/9/2019,23191,Bundle Of 3 Retro Note Books,6.19,1,15492,United Kingdom +581492,12/9/2019,23194,Gymkhana Treasure Book Box,6.19,1,15492,United Kingdom +581492,12/9/2019,23196,Vintage Leaf Magnetic Notepad,6.19,1,15492,United Kingdom +581492,12/9/2019,23197,Sketchbook Magnetic Shopping List,6.19,2,15492,United Kingdo +581492,12/9/2019,23198,Pantry Magnetic Shopping List,6.19,2,15492,United Kingdom +581492,12/9/2019,23204,Charlotte Bag Apples Design,6.19,6,15492,United Kingdom +581492,12/9/2019,23205,Charlotte Bag Vintage Alphabet,6.19,3,15492,United Kingdom +581492,12/9/2019,23212,Heart Wreath Decoration With Bell,6.19,7,15492,United Kingdo +581492,12/9/2019,23213,Star Wreath Decoration With Bell,6.19,7,15492,United Kingdom +581492,12/9/2019,23220,Reindeer Heart Decoration Gold,6.19,2,15492,United Kingdom +581492,12/9/2019,23224,Cherub Heart Decoration Gold,6.19,1,15492,United Kingdom +581492,12/9/2019,23229,Vintage Donkey Tail Game,6.19,2,15492,United Kingdom +581492,12/9/2019,23234,Biscuit Tin Vintage Christmas,6.19,4,15492,United Kingdom +581492,12/9/2019,23241,Treasure Tin Gymkhana Design,6.19,3,15492,United Kingdom +581492,12/9/2019,23243,Set Of Tea Coffee Sugar Tins Pantry,6.19,1,15492,United King +581492,12/9/2019,23245,Set Of 3 Regency Cake Tins,6.19,7,15492,United Kingdom +581492,12/9/2019,23247,Biscuit Tin 50'S Christmas,6.19,3,15492,United Kingdom +581492,12/9/2019,23264,Set Of 3 Wooden Sleigh Decorations,6.19,3,15492,United Kingd +581492,12/9/2019,23265,Set Of 3 Wooden Tree Decorations,6.19,3,15492,United Kingdom +581492,12/9/2019,23266,Set Of 3 Wooden Stocking Decoration,6.19,2,15492,United King +581492,12/9/2019,23274,Star T-Light Holder Willie Winkie,6.19,3,15492,United Kingdo +581492,12/9/2019,23275,Set Of 3 Hanging Owls Ollie Beak,6.19,2,15492,United Kingdom +581492,12/9/2019,23280,Folding Butterfly Mirror Hot Pink,6.19,2,15492,United Kingdo +581492,12/9/2019,23284,Doormat Keep Calm And Come In,6.19,1,15492,United Kingdom +581492,12/9/2019,23285,Pink Vintage Spot Beaker,6.19,1,15492,United Kingdom +581492,12/9/2019,23287,Red Vintage Spot Beaker,6.19,1,15492,United Kingdom +581492,12/9/2019,23290,Spaceboy Childrens Bowl,6.19,1,15492,United Kingdom +581492,12/9/2019,23292,Spaceboy Childrens Cup,6.19,1,15492,United Kingdom +581492,12/9/2019,23293,Set Of 12 Fairy Cake Baking Cases,6.19,3,15492,United Kingdo +581492,12/9/2019,23294,Set Of 6 Snack Loaf Baking Cases,6.19,1,15492,United Kingdom +581492,12/9/2019,23295,Set Of 12 Mini Loaf Baking Cases,6.19,4,15492,United Kingdom +581492,12/9/2019,23298,Spotty Bunting,6.19,2,15492,United Kingdom +581492,12/9/2019,23299,Food Cover With Beads Set 2,6.19,1,15492,United Kingdom +581492,12/9/2019,23300,Gardeners Kneeling Pad Cup Of Tea,6.19,3,15492,United Kingdo +581492,12/9/2019,23301,Gardeners Kneeling Pad Keep Calm,6.19,6,15492,United Kingdom +581492,12/9/2019,23307,Set Of 60 Pantry Design Cake Cases,6.19,7,15492,United Kingd +581492,12/9/2019,23308,Set Of 60 Vintage Leaf Cake Cases,6.19,1,15492,United Kingdo +581492,12/9/2019,23309,Set Of 60 I Love London Cake Cases,6.19,2,15492,United Kingd +581492,12/9/2019,23310,Bubblegum Ring Assorted,6.19,4,15492,United Kingdom +581492,12/9/2019,23311,Vintage Christmas Stocking,6.19,1,15492,United Kingdom +581492,12/9/2019,23312,Vintage Christmas Gift Sack,6.19,6,15492,United Kingdom +581492,12/9/2019,23313,Vintage Christmas Bunting,6.19,4,15492,United Kingdom +581492,12/9/2019,23314,Vintage Christmas Tablecloth,6.19,1,15492,United Kingdom +581492,12/9/2019,23319,Box Of 6 Mini 50'S Crackers,6.19,3,15492,United Kingdom +581492,12/9/2019,23322,Large White Heart Of Wicker,6.19,1,15492,United Kingdom +581492,12/9/2019,23323,White Wicker Star,6.19,6,15492,United Kingdom +581492,12/9/2019,23328,Set 6 School Milk Bottles In Crate,6.19,5,15492,United Kingd +581492,12/9/2019,23332,Ivory Wicker Heart Large,6.19,1,15492,United Kingdom +581492,12/9/2019,23334,Ivory Wicker Heart Small,6.19,1,15492,United Kingdom +581492,12/9/2019,23336,Egg Frying Pan Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,23340,Vintage Christmas Cake Frill,6.19,3,15492,United Kingdom +581492,12/9/2019,23345,Dolly Girl Beaker,6.19,1,15492,United Kingdom +581492,12/9/2019,23347,I Love London Beaker,6.19,1,15492,United Kingdom +581492,12/9/2019,23349,Roll Wrap Vintage Christmas,6.19,2,15492,United Kingdom +581492,12/9/2019,23351,Roll Wrap 50'S Christmas,6.19,5,15492,United Kingdom +581492,12/9/2019,23352,Roll Wrap 50'S Red Christmas,6.19,1,15492,United Kingdom +581492,12/9/2019,23353,6 Gift Tags Vintage Christmas,6.19,3,15492,United Kingdom +581492,12/9/2019,23354,6 Gift Tags 50'S Christmas,6.19,4,15492,United Kingdom +581492,12/9/2019,23357,Hot Water Bottle Sex Bomb,6.19,1,15492,United Kingdom +581492,12/9/2019,23358,Hot Stuff Hot Water Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,23365,Set 12 Colour Pencils Love London,6.19,1,15492,United Kingdo +581492,12/9/2019,23366,Set 12 Colouring Pencils Doily,6.04,5,15492,United Kingdom +581492,12/9/2019,23367,Set 12 Colour Pencils Spaceboy,6.04,10,15492,United Kingdom +581492,12/9/2019,23368,Set 12 Colour Pencils Dolly Girl,6.19,2,15492,United Kingdom +581492,12/9/2019,23581,Jumbo Bag Paisley Park,6.19,3,15492,United Kingdom +581492,12/9/2019,21928,Jumbo Bag Scandinavian Blue Paisley,6.19,2,15492,United King +581492,12/9/2019,21929,Jumbo Bag Pink Vintage Paisley,6.19,1,15492,United Kingdom +581492,12/9/2019,85099C,Jumbo Bag Baroque Black White,6.19,7,15492,United Kingdom +581492,12/9/2019,23199,Jumbo Bag Apples,6.19,2,15492,United Kingdom +581492,12/9/2019,23200,Jumbo Bag Pears,6.19,1,15492,United Kingdom +581492,12/9/2019,23202,Jumbo Bag Vintage Leaf,6.19,2,15492,United Kingdom +581492,12/9/2019,23343,Jumbo Bag Vintage Christmas,6.19,4,15492,United Kingdom +581492,12/9/2019,23344,Jumbo Bag 50'S Christmas,6.19,5,15492,United Kingdom +581492,12/9/2019,23583,Lunch Bag Paisley Park,6.19,2,15492,United Kingdom +581492,12/9/2019,20727,Lunch Bag Black Skull,6.04,2,15492,United Kingdom +581492,12/9/2019,20728,Lunch Bag Cars Blue,6.04,1,15492,United Kingdom +581492,12/9/2019,20725,Lunch Bag Red Retrospot,6.19,1,15492,United Kingdom +581492,12/9/2019,20726,Lunch Bag Woodland,6.19,1,15492,United Kingdom +581492,12/9/2019,22662,Lunch Bag Dolly Girl Design,6.19,1,15492,United Kingdom +581492,12/9/2019,23206,Lunch Bag Apple Design,6.19,3,15492,United Kingdom +581492,12/9/2019,23208,Lunch Bag Vintage Leaf Design,6.19,3,15492,United Kingdom +581492,12/9/2019,23375,50'S Christmas Paper Gift Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,23437,50'S Christmas Gift Bag Large,6.19,1,15492,United Kingdom +581492,12/9/2019,22821,Gift Bag Psychedelic Apples,7.24,3,15492,United Kingdom +581493,12/9/2019,79190B,Retro Plastic Polka Tray,7.24,15,12423,Belgium +581493,12/9/2019,79190A,Retro Plastic 70'S Tray,7.24,15,12423,Belgium +581493,12/9/2019,22915,Assorted Bottle Top Magnets,7.24,12,12423,Belgium +581493,12/9/2019,22151,Place Setting White Heart,7.24,24,12423,Belgium +581493,12/9/2019,22632,Hand Warmer Red Retrospot,7.24,12,12423,Belgium +581493,12/9/2019,22865,Hand Warmer Owl Design,7.24,12,12423,Belgium +581493,12/9/2019,20718,Red Retrospot Shopper Bag,7.24,10,12423,Belgium +581493,12/9/2019,79190B,Retro Plastic Polka Tray,7.24,12,12423,Belgium +581493,12/9/2019,71459,Hanging Jam Jar T-Light Holders,7.24,12,12423,Belgium +581493,12/9/2019,84945,Multi Colour Silver T-Light Holder,7.24,12,12423,Belgium +581493,12/9/2019,22356,Charlotte Bag Pink Polkadot,7.24,10,12423,Belgium +581493,12/9/2019,20724,Red Retrospot Charlotte Bag,7.24,10,12423,Belgium +581493,12/9/2019,23204,Charlotte Bag Apples Design,7.24,10,12423,Belgium +581493,12/9/2019,21108,Fairy Cake Flannel Assorted Colour,7.24,18,12423,Belgium +581493,12/9/2019,22252,Birdcage Decoration Tealight Holder,7.24,12,12423,Belgium +581493,12/9/2019,22807,Set Of 6 T-Lights Toadstools,6.19,6,12423,Belgium +581494,12/9/2019,23084,Rabbit Night Light,6.19,24,12518,Germany +581494,12/9/2019,21559,Strawberry Lunch Box With Cutlery,6.19,6,12518,Germany +581494,12/9/2019,21506,Fancy Font Birthday Card,6.19,12,12518,Germany +581494,12/9/2019,22716,Card Circus Parade,6.19,12,12518,Germany +581494,12/9/2019,22556,Plasters In Tin Circus Parade,6.19,12,12518,Germany +581494,12/9/2019,22328,Round Snack Boxes Set Of 4 Fruits,6.19,6,12518,Germany +581494,12/9/2019,22730,Alarm Clock Bakelike Ivory,6.19,4,12518,Germany +581494,12/9/2019,22633,Hand Warmer Union Jack,6.19,12,12518,Germany +581494,12/9/2019,22326,Round Snack Boxes Set Of4 Woodland,6.19,6,12518,Germany +581494,12/9/2019,10125,Mini Funky Design Tapes,6.19,20,12518,Germany +581494,12/9/2019,23367,Set 12 Colour Pencils Spaceboy,6.19,24,12518,Germany +581494,12/9/2019,22551,Plasters In Tin Spaceboy,6.04,12,12518,Germany +581494,12/9/2019,22554,Plasters In Tin Woodland Animals,6.04,12,12518,Germany +581494,12/9/2019,22549,Picture Dominoes,6.19,12,12518,Germany +581494,12/9/2019,23388,Woodland Mini Backpack,6.19,4,12518,Germany +581494,12/9/2019,23390,Dolly Girl Mini Backpack,6.19,4,12518,Germany +581494,12/9/2019,23389,Spaceboy Mini Backpack,6.19,4,12518,Germany +581495,12/9/2019,23535,Wall Art Bicycle Safety,6.19,12,14051,United Kingdom +581495,12/9/2019,22699,Roses Regency Teacup And Saucer,6.19,12,14051,United Kingdom +581495,12/9/2019,22698,Pink Regency Teacup And Saucer,6.19,12,14051,United Kingdom +581495,12/9/2019,22697,Green Regency Teacup And Saucer,6.19,12,14051,United Kingdom +581495,12/9/2019,22633,Hand Warmer Union Jack,6.04,18,14051,United Kingdom +581495,12/9/2019,15056N,Edwardian Parasol Natural,6.19,36,14051,United Kingdom +581495,12/9/2019,23439,Hand Warmer Red Love Heart,6.19,36,14051,United Kingdom +581495,12/9/2019,48138,Doormat Union Flag,6.19,10,14051,United Kingdom +581495,12/9/2019,21523,Doormat Fancy Font Home Sweet Home,6.19,10,14051,United King +581495,12/9/2019,21877,Home Sweet Home Mug,6.19,12,14051,United Kingdom +581495,12/9/2019,21871,Save The Planet Mug,6.19,18,14051,United Kingdom +581495,12/9/2019,22798,Antique Glass Dressing Table Pot,6.19,36,14051,United Kingdo +581495,12/9/2019,23173,Regency Teapot Roses,6.19,6,14051,United Kingdom +581495,12/9/2019,22423,Regency Cakestand 3 Tier,6.19,10,14051,United Kingdom +581496,12/9/2019,22664,Toy Tidy Dolly Girl Design,6.19,20,16558,United Kingdom +581496,12/9/2019,22721,Set Of 3 Cake Tins Sketchbook,6.19,12,16558,United Kingdom +581496,12/9/2019,72800E,4 Ivory Dinner Candles Silver Flock,6.19,12,16558,United Ki +581496,12/9/2019,23313,Vintage Christmas Bunting,6.19,10,16558,United Kingdom +581496,12/9/2019,22952,60 Cake Cases Vintage Christmas,6.19,24,16558,United Kingdom +581496,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,6.04,12,16558,United Kin +581496,12/9/2019,23298,Spotty Bunting,6.19,3,16558,United Kingdom +581496,12/9/2019,23598,Paper Bunting Vintage Party,6.19,6,16558,United Kingdom +581496,12/9/2019,16169E,Wrap 50'S Christmas,6.19,25,16558,United Kingdom +581496,12/9/2019,23351,Roll Wrap 50'S Christmas,6.19,12,16558,United Kingdom +581496,12/9/2019,23350,Roll Wrap Vintage Spot,6.19,24,16558,United Kingdom +581496,12/9/2019,22865,Hand Warmer Owl Design,6.19,24,16558,United Kingdom +581496,12/9/2019,22632,Hand Warmer Red Retrospot,6.19,12,16558,United Kingdom +581496,12/9/2019,22835,Hot Water Bottle I Am So Poorly,6.19,4,16558,United Kingdom +581496,12/9/2019,22112,Chocolate Hot Water Bottle,6.19,6,16558,United Kingdom +581496,12/9/2019,23355,Hot Water Bottle Keep Calm,6.19,4,16558,United Kingdom +581496,12/9/2019,22314,Office Mug Warmer Choc+Blue,6.19,24,16558,United Kingdom +581496,12/9/2019,22313,Office Mug Warmer Pink,6.19,12,16558,United Kingdom +581496,12/9/2019,23084,Rabbit Night Light,6.19,18,16558,United Kingdom +581496,12/9/2019,20831,Gold Photo Frame,6.19,12,16558,United Kingdom +581496,12/9/2019,21115,Rose Caravan Doorstop,6.19,8,16558,United Kingdom +581496,12/9/2019,21462,Nursery A B C Painted Letters,7.24,8,16558,United Kingdom +581496,12/9/2019,22076,6 Ribbons Empire,7.24,24,16558,United Kingdom +581496,12/9/2019,22190,Local Cafe Mug,7.24,24,16558,United Kingdom +581496,12/9/2019,22215,Cake Stand White Two Tier Lace,7.24,6,16558,United Kingdom +581496,12/9/2019,22220,Cake Stand Lovebird 2 Tier White,7.24,6,16558,United Kingdom +581496,12/9/2019,22464,Hanging Metal Heart Lantern,7.24,12,16558,United Kingdom +581496,12/9/2019,22465,Hanging Metal Star Lantern,7.24,12,16558,United Kingdom +581496,12/9/2019,22539,Mini Jigsaw Dolly Girl,7.24,48,16558,United Kingdom +581496,12/9/2019,22544,Mini Jigsaw Spaceboy,7.24,48,16558,United Kingdom +581496,12/9/2019,23438,Red Spot Gift Bag Large,6.19,12,16558,United Kingdom +581496,12/9/2019,23437,50'S Christmas Gift Bag Large,6.19,12,16558,United Kingdom +581497,12/9/2019,20719,Woodland Charlotte Bag,6.19,33,17497,United Kingdom +581497,12/9/2019,20723,Strawberry Charlotte Bag,6.19,42,17497,United Kingdom +581497,12/9/2019,20724,Red Retrospot Charlotte Bag,6.19,55,17497,United Kingdom +581497,12/9/2019,21212,Pack Of 72 Retrospot Cake Cases,7.24,7,17497,United Kingdom +581497,12/9/2019,21238,Red Retrospot Cup,7.24,8,17497,United Kingdom +581497,12/9/2019,21242,Red Retrospot Plate,7.24,2,17497,United Kingdom +581497,12/9/2019,21479,White Skull Hot Water Bottle,7.24,25,17497,United Kingdom +581497,12/9/2019,21481,Fawn Blue Hot Water Bottle,7.24,1,17497,United Kingdom +581497,12/9/2019,21481,Fawn Blue Hot Water Bottle,7.24,1,17497,United Kingdom +581497,12/9/2019,21484,Chick Grey Hot Water Bottle,7.24,1,17497,United Kingdom +581497,12/9/2019,21668,Red Stripe Ceramic Drawer Knob,7.24,1,17497,United Kingdom +581497,12/9/2019,21670,Blue Spot Ceramic Drawer Knob,7.24,1,17497,United Kingdom +581497,12/9/2019,21671,Red Spot Ceramic Drawer Knob,7.24,1,17497,United Kingdom +581497,12/9/2019,21672,White Spot Red Ceramic Drawer Knob,7.24,6,17497,United Kingd +581497,12/9/2019,21673,White Spot Blue Ceramic Drawer Knob,7.24,1,17497,United King +581497,12/9/2019,21714,Citronella Candle Garden Pot,7.24,2,17497,United Kingdom +581497,12/9/2019,22110,Bird House Hot Water Bottle,7.24,7,17497,United Kingdom +581497,12/9/2019,22111,Scottie Dog Hot Water Bottle,7.24,5,17497,United Kingdom +581497,12/9/2019,22112,Chocolate Hot Water Bottle,7.24,13,17497,United Kingdom +581497,12/9/2019,22114,Hot Water Bottle Tea And Sympathy,7.24,48,17497,United Kingd +581497,12/9/2019,22197,Popcorn Holder,7.24,68,17497,United Kingdom +581497,12/9/2019,22355,Charlotte Bag Suki Design,7.24,110,17497,United Kingdom +581497,12/9/2019,22356,Charlotte Bag Pink Polkadot,7.24,25,17497,United Kingdom +581497,12/9/2019,22356,Charlotte Bag Pink Polkadot,7.24,1,17497,United Kingdom +581497,12/9/2019,22423,Regency Cakestand 3 Tier,7.24,8,17497,United Kingdom +581497,12/9/2019,22725,Alarm Clock Bakelike Chocolate,7.24,3,17497,United Kingdom +581497,12/9/2019,22726,Alarm Clock Bakelike Green,7.24,1,17497,United Kingdom +581497,12/9/2019,22727,Alarm Clock Bakelike Red,7.24,10,17497,United Kingdom +581497,12/9/2019,22730,Alarm Clock Bakelike Ivory,7.24,5,17497,United Kingdom +581497,12/9/2019,22735,Ribbon Reel Socks And Mittens,7.24,2,17497,United Kingdom +581497,12/9/2019,22736,Ribbon Reel Making Snowmen,7.24,3,17497,United Kingdom +581497,12/9/2019,22738,Ribbon Reel Snowy Village,7.24,1,17497,United Kingdom +581497,12/9/2019,22805,Blue Drawer Knob Acrylic Edwardian,7.24,1,17497,United Kingd +581497,12/9/2019,22835,Hot Water Bottle I Am So Poorly,7.24,4,17497,United Kingdom +581497,12/9/2019,22895,Set Of 2 Tea Towels Apple And Pears,7.24,1,17497,United King +581497,12/9/2019,22896,Peg Bag Apples Design,7.24,2,17497,United Kingdom +581497,12/9/2019,22898,Childrens Apron Apples Design,7.24,2,17497,United Kingdom +581497,12/9/2019,22943,Christmas Lights 10 Vintage Baubles,7.24,1,17497,United King +581497,12/9/2019,23084,Rabbit Night Light,6.19,37,17497,United Kingdom +581497,12/9/2019,23168,Classic Cafe Sugar Dispenser,6.19,1,17497,United Kingdom +581497,12/9/2019,23204,Charlotte Bag Apples Design,6.04,13,17497,United Kingdom +581497,12/9/2019,23205,Charlotte Bag Vintage Alphabet,6.04,8,17497,United Kingdom +581497,12/9/2019,23301,Gardeners Kneeling Pad Keep Calm,6.19,1,17497,United Kingdom +581497,12/9/2019,23355,Hot Water Bottle Keep Calm,6.19,36,17497,United Kingdom +581497,12/9/2019,23356,Love Hot Water Bottle,6.19,1,17497,United Kingdom +581497,12/9/2019,23357,Hot Water Bottle Sex Bomb,6.19,2,17497,United Kingdom +581497,12/9/2019,23358,Hot Stuff Hot Water Bottle,6.19,2,17497,United Kingdom +581497,12/9/2019,35970,Zinc Folkart Sleigh Bells,6.19,2,17497,United Kingdom +581497,12/9/2019,47566,Party Bunting,6.19,5,17497,United Kingdom +581497,12/9/2019,82583,Hot Baths Metal Sign,6.19,4,17497,United Kingdom +581497,12/9/2019,84029G,Knitted Union Flag Hot Water Bottle,6.19,11,17497,United Ki +581497,12/9/2019,84997C,Childrens Cutlery Polkadot Blue,6.19,3,17497,United Kingdom +581497,12/9/2019,85049G,Chocolate Box Ribbons,6.19,2,17497,United Kingdom +581497,12/9/2019,20727,Lunch Bag Black Skull,6.19,8,17497,United Kingdom +581497,12/9/2019,22383,Lunch Bag Suki Design,7.24,2,17497,United Kingdom +581497,12/9/2019,23206,Lunch Bag Apple Design,6.04,3,17497,United Kingdom +581497,12/9/2019,23206,Lunch Bag Apple Design,6.04,1,17497,United Kingdom +581497,12/9/2019,23207,Lunch Bag Alphabet Design,6.19,1,17497,United Kingdom +581497,12/9/2019,23208,Lunch Bag Vintage Leaf Design,6.19,3,17497,United Kingdom +581498,12/9/2019,20669,Red Heart Luggage Tag,6.19,3,14498,United Kingdom +581498,12/9/2019,20679,Edwardian Parasol Red,6.19,5,14498,United Kingdom +581498,12/9/2019,20717,Strawberry Shopper Bag,6.19,1,14498,United Kingdom +581498,12/9/2019,20718,Red Retrospot Shopper Bag,6.19,1,14498,United Kingdom +581498,12/9/2019,20750,Red Retrospot Mini Cases,6.19,1,14498,United Kingdom +581498,12/9/2019,20961,Strawberry Bath Sponge,6.19,1,14498,United Kingdom +581498,12/9/2019,20963,Apple Bath Sponge,6.19,1,14498,United Kingdom +581498,12/9/2019,21115,Rose Caravan Doorstop,6.19,1,14498,United Kingdom +581498,12/9/2019,21125,Set 6 Football Celebration Candles,6.19,3,14498,United Kingd +581498,12/9/2019,21137,Black Record Cover Frame,6.19,4,14498,United Kingdom +581498,12/9/2019,21155,Red Retrospot Peg Bag,6.19,4,14498,United Kingdom +581498,12/9/2019,21166,Cook With Wine Metal Sign,6.19,3,14498,United Kingdom +581498,12/9/2019,21169,You're Confusing Me Metal Sign,6.19,2,14498,United Kingdom +581498,12/9/2019,21174,Pottering In The Shed Metal Sign,6.19,2,14498,United Kingdom +581498,12/9/2019,21181,Please One Person Metal Sign,6.19,6,14498,United Kingdom +581498,12/9/2019,21216,Set 3 Retrospot Tea/Coffee/Sugar,6.19,2,14498,United Kingdom +581498,12/9/2019,21217,Red Retrospot Round Cake Tins,6.19,3,14498,United Kingdom +581498,12/9/2019,21218,Red Spotty Biscuit Tin,6.19,4,14498,United Kingdom +581498,12/9/2019,21232,Strawberry Ceramic Trinket Pot,6.19,13,14498,United Kingdom +581498,12/9/2019,21239,Pink Polkadot Cup,6.19,1,14498,United Kingdom +581498,12/9/2019,21257,Victorian Sewing Box Medium,6.19,3,14498,United Kingdom +581498,12/9/2019,21327,Skulls Writing Set,6.19,1,14498,United Kingdom +581498,12/9/2019,21328,Balloons Writing Set,6.19,1,14498,United Kingdom +581498,12/9/2019,21329,Dinosaurs Writing Set,6.19,1,14498,United Kingdom +581498,12/9/2019,21411,Gingham Heart Doorstop Red,6.19,1,14498,United Kingdom +581498,12/9/2019,21430,Set/3 Red Gingham Rose Storage Box,6.19,3,14498,United Kingd +581498,12/9/2019,21494,Rotating Leaves T-Light Holder,6.19,7,14498,United Kingdom +581498,12/9/2019,21523,Doormat Fancy Font Home Sweet Home,6.19,1,14498,United Kingd +581498,12/9/2019,21557,Set Of 6 Funky Beakers,6.19,1,14498,United Kingdom +581498,12/9/2019,21558,Skull Lunch Box With Cutlery,6.19,1,14498,United Kingdom +581498,12/9/2019,21731,Red Toadstool Led Night Light,6.19,9,14498,United Kingdom +581498,12/9/2019,21754,Home Building Block Word,6.19,2,14498,United Kingdom +581498,12/9/2019,21790,Vintage Snap Cards,6.19,1,14498,United Kingdom +581498,12/9/2019,21843,Red Retrospot Cake Stand,6.19,5,14498,United Kingdom +581498,12/9/2019,21864,Union Jack Flag Passport Cover,6.19,2,14498,United Kingdom +581498,12/9/2019,21874,Gin And Tonic Mug,6.19,2,14498,United Kingdom +581498,12/9/2019,21876,Pottering Mug,6.19,4,14498,United Kingdom +581498,12/9/2019,21890,S/6 Wooden Skittles In Cotton Bag,6.19,1,14498,United Kingdo +581498,12/9/2019,21912,Vintage Snakes & Ladders,6.19,1,14498,United Kingdom +581498,12/9/2019,21916,Set 12 Retro White Chalk Sticks,6.19,7,14498,United Kingdom +581498,12/9/2019,21930,Jumbo Storage Bag Skulls,6.19,2,14498,United Kingdom +581498,12/9/2019,21931,Jumbo Storage Bag Suki,6.19,6,14498,United Kingdom +581498,12/9/2019,21934,Skull Shoulder Bag,6.19,1,14498,United Kingdom +581498,12/9/2019,21935,Suki Shoulder Bag,6.19,7,14498,United Kingdom +581498,12/9/2019,21942,Skulls Design Flannel,6.19,1,14498,United Kingdom +581498,12/9/2019,21955,Doormat Union Jack Guns And Roses,6.19,1,14498,United Kingdo +581498,12/9/2019,21977,Pack Of 60 Pink Paisley Cake Cases,6.19,1,14498,United Kingd +581498,12/9/2019,21983,Pack Of 12 Blue Paisley Tissues,6.19,1,14498,United Kingdom +581498,12/9/2019,21987,Pack Of 6 Skull Paper Cups,6.19,2,14498,United Kingdom +581498,12/9/2019,21989,Pack Of 20 Skull Paper Napkins,6.19,1,14498,United Kingdom +581498,12/9/2019,22041,"Record Frame 7"" Single Size",6.19,2,14498,United Kingdom +581498,12/9/2019,22059,Ceramic Strawberry Design Mug,6.19,1,14498,United Kingdom +581498,12/9/2019,22069,Brown Pirate Treasure Chest,6.19,3,14498,United Kingdom +581498,12/9/2019,22077,6 Ribbons Rustic Charm,6.19,2,14498,United Kingdom +581498,12/9/2019,22083,Paper Chain Kit Retrospot,6.19,2,14498,United Kingdom +581498,12/9/2019,22086,Paper Chain Kit 50'S Christmas,6.19,52,14498,United Kingdom +581498,12/9/2019,22099,Caravan Square Tissue Box,6.19,2,14498,United Kingdom +581498,12/9/2019,22114,Hot Water Bottle Tea And Sympathy,6.19,4,14498,United Kingdo +581498,12/9/2019,22139,Retrospot Tea Set Ceramic 11 Pc,6.19,2,14498,United Kingdom +581498,12/9/2019,22141,Christmas Craft Tree Top Angel,6.19,7,14498,United Kingdom +581498,12/9/2019,22142,Christmas Craft White Fairy,6.19,2,14498,United Kingdom +581498,12/9/2019,22144,Christmas Craft Little Friends,6.19,8,14498,United Kingdom +581498,12/9/2019,22161,Heart Decoration Rustic Hanging,6.19,2,14498,United Kingdom +581498,12/9/2019,22173,Metal 4 Hook Hanger French Chateau,6.19,3,14498,United Kingd +581498,12/9/2019,22174,Photo Cube,6.19,3,14498,United Kingdom +581498,12/9/2019,22175,Pink Owl Soft Toy,6.19,1,14498,United Kingdom +581498,12/9/2019,22178,Victorian Glass Hanging T-Light,6.19,1,14498,United Kingdom +581498,12/9/2019,22179,Set 10 Night Owl Lights,6.19,1,14498,United Kingdom +581498,12/9/2019,22186,Red Star Card Holder,6.19,1,14498,United Kingdom +581498,12/9/2019,22187,Green Christmas Tree Card Holder,6.19,6,14498,United Kingdom +581498,12/9/2019,22193,Red Diner Wall Clock,6.19,1,14498,United Kingdom +581498,12/9/2019,22195,Large Heart Measuring Spoons,6.19,3,14498,United Kingdom +581498,12/9/2019,22196,Small Heart Measuring Spoons,6.19,2,14498,United Kingdom +581498,12/9/2019,22207,Frying Pan Union Flag,6.19,1,14498,United Kingdom +581498,12/9/2019,22278,Overnight Bag Vintage Rose Paisley,6.19,2,14498,United Kingd +581498,12/9/2019,22301,Coffee Mug Cat + Bird Design,6.19,2,14498,United Kingdom +581498,12/9/2019,22302,Coffee Mug Pears Design,6.19,4,14498,United Kingdom +581498,12/9/2019,22303,Coffee Mug Apples Design,6.19,4,14498,United Kingdom +581498,12/9/2019,22304,Coffee Mug Blue Paisley Design,6.19,1,14498,United Kingdom +581498,12/9/2019,22308,Tea Cosy Blue Stripe,6.19,2,14498,United Kingdom +581498,12/9/2019,22327,Round Snack Boxes Set Of 4 Skulls,6.19,4,14498,United Kingdo +581498,12/9/2019,22328,Round Snack Boxes Set Of 4 Fruits,6.19,4,14498,United Kingdo +581498,12/9/2019,22352,Lunch Box With Cutlery Retrospot,6.19,6,14498,United Kingdom +581498,12/9/2019,22357,Kings Choice Biscuit Tin,6.19,1,14498,United Kingdom +581498,12/9/2019,22358,Kings Choice Tea Caddy,6.19,1,14498,United Kingdom +581498,12/9/2019,22367,Childrens Apron Spaceboy Design,6.19,7,14498,United Kingdom +581498,12/9/2019,22371,Airline Bag Vintage Tokyo 78,6.19,1,14498,United Kingdom +581498,12/9/2019,22374,Airline Bag Vintage Jet Set Red,6.19,1,14498,United Kingdom +581498,12/9/2019,22378,Wall Tidy Retrospot,7.24,2,14498,United Kingdom +581498,12/9/2019,22379,Recycling Bag Retrospot,7.24,4,14498,United Kingdom +581498,12/9/2019,22381,Toy Tidy Pink Polkadot,7.24,1,14498,United Kingdom +581498,12/9/2019,22411,Jumbo Shopper Vintage Red Paisley,7.24,2,14498,United Kingdo +581498,12/9/2019,22422,Toothpaste Tube Pen,7.24,1,14498,United Kingdom +581498,12/9/2019,22424,Enamel Bread Bin Cream,7.24,1,14498,United Kingdom +581498,12/9/2019,22429,Enamel Measuring Jug Cream,7.24,1,14498,United Kingdom +581498,12/9/2019,22456,Natural Slate Chalkboard Large,7.24,4,14498,United Kingdom +581498,12/9/2019,22457,Natural Slate Heart Chalkboard,7.24,2,14498,United Kingdom +581498,12/9/2019,22471,Tv Dinner Tray Air Hostess,7.24,1,14498,United Kingdom +581498,12/9/2019,22474,Spaceboy Tv Dinner Tray,7.24,1,14498,United Kingdom +581498,12/9/2019,22488,Natural Slate Rectangle Chalkboard,7.24,2,14498,United Kingd +581498,12/9/2019,22498,Wooden Regatta Bunting,7.24,1,14498,United Kingdom +581498,12/9/2019,22507,Memo Board Retrospot Design,7.24,1,14498,United Kingdom +581498,12/9/2019,22526,Wheelbarrow For Children,7.24,1,14498,United Kingdom +581498,12/9/2019,22553,Plasters In Tin Skulls,7.24,1,14498,United Kingdom +581498,12/9/2019,22557,Plasters In Tin Vintage Paisley,7.24,1,14498,United Kingdom +581498,12/9/2019,22619,Set Of 6 Soldier Skittles,7.24,1,14498,United Kingdom +581498,12/9/2019,22622,Box Of Vintage Alphabet Blocks,7.24,1,14498,United Kingdom +581498,12/9/2019,22624,Ivory Kitchen Scales,7.24,1,14498,United Kingdom +581498,12/9/2019,22629,Spaceboy Lunch Box,7.24,2,14498,United Kingdom +581498,12/9/2019,22632,Hand Warmer Red Retrospot,7.24,1,14498,United Kingdom +581498,12/9/2019,22645,Ceramic Heart Fairy Cake Money Bank,7.24,4,14498,United King +581498,12/9/2019,22654,Deluxe Sewing Kit,6.19,2,14498,United Kingdom +581498,12/9/2019,22659,Lunch Box I Love London,6.19,1,14498,United Kingdom +581498,12/9/2019,22666,Recipe Box Pantry Yellow Design,6.19,11,14498,United Kingdom +581498,12/9/2019,22676,French Blue Metal Door Sign 1,6.04,1,14498,United Kingdom +581498,12/9/2019,22684,French Blue Metal Door Sign 9,6.04,1,14498,United Kingdom +581498,12/9/2019,22694,Wicker Star,6.04,1,14498,United Kingdom +581498,12/9/2019,22697,Green Regency Teacup And Saucer,6.04,6,14498,United Kingdom +581498,12/9/2019,22698,Pink Regency Teacup And Saucer,6.04,9,14498,United Kingdom +581498,12/9/2019,22699,Roses Regency Teacup And Saucer,6.19,6,14498,United Kingdom +581498,12/9/2019,22722,Set Of 6 Spice Tins Pantry Design,6.19,3,14498,United Kingdo +581498,12/9/2019,22733,3d Traditional Christmas Stickers,6.19,1,14498,United Kingdo +581498,12/9/2019,22734,Set Of 6 Ribbons Vintage Christmas,6.19,5,14498,United Kingd +581498,12/9/2019,22776,Sweetheart 3 Tier Cake Stand,6.19,1,14498,United Kingdom +581498,12/9/2019,22795,Sweetheart Recipe Book Stand,6.19,1,14498,United Kingdom +581498,12/9/2019,22807,Set Of 6 T-Lights Toadstools,6.19,2,14498,United Kingdom +581498,12/9/2019,22813,Pack 3 Boxes Bird Panettone,6.19,4,14498,United Kingdom +581498,12/9/2019,22838,3 Tier Cake Tin Red And Cream,6.19,1,14498,United Kingdom +581498,12/9/2019,22844,Vintage Cream Dog Food Container,6.19,2,14498,United Kingdom +581498,12/9/2019,22845,Vintage Cream Cat Food Container,6.19,1,14498,United Kingdom +581498,12/9/2019,22865,Hand Warmer Owl Design,6.19,1,14498,United Kingdom +581498,12/9/2019,22866,Hand Warmer Scotty Dog Design,6.19,2,14498,United Kingdom +581498,12/9/2019,22891,Tea For One Polkadot,6.19,1,14498,United Kingdom +581498,12/9/2019,22900,Set 2 Tea Towels I Love London,6.19,2,14498,United Kingdom +581498,12/9/2019,22910,Paper Chain Kit Vintage Christmas,6.19,5,14498,United Kingdo +581498,12/9/2019,22952,60 Cake Cases Vintage Christmas,6.19,7,14498,United Kingdom +581498,12/9/2019,22960,Jam Making Set With Jars,6.19,5,14498,United Kingdom +581498,12/9/2019,22961,Jam Making Set Printed,6.19,4,14498,United Kingdom +581498,12/9/2019,22966,Gingerbread Man Cookie Cutter,6.19,2,14498,United Kingdom +581498,12/9/2019,22993,Set Of 4 Pantry Jelly Moulds,6.19,2,14498,United Kingdom +581498,12/9/2019,23012,Glass Apothecary Bottle Perfume,6.19,1,14498,United Kingdom +581498,12/9/2019,23013,Glass Apothecary Bottle Tonic,6.19,1,14498,United Kingdom +581498,12/9/2019,23014,Glass Apothecary Bottle Elixir,7.24,2,14498,United Kingdom +581498,12/9/2019,23080,Red Metal Box Top Secret,7.24,5,14498,United Kingdom +581498,12/9/2019,23170,Regency Tea Plate Roses,7.24,4,14498,United Kingdom +581498,12/9/2019,23171,Regency Tea Plate Green,7.24,5,14498,United Kingdom +581498,12/9/2019,23172,Regency Tea Plate Pink,6.19,4,14498,United Kingdom +581498,12/9/2019,23181,Bull Dog Bottle Top Wall Clock,6.19,1,14498,United Kingdom +581498,12/9/2019,23196,Vintage Leaf Magnetic Notepad,6.19,1,14498,United Kingdom +581498,12/9/2019,23198,Pantry Magnetic Shopping List,6.19,2,14498,United Kingdom +581498,12/9/2019,23245,Set Of 3 Regency Cake Tins,6.19,5,14498,United Kingdom +581498,12/9/2019,23295,Set Of 12 Mini Loaf Baking Cases,6.19,1,14498,United Kingdom +581498,12/9/2019,23298,Spotty Bunting,6.19,1,14498,United Kingdom +581498,12/9/2019,23300,Gardeners Kneeling Pad Cup Of Tea,6.19,9,14498,United Kingdo +581498,12/9/2019,23301,Gardeners Kneeling Pad Keep Calm,6.19,32,14498,United Kingdo +581498,12/9/2019,23311,Vintage Christmas Stocking,6.19,6,14498,United Kingdom +581498,12/9/2019,23312,Vintage Christmas Gift Sack,6.19,3,14498,United Kingdom +581498,12/9/2019,23328,Set 6 School Milk Bottles In Crate,6.19,6,14498,United Kingd +581498,12/9/2019,23349,Roll Wrap Vintage Christmas,6.19,8,14498,United Kingdom +581498,12/9/2019,23351,Roll Wrap 50'S Christmas,6.19,22,14498,United Kingdom +581498,12/9/2019,23352,Roll Wrap 50'S Red Christmas,6.19,8,14498,United Kingdom +581498,12/9/2019,23353,6 Gift Tags Vintage Christmas,6.19,10,14498,United Kingdom +581498,12/9/2019,23354,6 Gift Tags 50'S Christmas,6.19,9,14498,United Kingdom +581498,12/9/2019,23368,Set 12 Colour Pencils Dolly Girl,6.19,3,14498,United Kingdom +581498,12/9/2019,23369,Set 36 Colour Pencils Love London,6.19,1,14498,United Kingdo +581498,12/9/2019,23370,Set 36 Colouring Pencils Doily,6.19,3,14498,United Kingdom +581498,12/9/2019,23382,Box Of 6 Christmas Cake Decorations,6.19,10,14498,United Kin +581498,12/9/2019,23388,Woodland Mini Backpack,6.19,1,14498,United Kingdom +581498,12/9/2019,23480,Mini Lights Woodland Mushrooms,7.24,1,14498,United Kingdom +581498,12/9/2019,23493,Vintage Doily Travel Sewing Kit,7.24,1,14498,United Kingdom +581498,12/9/2019,23494,Vintage Doily Deluxe Sewing Kit,7.24,1,14498,United Kingdom +581498,12/9/2019,23497,Classic Chrome Bicycle Bell,7.24,1,14498,United Kingdom +581498,12/9/2019,23501,Key Ring Baseball Boot Union Jack,7.24,1,14498,United Kingdo +581498,12/9/2019,23564,Egg Cup Milkmaid Ingrid,7.24,1,14498,United Kingdom +581498,12/9/2019,35970,Zinc Folkart Sleigh Bells,7.24,6,14498,United Kingdom +581498,12/9/2019,48138,Doormat Union Flag,7.24,1,14498,United Kingdom +581498,12/9/2019,71053,White Moroccan Metal Lantern,7.24,1,14498,United Kingdom +581498,12/9/2019,72349B,Set/6 Purple Butterfly T-Lights,7.24,2,14498,United Kingdom +581498,12/9/2019,79321,Chilli Lights,7.24,10,14498,United Kingdom +581498,12/9/2019,82001S,Silver Record Cover Frame,6.19,2,14498,United Kingdom +581498,12/9/2019,82482,Wooden Picture Frame White Finish,6.04,4,14498,United Kingdo +581498,12/9/2019,82552,Washroom Metal Sign,6.04,1,14498,United Kingdom +581498,12/9/2019,21171,Bathroom Metal Sign,6.19,1,14498,United Kingdom +581498,12/9/2019,82581,Toilet Metal Sign,6.19,1,14498,United Kingdom +581498,12/9/2019,82600,N0 Singing Metal Sign,6.19,4,14498,United Kingdom +581498,12/9/2019,84029E,Red Woolly Hottie White Heart,6.19,4,14498,United Kingdom +581498,12/9/2019,84032A,Charlie+Lola Pink Hot Water Bottle,6.19,4,14498,United King +581498,12/9/2019,84032B,Charlie + Lola Red Hot Water Bottle,6.19,3,14498,United Kin +581498,12/9/2019,84375,Set Of 20 Kids Cookie Cutters,6.19,3,14498,United Kingdom +581498,12/9/2019,84509A,Set Of 4 English Rose Placemats,6.19,1,14498,United Kingdom +581498,12/9/2019,84558A,3d Dog Picture Playing Cards,6.19,1,14498,United Kingdom +581498,12/9/2019,84832,Zinc Willie Winkie Candle Stick,6.19,26,14498,United Kingdom +581498,12/9/2019,84968E,Set Of 16 Vintage Black Cutlery,6.19,1,14498,United Kingdom +581498,12/9/2019,84970S,Hanging Heart Zinc T-Light Holder,6.19,1,14498,United Kingd +581498,12/9/2019,84997A,Childrens Cutlery Polkadot Green,6.19,2,14498,United Kingdo +581498,12/9/2019,84997B,Childrens Cutlery Retrospot Red,6.19,3,14498,United Kingdom +581498,12/9/2019,84997D,Childrens Cutlery Polkadot Pink,6.19,1,14498,United Kingdom +581498,12/9/2019,85038,6 Chocolate Love Heart T-Lights,6.19,1,14498,United Kingdom +581498,12/9/2019,85048,15cm Christmas Glass Ball 20 Lights,6.19,1,14498,United King +581498,12/9/2019,85049A,Traditional Christmas Ribbons,6.17,5,14498,United Kingdom +581498,12/9/2019,85049E,Scandinavian Reds Ribbons,6.19,4,14498,United Kingdom +581498,12/9/2019,85150,Ladies & Gentlemen Metal Sign,6.19,1,14498,United Kingdom +581498,12/9/2019,85174,S/4 Cacti Candles,6.19,1,14498,United Kingdom +581498,12/9/2019,20712,Jumbo Bag Woodland Animals,6.19,3,14498,United Kingdom +581498,12/9/2019,20713,Jumbo Bag Owls,6.19,8,14498,United Kingdom +581498,12/9/2019,21928,Jumbo Bag Scandinavian Blue Paisley,6.19,2,14498,United King +581498,12/9/2019,22386,Jumbo Bag Pink Polkadot,7.24,1,14498,United Kingdom +581498,12/9/2019,22663,Jumbo Bag Dolly Girl Design,6.19,2,14498,United Kingdom +581498,12/9/2019,23199,Jumbo Bag Apples,6.19,6,14498,United Kingdom +581498,12/9/2019,23201,Jumbo Bag Alphabet,6.19,6,14498,United Kingdom +581498,12/9/2019,85099B,Jumbo Bag Red Retrospot,6.19,5,14498,United Kingdom +581498,12/9/2019,85099C,Jumbo Bag Baroque Black White,6.19,4,14498,United Kingdom +581498,12/9/2019,20726,Lunch Bag Woodland,6.19,3,14498,United Kingdom +581498,12/9/2019,20728,Lunch Bag Cars Blue,6.19,4,14498,United Kingdom +581498,12/9/2019,22384,Lunch Bag Pink Polkadot,7.24,1,14498,United Kingdom +581498,12/9/2019,23437,50'S Christmas Gift Bag Large,7.24,1,14498,United Kingdom +581500,12/9/2019,82486,3 Drawer Antique White Wood Cabinet,7.24,4,15344,United King +581500,12/9/2019,85066,Cream Sweetheart Mini Chest,7.24,4,15344,United Kingdom +581500,12/9/2019,48187,Doormat New England,7.24,2,15344,United Kingdom +581501,12/9/2019,22319,Hairclips Forties Fabric Assorted,7.24,180,12985,United King +581501,12/9/2019,20704,Mr Robot Soft Toy,7.24,8,12985,United Kingdom +581501,12/9/2019,21564,Pink Heart Shape Love Bucket,6.19,24,12985,United Kingdom +581501,12/9/2019,21563,Red Heart Shape Love Bucket,7.24,24,12985,United Kingdom +581501,12/9/2019,22165,Diamante Heart Shaped Wall Mirror,7.24,12,12985,United Kingd +581501,12/9/2019,22299,Pig Keyring With Light & Sound,7.24,48,12985,United Kingdom +581501,12/9/2019,22447,Pin Cushion Babushka Blue,7.24,12,12985,United Kingdom +581501,12/9/2019,22442,Grow Your Own Flowers Set Of 3,7.24,12,12985,United Kingdom +581501,12/9/2019,22495,Set Of 2 Round Tins Camembert,7.24,12,12985,United Kingdom +581501,12/9/2019,22544,Mini Jigsaw Spaceboy,7.24,96,12985,United Kingdom +581501,12/9/2019,22695,Wicker Wreath Small,7.24,24,12985,United Kingdom +581501,12/9/2019,22785,Squarecushion Cover Pink Union Jack,7.24,12,12985,United Kin +581501,12/9/2019,22811,Set Of 6 T-Lights Cacti,7.24,12,12985,United Kingdom +581501,12/9/2019,22807,Set Of 6 T-Lights Toadstools,7.24,12,12985,United Kingdom +581501,12/9/2019,22942,Christmas Lights 10 Santas,7.24,12,12985,United Kingdom +581501,12/9/2019,22808,Set Of 6 T-Lights Easter Chicks,6.19,12,12985,United Kingdom +581501,12/9/2019,23143,Zinc Wire Kitchen Organiser,7.24,4,12985,United Kingdom +581501,12/9/2019,23151,Zinc Sweetheart Soap Dish,7.24,12,12985,United Kingdom +581501,12/9/2019,23425,Storage Tin Home Sweet Home,7.24,12,12985,United Kingdom +581501,12/9/2019,84356,Pompom Curtain,7.24,12,12985,United Kingdom +581501,12/9/2019,85173,Set/6 Frog Prince T-Light Candles,7.24,12,12985,United Kingd +581501,12/9/2019,21731,Red Toadstool Led Night Light,7.24,24,12985,United Kingdom +581501,12/9/2019,23480,Mini Lights Woodland Mushrooms,7.24,8,12985,United Kingdom +581501,12/9/2019,22545,Mini Jigsaw Bunnies,7.24,96,12985,United Kingdom +581502,12/9/2019,22087,Paper Bunting White Lace,7.24,6,15910,United Kingdom +581502,12/9/2019,21209,Multicolour Honeycomb Fan,7.24,5,15910,United Kingdom +581502,12/9/2019,20668,Disco Ball Christmas Decoration,7.24,24,15910,United Kingdom +581502,12/9/2019,21790,Vintage Snap Cards,7.24,6,15910,United Kingdom +581502,12/9/2019,23270,Set Of 2 Ceramic Painted Hearts,7.24,4,15910,United Kingdom +581502,12/9/2019,23103,Jingle Bell Heart Decoration,7.24,8,15910,United Kingdom +581502,12/9/2019,22576,Swallow Wooden Christmas Decoration,7.24,2,15910,United King +581502,12/9/2019,22153,Angel Decoration Stars On Dress,7.24,13,15910,United Kingdom +581502,12/9/2019,21810,Christmas Hanging Star With Bell,7.24,6,15910,United Kingdom +581502,12/9/2019,22155,Star Decoration Rustic,7.24,6,15910,United Kingdom +581502,12/9/2019,23210,White Rocking Horse Hand Painted,7.24,12,15910,United Kingdo +581502,12/9/2019,22573,Star Wooden Christmas Decoration,7.24,8,15910,United Kingdom +581502,12/9/2019,22075,6 Ribbons Elegant Christmas,7.24,4,15910,United Kingdom +581502,12/9/2019,85049A,Traditional Christmas Ribbons,7.24,4,15910,United Kingdom +581502,12/9/2019,22734,Set Of 6 Ribbons Vintage Christmas,7.24,4,15910,United Kingd +581502,12/9/2019,23274,Star T-Light Holder Willie Winkie,7.24,8,15910,United Kingdo +581502,12/9/2019,22153,Angel Decoration Stars On Dress,7.24,1,15910,United Kingdom +581502,12/9/2019,22596,Christmas Star Wish List Chalkboard,7.24,24,15910,United Kin +581502,12/9/2019,22952,60 Cake Cases Vintage Christmas,7.24,10,15910,United Kingdom +581502,12/9/2019,22141,Christmas Craft Tree Top Angel,7.24,3,15910,United Kingdom +581514,12/9/2019,22753,Small Yellow Babushka Notebook,7.24,12,17754,United Kingdom +581514,12/9/2019,22755,Small Purple Babushka Notebook,7.24,12,17754,United Kingdom +581514,12/9/2019,22754,Small Red Babushka Notebook,6.19,12,17754,United Kingdom +581514,12/9/2019,22721,Set Of 3 Cake Tins Sketchbook,6.19,4,17754,United Kingdom +581514,12/9/2019,22059,Ceramic Strawberry Design Mug,6.19,12,17754,United Kingdom +581514,12/9/2019,22199,Frying Pan Red Retrospot,6.19,13,17754,United Kingdom +581514,12/9/2019,22200,Frying Pan Pink Polkadot,6.19,2,17754,United Kingdom +581514,12/9/2019,84032A,Charlie+Lola Pink Hot Water Bottle,6.19,9,17754,United King +581514,12/9/2019,84032B,Charlie + Lola Red Hot Water Bottle,6.19,9,17754,United Kin +581514,12/9/2019,84031A,Charlie+Lola Red Hot Water Bottle,6.19,10,17754,United King +581514,12/9/2019,84031B,Charlie Lola Blue Hot Water Bottle,6.19,14,17754,United Kin +581514,12/9/2019,22646,Ceramic Strawberry Cake Money Bank,6.19,4,17754,United Kingd +581514,12/9/2019,22644,Ceramic Cherry Cake Money Bank,6.19,4,17754,United Kingdom +581514,12/9/2019,22645,Ceramic Heart Fairy Cake Money Bank,6.19,4,17754,United King +581514,12/9/2019,22394,Paperweight Kings Choice,6.04,12,17754,United Kingdom +581514,12/9/2019,17091J,Vanilla Incense In Tin,6.04,66,17754,United Kingdom +581514,12/9/2019,35471D,Set Of 3 Bird Light Pink Feather,6.04,12,17754,United Kingd +581514,12/9/2019,22075,6 Ribbons Elegant Christmas,6.04,24,17754,United Kingdom +581514,12/9/2019,17091J,Vanilla Incense In Tin,6.19,24,17754,United Kingdom +581514,12/9/2019,22069,Brown Pirate Treasure Chest,6.19,20,17754,United Kingdom +581514,12/9/2019,22068,Black Pirate Treasure Chest,6.19,14,17754,United Kingdom +581514,12/9/2019,22500,Set Of 2 Tins Jardin De Provence,6.19,4,17754,United Kingdom +581514,12/9/2019,22075,6 Ribbons Elegant Christmas,6.19,24,17754,United Kingdom +581514,12/9/2019,21705,Bag 500g Swirly Marbles,6.19,84,17754,United Kingdom +581516,12/9/2019,21109,Large Cake Towel Chocolate Spots,6.19,12,14422,United Kingdo +581516,12/9/2019,21111,Swiss Roll Towel Chocolate Spots,6.19,24,14422,United Kingdo +581516,12/9/2019,21705,Bag 500g Swirly Marbles,6.19,24,14422,United Kingdom +581516,12/9/2019,22185,Slate Tile Natural Hanging,6.19,12,14422,United Kingdom +581516,12/9/2019,22442,Grow Your Own Flowers Set Of 3,6.19,12,14422,United Kingdom +581516,12/9/2019,21620,Set Of 4 Rose Botanical Candles,6.19,12,14422,United Kingdom +581516,12/9/2019,84029G,Knitted Union Flag Hot Water Bottle,6.19,8,14422,United Kin +581516,12/9/2019,21485,Retrospot Heart Hot Water Bottle,6.19,3,14422,United Kingdom +581516,12/9/2019,22111,Scottie Dog Hot Water Bottle,6.19,6,14422,United Kingdom +581516,12/9/2019,23355,Hot Water Bottle Keep Calm,6.19,8,14422,United Kingdom +581516,12/9/2019,22112,Chocolate Hot Water Bottle,6.19,6,14422,United Kingdom +581516,12/9/2019,23356,Love Hot Water Bottle,6.19,6,14422,United Kingdom +581516,12/9/2019,21108,Fairy Cake Flannel Assorted Colour,6.19,18,14422,United King +581516,12/9/2019,22171,3 Hook Photo Shelf Antique White,6.19,4,14422,United Kingdom +581516,12/9/2019,23301,Gardeners Kneeling Pad Keep Calm,6.19,24,14422,United Kingdo +581538,12/9/2019,23193,Buffalo Bill Treasure Book Box,6.19,6,14446,United Kingdom +581538,12/9/2019,23194,Gymkhana Treasure Book Box,6.19,1,14446,United Kingdom +581538,12/9/2019,23084,Rabbit Night Light,6.19,2,14446,United Kingdom +581538,12/9/2019,22068,Black Pirate Treasure Chest,6.19,1,14446,United Kingdom +581538,12/9/2019,22956,36 Foil Heart Cake Cases,6.19,1,14446,United Kingdom +581538,12/9/2019,20936,Forked Cactus Candle,6.19,1,14446,United Kingdom +581538,12/9/2019,23040,Paper Lantern 9 Point Snow Star,6.19,1,14446,United Kingdom +581538,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,6.19,1,14446,United King +581538,12/9/2019,21222,Set/4 Badges Beetles,6.19,1,14446,United Kingdom +581538,12/9/2019,21220,Set/4 Badges Dogs,6.19,1,14446,United Kingdom +581538,12/9/2019,21224,Set/4 Skull Badges,6.19,1,14446,United Kingdom +581538,12/9/2019,85123A,Cream Hanging Heart T-Light Holder,6.19,1,14446,United King +581538,12/9/2019,22992,Revolver Wooden Ruler,6.19,1,14446,United Kingdom +581538,12/9/2019,79066K,Retro Mod Tray,6.19,1,14446,United Kingdom +581538,12/9/2019,84380,Set Of 3 Butterfly Cookie Cutters,6.19,1,14446,United Kingdo +581538,12/9/2019,23371,Set 36 Colour Pencils Spaceboy,6.19,1,14446,United Kingdom +581538,12/9/2019,22694,Wicker Star,6.19,1,14446,United Kingdom +581538,12/9/2019,22095,Lads Only Tissue Box,6.19,1,14446,United Kingdom +581538,12/9/2019,23275,Set Of 3 Hanging Owls Ollie Beak,6.19,1,14446,United Kingdom +581538,12/9/2019,21673,White Spot Blue Ceramic Drawer Knob,6.19,1,14446,United King +581538,12/9/2019,21670,Blue Spot Ceramic Drawer Knob,6.19,1,14446,United Kingdom +581538,12/9/2019,85071C,"Charlie+Lola""Extremely Busy"" Sign",6.19,1,14446,United K +581538,12/9/2019,23349,Roll Wrap Vintage Christmas,6.19,3,14446,United Kingdom +581538,12/9/2019,23034,Drawer Knob Ceramic Black,6.19,1,14446,United Kingdom +581538,12/9/2019,21669,Blue Stripe Ceramic Drawer Knob,6.19,1,14446,United Kingdom +581538,12/9/2019,23033,Drawer Knob Ceramic Red,6.19,1,14446,United Kingdom +581538,12/9/2019,21668,Red Stripe Ceramic Drawer Knob,6.19,1,14446,United Kingdom +581538,12/9/2019,23275,Set Of 3 Hanging Owls Ollie Beak,6.19,1,14446,United Kingdom +581538,12/9/2019,23318,Box Of 6 Mini Vintage Crackers,6.19,1,14446,United Kingdom +581538,12/9/2019,23382,Box Of 6 Christmas Cake Decorations,6.19,1,14446,United King +581538,12/9/2019,22469,Heart Of Wicker Small,6.19,1,14446,United Kingdom +581538,12/9/2019,22899,Children's Apron Dolly Girl,6.19,2,14446,United Kingdom +581538,12/9/2019,22367,Childrens Apron Spaceboy Design,6.19,1,14446,United Kingdom +581538,12/9/2019,22899,Children's Apron Dolly Girl,6.19,3,14446,United Kingdom +581538,12/9/2019,23527,Wall Art Animals And Nature,6.19,1,14446,United Kingdom +581538,12/9/2019,23524,Wall Art Horse & Pony,6.19,1,14446,United Kingdom +581538,12/9/2019,23525,Wall Art Buffalo Bill,6.19,1,14446,United Kingdom +581538,12/9/2019,84380,Set Of 3 Butterfly Cookie Cutters,6.19,4,14446,United Kingdo +581538,12/9/2019,23122,Party Charms 50 Pieces,7.24,1,14446,United Kingdom +581538,12/9/2019,21990,Modern Floral Stationery Set,7.24,1,14446,United Kingdom +581538,12/9/2019,21329,Dinosaurs Writing Set,7.24,1,14446,United Kingdom +581538,12/9/2019,21328,Balloons Writing Set,7.24,1,14446,United Kingdom +581538,12/9/2019,22561,Wooden School Colouring Set,7.24,1,14446,United Kingdom +581538,12/9/2019,84519A,Tomato Charlie+Lola Coaster Set,7.24,1,14446,United Kingdom +581538,12/9/2019,84519B,Carrot Charlie+Lola Coaster Set,7.24,1,14446,United Kingdom +581538,12/9/2019,35004B,Set Of 3 Black Flying Ducks,7.24,2,14446,United Kingdom +581538,12/9/2019,22068,Black Pirate Treasure Chest,7.24,1,14446,United Kingdom +581538,12/9/2019,23353,6 Gift Tags Vintage Christmas,6.19,1,14446,United Kingdom +581538,12/9/2019,21591,Cosy Hour Cigar Box Matches,6.19,1,14446,United Kingdom +581538,12/9/2019,22197,Popcorn Holder,6.19,4,14446,United Kingdom +581538,12/9/2019,23320,Giant 50'S Christmas Cracker,6.19,1,14446,United Kingdom +581538,12/9/2019,23349,Roll Wrap Vintage Christmas,6.19,1,14446,United Kingdom +581538,12/9/2019,22985,Wrap Billboard Fonts Design,6.19,25,14446,United Kingdom +581538,12/9/2019,23040,Paper Lantern 9 Point Snow Star,6.19,2,14446,United Kingdom +581538,12/9/2019,23040,Paper Lantern 9 Point Snow Star,6.19,3,14446,United Kingdom +581538,12/9/2019,21194,Pink Honeycomb Paper Fan,6.19,2,14446,United Kingdom +581538,12/9/2019,21208,Pastel Colour Honeycomb Fan,6.19,1,14446,United Kingdom +581538,12/9/2019,79190D,Retro Plastic Daisy Tray,6.19,1,14446,United Kingdom +581538,12/9/2019,79190B,Retro Plastic Polka Tray,6.19,1,14446,United Kingdom +581538,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,6.02,2,14446,United King +581538,12/9/2019,23318,Box Of 6 Mini Vintage Crackers,6.02,1,14446,United Kingdom +581538,12/9/2019,23319,Box Of 6 Mini 50'S Crackers,6.02,1,14446,United Kingdom +581538,12/9/2019,23537,Wall Art I Love London,6.19,1,14446,United Kingdom +581538,12/9/2019,22992,Revolver Wooden Ruler,6.19,1,14446,United Kingdom +581538,12/9/2019,22991,Giraffe Wooden Ruler,6.19,1,14446,United Kingdom +581538,12/9/2019,23190,Bundle Of 3 School Exercise Books,6.19,1,14446,United Kingdo +581538,12/9/2019,21194,Pink Honeycomb Paper Fan,6.19,1,14446,United Kingdom +581538,12/9/2019,35004B,Set Of 3 Black Flying Ducks,6.19,1,14446,United Kingdom +581538,12/9/2019,22694,Wicker Star,6.19,1,14446,United Kingdom +581538,12/9/2019,21355,Toast Its - I Love You,6.19,1,14446,United Kingdom +581538,12/9/2019,23343,Jumbo Bag Vintage Christmas,6.19,1,14446,United Kingdom +581538,12/9/2019,23343,Jumbo Bag Vintage Christmas,6.19,1,14446,United Kingdom +581538,12/9/2019,20727,Lunch Bag Black Skull,6.19,1,14446,United Kingdom +581538,12/9/2019,20725,Lunch Bag Red Retrospot,6.19,1,14446,United Kingdom +581566,12/9/2019,23404,Home Sweet Home Blackboard,6.19,144,18102,United Kingdom +581567,12/9/2019,21417,Cockle Shell Dish,6.19,84,16626,United Kingdom +581567,12/9/2019,22464,Hanging Metal Heart Lantern,6.19,24,16626,United Kingdom +581567,12/9/2019,22465,Hanging Metal Star Lantern,6.19,24,16626,United Kingdom +581567,12/9/2019,84971S,Small Heart Flowers Hook,6.19,48,16626,United Kingdom +581567,12/9/2019,22624,Ivory Kitchen Scales,6.19,2,16626,United Kingdom +581567,12/9/2019,22627,Mint Kitchen Scales,6.19,2,16626,United Kingdom +581567,12/9/2019,22625,Red Kitchen Scales,6.19,2,16626,United Kingdom +581567,12/9/2019,23355,Hot Water Bottle Keep Calm,6.19,4,16626,United Kingdom +581567,12/9/2019,21326,Aged Glass Silver T-Light Holder,6.19,144,16626,United Kingd +581567,12/9/2019,21479,White Skull Hot Water Bottle,6.19,4,16626,United Kingdom +581567,12/9/2019,23356,Love Hot Water Bottle,6.19,3,16626,United Kingdom +581567,12/9/2019,21137,Black Record Cover Frame,6.19,24,16626,United Kingdom +581570,12/9/2019,22141,Christmas Craft Tree Top Angel,6.19,6,12662,Germany +581570,12/9/2019,22175,Pink Owl Soft Toy,6.19,6,12662,Germany +581570,12/9/2019,21481,Fawn Blue Hot Water Bottle,6.19,4,12662,Germany +581570,12/9/2019,23570,Traditional Pick Up Sticks Game,6.19,12,12662,Germany +581570,12/9/2019,22326,Round Snack Boxes Set Of4 Woodland,6.19,6,12662,Germany +581570,12/9/2019,22331,Woodland Party Bag + Sticker Set,6.19,8,12662,Germany +581570,12/9/2019,22834,Hand Warmer Babushka Design,6.19,12,12662,Germany +581570,12/9/2019,21914,Blue Harmonica In Box,6.19,12,12662,Germany +581570,12/9/2019,22139,Retrospot Tea Set Ceramic 11 Pc,6.19,3,12662,Germany +581570,12/9/2019,23077,Doughnut Lip Gloss,6.19,20,12662,Germany +581570,12/9/2019,20750,Red Retrospot Mini Cases,6.19,2,12662,Germany +581570,12/9/2019,22505,Memo Board Cottage Design,6.19,4,12662,Germany +581571,12/9/2019,23326,Hanging Mini Coloured Bottles,6.19,6,15311,United Kingdom +581571,12/9/2019,21313,Glass Heart T-Light Holder,6.19,1,15311,United Kingdom +581571,12/9/2019,48187,Doormat New England,6.19,1,15311,United Kingdom +581571,12/9/2019,23317,Blue Refectory Clock,6.19,1,15311,United Kingdom +581571,12/9/2019,23197,Sketchbook Magnetic Shopping List,6.19,4,15311,United Kingdo +581571,12/9/2019,21012,Antique All Glass Candlestick,6.19,2,15311,United Kingdom +581571,12/9/2019,22227,Hanging Heart Mirror Decoration,6.19,10,15311,United Kingdom +581571,12/9/2019,22794,Sweetheart Wire Magazine Rack,6.19,1,15311,United Kingdom +581571,12/9/2019,23182,Toilet Sign Occupied Or Vacant,6.19,1,15311,United Kingdom +581571,12/9/2019,21755,Love Building Block Word,6.19,1,15311,United Kingdom +581571,12/9/2019,85053,French Enamel Candleholder,6.19,2,15311,United Kingdom +581571,12/9/2019,23110,Parisienne Key Cabinet,6.19,2,15311,United Kingdom +581571,12/9/2019,21169,You're Confusing Me Metal Sign,6.19,1,15311,United Kingdom +581571,12/9/2019,21258,Victorian Sewing Box Large,6.19,8,15311,United Kingdom +581571,12/9/2019,23168,Classic Cafe Sugar Dispenser,6.19,36,15311,United Kingdom +581571,12/9/2019,23167,Small Ceramic Top Storage Jar,6.19,96,15311,United Kingdom +581571,12/9/2019,21314,Small Glass Heart Trinket Pot,6.19,48,15311,United Kingdom +581571,12/9/2019,21137,Black Record Cover Frame,6.19,24,15311,United Kingdom +581571,12/9/2019,44234,Assorted Circular Mobile,6.19,1,15311,United Kingdom +581571,12/9/2019,84347,Rotating Silver Angels T-Light Hldr,6.19,24,15311,United Kin +581572,12/9/2019,23328,Set 6 School Milk Bottles In Crate,6.19,48,16705,United King +581572,12/9/2019,22627,Mint Kitchen Scales,6.19,4,16705,United Kingdom +581572,12/9/2019,22624,Ivory Kitchen Scales,6.19,4,16705,United Kingdom +581572,12/9/2019,23245,Set Of 3 Regency Cake Tins,6.19,4,16705,United Kingdom +581574,12/9/2019,22326,Round Snack Boxes Set Of4 Woodland,6.19,6,12526,Germany +581574,12/9/2019,22328,Round Snack Boxes Set Of 4 Fruits,6.19,6,12526,Germany +581574,12/9/2019,23238,Set Of 4 Knick Knack Tins London,6.19,6,12526,Germany +581574,12/9/2019,23237,Set Of 4 Knick Knack Tins Leaf,6.19,6,12526,Germany +581574,12/9/2019,21257,Victorian Sewing Box Medium,6.19,2,12526,Germany +581574,12/9/2019,21258,Victorian Sewing Box Large,6.19,2,12526,Germany +581574,12/9/2019,23111,Parisienne Sewing Box,6.19,2,12526,Germany +581574,12/9/2019,22077,6 Ribbons Rustic Charm,6.19,12,12526,Germany +581574,12/9/2019,22074,6 Ribbons Shimmering Pinks,6.19,12,12526,Germany +581574,12/9/2019,22621,Traditional Knitting Nancy,6.19,12,12526,Germany +581574,12/9/2019,23199,Jumbo Bag Apples,6.19,10,12526,Germany +581574,12/9/2019,23581,Jumbo Bag Paisley Park,6.19,10,12526,Germany +581578,12/9/2019,21124,Set/10 Blue Polkadot Party Candles,6.19,24,12713,Germany +581578,12/9/2019,21122,Set/10 Pink Polkadot Party Candles,6.19,24,12713,Germany +581578,12/9/2019,21121,Set/10 Red Polkadot Party Candles,6.19,24,12713,Germany +581578,12/9/2019,23389,Spaceboy Mini Backpack,6.04,4,12713,Germany +581578,12/9/2019,22556,Plasters In Tin Circus Parade,6.19,12,12713,Germany +581578,12/9/2019,22976,Circus Parade Childrens Egg Cup,6.19,12,12713,Germany +581578,12/9/2019,23255,Childrens Cutlery Circus Parade,7.24,12,12713,Germany +581578,12/9/2019,84997D,Childrens Cutlery Polkadot Pink,7.24,8,12713,Germany +581578,12/9/2019,84997B,Childrens Cutlery Retrospot Red,7.24,8,12713,Germany +581578,12/9/2019,84997C,Childrens Cutlery Polkadot Blue,7.24,8,12713,Germany +581578,12/9/2019,22555,Plasters In Tin Strongman,7.24,12,12713,Germany +581578,12/9/2019,21914,Blue Harmonica In Box,7.24,12,12713,Germany +581578,12/9/2019,22549,Picture Dominoes,7.24,24,12713,Germany +581578,12/9/2019,21918,Set 12 Kids Colour Chalk Sticks,7.24,24,12713,Germany +581578,12/9/2019,22992,Revolver Wooden Ruler,7.24,12,12713,Germany +581578,12/9/2019,22991,Giraffe Wooden Ruler,7.24,12,12713,Germany +581578,12/9/2019,23229,Vintage Donkey Tail Game,7.24,6,12713,Germany +581578,12/9/2019,22622,Box Of Vintage Alphabet Blocks,6.19,6,12713,Germany +581578,12/9/2019,21506,Fancy Font Birthday Card,6.19,12,12713,Germany +581578,12/9/2019,21507,Elephant Birthday Card,6.19,12,12713,Germany +581578,12/9/2019,23037,Candle Holder Silver Madeline,6.19,12,12713,Germany +581578,12/9/2019,23550,Wrap Alphabet Poster,6.19,25,12713,Germany +581578,12/9/2019,22711,Wrap Circus Parade,6.19,25,12713,Germany +581578,12/9/2019,21497,Fancy Fonts Birthday Wrap,6.19,25,12713,Germany +581578,12/9/2019,22704,Wrap Red Apples,6.19,25,12713,Germany +581578,12/9/2019,22585,Pack Of 6 Birdy Gift Tags,6.19,12,12713,Germany diff --git a/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/go-solution/main.go b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/go-solution/main.go new file mode 100644 index 000000000000..ce5980b8e5b8 --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/go-solution/main.go @@ -0,0 +1,150 @@ +/* + * 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. + */ + +// beam-playground: +// name: FinalSolution1 +// description: Final challenge solution 1. +// multifile: true +// files: +// - name: input.csv +// context_line: 54 +// categories: +// - Quickstart +// complexity: ADVANCED +// tags: +// - hellobeam + +package main + +import ( + "context" + "fmt" + "github.com/apache/beam/sdks/v2/go/pkg/beam" + "github.com/apache/beam/sdks/v2/go/pkg/beam/core/graph/window" + "github.com/apache/beam/sdks/v2/go/pkg/beam/core/graph/window/trigger" + "github.com/apache/beam/sdks/v2/go/pkg/beam/io/textio" + "github.com/apache/beam/sdks/v2/go/pkg/beam/transforms/filter" + "github.com/apache/beam/sdks/v2/go/pkg/beam/transforms/stats" + "github.com/apache/beam/sdks/v2/go/pkg/beam/x/beamx" + "log" + "strconv" + "strings" + "time" +) + +type Transaction struct { + ID int64 + Date string + ProductID string + ProductName string + Price float64 + Quantity int64 + CustomerID int64 + Country string +} + +func main() { + ctx := context.Background() + + beam.Init() + p := beam.NewPipeline() + s := p.Root() + + file := textio.Read(s, "input.csv") + + transactions := getTransactions(s, file) + + trigger := trigger.AfterEndOfWindow(). + EarlyFiring(trigger.AfterProcessingTime(). + PlusDelay(5 * time.Second)). + LateFiring(trigger.Repeat(trigger.AfterCount(1))) + + fixedWindowedItems := beam.WindowInto(s, window.NewFixedWindows(30*time.Second), transactions, + beam.Trigger(trigger), + beam.AllowedLateness(30*time.Minute), + beam.PanesDiscard(), + ) + + filtered := filtering(s, fixedWindowedItems) + + result := getPartition(s, filtered) + + biggerThan10 := sumCombine(s, mapIdWithPrice(s, result[0])) + textio.Write(s, "price_more_than_10.txt", convertToString(s, biggerThan10)) + + smallerThan10 := sumCombine(s, mapIdWithPrice(s, result[1])) + textio.Write(s, "price_less_than_10.txt", convertToString(s, smallerThan10)) + + if err := beamx.Run(ctx, p); err != nil { + log.Fatalf("Failed to execute job: %v", err) + } +} + +func getTransactions(s beam.Scope, input beam.PCollection) beam.PCollection { + return beam.ParDo(s, func(line string, emit func(transaction Transaction)) { + csv := strings.Split(line, ",") + + if csv[0] != "TransactionNo" { + id, _ := strconv.ParseInt(csv[0], 10, 64) + price, _ := strconv.ParseFloat(csv[4], 64) + quantity, _ := strconv.ParseInt(csv[5], 10, 64) + customerID, _ := strconv.ParseInt(csv[6], 10, 64) + emit(Transaction{ + ID: id, + Date: csv[1], + ProductID: csv[2], + ProductName: csv[3], + Price: price, + Quantity: quantity, + CustomerID: customerID, + Country: csv[7], + }) + } + }, input) +} + +func getPartition(s beam.Scope, input beam.PCollection) []beam.PCollection { + return beam.Partition(s, 2, func(element Transaction) int { + if element.Price >= 10 { + return 0 + } + return 1 + }, input) +} + +func convertToString(s beam.Scope, input beam.PCollection) beam.PCollection { + return beam.ParDo(s, func(product string, sum float64, emit func(string)) { + emit(fmt.Sprint("product: ", product, " , sum: ", sum)) + }, input) +} + +func filtering(s beam.Scope, input beam.PCollection) beam.PCollection { + return filter.Include(s, input, func(element Transaction) bool { + return element.Quantity >= 20 + }) +} + +func mapIdWithPrice(s beam.Scope, input beam.PCollection) beam.PCollection { + return beam.ParDo(s, func(element Transaction, emit func(string, float64)) { + emit(element.ProductID, element.Price) + }, input) +} + +func sumCombine(s beam.Scope, input beam.PCollection) beam.PCollection { + return stats.SumPerKey(s, input) +} diff --git a/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/hint1.md b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/hint1.md new file mode 100644 index 000000000000..692accb622c2 --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/hint1.md @@ -0,0 +1,160 @@ + +{{if (eq .Sdk "go")}} +1. Parse the csv file into a `Transaction` object. + + Extract: `func getTransactions(s beam.Scope, input beam.PCollection) beam.PCollection { + return beam.ParDo(s, func(line string, emit func(transaction Transaction)) { + csv := strings.Split(line, ",") + if csv[0] != "TransactionNo" { + id, _ := strconv.ParseInt(csv[0], 10, 64) + price, _ := strconv.ParseFloat(csv[4], 64) + quantity, _ := strconv.ParseInt(csv[5], 10, 64) + customerID, _ := strconv.ParseInt(csv[6], 10, 64) + emit(Transaction{ + ID: id, + Date: csv[1], + ProductID: csv[2], + ProductName: csv[3], + Price: price, + Quantity: quantity, + CustomerID: customerID, + Country: csv[7], + }) + } + }, input) + }` +2. Add a fixed-window that runs for 30 seconds + + Window: `fixedWindowedItems := beam.WindowInto(s, window.NewFixedWindows(30*time.Second), transactions, + beam.Trigger(trigger), + beam.AllowedLateness(30*time.Minute), + beam.PanesDiscard(), + )`. + + And add a trigger that works after the first element with a delay of 5 seconds. + + Trigger: `trigger := trigger.AfterEndOfWindow(). + EarlyFiring(trigger.AfterProcessingTime(). + PlusDelay(5 * time.Second)). + LateFiring(trigger.Repeat(trigger.AfterCount(1)))` + +3. Filter so that the quantity is higher or equal to 20. + + Filter: `func filtering(s beam.Scope, input beam.PCollection) beam.PCollection { + return filter.Include(s, input, func(element Transaction) bool { + return element.Quantity >= 20 + }) + }` + +4. Divide transactions into parts, the first contains transactions whose **price** is more than 10. And the rest are in the second. + + Partition: `func getPartition(s beam.Scope, input beam.PCollection) []beam.PCollection { + return beam.Partition(s, 2, func(element Transaction) int { + if element.Price >= 10 { + return 0 + } + return 1 + }, input) + }` + +5. Create a map function `func mapIdWithPrice(s beam.Scope, input beam.PCollection) beam.PCollection { + return beam.ParDo(s, func(element Transaction, emit func(int64, float64)) { + emit(element.ID, element.Price) + }, input) + }` for group + +6. Combine by key, the function that summarizes the prices `func sumCombine(s beam.Scope, input beam.PCollection) beam.PCollection { + return stats.SumPerKey(s, input) + }` + +7. To write to a file, first you need to convert to a string `func convertToString(s beam.Scope, input beam.PCollection) beam.PCollection { + return beam.ParDo(s, func(id int64, sum float64, emit func(string)) { + emit(fmt.Sprint("id: ", id, " , sum: ", sum)) + }, input) + }` + +8. Write to a txt file: `textio.Write(s, "smallerThan10.txt", smallerThan10)` + +{{end}} + +{{if (eq .Sdk "java")}} +1. Parse the csv file into a `Transaction` object. + + Extract: `static class ExtractDataFn extends DoFn { + @ProcessElement + public void processElement(ProcessContext c) { + String[] items = c.element().split(REGEX_FOR_CSV); + try { + c.output(new Transaction(Long.valueOf(items[0]), items[1], items[2], items[3], Double.valueOf(items[4]), Integer.parseInt(items[5]), Long.valueOf(items[6]), items[7])); + } catch (Exception e) { + System.out.println("Skip header"); + } + } + }` +2. Add a fixed-window that runs for 30 seconds `Window.into(Fixed Windows.of(Duration.standard Seconds(30)))`. And add a trigger that works after the first element with a delay of 5 seconds `AfterProcessingTime.pastFirstElementInPane().plusDelayOf(Duration.standardSeconds(5))` +3. Filter so that the number is higher or equal to 20 `Filter.by(it -> it.quantity >= 20)` +4. Divide transactions into parts, the first contains transactions whose **price** is more than 10. And the rest are in the second. + + Partition: `static class TransactionPartitionFn extends PTransform, PCollectionList> { + @Override + public PCollectionList expand(PCollection input) { + return input.apply(Partition.of(2, + (Partition.PartitionFn) (transaction, numPartitions) -> { + if (transaction.price > 10) { + return 0; + } else { + return 1; + } + })); + } + }` +5. Create a map function `MapElements.into(TypeDescriptors.kvs(TypeDescriptors.longs(), TypeDescriptors.doubles())).via(it->KV.of(it.id,it.price))` for group +6. Combine by key, the function that summarizes the prices `Combine.perKey(new SumDoubleBinaryCombineFn())`. + + Sum function: `static class SumDoubleBinaryCombineFn extends Combine.BinaryCombineFn { + @Override + public Double apply(Double left, Double right) { + return left + right; + } + } + ` +7. To write to a file, first you need to convert to a string `.apply(MapElements.into(TypeDescriptor.of(String.class)).via(it -> it.toString()))` + +8. Write to a txt file: `TextIO.write().to("biggerThan10").withSuffix(".txt")` +{{end}} + +{{if (eq .Sdk "python")}} +1. Parse the csv file into a `Transaction` object. + + Extract: `class ExtractDataFn(beam.DoFn): + def process(self, element): + items = re.split(r',(?=(?:[^"]*"[^"]*")*[^"]*$)', element) + if items[0] != 'TransactionNo': + yield Transaction(items[0], items[1], items[2], items[3], items[4], items[5], items[6], items[7])` + +2. Add a fixed-window that runs for 30 seconds. And add a trigger that works after the first element with a delay of 5 seconds. + + Window and trigger: `windowed_transactions = (transactions + | 'Window' >> beam.WindowInto(window.FixedWindows(30), trigger=trigger.AfterWatermark( + early=trigger.AfterProcessingTime(5).has_ontime_pane(), late=trigger.AfterAll()), + allowed_lateness=30, + accumulation_mode=trigger.AccumulationMode.DISCARDING))`. + +3. Filter so that the number is higher or equal to 20 `'Filtering' >> beam.Filter(lambda t: int(t.quantity) >= 20)` +4. Divide transactions into parts, the first contains transactions whose **price** is more than 10. And the rest are in the second. `'Partition transactions' >> beam.Partition(partitionTransactions, 2))` +5. Create a map function `'Map id and price for bigger' >> beam.Map(lambda transaction: (transaction.transaction_no, float(transaction.price)))` for group +6. Combine by key, the function that summarizes the prices. + Sum function: `'Calculate sum for biggerThan10' >> beam.CombinePerKey(sum)` + +7. Write to a txt file: `'Write biggerThan10 results to text file' >> beam.io.WriteToText('biggerThan10', '.txt', shard_name_template=''))` +{{end}} \ No newline at end of file diff --git a/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/java-challenge/Task.java b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/java-challenge/Task.java new file mode 100644 index 000000000000..9286cd89f6cf --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/java-challenge/Task.java @@ -0,0 +1,120 @@ +/* + * 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. + */ + +// beam-playground: +// name: FinalChallenge1 +// description: Final challenge 1. +// multifile: true +// files: +// - name: input.csv +// context_line: 50 +// categories: +// - Quickstart +// complexity: ADVANCED +// tags: +// - hellobeam + + +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.io.TextIO; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +import org.apache.beam.sdk.schemas.JavaFieldSchema; +import org.apache.beam.sdk.schemas.annotations.DefaultSchema; +import org.apache.beam.sdk.schemas.annotations.SchemaCreate; +import org.apache.beam.sdk.transforms.DoFn; +import org.apache.beam.sdk.values.PCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Task { + private static final Logger LOG = LoggerFactory.getLogger(Task.class); + private static final Integer WINDOW_TIME = 30; + private static final Integer TIME_OUTPUT_AFTER_FIRST_ELEMENT = 5; + private static final Integer ALLOWED_LATENESS_TIME = 1; + + private static final String REGEX_FOR_CSV = ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)"; + + public static void main(String[] args) { + LOG.info("Running Task"); + PipelineOptions options = PipelineOptionsFactory.fromArgs(args).create(); + Pipeline pipeline = Pipeline.create(options); + + PCollection input = pipeline.apply(TextIO.read().from("input.csv")); + + pipeline.run().waitUntilFinish(); + } + + static class LogOutput extends DoFn { + private final String prefix; + + LogOutput() { + this.prefix = "Processing element"; + } + + LogOutput(String prefix) { + this.prefix = prefix; + } + + @DoFn.ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + ": {}", c.element()); + } + } + + @DefaultSchema(JavaFieldSchema.class) + public static class Transaction { + public Long id; + public String date; + public String productId; + public String productName; + public Double price; + public Integer quantity; + public Long customerId; + public String country; + + public Transaction() { + } + + @SchemaCreate + public Transaction(Long id, String date, String productId, String productName, Double price, Integer quantity, Long customerId, String country) { + this.id = id; + this.date = date; + this.productId = productId; + this.productName = productName; + this.price = price; + this.quantity = quantity; + this.customerId = customerId; + this.country = country; + } + + @Override + public String toString() { + return "Transaction{" + + "id=" + id + + ", date='" + date + '\'' + + ", productId='" + productId + '\'' + + ", productName='" + productName + '\'' + + ", price='" + price + '\'' + + ", quantity=" + quantity + + ", customerId=" + customerId + + ", country='" + country + '\'' + + '}'; + } + } +} \ No newline at end of file diff --git a/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/java-challenge/input.csv b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/java-challenge/input.csv new file mode 100644 index 000000000000..85854a2d4358 --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/java-challenge/input.csv @@ -0,0 +1,1500 @@ +TransactionNo,Date,ProductNo,ProductName,Price,Quantity,CustomerNo,Country +581482,12/9/2019,22485,Set Of 2 Wooden Market Crates,21.47,12,17490,United Kingdom +581475,12/9/2019,22596,Christmas Star Wish List Chalkboard,10.65,36,13069,United Ki +581475,12/9/2019,23235,Storage Tin Vintage Leaf,11.53,12,13069,United Kingdom +581475,12/9/2019,23272,Tree T-Light Holder Willie Winkie,10.65,12,13069,United King +581475,12/9/2019,23239,Set Of 4 Knick Knack Tins Poppies,11.94,6,13069,United Kingd +581475,12/9/2019,21705,Bag 500g Swirly Marbles,10.65,24,13069,United Kingdom +581475,12/9/2019,22118,Joy Wooden Block Letters,11.53,18,13069,United Kingdom +581475,12/9/2019,22119,Peace Wooden Block Letters,12.25,12,13069,United Kingdom +581475,12/9/2019,22217,T-Light Holder Hanging Lace,10.65,12,13069,United Kingdom +581475,12/9/2019,22216,T-Light Holder White Lace,10.55,24,13069,United Kingdom +581475,12/9/2019,22380,Toy Tidy Spaceboy,11.06,20,13069,United Kingdom +581475,12/9/2019,22442,Grow Your Own Flowers Set Of 3,12.25,12,13069,United Kingdom +581475,12/9/2019,22664,Toy Tidy Dolly Girl Design,11.06,20,13069,United Kingdom +581475,12/9/2019,22721,Set Of 3 Cake Tins Sketchbook,12.25,12,13069,United Kingdom +581475,12/9/2019,22723,Set Of 6 Herb Tins Sketchbook,11.53,12,13069,United Kingdom +581475,12/9/2019,22785,Squarecushion Cover Pink Union Jack,11.53,12,13069,United Ki +581475,12/9/2019,22955,36 Foil Star Cake Cases,11.06,24,13069,United Kingdom +581475,12/9/2019,23141,Triple Wire Hook Pink Heart,11.06,12,13069,United Kingdom +581475,12/9/2019,22956,36 Foil Heart Cake Cases,11.06,24,13069,United Kingdom +581475,12/9/2019,22581,Wood Stocking Christmas Scandispot,10.55,48,13069,United Kin +581476,12/9/2019,23198,Pantry Magnetic Shopping List,11.53,48,12433,Norway +581476,12/9/2019,23197,Sketchbook Magnetic Shopping List,11.74,24,12433,Norway +581476,12/9/2019,23184,Bull Dog Bottle Opener,15.32,8,12433,Norway +581476,12/9/2019,23168,Classic Cafe Sugar Dispenser,11.53,12,12433,Norway +581476,12/9/2019,23167,Small Ceramic Top Storage Jar,10.96,96,12433,Norway +581476,12/9/2019,23166,Medium Ceramic Top Storage Jar,11.32,48,12433,Norway +581476,12/9/2019,23165,Large Ceramic Top Storage Jar,11.74,48,12433,Norway +581476,12/9/2019,23004,Travel Card Wallet Pantry,10.68,48,12433,Norway +581476,12/9/2019,23002,Travel Card Wallet Skulls,10.68,24,12433,Norway +581476,12/9/2019,23000,Travel Card Wallet Transport,10.68,24,12433,Norway +581476,12/9/2019,22998,Travel Card Wallet Keep Calm,10.68,72,12433,Norway +581476,12/9/2019,22994,Travel Card Wallet Retrospot,10.68,48,12433,Norway +581476,12/9/2019,22835,Hot Water Bottle I Am So Poorly,15.32,8,12433,Norway +581476,12/9/2019,22730,Alarm Clock Bakelike Ivory,14.09,4,12433,Norway +581476,12/9/2019,22728,Alarm Clock Bakelike Pink,14.09,8,12433,Norway +581476,12/9/2019,22727,Alarm Clock Bakelike Red,14.09,8,12433,Norway +581476,12/9/2019,22726,Alarm Clock Bakelike Green,14.09,4,12433,Norway +581476,12/9/2019,22720,Set Of 3 Cake Tins Pantry Design,14.61,16,12433,Norway +581476,12/9/2019,22693,Grow A Flytrap Or Sunflower In Tin,11.34,192,12433,Norway +581476,12/9/2019,22670,French Wc Sign Blue Metal,11.53,24,12433,Norway +581476,12/9/2019,22667,Recipe Box Retrospot,12.86,24,12433,Norway +581476,12/9/2019,22666,Recipe Box Pantry Yellow Design,12.86,24,12433,Norway +581476,12/9/2019,22631,Circus Parade Lunch Box,12.25,12,12433,Norway +581476,12/9/2019,22628,Picnic Boxes Set Of 3 Retrospot,15.32,16,12433,Norway +581476,12/9/2019,22467,Gumball Coat Rack,12.86,6,12433,Norway +581476,12/9/2019,22197,Popcorn Holder,10.99,100,12433,Norway +581476,12/9/2019,22114,Hot Water Bottle Tea And Sympathy,14.61,8,12433,Norway +581476,12/9/2019,22112,Chocolate Hot Water Bottle,15.32,9,12433,Norway +581476,12/9/2019,21908,Chocolate This Way Metal Sign,12.40,36,12433,Norway +581476,12/9/2019,21874,Gin And Tonic Mug,11.74,36,12433,Norway +581476,12/9/2019,21872,Glamorous Mug,11.53,12,12433,Norway +581476,12/9/2019,21871,Save The Planet Mug,11.74,36,12433,Norway +581476,12/9/2019,21533,Retrospot Large Milk Jug,15.32,6,12433,Norway +581476,12/9/2019,21481,Fawn Blue Hot Water Bottle,14.09,12,12433,Norway +581476,12/9/2019,21479,White Skull Hot Water Bottle,14.61,4,12433,Norway +581476,12/9/2019,21248,Door Hanger Mum + Dads Room,11.74,12,12433,Norway +581476,12/9/2019,21216,Set 3 Retrospot Tea/Coffee/Sugar,14.61,24,12433,Norway +581476,12/9/2019,21181,Please One Person Metal Sign,12.15,48,12433,Norway +581476,12/9/2019,21175,Gin And Tonic Diet Metal Sign,12.38,48,12433,Norway +581476,12/9/2019,21169,You're Confusing Me Metal Sign,11.74,48,12433,Norway +581476,12/9/2019,21162,Toxic Area Door Hanger,10.65,24,12433,Norway +581476,12/9/2019,21159,Moody Boy Door Hanger,10.65,24,12433,Norway +581476,12/9/2019,21158,Moody Girl Door Hanger,10.65,24,12433,Norway +581476,12/9/2019,21154,Red Retrospot Oven Glove,11.53,10,12433,Norway +581476,12/9/2019,16016,Large Chinese Style Scissor,11.12,40,12433,Norway +581476,12/9/2019,16014,Small Chinese Style Scissor,10.68,60,12433,Norway +581476,12/9/2019,16008,Small Folding Scissor(Pointed Edge),10.37,240,12433,Norway +581476,12/9/2019,85152,Hand Over The Chocolate Sign,12.15,48,12433,Norway +581476,12/9/2019,84596F,Small Marshmallows Pink Bowl,10.68,32,12433,Norway +581476,12/9/2019,84596B,Small Dolly Mix Design Orange Bowl,10.68,16,12433,Norway +581476,12/9/2019,84510A,Set Of 4 English Rose Coasters,11.53,20,12433,Norway +581476,12/9/2019,82600,N0 Singing Metal Sign,12.15,48,12433,Norway +581476,12/9/2019,82581,Toilet Metal Sign,10.81,48,12433,Norway +581476,12/9/2019,72232,Feng Shui Pillar Candle,10.44,144,12433,Norway +581476,12/9/2019,47559B,Tea Time Oven Glove,11.53,10,12433,Norway +581476,12/9/2019,47504H,English Rose Spirit Level,11.06,36,12433,Norway +581476,12/9/2019,23493,Vintage Doily Travel Sewing Kit,12.25,30,12433,Norway +581476,12/9/2019,23430,Blue Retro Kitchen Wall Clock,18.60,2,12433,Norway +581476,12/9/2019,23429,Red Retro Kitchen Wall Clock,18.60,2,12433,Norway +581476,12/9/2019,23428,Ivory Retro Kitchen Wall Clock,18.60,2,12433,Norway +581476,12/9/2019,23358,Hot Stuff Hot Water Bottle,11.53,18,12433,Norway +581476,12/9/2019,23293,Set Of 12 Fairy Cake Baking Cases,11.10,32,12433,Norway +581476,12/9/2019,23243,Set Of Tea Coffee Sugar Tins Pantry,15.32,12,12433,Norway +581476,12/9/2019,23240,Set Of 4 Knick Knack Tins Doily,14.50,6,12433,Norway +581477,12/9/2019,48111,Doormat 3 Smiley Cats,17.51,10,13426,United Kingdom +581477,12/9/2019,22464,Hanging Metal Heart Lantern,11.06,12,13426,United Kingdom +581477,12/9/2019,20982,12 Pencils Tall Tube Skulls,11.12,12,13426,United Kingdom +581477,12/9/2019,20981,12 Pencils Tall Tube Woodland,11.12,12,13426,United Kingdom +581477,12/9/2019,23424,Gingham Recipe Book Box,15.32,8,13426,United Kingdom +581477,12/9/2019,23338,Egg Frying Pan Red,12.15,48,13426,United Kingdom +581477,12/9/2019,84970L,Single Heart Zinc T-Light Holder,11.53,12,13426,United King +581477,12/9/2019,22457,Natural Slate Heart Chalkboard,13.27,6,13426,United Kingdom +581477,12/9/2019,22469,Heart Of Wicker Small,11.94,12,13426,United Kingdom +581477,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,11.12,12,13426,United Ki +581478,12/9/2019,84947,Antique Silver Tea Glass Engraved,11.53,24,17364,United King +581478,12/9/2019,23503,Playing Cards Keep Calm & Carry On,11.53,12,17364,United Kin +581478,12/9/2019,23445,Ice Cream Bubbles,11.10,20,17364,United Kingdom +581478,12/9/2019,23530,Wall Art Only One Person,15.32,12,17364,United Kingdom +581478,12/9/2019,84997C,Childrens Cutlery Polkadot Blue,14.50,4,17364,United Kingdo +581478,12/9/2019,84997D,Childrens Cutlery Polkadot Pink,14.50,4,17364,United Kingdo +581478,12/9/2019,84077,World War 2 Gliders Asstd Designs,10.55,48,17364,United King +581478,12/9/2019,22749,Feltcraft Princess Charlotte Doll,14.09,4,17364,United Kingd +581478,12/9/2019,23127,Feltcraft Girl Nicole Kit,15.32,4,17364,United Kingdom +581478,12/9/2019,23126,Feltcraft Girl Amelie Kit,15.32,4,17364,United Kingdom +581478,12/9/2019,22747,Poppy's Playhouse Bathroom,12.40,6,17364,United Kingdom +581478,12/9/2019,22078,Ribbon Reel Lace Design,12.40,10,17364,United Kingdom +581478,12/9/2019,84946,Antique Silver T-Light Glass,11.53,12,17364,United Kingdom +581478,12/9/2019,22791,T-Light Glass Fluted Antique,11.53,12,17364,United Kingdom +581478,12/9/2019,21326,Aged Glass Silver T-Light Holder,10.92,12,17364,United Kingd +581478,12/9/2019,22170,Picture Frame Wood Triple Portrait,17.17,8,17364,United King +581478,12/9/2019,23082,Set 6 Paper Table Lantern Hearts,14.09,6,17364,United Kingdo +581478,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,11.12,24,17364,United Ki +581479,12/9/2019,22087,Paper Bunting White Lace,13.27,10,17364,United Kingdom +581480,12/9/2019,23464,Vintage Zinc Watering Can Small,15.32,4,14441,United Kingdom +581480,12/9/2019,22411,Jumbo Shopper Vintage Red Paisley,12.38,10,14441,United King +581480,12/9/2019,84029E,Red Woolly Hottie White Heart,14.61,8,14441,United Kingdom +581480,12/9/2019,22633,Hand Warmer Union Jack,12.40,12,14441,United Kingdom +581480,12/9/2019,23355,Hot Water Bottle Keep Calm,15.32,12,14441,United Kingdom +581480,12/9/2019,84029G,Knitted Union Flag Hot Water Bottle,14.61,12,14441,United K +581480,12/9/2019,22112,Chocolate Hot Water Bottle,15.32,6,14441,United Kingdom +581480,12/9/2019,84347,Rotating Silver Angels T-Light Hldr,12.86,18,14441,United Ki +581481,12/9/2019,21115,Rose Caravan Doorstop,12.25,8,17490,United Kingdom +581481,12/9/2019,22059,Ceramic Strawberry Design Mug,10.65,24,17490,United Kingdom +581481,12/9/2019,22072,Red Retrospot Tea Cup And Saucer,11.53,24,17490,United Kingd +581481,12/9/2019,22123,Ping Microwave Apron,11.06,24,17490,United Kingdom +581481,12/9/2019,22476,Empire Union Jack Tv Dinner Tray,12.25,8,17490,United Kingdo +581481,12/9/2019,22495,Set Of 2 Round Tins Camembert,11.06,12,17490,United Kingdom +581481,12/9/2019,22496,Set Of 2 Round Tins Dutch Cheese,11.06,12,17490,United Kingd +581481,12/9/2019,22513,Doorstop Football Design,11.06,8,17490,United Kingdom +581481,12/9/2019,22500,Set Of 2 Tins Jardin De Provence,11.53,12,17490,United Kingd +581481,12/9/2019,22664,Toy Tidy Dolly Girl Design,11.06,20,17490,United Kingdom +581481,12/9/2019,22721,Set Of 3 Cake Tins Sketchbook,12.25,12,17490,United Kingdom +581481,12/9/2019,22785,Squarecushion Cover Pink Union Jack,11.53,12,17490,United Ki +581481,12/9/2019,23178,Jam Clock Magnet,11.53,12,17490,United Kingdom +581481,12/9/2019,23302,Kneeling Mat Housework Design,11.06,24,17490,United Kingdom +581481,12/9/2019,23533,Wall Art Garden Haven,12.25,6,17490,United Kingdom +581481,12/9/2019,84819,Danish Rose Round Sewing Box,11.06,16,17490,United Kingdom +581482,12/9/2019,22371,Airline Bag Vintage Tokyo 78,14.30,12,17490,United Kingdom +581482,12/9/2019,21875,Kings Choice Mug,11.34,36,17490,United Kingdom +581482,12/9/2019,23251,Vintage Red Enamel Trim Mug,11.32,96,17490,United Kingdom +581482,12/9/2019,23300,Gardeners Kneeling Pad Cup Of Tea,11.74,48,17490,United King +581482,12/9/2019,22138,Baking Set 9 Piece Retrospot,14.61,24,17490,United Kingdom +581483,12/9/2019,23843,Paper Craft Little Birdie,12.38,80995,16446,United Kingdom +581485,12/9/2019,22617,Baking Set Spaceboy Design,15.32,18,17389,United Kingdom +581485,12/9/2019,20749,Assorted Colour Mini Cases,16.76,84,17389,United Kingdom +581486,12/9/2019,22910,Paper Chain Kit Vintage Christmas,13.27,12,17001,United King +581486,12/9/2019,22086,Paper Chain Kit 50'S Christmas,13.27,12,17001,United Kingdom +581486,12/9/2019,23351,Roll Wrap 50'S Christmas,6.19,12,17001,United Kingdom +581486,12/9/2019,23352,Roll Wrap 50'S Red Christmas,6.19,12,17001,United Kingdom +581486,12/9/2019,22727,Alarm Clock Bakelike Red,6.19,8,17001,United Kingdom +581486,12/9/2019,22730,Alarm Clock Bakelike Ivory,6.19,4,17001,United Kingdom +581486,12/9/2019,22491,Pack Of 12 Coloured Pencils,6.04,12,17001,United Kingdom +581486,12/9/2019,22561,Wooden School Colouring Set,6.04,12,17001,United Kingdom +581486,12/9/2019,22489,Pack Of 12 Traditional Crayons,6.04,24,17001,United Kingdom +581486,12/9/2019,22560,Traditional Modelling Clay,6.04,24,17001,United Kingdom +581486,12/9/2019,22139,Retrospot Tea Set Ceramic 11 Pc,6.04,6,17001,United Kingdom +581486,12/9/2019,23344,Jumbo Bag 50'S Christmas,6.19,20,17001,United Kingdom +581486,12/9/2019,23203,Jumbo Bag Vintage Doily,6.19,20,17001,United Kingdom +581486,12/9/2019,85099B,Jumbo Bag Red Retrospot,6.19,10,17001,United Kingdom +581486,12/9/2019,23201,Jumbo Bag Alphabet,6.19,20,17001,United Kingdom +581486,12/9/2019,23207,Lunch Bag Alphabet Design,6.19,10,17001,United Kingdom +581487,12/9/2019,21137,Black Record Cover Frame,6.04,120,15694,United Kingdom +581488,12/9/2019,23118,Parisienne Jewellery Drawer,6.04,16,17428,United Kingdom +581488,12/9/2019,23111,Parisienne Sewing Box,6.04,16,17428,United Kingdom +581488,12/9/2019,22179,Set 10 Night Owl Lights,6.04,24,17428,United Kingdom +581489,12/9/2019,22061,Large Cake Stand Hanging Strawbery,7.24,48,16954,United King +581489,12/9/2019,22182,Cake Stand Victorian Filigree Small,7.24,24,16954,United Kin +581491,12/9/2019,23571,Traditional Naughts & Crosses,7.24,12,12433,Norway +581492,12/9/2019,23369,Set 36 Colour Pencils Love London,6.19,2,15492,United Kingdo +581492,12/9/2019,23370,Set 36 Colouring Pencils Doily,6.19,2,15492,United Kingdom +581492,12/9/2019,23371,Set 36 Colour Pencils Spaceboy,6.19,3,15492,United Kingdom +581492,12/9/2019,23372,Set 36 Colour Pencils Dolly Girl,6.19,1,15492,United Kingdom +581492,12/9/2019,23376,Pack Of 12 Vintage Christmas Tissue,6.19,3,15492,United King +581492,12/9/2019,23377,Pack Of 12 Dolly Girl Tissues,6.19,6,15492,United Kingdom +581492,12/9/2019,23378,Pack Of 12 50'S Christmas Tissues,6.19,9,15492,United Kingdo +581492,12/9/2019,23379,Pack Of 12 Red Apple Tissues,6.19,4,15492,United Kingdom +581492,12/9/2019,23380,Pack Of 12 Vintage Doily Tissues,6.19,3,15492,United Kingdom +581492,12/9/2019,23381,Pack Of 12 Vintage Leaf Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,23382,Box Of 6 Christmas Cake Decorations,6.19,4,15492,United King +581492,12/9/2019,23391,I Love London Mini Backpack,6.19,2,15492,United Kingdom +581492,12/9/2019,23392,Spaceboy Rocket Lolly Makers,6.19,2,15492,United Kingdom +581492,12/9/2019,23399,Home Sweet Home Hanging Heart,6.19,4,15492,United Kingdom +581492,12/9/2019,23405,Home Sweet Home 2 Drawer Cabinet,6.19,3,15492,United Kingdom +581492,12/9/2019,23418,Lavender Toilette Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,23426,Metal Sign Drop Your Pants,6.19,1,15492,United Kingdom +581492,12/9/2019,23434,3 Raffia Ribbons 50'S Christmas,6.19,9,15492,United Kingdom +581492,12/9/2019,23435,3 Raffia Ribbons Vintage Christmas,6.04,3,15492,United Kingd +581492,12/9/2019,23439,Hand Warmer Red Love Heart,6.19,1,15492,United Kingdom +581492,12/9/2019,23451,Square Mini Portrait Frame,6.19,1,15492,United Kingdom +581492,12/9/2019,23467,Vintage Zinc Planter,6.19,1,15492,United Kingdom +581492,12/9/2019,23469,Card Holder Love Bird Small,6.19,3,15492,United Kingdom +581492,12/9/2019,23480,Mini Lights Woodland Mushrooms,6.19,2,15492,United Kingdom +581492,12/9/2019,23493,Vintage Doily Travel Sewing Kit,6.19,3,15492,United Kingdom +581492,12/9/2019,23494,Vintage Doily Deluxe Sewing Kit,6.19,1,15492,United Kingdom +581492,12/9/2019,23495,Set Of 3 Pantry Wooden Spoons,6.19,1,15492,United Kingdom +581492,12/9/2019,23497,Classic Chrome Bicycle Bell,6.19,4,15492,United Kingdom +581492,12/9/2019,23498,Classic Bicycle Clips,6.19,2,15492,United Kingdom +581492,12/9/2019,23501,Key Ring Baseball Boot Union Jack,6.19,3,15492,United Kingdo +581492,12/9/2019,23506,Mini Playing Cards Spaceboy,6.04,1,15492,United Kingdom +581492,12/9/2019,23508,Mini Playing Cards Dolly Girl,6.04,2,15492,United Kingdom +581492,12/9/2019,23510,Mini Playing Cards Gymkhana,6.04,1,15492,United Kingdom +581492,12/9/2019,23521,Wall Art Cat And Bird,6.04,1,15492,United Kingdom +581492,12/9/2019,23526,Wall Art Dog Licence,6.04,4,15492,United Kingdom +581492,12/9/2019,23530,Wall Art Only One Person,6.04,2,15492,United Kingdom +581492,12/9/2019,23534,Wall Art Stop For Tea,6.19,6,15492,United Kingdom +581492,12/9/2019,23535,Wall Art Bicycle Safety,6.19,4,15492,United Kingdom +581492,12/9/2019,23536,Wall Art Village Show,6.19,1,15492,United Kingdom +581492,12/9/2019,23538,Wall Art Vintage Heart,6.19,1,15492,United Kingdom +581492,12/9/2019,23551,Pack Of 12 Paisley Park Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,23552,Bicycle Puncture Repair Kit,6.19,12,15492,United Kingdom +581492,12/9/2019,23555,Landmark Frame Notting Hill,6.19,1,15492,United Kingdom +581492,12/9/2019,23559,Woodland Bunnies Lolly Makers,6.19,5,15492,United Kingdom +581492,12/9/2019,23561,Set Of 6 Ribbons Party,6.19,1,15492,United Kingdom +581492,12/9/2019,23564,Egg Cup Milkmaid Ingrid,6.19,2,15492,United Kingdom +581492,12/9/2019,23565,Egg Cup Milkmaid Helga,6.19,2,15492,United Kingdom +581492,12/9/2019,23567,Egg Cup Henrietta Hen Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,23569,Tradtional Alphabet Stamp Set,6.19,2,15492,United Kingdom +581492,12/9/2019,23570,Traditional Pick Up Sticks Game,6.19,7,15492,United Kingdom +581492,12/9/2019,23571,Traditional Naughts & Crosses,6.19,2,15492,United Kingdom +581492,12/9/2019,23575,Snack Tray Paisley Park,6.19,3,15492,United Kingdom +581492,12/9/2019,23579,Snack Tray I Love London,6.19,1,15492,United Kingdom +581492,12/9/2019,23611,Set 10 Cards Red Riding Hood 17214,6.19,3,15492,United Kingd +581492,12/9/2019,23616,Set 10 Cards Jingle Bells 17217,6.19,1,15492,United Kingdom +581492,12/9/2019,23621,Set 10 Cards David's Madonna 17074,6.19,3,15492,United Kingd +581492,12/9/2019,23635,Set 10 Cards Christmas Holly 17259,6.19,1,15492,United Kingd +581492,12/9/2019,23644,Set 10 Cards Christmas Tree 16955,6.19,1,15492,United Kingdo +581492,12/9/2019,23660,Henrietta Hen Mug,6.19,1,15492,United Kingdom +581492,12/9/2019,23661,Milk Maids Mug,6.19,1,15492,United Kingdom +581492,12/9/2019,35095A,Blue Victorian Fabric Oval Box,6.19,1,15492,United Kingdom +581492,12/9/2019,35095B,Red Victorian Fabric Oval Box,6.19,1,15492,United Kingdom +581492,12/9/2019,35646,Vintage Bead Pink Evening Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,35648,Vintage Bead Pink Purse,6.19,2,15492,United Kingdom +581492,12/9/2019,35953,Folkart Star Christmas Decorations,6.19,12,15492,United King +581492,12/9/2019,35964,Folkart Clip On Stars,6.19,4,15492,United Kingdom +581492,12/9/2019,35970,Zinc Folkart Sleigh Bells,6.04,1,15492,United Kingdom +581492,12/9/2019,46118,Funky Monkey Cushion Cover,6.19,1,15492,United Kingdom +581492,12/9/2019,46776A,Woven Bubble Gum Cushion Cover,7.24,2,15492,United Kingdom +581492,12/9/2019,46776B,Woven Berries Cushion Cover,7.24,3,15492,United Kingdom +581492,12/9/2019,46776C,Woven Frost Cushion Cover,7.24,1,15492,United Kingdom +581492,12/9/2019,46776D,Woven Sunset Cushion Cover,7.24,2,15492,United Kingdom +581492,12/9/2019,46776E,Woven Candy Cushion Cover,7.24,5,15492,United Kingdom +581492,12/9/2019,46776F,Woven Rose Garden Cushion Cover,7.24,6,15492,United Kingdom +581492,12/9/2019,47310M,Small Pop Box Funky Monkey,6.19,1,15492,United Kingdom +581492,12/9/2019,47480,Hanging Photo Clip Rope Ladder,6.19,3,15492,United Kingdom +581492,12/9/2019,47504H,English Rose Spirit Level,7.24,1,15492,United Kingdom +581492,12/9/2019,47559B,Tea Time Oven Glove,7.24,3,15492,United Kingdom +581492,12/9/2019,47563A,Retro Longboard Ironing Board Cover,7.24,2,15492,United Kin +581492,12/9/2019,47566,Party Bunting,7.24,2,15492,United Kingdom +581492,12/9/2019,47590B,Pink Happy Birthday Bunting,7.24,1,15492,United Kingdom +581492,12/9/2019,51014A,Feather Pen Hot Pink,7.24,2,15492,United Kingdom +581492,12/9/2019,51014L,Feather Pen Light Pink,7.24,1,15492,United Kingdom +581492,12/9/2019,71270,Photo Clip Line,7.24,1,15492,United Kingdom +581492,12/9/2019,72349B,Set/6 Purple Butterfly T-Lights,6.39,1,15492,United Kingdom +581492,12/9/2019,72741,Grand Chocolatecandle,7.24,3,15492,United Kingdom +581492,12/9/2019,72800E,4 Ivory Dinner Candles Silver Flock,7.24,3,15492,United Kin +581492,12/9/2019,79321,Chilli Lights,6.19,1,15492,United Kingdom +581492,12/9/2019,82484,Wood Black Board Ant White Finish,6.19,2,15492,United Kingdo +581492,12/9/2019,82567,Airline Lounge Metal Sign,6.19,2,15492,United Kingdom +581492,12/9/2019,82582,Area Patrolled Metal Sign,6.19,1,15492,United Kingdom +581492,12/9/2019,82600,N0 Singing Metal Sign,6.19,1,15492,United Kingdom +581492,12/9/2019,84031A,Charlie+Lola Red Hot Water Bottle,6.19,4,15492,United Kingd +581492,12/9/2019,84077,World War 2 Gliders Asstd Designs,6.19,1,15492,United Kingdo +581492,12/9/2019,84249A,Greeting Card Square Doughnuts,6.19,1,15492,United Kingdom +581492,12/9/2019,84347,Rotating Silver Angels T-Light Hldr,6.19,2,15492,United King +581492,12/9/2019,84375,Set Of 20 Kids Cookie Cutters,6.19,1,15492,United Kingdom +581492,12/9/2019,84378,Set Of 3 Heart Cookie Cutters,6.19,4,15492,United Kingdom +581492,12/9/2019,84519B,Carrot Charlie+Lola Coaster Set,6.19,1,15492,United Kingdom +581492,12/9/2019,84559A,3d Sheet Of Dog Stickers,6.19,2,15492,United Kingdom +581492,12/9/2019,84568,Girls Alphabet Iron On Patches,6.19,31,15492,United Kingdom +581492,12/9/2019,84569D,Pack 6 Heart/Ice-Cream Patches,6.19,1,15492,United Kingdom +581492,12/9/2019,84596B,Small Dolly Mix Design Orange Bowl,6.19,4,15492,United King +581492,12/9/2019,84596F,Small Marshmallows Pink Bowl,6.19,4,15492,United Kingdom +581492,12/9/2019,84598,Boys Alphabet Iron On Patches,6.19,5,15492,United Kingdom +581492,12/9/2019,84692,Box Of 24 Cocktail Parasols,6.19,1,15492,United Kingdom +581492,12/9/2019,84755,Colour Glass T-Light Holder Hanging,6.19,4,15492,United King +581492,12/9/2019,84828,Jungle Popsicles Ice Lolly Moulds,6.19,1,15492,United Kingdo +581492,12/9/2019,84879,Assorted Colour Bird Ornament,6.19,16,15492,United Kingdom +581492,12/9/2019,84923,Pink Butterfly Handbag W Bobbles,6.04,3,15492,United Kingdom +581492,12/9/2019,84946,Antique Silver T-Light Glass,6.04,18,15492,United Kingdom +581492,12/9/2019,84970S,Hanging Heart Zinc T-Light Holder,6.04,3,15492,United Kingd +581492,12/9/2019,84978,Hanging Heart Jar T-Light Holder,6.04,4,15492,United Kingdom +581492,12/9/2019,84991,60 Teatime Fairy Cake Cases,6.04,1,15492,United Kingdom +581492,12/9/2019,84997A,Childrens Cutlery Polkadot Green,6.04,1,15492,United Kingdo +581492,12/9/2019,84997B,Childrens Cutlery Retrospot Red,6.04,1,15492,United Kingdom +581492,12/9/2019,20733,Gold Mini Tape Measure,6.04,3,15492,United Kingdom +581492,12/9/2019,20777,Chrysanthemum Notebook,6.19,2,15492,United Kingdom +581492,12/9/2019,20782,Camouflage Ear Muff Headphones,6.19,1,15492,United Kingdom +581492,12/9/2019,20914,Set/5 Red Retrospot Lid Glass Bowls,6.19,2,15492,United King +581492,12/9/2019,20931,Blue Pot Plant Candle,6.19,1,15492,United Kingdom +581492,12/9/2019,20970,Pink Floral Feltcraft Shoulder Bag,6.19,1,15492,United Kingd +581492,12/9/2019,20971,Pink Blue Felt Craft Trinket Box,6.19,2,15492,United Kingdom +581492,12/9/2019,20972,Pink Cream Felt Craft Trinket Box,6.19,3,15492,United Kingdo +581492,12/9/2019,20973,12 Pencil Small Tube Woodland,6.19,4,15492,United Kingdom +581492,12/9/2019,20978,36 Pencils Tube Skulls,6.19,1,15492,United Kingdom +581492,12/9/2019,20979,36 Pencils Tube Red Retrospot,6.19,3,15492,United Kingdom +581492,12/9/2019,20982,12 Pencils Tall Tube Skulls,6.19,2,15492,United Kingdom +581492,12/9/2019,20983,12 Pencils Tall Tube Red Retrospot,6.19,4,15492,United Kingd +581492,12/9/2019,20985,Heart Calculator,6.19,1,15492,United Kingdom +581492,12/9/2019,20986,Blue Calculator Ruler,6.19,1,15492,United Kingdom +581492,12/9/2019,21000,Rose Du Sud Cosmetics Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,21012,Antique All Glass Candlestick,6.19,3,15492,United Kingdom +581492,12/9/2019,21015,Dark Bird House Tree Decoration,6.19,8,15492,United Kingdom +581492,12/9/2019,21026,Space Owl,6.19,1,15492,United Kingdom +581492,12/9/2019,21035,Set/2 Red Retrospot Tea Towels,6.19,1,15492,United Kingdom +581492,12/9/2019,21064,Boom Box Speaker Boys,6.19,4,15492,United Kingdom +581492,12/9/2019,21065,Boom Box Speaker Girls,6.19,2,15492,United Kingdom +581492,12/9/2019,21098,Christmas Toilet Roll,6.19,1,15492,United Kingdom +581492,12/9/2019,21123,Set/10 Ivory Polkadot Party Candles,6.19,1,15492,United King +581492,12/9/2019,21125,Set 6 Football Celebration Candles,6.19,1,15492,United Kingd +581492,12/9/2019,21126,Set Of 6 Girls Celebration Candles,6.19,1,15492,United Kingd +581492,12/9/2019,21137,Black Record Cover Frame,6.19,17,15492,United Kingdom +581492,12/9/2019,21154,Red Retrospot Oven Glove,6.19,2,15492,United Kingdom +581492,12/9/2019,21158,Moody Girl Door Hanger,6.19,1,15492,United Kingdom +581492,12/9/2019,21162,Toxic Area Door Hanger,6.19,1,15492,United Kingdom +581492,12/9/2019,21166,Cook With Wine Metal Sign,6.19,2,15492,United Kingdom +581492,12/9/2019,21172,Party Metal Sign,6.19,1,15492,United Kingdom +581492,12/9/2019,21174,Pottering In The Shed Metal Sign,6.19,2,15492,United Kingdom +581492,12/9/2019,21175,Gin And Tonic Diet Metal Sign,6.19,2,15492,United Kingdom +581492,12/9/2019,21200,Multicolour Honeycomb Paper Garland,6.04,6,15492,United King +581492,12/9/2019,21201,Tropical Honeycomb Paper Garland,6.04,4,15492,United Kingdom +581492,12/9/2019,21212,Pack Of 72 Retrospot Cake Cases,6.04,2,15492,United Kingdom +581492,12/9/2019,21213,Pack Of 72 Skull Cake Cases,6.04,2,15492,United Kingdom +581492,12/9/2019,21220,Set/4 Badges Dogs,6.19,2,15492,United Kingdom +581492,12/9/2019,21224,Set/4 Skull Badges,6.19,1,15492,United Kingdom +581492,12/9/2019,21232,Strawberry Ceramic Trinket Pot,6.19,1,15492,United Kingdom +581492,12/9/2019,21257,Victorian Sewing Box Medium,6.19,2,15492,United Kingdom +581492,12/9/2019,21258,Victorian Sewing Box Large,6.19,1,15492,United Kingdom +581492,12/9/2019,21259,Victorian Sewing Box Small,6.19,1,15492,United Kingdom +581492,12/9/2019,21313,Glass Heart T-Light Holder,6.19,1,15492,United Kingdom +581492,12/9/2019,21314,Small Glass Heart Trinket Pot,6.19,2,15492,United Kingdom +581492,12/9/2019,21328,Balloons Writing Set,6.19,2,15492,United Kingdom +581492,12/9/2019,21329,Dinosaurs Writing Set,6.19,2,15492,United Kingdom +581492,12/9/2019,21356,Toast Its - Fairy Flower,6.19,16,15492,United Kingdom +581492,12/9/2019,21378,Small Tall Camphor Wood Toadstool,6.19,2,15492,United Kingdo +581492,12/9/2019,21379,Camphor Wood Portobello Mushroom,6.19,1,15492,United Kingdom +581492,12/9/2019,21383,Pack Of 12 Sticky Bunnies,6.19,1,15492,United Kingdom +581492,12/9/2019,21402,Red Egg Spoon,6.19,1,15492,United Kingdom +581492,12/9/2019,21408,Spotty Pink Duck Doorstop,6.19,2,15492,United Kingdom +581492,12/9/2019,21411,Gingham Heart Doorstop Red,6.19,1,15492,United Kingdom +581492,12/9/2019,21467,Cherry Crochet Food Cover,6.19,1,15492,United Kingdom +581492,12/9/2019,21471,Strawberry Raffia Food Cover,6.19,2,15492,United Kingdom +581492,12/9/2019,21479,White Skull Hot Water Bottle,6.19,2,15492,United Kingdom +581492,12/9/2019,21481,Fawn Blue Hot Water Bottle,6.19,3,15492,United Kingdom +581492,12/9/2019,21484,Chick Grey Hot Water Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,21485,Retrospot Heart Hot Water Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,21494,Rotating Leaves T-Light Holder,6.19,11,15492,United Kingdom +581492,12/9/2019,21506,Fancy Font Birthday Card,6.19,3,15492,United Kingdom +581492,12/9/2019,21507,Elephant Birthday Card,7.24,1,15492,United Kingdom +581492,12/9/2019,21508,Vintage Kid Dolly Card,7.24,1,15492,United Kingdom +581492,12/9/2019,21509,Cowboys And Indians Birthday Card,7.24,2,15492,United Kingdo +581492,12/9/2019,21528,Dairy Maid Traditional Teapot,7.24,1,15492,United Kingdom +581492,12/9/2019,21544,Skulls Water Transfer Tattoos,7.24,2,15492,United Kingdom +581492,12/9/2019,21558,Skull Lunch Box With Cutlery,6.39,1,15492,United Kingdom +581492,12/9/2019,21559,Strawberry Lunch Box With Cutlery,7.24,1,15492,United Kingdo +581492,12/9/2019,21615,4 Lavender Botanical Dinner Candles,7.24,2,15492,United King +581492,12/9/2019,21616,4 Pear Botanical Dinner Candles,7.24,6,15492,United Kingdom +581492,12/9/2019,21620,Set Of 4 Rose Botanical Candles,7.24,5,15492,United Kingdom +581492,12/9/2019,21642,Assorted Tutti Frutti Pen,7.24,4,15492,United Kingdom +581492,12/9/2019,21648,Assorted Tutti Frutti Small Purse,7.24,2,15492,United Kingdo +581492,12/9/2019,21650,Assorted Tutti Frutti Bracelet,7.24,14,15492,United Kingdom +581492,12/9/2019,21675,Butterflies Stickers,6.19,2,15492,United Kingdom +581492,12/9/2019,21677,Hearts Stickers,6.19,1,15492,United Kingdom +581492,12/9/2019,21678,Paisley Pattern Stickers,6.19,2,15492,United Kingdom +581492,12/9/2019,21680,Woodland Stickers,6.19,1,15492,United Kingdom +581492,12/9/2019,21703,Bag 125g Swirly Marbles,6.19,1,15492,United Kingdom +581492,12/9/2019,21704,Bag 250g Swirly Marbles,6.19,1,15492,United Kingdom +581492,12/9/2019,21716,Boys Vintage Tin Seaside Bucket,6.19,1,15492,United Kingdom +581492,12/9/2019,21718,Red Metal Beach Spade,6.19,1,15492,United Kingdom +581492,12/9/2019,21724,Panda And Bunnies Sticker Sheet,6.19,1,15492,United Kingdom +581492,12/9/2019,21731,Red Toadstool Led Night Light,6.19,6,15492,United Kingdom +581492,12/9/2019,21739,Cosy Slipper Shoes Small Green,6.19,2,15492,United Kingdom +581492,12/9/2019,21774,Decorative Cats Bathroom Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,21786,Polkadot Rain Hat,6.19,3,15492,United Kingdom +581492,12/9/2019,21787,Rain Poncho Retrospot,6.19,2,15492,United Kingdom +581492,12/9/2019,21790,Vintage Snap Cards,6.19,5,15492,United Kingdom +581492,12/9/2019,21791,Vintage Heads And Tails Card Game,6.19,1,15492,United Kingdo +581492,12/9/2019,21808,Christmas Garland Stars Trees,6.19,3,15492,United Kingdom +581492,12/9/2019,21810,Christmas Hanging Star With Bell,6.19,25,15492,United Kingdo +581492,12/9/2019,21812,Garland With Hearts And Bells,6.19,7,15492,United Kingdom +581492,12/9/2019,21813,Garland With Stars And Bells,6.19,3,15492,United Kingdom +581492,12/9/2019,21822,Glitter Christmas Tree With Bells,6.19,12,15492,United Kingd +581492,12/9/2019,21828,Eight Piece Snake Set,6.19,1,15492,United Kingdom +581492,12/9/2019,21832,Chocolate Calculator,6.19,1,15492,United Kingdom +581492,12/9/2019,21833,Camouflage Led Torch,6.04,2,15492,United Kingdom +581492,12/9/2019,21871,Save The Planet Mug,6.19,1,15492,United Kingdom +581492,12/9/2019,21874,Gin And Tonic Mug,6.19,2,15492,United Kingdom +581492,12/9/2019,21876,Pottering Mug,6.19,4,15492,United Kingdom +581492,12/9/2019,21879,Hearts Gift Tape,6.19,1,15492,United Kingdom +581492,12/9/2019,21889,Wooden Box Of Dominoes,6.19,3,15492,United Kingdom +581492,12/9/2019,21890,S/6 Wooden Skittles In Cotton Bag,6.19,1,15492,United Kingdo +581492,12/9/2019,21892,Traditional Wooden Catch Cup Game,6.19,1,15492,United Kingdo +581492,12/9/2019,21900,Key Fob Shed,6.19,4,15492,United Kingdom +581492,12/9/2019,21901,Key Fob Back Door,6.19,2,15492,United Kingdom +581492,12/9/2019,21902,Key Fob Front Door,6.19,1,15492,United Kingdom +581492,12/9/2019,21905,More Butter Metal Sign,6.19,1,15492,United Kingdom +581492,12/9/2019,21906,Pharmacie First Aid Tin,6.19,1,15492,United Kingdom +581492,12/9/2019,21914,Blue Harmonica In Box,6.19,2,15492,United Kingdom +581492,12/9/2019,21916,Set 12 Retro White Chalk Sticks,6.19,2,15492,United Kingdom +581492,12/9/2019,21930,Jumbo Storage Bag Skulls,6.19,1,15492,United Kingdom +581492,12/9/2019,21931,Jumbo Storage Bag Suki,6.19,1,15492,United Kingdom +581492,12/9/2019,21932,Scandinavian Paisley Picnic Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,21934,Skull Shoulder Bag,6.19,3,15492,United Kingdom +581492,12/9/2019,21935,Suki Shoulder Bag,6.19,9,15492,United Kingdom +581492,12/9/2019,21936,Red Retrospot Picnic Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,21942,Skulls Design Flannel,6.19,2,15492,United Kingdom +581492,12/9/2019,21945,Strawberries Design Flannel,6.19,2,15492,United Kingdom +581492,12/9/2019,21947,Set Of 6 Heart Chopsticks,6.19,1,15492,United Kingdom +581492,12/9/2019,21949,Set Of 6 Strawberry Chopsticks,6.19,2,15492,United Kingdom +581492,12/9/2019,21967,Pack Of 12 Skull Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,21976,Pack Of 60 Mushroom Cake Cases,6.19,3,15492,United Kingdom +581492,12/9/2019,21977,Pack Of 60 Pink Paisley Cake Cases,6.19,2,15492,United Kingd +581492,12/9/2019,21980,Pack Of 12 Red Retrospot Tissues,6.19,2,15492,United Kingdom +581492,12/9/2019,21981,Pack Of 12 Woodland Tissues,6.19,4,15492,United Kingdom +581492,12/9/2019,21982,Pack Of 12 Suki Tissues,6.19,2,15492,United Kingdom +581492,12/9/2019,21983,Pack Of 12 Blue Paisley Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,21984,Pack Of 12 Pink Paisley Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,21986,Pack Of 12 Pink Polkadot Tissues,6.19,3,15492,United Kingdom +581492,12/9/2019,21989,Pack Of 20 Skull Paper Napkins,6.19,2,15492,United Kingdom +581492,12/9/2019,21990,Modern Floral Stationery Set,6.19,8,15492,United Kingdom +581492,12/9/2019,21993,Floral Folk Stationery Set,6.19,8,15492,United Kingdom +581492,12/9/2019,22024,Rainy Ladies Birthday Card,6.19,3,15492,United Kingdom +581492,12/9/2019,22025,Ring Of Roses Birthday Card,6.19,3,15492,United Kingdom +581492,12/9/2019,22026,Banquet Birthday Card,6.19,4,15492,United Kingdom +581492,12/9/2019,22027,Tea Party Birthday Card,6.19,2,15492,United Kingdom +581492,12/9/2019,22028,Penny Farthing Birthday Card,6.19,1,15492,United Kingdom +581492,12/9/2019,22029,Spaceboy Birthday Card,6.19,4,15492,United Kingdom +581492,12/9/2019,22031,Botanical Lavender Birthday Card,6.19,1,15492,United Kingdom +581492,12/9/2019,22037,Robot Birthday Card,6.19,4,15492,United Kingdom +581492,12/9/2019,22064,Pink Doughnut Trinket Pot,6.19,1,15492,United Kingdom +581492,12/9/2019,22065,Christmas Pudding Trinket Pot,6.19,2,15492,United Kingdom +581492,12/9/2019,22068,Black Pirate Treasure Chest,6.19,1,15492,United Kingdom +581492,12/9/2019,22070,Small Red Retrospot Mug In Box,6.19,3,15492,United Kingdom +581492,12/9/2019,22071,Small White Retrospot Mug In Box,6.19,1,15492,United Kingdom +581492,12/9/2019,22074,6 Ribbons Shimmering Pinks,6.19,1,15492,United Kingdom +581492,12/9/2019,22075,6 Ribbons Elegant Christmas,6.19,8,15492,United Kingdom +581492,12/9/2019,22076,6 Ribbons Empire,6.19,4,15492,United Kingdom +581492,12/9/2019,22083,Paper Chain Kit Retrospot,6.19,1,15492,United Kingdom +581492,12/9/2019,22085,Paper Chain Kit Skulls,6.19,1,15492,United Kingdom +581492,12/9/2019,22086,Paper Chain Kit 50'S Christmas,6.19,38,15492,United Kingdom +581492,12/9/2019,22091,Empire Tissue Box,6.19,1,15492,United Kingdom +581492,12/9/2019,22099,Caravan Square Tissue Box,6.19,3,15492,United Kingdom +581492,12/9/2019,22104,Mirror Mosaic Candle Plate,6.19,4,15492,United Kingdom +581492,12/9/2019,22106,Mirror Mosaic Hurricane Lamp,6.19,1,15492,United Kingdom +581492,12/9/2019,22107,Pizza Plate In Box,6.19,10,15492,United Kingdom +581492,12/9/2019,22108,Ping! Microwave Plate,6.04,2,15492,United Kingdom +581492,12/9/2019,22109,Full English Breakfast Plate,6.04,2,15492,United Kingdom +581492,12/9/2019,22110,Bird House Hot Water Bottle,6.04,3,15492,United Kingdom +581492,12/9/2019,22111,Scottie Dog Hot Water Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,22112,Chocolate Hot Water Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,22114,Hot Water Bottle Tea And Sympathy,6.19,4,15492,United Kingdo +581492,12/9/2019,22116,Metal Sign His Dinner Is Served,6.19,2,15492,United Kingdom +581492,12/9/2019,22121,Noel Wooden Block Letters,6.19,1,15492,United Kingdom +581492,12/9/2019,22123,Ping Microwave Apron,6.19,1,15492,United Kingdom +581492,12/9/2019,22124,Set Of 2 Tea Towels Ping Microwave,6.19,1,15492,United Kingd +581492,12/9/2019,22129,Party Cones Candy Decoration,6.19,3,15492,United Kingdom +581492,12/9/2019,22134,Mini Ladle Love Heart Red,6.19,1,15492,United Kingdom +581492,12/9/2019,15036,Assorted Colours Silk Fan,6.19,1,15492,United Kingdom +581492,12/9/2019,15039,Sandalwood Fan,6.19,1,15492,United Kingdom +581492,12/9/2019,15058C,Ice Cream Design Garden Parasol,6.19,1,15492,United Kingdom +581492,12/9/2019,16218,Cartoon Pencil Sharpeners,6.19,5,15492,United Kingdom +581492,12/9/2019,16225,Rattle Snake Eggs,6.19,1,15492,United Kingdom +581492,12/9/2019,16235,Recycled Pencil With Rabbit Eraser,6.19,3,15492,United Kingd +581492,12/9/2019,16237,Sleeping Cat Erasers,6.19,1,15492,United Kingdom +581492,12/9/2019,17038,Porcelain Budah Incense Holder,6.19,1,15492,United Kingdom +581492,12/9/2019,17084N,Fairy Dreams Incense,6.19,1,15492,United Kingdom +581492,12/9/2019,20659,Economy Luggage Tag,6.19,7,15492,United Kingdom +581492,12/9/2019,20665,Red Retrospot Purse,6.19,2,15492,United Kingdom +581492,12/9/2019,20668,Disco Ball Christmas Decoration,6.19,1,15492,United Kingdom +581492,12/9/2019,20718,Red Retrospot Shopper Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,20719,Woodland Charlotte Bag,6.19,7,15492,United Kingdom +581492,12/9/2019,20723,Strawberry Charlotte Bag,6.19,2,15492,United Kingdom +581492,12/9/2019,20724,Red Retrospot Charlotte Bag,6.19,4,15492,United Kingdom +581492,12/9/2019,22135,Mini Ladle Love Heart Pink,6.19,6,15492,United Kingdom +581492,12/9/2019,22138,Baking Set 9 Piece Retrospot,6.19,1,15492,United Kingdom +581492,12/9/2019,22141,Christmas Craft Tree Top Angel,6.19,2,15492,United Kingdom +581492,12/9/2019,22150,3 Stripey Mice Feltcraft,7.24,2,15492,United Kingdom +581492,12/9/2019,22153,Angel Decoration Stars On Dress,7.24,2,15492,United Kingdom +581492,12/9/2019,22154,Angel Decoration 3 Buttons,7.24,3,15492,United Kingdom +581492,12/9/2019,22155,Star Decoration Rustic,7.24,7,15492,United Kingdom +581492,12/9/2019,22156,Heart Decoration With Pearls,7.24,4,15492,United Kingdom +581492,12/9/2019,22163,Heart String Memo Holder Hanging,7.24,9,15492,United Kingdom +581492,12/9/2019,22165,Diamante Heart Shaped Wall Mirror,7.24,1,15492,United Kingdo +581492,12/9/2019,22167,Oval Wall Mirror Diamante,7.24,1,15492,United Kingdom +581492,12/9/2019,22170,Picture Frame Wood Triple Portrait,7.24,1,15492,United Kingd +581492,12/9/2019,22173,Metal 4 Hook Hanger French Chateau,7.24,2,15492,United Kingd +581492,12/9/2019,22174,Photo Cube,6.19,7,15492,United Kingdom +581492,12/9/2019,22178,Victorian Glass Hanging T-Light,6.19,5,15492,United Kingdom +581492,12/9/2019,22186,Red Star Card Holder,7.24,2,15492,United Kingdom +581492,12/9/2019,22190,Local Cafe Mug,7.24,3,15492,United Kingdom +581492,12/9/2019,22193,Red Diner Wall Clock,7.24,1,15492,United Kingdom +581492,12/9/2019,22195,Large Heart Measuring Spoons,7.24,1,15492,United Kingdom +581492,12/9/2019,22196,Small Heart Measuring Spoons,7.24,11,15492,United Kingdom +581492,12/9/2019,22197,Popcorn Holder,7.24,34,15492,United Kingdom +581492,12/9/2019,22199,Frying Pan Red Retrospot,7.24,1,15492,United Kingdom +581492,12/9/2019,22209,Wood Stamp Set Happy Birthday,7.24,1,15492,United Kingdom +581492,12/9/2019,22212,Four Hook White Lovebirds,7.24,1,15492,United Kingdom +581492,12/9/2019,22219,Lovebird Hanging Decoration White,7.24,4,15492,United Kingdo +581492,12/9/2019,22224,White Lovebird Lantern,7.24,4,15492,United Kingdom +581492,12/9/2019,22227,Hanging Heart Mirror Decoration,7.24,1,15492,United Kingdom +581492,12/9/2019,22260,Felt Egg Cosy Blue Rabbit,6.39,2,15492,United Kingdom +581492,12/9/2019,22261,Felt Egg Cosy White Rabbit,7.24,1,15492,United Kingdom +581492,12/9/2019,22264,Felt Farm Animal White Bunny,7.24,1,15492,United Kingdom +581492,12/9/2019,22273,Feltcraft Doll Molly,7.24,2,15492,United Kingdom +581492,12/9/2019,22277,Cosmetic Bag Vintage Rose Paisley,7.24,1,15492,United Kingdo +581492,12/9/2019,22279,Pocket Bag Blue Paisley Red Spot,7.24,5,15492,United Kingdom +581492,12/9/2019,22280,Pocket Bag Pink Paisely Brown Spot,7.24,4,15492,United Kingd +581492,12/9/2019,22300,Coffee Mug Dog + Ball Design,7.24,1,15492,United Kingdom +581492,12/9/2019,22301,Coffee Mug Cat + Bird Design,7.24,1,15492,United Kingdom +581492,12/9/2019,22307,Gold Mug Bone China Tree Of Life,7.24,1,15492,United Kingdom +581492,12/9/2019,22308,Tea Cosy Blue Stripe,7.24,2,15492,United Kingdom +581492,12/9/2019,22309,Tea Cosy Red Stripe,7.24,2,15492,United Kingdom +581492,12/9/2019,22324,Blue Polkadot Kids Bag,7.24,2,15492,United Kingdom +581492,12/9/2019,22326,Round Snack Boxes Set Of4 Woodland,7.24,3,15492,United Kingd +581492,12/9/2019,22327,Round Snack Boxes Set Of 4 Skulls,7.24,2,15492,United Kingdo +581492,12/9/2019,22329,Round Container Set Of 5 Retrospot,6.19,2,15492,United Kingd +581492,12/9/2019,22338,Star Decoration Painted Zinc,6.19,4,15492,United Kingdom +581492,12/9/2019,22340,Noel Garland Painted Zinc,6.19,17,15492,United Kingdom +581492,12/9/2019,22342,Home Garland Painted Zinc,6.19,7,15492,United Kingdom +581492,12/9/2019,22348,Tea Bag Plate Red Retrospot,6.19,3,15492,United Kingdom +581492,12/9/2019,22355,Charlotte Bag Suki Design,6.19,3,15492,United Kingdom +581492,12/9/2019,22356,Charlotte Bag Pink Polkadot,6.19,1,15492,United Kingdom +581492,12/9/2019,22357,Kings Choice Biscuit Tin,6.19,2,15492,United Kingdom +581492,12/9/2019,22358,Kings Choice Tea Caddy,6.19,1,15492,United Kingdom +581492,12/9/2019,22361,Glass Jar Daisy Fresh Cotton Wool,6.19,2,15492,United Kingdo +581492,12/9/2019,22362,Glass Jar Peacock Bath Salts,6.19,2,15492,United Kingdom +581492,12/9/2019,22367,Childrens Apron Spaceboy Design,6.19,1,15492,United Kingdom +581492,12/9/2019,22372,Airline Bag Vintage World Champion,6.19,1,15492,United Kingd +581492,12/9/2019,22374,Airline Bag Vintage Jet Set Red,6.19,1,15492,United Kingdom +581492,12/9/2019,85014B,Red Retrospot Umbrella,6.19,1,15492,United Kingdom +581492,12/9/2019,85032C,Curious Images Gift Wrap Set,6.19,1,15492,United Kingdom +581492,12/9/2019,85038,6 Chocolate Love Heart T-Lights,6.19,1,15492,United Kingdom +581492,12/9/2019,85039A,Set/4 Red Mini Rose Candle In Bowl,6.19,5,15492,United King +581492,12/9/2019,85039B,S/4 Ivory Mini Rose Candle In Bowl,6.19,4,15492,United King +581492,12/9/2019,85040A,S/4 Pink Flower Candles In Bowl,6.19,1,15492,United Kingdom +581492,12/9/2019,85048,15cm Christmas Glass Ball 20 Lights,6.19,2,15492,United King +581492,12/9/2019,85049C,Romantic Pinks Ribbons,6.19,1,15492,United Kingdom +581492,12/9/2019,85049G,Chocolate Box Ribbons,6.19,1,15492,United Kingdom +581492,12/9/2019,85049H,Urban Black Ribbons,6.19,2,15492,United Kingdom +581492,12/9/2019,85053,French Enamel Candleholder,6.19,1,15492,United Kingdom +581492,12/9/2019,85059,French Enamel Water Basin,6.19,1,15492,United Kingdom +581492,12/9/2019,85066,Cream Sweetheart Mini Chest,6.19,1,15492,United Kingdom +581492,12/9/2019,85094,Candy Spot Egg Warmer Rabbit,6.19,2,15492,United Kingdom +581492,12/9/2019,85114C,Red Enchanted Forest Placemat,6.19,1,15492,United Kingdom +581492,12/9/2019,85123A,Cream Hanging Heart T-Light Holder,6.19,3,15492,United King +581492,12/9/2019,85131B,Beaded Crystal Heart Green On Stick,6.19,1,15492,United Kin +581492,12/9/2019,85131D,Beaded Crystal Heart Pink On Stick,6.19,2,15492,United King +581492,12/9/2019,85152,Hand Over The Chocolate Sign,6.19,1,15492,United Kingdom +581492,12/9/2019,85168B,Black Baroque Carriage Clock,6.19,3,15492,United Kingdom +581492,12/9/2019,85169C,Eau De Nil Love Bird Candle,6.19,1,15492,United Kingdom +581492,12/9/2019,85170C,Set/6 Eau De Nil Bird T-Lights,6.19,1,15492,United Kingdom +581492,12/9/2019,85173,Set/6 Frog Prince T-Light Candles,6.19,1,15492,United Kingdo +581492,12/9/2019,85177,Basket Of Flowers Sewing Kit,6.19,1,15492,United Kingdom +581492,12/9/2019,85178,Victorian Sewing Kit,6.19,1,15492,United Kingdom +581492,12/9/2019,85179A,Green Bitty Light Chain,6.19,4,15492,United Kingdom +581492,12/9/2019,85199S,Small Hanging Ivory/Red Wood Bird,6.19,9,15492,United Kingd +581492,12/9/2019,85227,Set Of 6 3d Kit Cards For Kids,6.19,3,15492,United Kingdom +581492,12/9/2019,90003C,Midnight Blue Pair Heart Hair Slide,6.19,1,15492,United Kin +581492,12/9/2019,90003E,Green Pair Heart Hair Slides,6.19,2,15492,United Kingdom +581492,12/9/2019,90010A,Midnight Blue Glass/Silver Bracelet,6.04,1,15492,United Kin +581492,12/9/2019,90013A,Midnight Blue Vintage Earrings,6.19,3,15492,United Kingdom +581492,12/9/2019,90013C,Green Vintage Earrings,6.19,2,15492,United Kingdom +581492,12/9/2019,90014A,Silver Mop Orbit Necklace,6.19,1,15492,United Kingdom +581492,12/9/2019,90016B,Gold/Mop Pendant Orbit Necklace,6.19,1,15492,United Kingdom +581492,12/9/2019,90018B,Gold Mop Orbit Drop Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90019B,Gold Mop Orbit Bracelet,6.19,1,15492,United Kingdom +581492,12/9/2019,90027D,Glass Bead Hoop Earrings Amethyst,6.19,1,15492,United Kingd +581492,12/9/2019,90030B,Red Kukui Coconut Seed Necklace,6.19,1,15492,United Kingdom +581492,12/9/2019,90055,Cracked Glaze Earrings Brown,6.19,1,15492,United Kingdom +581492,12/9/2019,90059A,Diamante Hair Grip Pack/2 Crystal,6.19,1,15492,United Kingd +581492,12/9/2019,90059D,Diamante Hair Grip Pack/2 Peridot,6.19,2,15492,United Kingd +581492,12/9/2019,90059E,Diamante Hair Grip Pack/2 Ruby,6.04,1,15492,United Kingdom +581492,12/9/2019,90059F,Diamante Hair Grip Pack/2 Lt Rose,6.19,1,15492,United Kingd +581492,12/9/2019,90072,Ruby Drop Chandelier Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90086,Crystal Frog Phone Charm,6.19,1,15492,United Kingdom +581492,12/9/2019,90120B,Blue Murano Twist Bracelet,6.19,2,15492,United Kingdom +581492,12/9/2019,90120C,Green Murano Twist Bracelet,6.19,1,15492,United Kingdom +581492,12/9/2019,90130B,Turq Stone/Crystal Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90130C,Green Stone/Crystal Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90134,Old Rose Combo Bead Necklace,6.19,1,15492,United Kingdom +581492,12/9/2019,90138,White/Pink Mini Crystals Necklace,6.19,1,15492,United Kingdo +581492,12/9/2019,90141B,Ivory Pendant Triple Shell Necklace,6.19,1,15492,United Kin +581492,12/9/2019,90145,Silver Hoop Earrings With Flower,6.19,1,15492,United Kingdom +581492,12/9/2019,90155,Resin Necklace W Pastel Beads,6.19,1,15492,United Kingdom +581492,12/9/2019,90161D,Ant Copper Pink Boudicca Bracelet,6.19,1,15492,United Kingd +581492,12/9/2019,90163A,Pink Rosebud & Pearl Necklace,6.19,2,15492,United Kingdom +581492,12/9/2019,90165B,White Rosebud Pearl Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90168,2 Daisies Hair Comb,6.19,1,15492,United Kingdom +581492,12/9/2019,90169,Daisy Hair Comb,6.19,1,15492,United Kingdom +581492,12/9/2019,90170,Daisy Hair Band,6.19,1,15492,United Kingdom +581492,12/9/2019,90174,Butterfly Hair Band,6.19,2,15492,United Kingdom +581492,12/9/2019,90175A,White Glass Chunky Charm Bracelet,6.19,2,15492,United Kingd +581492,12/9/2019,90175D,Tigris Eye Chunky Charm Bracelet,6.19,1,15492,United Kingdo +581492,12/9/2019,90177A,Classic Diamante Earrings Jet,6.19,1,15492,United Kingdom +581492,12/9/2019,90177C,Drop Diamante Earrings Crystal,6.19,1,15492,United Kingdom +581492,12/9/2019,90181B,Amethyst Glass/Shell/Pearl Necklace,6.04,1,15492,United Kin +581492,12/9/2019,90182C,Black 3 Bead Drop Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90183A,Amber Drop Earrings W Long Beads,6.19,2,15492,United Kingdo +581492,12/9/2019,90183C,Black Drop Earrings W Long Beads,6.19,1,15492,United Kingdo +581492,12/9/2019,90184C,Black Chunky Bead Bracelet W Strap,6.19,1,15492,United King +581492,12/9/2019,90185B,Amethyst Diamante Expandable Ring,6.19,1,15492,United Kingd +581492,12/9/2019,90188,Drop Earrings W Flower & Leaf,6.19,2,15492,United Kingdom +581492,12/9/2019,90191,Silver Lariat 40cm,6.19,2,15492,United Kingdom +581492,12/9/2019,90192,Jade Drop Earrings W Filigree,6.19,1,15492,United Kingdom +581492,12/9/2019,90198A,Vintage Rose Bead Bracelet Raspberr,6.19,2,15492,United Kin +581492,12/9/2019,90200A,Purple Sweetheart Bracelet,6.19,1,15492,United Kingdom +581492,12/9/2019,90201A,Purple Enamel Flower Ring,6.19,2,15492,United Kingdom +581492,12/9/2019,90201B,Black Enamel Flower Ring,6.19,1,15492,United Kingdom +581492,12/9/2019,90201C,Red Enamel Flower Ring,6.19,1,15492,United Kingdom +581492,12/9/2019,90201D,Green Enamel Flower Ring,6.19,1,15492,United Kingdom +581492,12/9/2019,90202C,Green Enamel Flower Hair Tie,6.19,1,15492,United Kingdom +581492,12/9/2019,90202D,Pink Enamel Flower Hair Tie,6.19,1,15492,United Kingdom +581492,12/9/2019,90206C,Crystal Diamante Star Brooch,6.19,1,15492,United Kingdom +581492,12/9/2019,90208,Pair Of Pink Flower Cluster Slide,6.19,1,15492,United Kingdo +581492,12/9/2019,90210A,Grey Acrylic Faceted Bangle,6.19,1,15492,United Kingdom +581492,12/9/2019,22378,Wall Tidy Retrospot,6.19,2,15492,United Kingdom +581492,12/9/2019,22379,Recycling Bag Retrospot,6.19,1,15492,United Kingdom +581492,12/9/2019,22380,Toy Tidy Spaceboy,6.19,2,15492,United Kingdom +581492,12/9/2019,22396,Magnets Pack Of 4 Retro Photo,6.19,1,15492,United Kingdom +581492,12/9/2019,22411,Jumbo Shopper Vintage Red Paisley,6.19,1,15492,United Kingdo +581492,12/9/2019,22418,10 Colour Spaceboy Pen,6.19,3,15492,United Kingdom +581492,12/9/2019,22419,Lipstick Pen Red,6.19,3,15492,United Kingdom +581492,12/9/2019,22420,Lipstick Pen Baby Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,22421,Lipstick Pen Fuschia,6.19,2,15492,United Kingdom +581492,12/9/2019,22422,Toothpaste Tube Pen,6.19,4,15492,United Kingdom +581492,12/9/2019,22437,Set Of 9 Black Skull Balloons,7.24,1,15492,United Kingdom +581492,12/9/2019,22441,Grow Your Own Basil In Enamel Mug,7.24,1,15492,United Kingdo +581492,12/9/2019,22446,Pin Cushion Babushka Pink,7.24,7,15492,United Kingdom +581492,12/9/2019,22457,Natural Slate Heart Chalkboard,7.24,1,15492,United Kingdom +581492,12/9/2019,22464,Hanging Metal Heart Lantern,7.24,1,15492,United Kingdom +581492,12/9/2019,22466,Fairy Tale Cottage Night Light,7.24,1,15492,United Kingdom +581492,12/9/2019,22467,Gumball Coat Rack,7.24,1,15492,United Kingdom +581492,12/9/2019,22478,Birdhouse Garden Marker,7.24,1,15492,United Kingdom +581492,12/9/2019,22486,Plasmatronic Lamp,7.24,1,15492,United Kingdom +581492,12/9/2019,22488,Natural Slate Rectangle Chalkboard,7.24,1,15492,United Kingd +581492,12/9/2019,22489,Pack Of 12 Traditional Crayons,7.24,5,15492,United Kingdom +581492,12/9/2019,22495,Set Of 2 Round Tins Camembert,7.24,1,15492,United Kingdom +581492,12/9/2019,22540,Mini Jigsaw Circus Parade,7.24,1,15492,United Kingdom +581492,12/9/2019,22544,Mini Jigsaw Spaceboy,7.24,1,15492,United Kingdom +581492,12/9/2019,22549,Picture Dominoes,7.24,3,15492,United Kingdom +581492,12/9/2019,22551,Plasters In Tin Spaceboy,7.24,2,15492,United Kingdom +581492,12/9/2019,22553,Plasters In Tin Skulls,7.24,2,15492,United Kingdom +581492,12/9/2019,22554,Plasters In Tin Woodland Animals,7.24,3,15492,United Kingdom +581492,12/9/2019,22555,Plasters In Tin Strongman,7.24,3,15492,United Kingdom +581492,12/9/2019,22557,Plasters In Tin Vintage Paisley,7.24,2,15492,United Kingdom +581492,12/9/2019,22558,Clothes Pegs Retrospot Pack 24,7.24,3,15492,United Kingdom +581492,12/9/2019,22560,Traditional Modelling Clay,7.24,5,15492,United Kingdom +581492,12/9/2019,22565,Feltcraft Hairbands Pink And White,7.24,4,15492,United Kingd +581492,12/9/2019,22566,Feltcraft Hairband Pink And Purple,7.24,3,15492,United Kingd +581492,12/9/2019,22571,Rocking Horse Red Christmas,7.24,4,15492,United Kingdom +581492,12/9/2019,22573,Star Wooden Christmas Decoration,6.39,2,15492,United Kingdom +581492,12/9/2019,22574,Heart Wooden Christmas Decoration,7.24,5,15492,United Kingdo +581492,12/9/2019,22576,Swallow Wooden Christmas Decoration,7.24,3,15492,United King +581492,12/9/2019,22577,Wooden Heart Christmas Scandinavian,7.24,4,15492,United King +581492,12/9/2019,22578,Wooden Star Christmas Scandinavian,7.24,19,15492,United King +581492,12/9/2019,22580,Advent Calendar Gingham Sack,7.24,9,15492,United Kingdom +581492,12/9/2019,22581,Wood Stocking Christmas Scandispot,7.24,11,15492,United King +581492,12/9/2019,22585,Pack Of 6 Birdy Gift Tags,7.24,2,15492,United Kingdom +581492,12/9/2019,22586,Feltcraft Hairband Pink And Blue,7.24,2,15492,United Kingdom +581492,12/9/2019,22589,Cardholder Gingham Star,7.24,6,15492,United Kingdom +581492,12/9/2019,22591,Cardholder Gingham Christmas Tree,7.24,1,15492,United Kingdo +581492,12/9/2019,22592,Cardholder Holly Wreath Metal,7.24,3,15492,United Kingdom +581492,12/9/2019,22593,Christmas Gingham Star,6.39,2,15492,United Kingdom +581492,12/9/2019,22594,Christmas Gingham Tree,7.24,3,15492,United Kingdom +581492,12/9/2019,22597,Musical Zinc Heart Decoration,7.24,9,15492,United Kingdom +581492,12/9/2019,22598,Christmas Musical Zinc Tree,7.24,4,15492,United Kingdom +581492,12/9/2019,22599,Christmas Musical Zinc Star,6.19,5,15492,United Kingdom +581492,12/9/2019,22600,Christmas Retrospot Star Wood,6.19,2,15492,United Kingdom +581492,12/9/2019,22601,Christmas Retrospot Angel Wood,6.19,3,15492,United Kingdom +581492,12/9/2019,22602,Retrospot Wooden Heart Decoration,6.19,3,15492,United Kingdo +581492,12/9/2019,22608,Pens Assorted Funky Jeweled,6.19,3,15492,United Kingdom +581492,12/9/2019,22614,Pack Of 12 Spaceboy Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,22615,Pack Of 12 Circus Parade Tissues,6.19,4,15492,United Kingdom +581492,12/9/2019,22616,Pack Of 12 London Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,22619,Set Of 6 Soldier Skittles,6.19,4,15492,United Kingdom +581492,12/9/2019,22620,4 Traditional Spinning Tops,6.19,3,15492,United Kingdom +581492,12/9/2019,22621,Traditional Knitting Nancy,6.19,2,15492,United Kingdom +581492,12/9/2019,22629,Spaceboy Lunch Box,6.19,1,15492,United Kingdom +581492,12/9/2019,22630,Dolly Girl Lunch Box,6.19,1,15492,United Kingdom +581492,12/9/2019,22632,Hand Warmer Red Retrospot,6.19,1,15492,United Kingdom +581492,12/9/2019,22633,Hand Warmer Union Jack,6.19,1,15492,United Kingdom +581492,12/9/2019,22634,Childs Breakfast Set Spaceboy,6.19,1,15492,United Kingdom +581492,12/9/2019,22650,Ceramic Pirate Chest Money Bank,6.19,2,15492,United Kingdom +581492,12/9/2019,22651,Gentleman Shirt Repair Kit,6.19,1,15492,United Kingdom +581492,12/9/2019,22653,Button Box,6.19,16,15492,United Kingdom +581492,12/9/2019,22654,Deluxe Sewing Kit,6.19,2,15492,United Kingdom +581492,12/9/2019,22659,Lunch Box I Love London,6.19,1,15492,United Kingdom +581492,12/9/2019,22666,Recipe Box Pantry Yellow Design,6.19,5,15492,United Kingdom +581492,12/9/2019,22693,Grow A Flytrap Or Sunflower In Tin,6.19,3,15492,United Kingd +581492,12/9/2019,22694,Wicker Star,6.19,1,15492,United Kingdom +581492,12/9/2019,22697,Green Regency Teacup And Saucer,6.19,1,15492,United Kingdom +581492,12/9/2019,22699,Roses Regency Teacup And Saucer,6.19,2,15492,United Kingdom +581492,12/9/2019,22701,Pink Dog Bowl,6.19,5,15492,United Kingdom +581492,12/9/2019,22703,Pink Cat Bowl,6.19,6,15492,United Kingdom +581492,12/9/2019,22712,Card Dolly Girl,6.19,1,15492,United Kingdom +581492,12/9/2019,22713,Card I Love London,6.19,1,15492,United Kingdom +581492,12/9/2019,22714,Card Birthday Cowboy,6.19,2,15492,United Kingdom +581492,12/9/2019,22716,Card Circus Parade,6.19,3,15492,United Kingdom +581492,12/9/2019,22717,Card Dog And Ball,6.19,1,15492,United Kingdom +581492,12/9/2019,22720,Set Of 3 Cake Tins Pantry Design,6.19,2,15492,United Kingdom +581492,12/9/2019,22725,Alarm Clock Bakelike Chocolate,6.19,1,15492,United Kingdom +581492,12/9/2019,22726,Alarm Clock Bakelike Green,6.19,4,15492,United Kingdom +581492,12/9/2019,22727,Alarm Clock Bakelike Red,6.19,4,15492,United Kingdom +581492,12/9/2019,22730,Alarm Clock Bakelike Ivory,6.19,1,15492,United Kingdom +581492,12/9/2019,22741,Funky Diva Pen,6.19,4,15492,United Kingdom +581492,12/9/2019,22745,Poppy's Playhouse Bedroom,6.19,2,15492,United Kingdom +581492,12/9/2019,22748,Poppy's Playhouse Kitchen,6.19,1,15492,United Kingdom +581492,12/9/2019,22749,Feltcraft Princess Charlotte Doll,6.19,1,15492,United Kingdo +581492,12/9/2019,22751,Feltcraft Princess Olivia Doll,6.19,2,15492,United Kingdom +581492,12/9/2019,22753,Small Yellow Babushka Notebook,6.19,1,15492,United Kingdom +581492,12/9/2019,22754,Small Red Babushka Notebook,6.19,1,15492,United Kingdom +581492,12/9/2019,22757,Large Red Babushka Notebook,6.19,3,15492,United Kingdom +581492,12/9/2019,22758,Large Purple Babushka Notebook,6.19,2,15492,United Kingdom +581492,12/9/2019,22763,Key Cabinet Ma Campagne,6.19,1,15492,United Kingdom +581492,12/9/2019,22768,Family Photo Frame Cornice,6.19,2,15492,United Kingdom +581492,12/9/2019,22776,Sweetheart 3 Tier Cake Stand,6.19,1,15492,United Kingdom +581492,12/9/2019,22795,Sweetheart Recipe Book Stand,6.19,1,15492,United Kingdom +581492,12/9/2019,22798,Antique Glass Dressing Table Pot,6.19,3,15492,United Kingdom +581492,12/9/2019,22800,Antique Tall Swirlglass Trinket Pot,6.19,3,15492,United King +581492,12/9/2019,22809,Set Of 6 T-Lights Santa,6.19,1,15492,United Kingdom +581492,12/9/2019,22811,Set Of 6 T-Lights Cacti,6.19,1,15492,United Kingdom +581492,12/9/2019,22814,Card Party Games,6.19,9,15492,United Kingdom +581492,12/9/2019,22815,Card Psychedelic Apples,6.19,18,15492,United Kingdom +581492,12/9/2019,22816,Card Motorbike Santa,6.19,2,15492,United Kingdom +581492,12/9/2019,22817,Card Suki Birthday,6.19,5,15492,United Kingdom +581492,12/9/2019,22818,Card Christmas Village,7.24,6,15492,United Kingdom +581492,12/9/2019,22819,Birthday Card Retro Spot,7.24,3,15492,United Kingdom +581492,12/9/2019,22835,Hot Water Bottle I Am So Poorly,7.24,3,15492,United Kingdom +581492,12/9/2019,22865,Hand Warmer Owl Design,7.24,2,15492,United Kingdom +581492,12/9/2019,22866,Hand Warmer Scotty Dog Design,7.24,3,15492,United Kingdom +581492,12/9/2019,22867,Hand Warmer Bird Design,7.24,4,15492,United Kingdom +581492,12/9/2019,22881,Number Tile Vintage Font 2,7.24,1,15492,United Kingdom +581492,12/9/2019,22885,Number Tile Vintage Font 6,7.24,1,15492,United Kingdom +581492,12/9/2019,22888,Number Tile Vintage Font 9,7.24,1,15492,United Kingdom +581492,12/9/2019,22890,Novelty Biscuits Cake Stand 3 Tier,7.24,1,15492,United Kingd +581492,12/9/2019,22898,Childrens Apron Apples Design,7.24,1,15492,United Kingdom +581492,12/9/2019,22899,Children's Apron Dolly Girl,7.24,2,15492,United Kingdom +581492,12/9/2019,22900,Set 2 Tea Towels I Love London,7.24,3,15492,United Kingdom +581492,12/9/2019,22905,Calendar In Season Design,7.24,1,15492,United Kingdom +581492,12/9/2019,22907,Pack Of 20 Napkins Pantry Design,6.39,1,15492,United Kingdom +581492,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,7.24,5,15492,United King +581492,12/9/2019,22910,Paper Chain Kit Vintage Christmas,7.24,7,15492,United Kingdo +581492,12/9/2019,22914,Blue Coat Rack Paris Fashion,7.24,1,15492,United Kingdom +581492,12/9/2019,22922,Fridge Magnets Us Diner Assorted,7.24,6,15492,United Kingdom +581492,12/9/2019,22924,Fridge Magnets La Vie En Rose,7.24,6,15492,United Kingdom +581492,12/9/2019,22928,Yellow Giant Garden Thermometer,7.24,1,15492,United Kingdom +581492,12/9/2019,22940,Feltcraft Christmas Fairy,6.19,1,15492,United Kingdom +581492,12/9/2019,22941,Christmas Lights 10 Reindeer,6.19,2,15492,United Kingdom +581492,12/9/2019,22943,Christmas Lights 10 Vintage Baubles,6.19,1,15492,United King +581492,12/9/2019,22948,Metal Decoration Naughty Children,6.19,4,15492,United Kingdo +581492,12/9/2019,22951,60 Cake Cases Dolly Girl Design,6.19,2,15492,United Kingdom +581492,12/9/2019,22952,60 Cake Cases Vintage Christmas,6.19,2,15492,United Kingdom +581492,12/9/2019,22955,36 Foil Star Cake Cases,6.19,1,15492,United Kingdom +581492,12/9/2019,22960,Jam Making Set With Jars,6.19,2,15492,United Kingdom +581492,12/9/2019,22961,Jam Making Set Printed,6.19,9,15492,United Kingdom +581492,12/9/2019,22962,Jam Jar With Pink Lid,6.19,3,15492,United Kingdom +581492,12/9/2019,22963,Jam Jar With Green Lid,6.19,3,15492,United Kingdom +581492,12/9/2019,22964,3 Piece Spaceboy Cookie Cutter Set,6.19,1,15492,United Kingd +581492,12/9/2019,22965,3 Traditional Biscuit Cutters Set,6.19,1,15492,United Kingdo +581492,12/9/2019,22966,Gingerbread Man Cookie Cutter,6.19,4,15492,United Kingdom +581492,12/9/2019,22969,Homemade Jam Scented Candles,6.19,6,15492,United Kingdom +581492,12/9/2019,22975,Spaceboy Childrens Egg Cup,6.19,2,15492,United Kingdom +581492,12/9/2019,22976,Circus Parade Childrens Egg Cup,6.19,1,15492,United Kingdom +581492,12/9/2019,22977,Dolly Girl Childrens Egg Cup,6.19,1,15492,United Kingdom +581492,12/9/2019,22979,Pantry Washing Up Brush,6.19,2,15492,United Kingdom +581492,12/9/2019,22980,Pantry Scrubbing Brush,6.19,1,15492,United Kingdom +581492,12/9/2019,22982,Pantry Pastry Brush,6.19,3,15492,United Kingdom +581492,12/9/2019,22983,Card Billboard Font,6.19,1,15492,United Kingdom +581492,12/9/2019,22984,Card Gingham Rose,6.19,1,15492,United Kingdom +581492,12/9/2019,22988,Soldiers Egg Cup,6.19,1,15492,United Kingdom +581492,12/9/2019,22989,Set 2 Pantry Design Tea Towels,6.19,2,15492,United Kingdom +581492,12/9/2019,22992,Revolver Wooden Ruler,6.19,3,15492,United Kingdom +581492,12/9/2019,22993,Set Of 4 Pantry Jelly Moulds,6.19,3,15492,United Kingdom +581492,12/9/2019,22995,Travel Card Wallet Suki,6.19,4,15492,United Kingdom +581492,12/9/2019,22996,Travel Card Wallet Vintage Ticket,6.19,5,15492,United Kingdo +581492,12/9/2019,22997,Travel Card Wallet Union Jack,6.19,1,15492,United Kingdom +581492,12/9/2019,22998,Travel Card Wallet Keep Calm,6.19,4,15492,United Kingdom +581492,12/9/2019,22999,Travel Card Wallet Vintage Leaf,6.19,1,15492,United Kingdom +581492,12/9/2019,23005,Travel Card Wallet I Love London,6.19,4,15492,United Kingdom +581492,12/9/2019,23007,Spaceboy Baby Gift Set,6.19,1,15492,United Kingdom +581492,12/9/2019,23009,I Love London Baby Gift Set,6.19,2,15492,United Kingdom +581492,12/9/2019,23012,Glass Apothecary Bottle Perfume,6.19,1,15492,United Kingdom +581492,12/9/2019,23013,Glass Apothecary Bottle Tonic,6.19,2,15492,United Kingdom +581492,12/9/2019,23014,Glass Apothecary Bottle Elixir,6.19,1,15492,United Kingdom +581492,12/9/2019,23050,Recycled Acapulco Mat Green,6.19,1,15492,United Kingdom +581492,12/9/2019,23051,Recycled Acapulco Mat Blue,6.19,1,15492,United Kingdom +581492,12/9/2019,23052,Recycled Acapulco Mat Turquoise,6.19,5,15492,United Kingdom +581492,12/9/2019,23053,Recycled Acapulco Mat Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,23054,Recycled Acapulco Mat Lavender,6.19,1,15492,United Kingdom +581492,12/9/2019,23074,Embossed Heart Trinket Box,6.19,1,15492,United Kingdom +581492,12/9/2019,23076,Ice Cream Sundae Lip Gloss,6.19,3,15492,United Kingdom +581492,12/9/2019,23077,Doughnut Lip Gloss,6.19,3,15492,United Kingdom +581492,12/9/2019,23082,Set 6 Paper Table Lantern Hearts,6.19,1,15492,United Kingdom +581492,12/9/2019,23083,Set 6 Paper Table Lantern Stars,6.19,1,15492,United Kingdom +581492,12/9/2019,23084,Rabbit Night Light,6.19,57,15492,United Kingdom +581492,12/9/2019,23088,Zinc Heart Flower T-Light Holder,6.19,1,15492,United Kingdom +581492,12/9/2019,23089,Glass Bon Bon Jar,6.19,4,15492,United Kingdom +581492,12/9/2019,23093,Small Parisienne Heart Photo Frame,6.19,3,15492,United Kingd +581492,12/9/2019,23103,Jingle Bell Heart Decoration,6.19,2,15492,United Kingdom +581492,12/9/2019,23110,Parisienne Key Cabinet,6.19,1,15492,United Kingdom +581492,12/9/2019,23111,Parisienne Sewing Box,6.19,1,15492,United Kingdom +581492,12/9/2019,23112,Parisienne Curio Cabinet,6.19,1,15492,United Kingdom +581492,12/9/2019,23118,Parisienne Jewellery Drawer,6.19,1,15492,United Kingdom +581492,12/9/2019,23158,Set Of 5 Lucky Cat Magnets,6.19,1,15492,United Kingdom +581492,12/9/2019,23165,Large Ceramic Top Storage Jar,6.19,2,15492,United Kingdom +581492,12/9/2019,23166,Medium Ceramic Top Storage Jar,6.19,2,15492,United Kingdom +581492,12/9/2019,23168,Classic Cafe Sugar Dispenser,6.19,2,15492,United Kingdom +581492,12/9/2019,23171,Regency Tea Plate Green,6.19,1,15492,United Kingdom +581492,12/9/2019,23172,Regency Tea Plate Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,23173,Regency Teapot Roses,6.19,1,15492,United Kingdom +581492,12/9/2019,23175,Regency Milk Jug Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,23177,Treasure Island Book Box,6.19,1,15492,United Kingdom +581492,12/9/2019,23183,Mother's Kitchen Spoon Rest,6.19,3,15492,United Kingdom +581492,12/9/2019,23184,Bull Dog Bottle Opener,6.19,2,15492,United Kingdom +581492,12/9/2019,23188,Vintage 2 Metre Folding Ruler,6.19,1,15492,United Kingdom +581492,12/9/2019,23191,Bundle Of 3 Retro Note Books,6.19,1,15492,United Kingdom +581492,12/9/2019,23194,Gymkhana Treasure Book Box,6.19,1,15492,United Kingdom +581492,12/9/2019,23196,Vintage Leaf Magnetic Notepad,6.19,1,15492,United Kingdom +581492,12/9/2019,23197,Sketchbook Magnetic Shopping List,6.19,2,15492,United Kingdo +581492,12/9/2019,23198,Pantry Magnetic Shopping List,6.19,2,15492,United Kingdom +581492,12/9/2019,23204,Charlotte Bag Apples Design,6.19,6,15492,United Kingdom +581492,12/9/2019,23205,Charlotte Bag Vintage Alphabet,6.19,3,15492,United Kingdom +581492,12/9/2019,23212,Heart Wreath Decoration With Bell,6.19,7,15492,United Kingdo +581492,12/9/2019,23213,Star Wreath Decoration With Bell,6.19,7,15492,United Kingdom +581492,12/9/2019,23220,Reindeer Heart Decoration Gold,6.19,2,15492,United Kingdom +581492,12/9/2019,23224,Cherub Heart Decoration Gold,6.19,1,15492,United Kingdom +581492,12/9/2019,23229,Vintage Donkey Tail Game,6.19,2,15492,United Kingdom +581492,12/9/2019,23234,Biscuit Tin Vintage Christmas,6.19,4,15492,United Kingdom +581492,12/9/2019,23241,Treasure Tin Gymkhana Design,6.19,3,15492,United Kingdom +581492,12/9/2019,23243,Set Of Tea Coffee Sugar Tins Pantry,6.19,1,15492,United King +581492,12/9/2019,23245,Set Of 3 Regency Cake Tins,6.19,7,15492,United Kingdom +581492,12/9/2019,23247,Biscuit Tin 50'S Christmas,6.19,3,15492,United Kingdom +581492,12/9/2019,23264,Set Of 3 Wooden Sleigh Decorations,6.19,3,15492,United Kingd +581492,12/9/2019,23265,Set Of 3 Wooden Tree Decorations,6.19,3,15492,United Kingdom +581492,12/9/2019,23266,Set Of 3 Wooden Stocking Decoration,6.19,2,15492,United King +581492,12/9/2019,23274,Star T-Light Holder Willie Winkie,6.19,3,15492,United Kingdo +581492,12/9/2019,23275,Set Of 3 Hanging Owls Ollie Beak,6.19,2,15492,United Kingdom +581492,12/9/2019,23280,Folding Butterfly Mirror Hot Pink,6.19,2,15492,United Kingdo +581492,12/9/2019,23284,Doormat Keep Calm And Come In,6.19,1,15492,United Kingdom +581492,12/9/2019,23285,Pink Vintage Spot Beaker,6.19,1,15492,United Kingdom +581492,12/9/2019,23287,Red Vintage Spot Beaker,6.19,1,15492,United Kingdom +581492,12/9/2019,23290,Spaceboy Childrens Bowl,6.19,1,15492,United Kingdom +581492,12/9/2019,23292,Spaceboy Childrens Cup,6.19,1,15492,United Kingdom +581492,12/9/2019,23293,Set Of 12 Fairy Cake Baking Cases,6.19,3,15492,United Kingdo +581492,12/9/2019,23294,Set Of 6 Snack Loaf Baking Cases,6.19,1,15492,United Kingdom +581492,12/9/2019,23295,Set Of 12 Mini Loaf Baking Cases,6.19,4,15492,United Kingdom +581492,12/9/2019,23298,Spotty Bunting,6.19,2,15492,United Kingdom +581492,12/9/2019,23299,Food Cover With Beads Set 2,6.19,1,15492,United Kingdom +581492,12/9/2019,23300,Gardeners Kneeling Pad Cup Of Tea,6.19,3,15492,United Kingdo +581492,12/9/2019,23301,Gardeners Kneeling Pad Keep Calm,6.19,6,15492,United Kingdom +581492,12/9/2019,23307,Set Of 60 Pantry Design Cake Cases,6.19,7,15492,United Kingd +581492,12/9/2019,23308,Set Of 60 Vintage Leaf Cake Cases,6.19,1,15492,United Kingdo +581492,12/9/2019,23309,Set Of 60 I Love London Cake Cases,6.19,2,15492,United Kingd +581492,12/9/2019,23310,Bubblegum Ring Assorted,6.19,4,15492,United Kingdom +581492,12/9/2019,23311,Vintage Christmas Stocking,6.19,1,15492,United Kingdom +581492,12/9/2019,23312,Vintage Christmas Gift Sack,6.19,6,15492,United Kingdom +581492,12/9/2019,23313,Vintage Christmas Bunting,6.19,4,15492,United Kingdom +581492,12/9/2019,23314,Vintage Christmas Tablecloth,6.19,1,15492,United Kingdom +581492,12/9/2019,23319,Box Of 6 Mini 50'S Crackers,6.19,3,15492,United Kingdom +581492,12/9/2019,23322,Large White Heart Of Wicker,6.19,1,15492,United Kingdom +581492,12/9/2019,23323,White Wicker Star,6.19,6,15492,United Kingdom +581492,12/9/2019,23328,Set 6 School Milk Bottles In Crate,6.19,5,15492,United Kingd +581492,12/9/2019,23332,Ivory Wicker Heart Large,6.19,1,15492,United Kingdom +581492,12/9/2019,23334,Ivory Wicker Heart Small,6.19,1,15492,United Kingdom +581492,12/9/2019,23336,Egg Frying Pan Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,23340,Vintage Christmas Cake Frill,6.19,3,15492,United Kingdom +581492,12/9/2019,23345,Dolly Girl Beaker,6.19,1,15492,United Kingdom +581492,12/9/2019,23347,I Love London Beaker,6.19,1,15492,United Kingdom +581492,12/9/2019,23349,Roll Wrap Vintage Christmas,6.19,2,15492,United Kingdom +581492,12/9/2019,23351,Roll Wrap 50'S Christmas,6.19,5,15492,United Kingdom +581492,12/9/2019,23352,Roll Wrap 50'S Red Christmas,6.19,1,15492,United Kingdom +581492,12/9/2019,23353,6 Gift Tags Vintage Christmas,6.19,3,15492,United Kingdom +581492,12/9/2019,23354,6 Gift Tags 50'S Christmas,6.19,4,15492,United Kingdom +581492,12/9/2019,23357,Hot Water Bottle Sex Bomb,6.19,1,15492,United Kingdom +581492,12/9/2019,23358,Hot Stuff Hot Water Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,23365,Set 12 Colour Pencils Love London,6.19,1,15492,United Kingdo +581492,12/9/2019,23366,Set 12 Colouring Pencils Doily,6.04,5,15492,United Kingdom +581492,12/9/2019,23367,Set 12 Colour Pencils Spaceboy,6.04,10,15492,United Kingdom +581492,12/9/2019,23368,Set 12 Colour Pencils Dolly Girl,6.19,2,15492,United Kingdom +581492,12/9/2019,23581,Jumbo Bag Paisley Park,6.19,3,15492,United Kingdom +581492,12/9/2019,21928,Jumbo Bag Scandinavian Blue Paisley,6.19,2,15492,United King +581492,12/9/2019,21929,Jumbo Bag Pink Vintage Paisley,6.19,1,15492,United Kingdom +581492,12/9/2019,85099C,Jumbo Bag Baroque Black White,6.19,7,15492,United Kingdom +581492,12/9/2019,23199,Jumbo Bag Apples,6.19,2,15492,United Kingdom +581492,12/9/2019,23200,Jumbo Bag Pears,6.19,1,15492,United Kingdom +581492,12/9/2019,23202,Jumbo Bag Vintage Leaf,6.19,2,15492,United Kingdom +581492,12/9/2019,23343,Jumbo Bag Vintage Christmas,6.19,4,15492,United Kingdom +581492,12/9/2019,23344,Jumbo Bag 50'S Christmas,6.19,5,15492,United Kingdom +581492,12/9/2019,23583,Lunch Bag Paisley Park,6.19,2,15492,United Kingdom +581492,12/9/2019,20727,Lunch Bag Black Skull,6.04,2,15492,United Kingdom +581492,12/9/2019,20728,Lunch Bag Cars Blue,6.04,1,15492,United Kingdom +581492,12/9/2019,20725,Lunch Bag Red Retrospot,6.19,1,15492,United Kingdom +581492,12/9/2019,20726,Lunch Bag Woodland,6.19,1,15492,United Kingdom +581492,12/9/2019,22662,Lunch Bag Dolly Girl Design,6.19,1,15492,United Kingdom +581492,12/9/2019,23206,Lunch Bag Apple Design,6.19,3,15492,United Kingdom +581492,12/9/2019,23208,Lunch Bag Vintage Leaf Design,6.19,3,15492,United Kingdom +581492,12/9/2019,23375,50'S Christmas Paper Gift Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,23437,50'S Christmas Gift Bag Large,6.19,1,15492,United Kingdom +581492,12/9/2019,22821,Gift Bag Psychedelic Apples,7.24,3,15492,United Kingdom +581493,12/9/2019,79190B,Retro Plastic Polka Tray,7.24,15,12423,Belgium +581493,12/9/2019,79190A,Retro Plastic 70'S Tray,7.24,15,12423,Belgium +581493,12/9/2019,22915,Assorted Bottle Top Magnets,7.24,12,12423,Belgium +581493,12/9/2019,22151,Place Setting White Heart,7.24,24,12423,Belgium +581493,12/9/2019,22632,Hand Warmer Red Retrospot,7.24,12,12423,Belgium +581493,12/9/2019,22865,Hand Warmer Owl Design,7.24,12,12423,Belgium +581493,12/9/2019,20718,Red Retrospot Shopper Bag,7.24,10,12423,Belgium +581493,12/9/2019,79190B,Retro Plastic Polka Tray,7.24,12,12423,Belgium +581493,12/9/2019,71459,Hanging Jam Jar T-Light Holders,7.24,12,12423,Belgium +581493,12/9/2019,84945,Multi Colour Silver T-Light Holder,7.24,12,12423,Belgium +581493,12/9/2019,22356,Charlotte Bag Pink Polkadot,7.24,10,12423,Belgium +581493,12/9/2019,20724,Red Retrospot Charlotte Bag,7.24,10,12423,Belgium +581493,12/9/2019,23204,Charlotte Bag Apples Design,7.24,10,12423,Belgium +581493,12/9/2019,21108,Fairy Cake Flannel Assorted Colour,7.24,18,12423,Belgium +581493,12/9/2019,22252,Birdcage Decoration Tealight Holder,7.24,12,12423,Belgium +581493,12/9/2019,22807,Set Of 6 T-Lights Toadstools,6.19,6,12423,Belgium +581494,12/9/2019,23084,Rabbit Night Light,6.19,24,12518,Germany +581494,12/9/2019,21559,Strawberry Lunch Box With Cutlery,6.19,6,12518,Germany +581494,12/9/2019,21506,Fancy Font Birthday Card,6.19,12,12518,Germany +581494,12/9/2019,22716,Card Circus Parade,6.19,12,12518,Germany +581494,12/9/2019,22556,Plasters In Tin Circus Parade,6.19,12,12518,Germany +581494,12/9/2019,22328,Round Snack Boxes Set Of 4 Fruits,6.19,6,12518,Germany +581494,12/9/2019,22730,Alarm Clock Bakelike Ivory,6.19,4,12518,Germany +581494,12/9/2019,22633,Hand Warmer Union Jack,6.19,12,12518,Germany +581494,12/9/2019,22326,Round Snack Boxes Set Of4 Woodland,6.19,6,12518,Germany +581494,12/9/2019,10125,Mini Funky Design Tapes,6.19,20,12518,Germany +581494,12/9/2019,23367,Set 12 Colour Pencils Spaceboy,6.19,24,12518,Germany +581494,12/9/2019,22551,Plasters In Tin Spaceboy,6.04,12,12518,Germany +581494,12/9/2019,22554,Plasters In Tin Woodland Animals,6.04,12,12518,Germany +581494,12/9/2019,22549,Picture Dominoes,6.19,12,12518,Germany +581494,12/9/2019,23388,Woodland Mini Backpack,6.19,4,12518,Germany +581494,12/9/2019,23390,Dolly Girl Mini Backpack,6.19,4,12518,Germany +581494,12/9/2019,23389,Spaceboy Mini Backpack,6.19,4,12518,Germany +581495,12/9/2019,23535,Wall Art Bicycle Safety,6.19,12,14051,United Kingdom +581495,12/9/2019,22699,Roses Regency Teacup And Saucer,6.19,12,14051,United Kingdom +581495,12/9/2019,22698,Pink Regency Teacup And Saucer,6.19,12,14051,United Kingdom +581495,12/9/2019,22697,Green Regency Teacup And Saucer,6.19,12,14051,United Kingdom +581495,12/9/2019,22633,Hand Warmer Union Jack,6.04,18,14051,United Kingdom +581495,12/9/2019,15056N,Edwardian Parasol Natural,6.19,36,14051,United Kingdom +581495,12/9/2019,23439,Hand Warmer Red Love Heart,6.19,36,14051,United Kingdom +581495,12/9/2019,48138,Doormat Union Flag,6.19,10,14051,United Kingdom +581495,12/9/2019,21523,Doormat Fancy Font Home Sweet Home,6.19,10,14051,United King +581495,12/9/2019,21877,Home Sweet Home Mug,6.19,12,14051,United Kingdom +581495,12/9/2019,21871,Save The Planet Mug,6.19,18,14051,United Kingdom +581495,12/9/2019,22798,Antique Glass Dressing Table Pot,6.19,36,14051,United Kingdo +581495,12/9/2019,23173,Regency Teapot Roses,6.19,6,14051,United Kingdom +581495,12/9/2019,22423,Regency Cakestand 3 Tier,6.19,10,14051,United Kingdom +581496,12/9/2019,22664,Toy Tidy Dolly Girl Design,6.19,20,16558,United Kingdom +581496,12/9/2019,22721,Set Of 3 Cake Tins Sketchbook,6.19,12,16558,United Kingdom +581496,12/9/2019,72800E,4 Ivory Dinner Candles Silver Flock,6.19,12,16558,United Ki +581496,12/9/2019,23313,Vintage Christmas Bunting,6.19,10,16558,United Kingdom +581496,12/9/2019,22952,60 Cake Cases Vintage Christmas,6.19,24,16558,United Kingdom +581496,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,6.04,12,16558,United Kin +581496,12/9/2019,23298,Spotty Bunting,6.19,3,16558,United Kingdom +581496,12/9/2019,23598,Paper Bunting Vintage Party,6.19,6,16558,United Kingdom +581496,12/9/2019,16169E,Wrap 50'S Christmas,6.19,25,16558,United Kingdom +581496,12/9/2019,23351,Roll Wrap 50'S Christmas,6.19,12,16558,United Kingdom +581496,12/9/2019,23350,Roll Wrap Vintage Spot,6.19,24,16558,United Kingdom +581496,12/9/2019,22865,Hand Warmer Owl Design,6.19,24,16558,United Kingdom +581496,12/9/2019,22632,Hand Warmer Red Retrospot,6.19,12,16558,United Kingdom +581496,12/9/2019,22835,Hot Water Bottle I Am So Poorly,6.19,4,16558,United Kingdom +581496,12/9/2019,22112,Chocolate Hot Water Bottle,6.19,6,16558,United Kingdom +581496,12/9/2019,23355,Hot Water Bottle Keep Calm,6.19,4,16558,United Kingdom +581496,12/9/2019,22314,Office Mug Warmer Choc+Blue,6.19,24,16558,United Kingdom +581496,12/9/2019,22313,Office Mug Warmer Pink,6.19,12,16558,United Kingdom +581496,12/9/2019,23084,Rabbit Night Light,6.19,18,16558,United Kingdom +581496,12/9/2019,20831,Gold Photo Frame,6.19,12,16558,United Kingdom +581496,12/9/2019,21115,Rose Caravan Doorstop,6.19,8,16558,United Kingdom +581496,12/9/2019,21462,Nursery A B C Painted Letters,7.24,8,16558,United Kingdom +581496,12/9/2019,22076,6 Ribbons Empire,7.24,24,16558,United Kingdom +581496,12/9/2019,22190,Local Cafe Mug,7.24,24,16558,United Kingdom +581496,12/9/2019,22215,Cake Stand White Two Tier Lace,7.24,6,16558,United Kingdom +581496,12/9/2019,22220,Cake Stand Lovebird 2 Tier White,7.24,6,16558,United Kingdom +581496,12/9/2019,22464,Hanging Metal Heart Lantern,7.24,12,16558,United Kingdom +581496,12/9/2019,22465,Hanging Metal Star Lantern,7.24,12,16558,United Kingdom +581496,12/9/2019,22539,Mini Jigsaw Dolly Girl,7.24,48,16558,United Kingdom +581496,12/9/2019,22544,Mini Jigsaw Spaceboy,7.24,48,16558,United Kingdom +581496,12/9/2019,23438,Red Spot Gift Bag Large,6.19,12,16558,United Kingdom +581496,12/9/2019,23437,50'S Christmas Gift Bag Large,6.19,12,16558,United Kingdom +581497,12/9/2019,20719,Woodland Charlotte Bag,6.19,33,17497,United Kingdom +581497,12/9/2019,20723,Strawberry Charlotte Bag,6.19,42,17497,United Kingdom +581497,12/9/2019,20724,Red Retrospot Charlotte Bag,6.19,55,17497,United Kingdom +581497,12/9/2019,21212,Pack Of 72 Retrospot Cake Cases,7.24,7,17497,United Kingdom +581497,12/9/2019,21238,Red Retrospot Cup,7.24,8,17497,United Kingdom +581497,12/9/2019,21242,Red Retrospot Plate,7.24,2,17497,United Kingdom +581497,12/9/2019,21479,White Skull Hot Water Bottle,7.24,25,17497,United Kingdom +581497,12/9/2019,21481,Fawn Blue Hot Water Bottle,7.24,1,17497,United Kingdom +581497,12/9/2019,21481,Fawn Blue Hot Water Bottle,7.24,1,17497,United Kingdom +581497,12/9/2019,21484,Chick Grey Hot Water Bottle,7.24,1,17497,United Kingdom +581497,12/9/2019,21668,Red Stripe Ceramic Drawer Knob,7.24,1,17497,United Kingdom +581497,12/9/2019,21670,Blue Spot Ceramic Drawer Knob,7.24,1,17497,United Kingdom +581497,12/9/2019,21671,Red Spot Ceramic Drawer Knob,7.24,1,17497,United Kingdom +581497,12/9/2019,21672,White Spot Red Ceramic Drawer Knob,7.24,6,17497,United Kingd +581497,12/9/2019,21673,White Spot Blue Ceramic Drawer Knob,7.24,1,17497,United King +581497,12/9/2019,21714,Citronella Candle Garden Pot,7.24,2,17497,United Kingdom +581497,12/9/2019,22110,Bird House Hot Water Bottle,7.24,7,17497,United Kingdom +581497,12/9/2019,22111,Scottie Dog Hot Water Bottle,7.24,5,17497,United Kingdom +581497,12/9/2019,22112,Chocolate Hot Water Bottle,7.24,13,17497,United Kingdom +581497,12/9/2019,22114,Hot Water Bottle Tea And Sympathy,7.24,48,17497,United Kingd +581497,12/9/2019,22197,Popcorn Holder,7.24,68,17497,United Kingdom +581497,12/9/2019,22355,Charlotte Bag Suki Design,7.24,110,17497,United Kingdom +581497,12/9/2019,22356,Charlotte Bag Pink Polkadot,7.24,25,17497,United Kingdom +581497,12/9/2019,22356,Charlotte Bag Pink Polkadot,7.24,1,17497,United Kingdom +581497,12/9/2019,22423,Regency Cakestand 3 Tier,7.24,8,17497,United Kingdom +581497,12/9/2019,22725,Alarm Clock Bakelike Chocolate,7.24,3,17497,United Kingdom +581497,12/9/2019,22726,Alarm Clock Bakelike Green,7.24,1,17497,United Kingdom +581497,12/9/2019,22727,Alarm Clock Bakelike Red,7.24,10,17497,United Kingdom +581497,12/9/2019,22730,Alarm Clock Bakelike Ivory,7.24,5,17497,United Kingdom +581497,12/9/2019,22735,Ribbon Reel Socks And Mittens,7.24,2,17497,United Kingdom +581497,12/9/2019,22736,Ribbon Reel Making Snowmen,7.24,3,17497,United Kingdom +581497,12/9/2019,22738,Ribbon Reel Snowy Village,7.24,1,17497,United Kingdom +581497,12/9/2019,22805,Blue Drawer Knob Acrylic Edwardian,7.24,1,17497,United Kingd +581497,12/9/2019,22835,Hot Water Bottle I Am So Poorly,7.24,4,17497,United Kingdom +581497,12/9/2019,22895,Set Of 2 Tea Towels Apple And Pears,7.24,1,17497,United King +581497,12/9/2019,22896,Peg Bag Apples Design,7.24,2,17497,United Kingdom +581497,12/9/2019,22898,Childrens Apron Apples Design,7.24,2,17497,United Kingdom +581497,12/9/2019,22943,Christmas Lights 10 Vintage Baubles,7.24,1,17497,United King +581497,12/9/2019,23084,Rabbit Night Light,6.19,37,17497,United Kingdom +581497,12/9/2019,23168,Classic Cafe Sugar Dispenser,6.19,1,17497,United Kingdom +581497,12/9/2019,23204,Charlotte Bag Apples Design,6.04,13,17497,United Kingdom +581497,12/9/2019,23205,Charlotte Bag Vintage Alphabet,6.04,8,17497,United Kingdom +581497,12/9/2019,23301,Gardeners Kneeling Pad Keep Calm,6.19,1,17497,United Kingdom +581497,12/9/2019,23355,Hot Water Bottle Keep Calm,6.19,36,17497,United Kingdom +581497,12/9/2019,23356,Love Hot Water Bottle,6.19,1,17497,United Kingdom +581497,12/9/2019,23357,Hot Water Bottle Sex Bomb,6.19,2,17497,United Kingdom +581497,12/9/2019,23358,Hot Stuff Hot Water Bottle,6.19,2,17497,United Kingdom +581497,12/9/2019,35970,Zinc Folkart Sleigh Bells,6.19,2,17497,United Kingdom +581497,12/9/2019,47566,Party Bunting,6.19,5,17497,United Kingdom +581497,12/9/2019,82583,Hot Baths Metal Sign,6.19,4,17497,United Kingdom +581497,12/9/2019,84029G,Knitted Union Flag Hot Water Bottle,6.19,11,17497,United Ki +581497,12/9/2019,84997C,Childrens Cutlery Polkadot Blue,6.19,3,17497,United Kingdom +581497,12/9/2019,85049G,Chocolate Box Ribbons,6.19,2,17497,United Kingdom +581497,12/9/2019,20727,Lunch Bag Black Skull,6.19,8,17497,United Kingdom +581497,12/9/2019,22383,Lunch Bag Suki Design,7.24,2,17497,United Kingdom +581497,12/9/2019,23206,Lunch Bag Apple Design,6.04,3,17497,United Kingdom +581497,12/9/2019,23206,Lunch Bag Apple Design,6.04,1,17497,United Kingdom +581497,12/9/2019,23207,Lunch Bag Alphabet Design,6.19,1,17497,United Kingdom +581497,12/9/2019,23208,Lunch Bag Vintage Leaf Design,6.19,3,17497,United Kingdom +581498,12/9/2019,20669,Red Heart Luggage Tag,6.19,3,14498,United Kingdom +581498,12/9/2019,20679,Edwardian Parasol Red,6.19,5,14498,United Kingdom +581498,12/9/2019,20717,Strawberry Shopper Bag,6.19,1,14498,United Kingdom +581498,12/9/2019,20718,Red Retrospot Shopper Bag,6.19,1,14498,United Kingdom +581498,12/9/2019,20750,Red Retrospot Mini Cases,6.19,1,14498,United Kingdom +581498,12/9/2019,20961,Strawberry Bath Sponge,6.19,1,14498,United Kingdom +581498,12/9/2019,20963,Apple Bath Sponge,6.19,1,14498,United Kingdom +581498,12/9/2019,21115,Rose Caravan Doorstop,6.19,1,14498,United Kingdom +581498,12/9/2019,21125,Set 6 Football Celebration Candles,6.19,3,14498,United Kingd +581498,12/9/2019,21137,Black Record Cover Frame,6.19,4,14498,United Kingdom +581498,12/9/2019,21155,Red Retrospot Peg Bag,6.19,4,14498,United Kingdom +581498,12/9/2019,21166,Cook With Wine Metal Sign,6.19,3,14498,United Kingdom +581498,12/9/2019,21169,You're Confusing Me Metal Sign,6.19,2,14498,United Kingdom +581498,12/9/2019,21174,Pottering In The Shed Metal Sign,6.19,2,14498,United Kingdom +581498,12/9/2019,21181,Please One Person Metal Sign,6.19,6,14498,United Kingdom +581498,12/9/2019,21216,Set 3 Retrospot Tea/Coffee/Sugar,6.19,2,14498,United Kingdom +581498,12/9/2019,21217,Red Retrospot Round Cake Tins,6.19,3,14498,United Kingdom +581498,12/9/2019,21218,Red Spotty Biscuit Tin,6.19,4,14498,United Kingdom +581498,12/9/2019,21232,Strawberry Ceramic Trinket Pot,6.19,13,14498,United Kingdom +581498,12/9/2019,21239,Pink Polkadot Cup,6.19,1,14498,United Kingdom +581498,12/9/2019,21257,Victorian Sewing Box Medium,6.19,3,14498,United Kingdom +581498,12/9/2019,21327,Skulls Writing Set,6.19,1,14498,United Kingdom +581498,12/9/2019,21328,Balloons Writing Set,6.19,1,14498,United Kingdom +581498,12/9/2019,21329,Dinosaurs Writing Set,6.19,1,14498,United Kingdom +581498,12/9/2019,21411,Gingham Heart Doorstop Red,6.19,1,14498,United Kingdom +581498,12/9/2019,21430,Set/3 Red Gingham Rose Storage Box,6.19,3,14498,United Kingd +581498,12/9/2019,21494,Rotating Leaves T-Light Holder,6.19,7,14498,United Kingdom +581498,12/9/2019,21523,Doormat Fancy Font Home Sweet Home,6.19,1,14498,United Kingd +581498,12/9/2019,21557,Set Of 6 Funky Beakers,6.19,1,14498,United Kingdom +581498,12/9/2019,21558,Skull Lunch Box With Cutlery,6.19,1,14498,United Kingdom +581498,12/9/2019,21731,Red Toadstool Led Night Light,6.19,9,14498,United Kingdom +581498,12/9/2019,21754,Home Building Block Word,6.19,2,14498,United Kingdom +581498,12/9/2019,21790,Vintage Snap Cards,6.19,1,14498,United Kingdom +581498,12/9/2019,21843,Red Retrospot Cake Stand,6.19,5,14498,United Kingdom +581498,12/9/2019,21864,Union Jack Flag Passport Cover,6.19,2,14498,United Kingdom +581498,12/9/2019,21874,Gin And Tonic Mug,6.19,2,14498,United Kingdom +581498,12/9/2019,21876,Pottering Mug,6.19,4,14498,United Kingdom +581498,12/9/2019,21890,S/6 Wooden Skittles In Cotton Bag,6.19,1,14498,United Kingdo +581498,12/9/2019,21912,Vintage Snakes & Ladders,6.19,1,14498,United Kingdom +581498,12/9/2019,21916,Set 12 Retro White Chalk Sticks,6.19,7,14498,United Kingdom +581498,12/9/2019,21930,Jumbo Storage Bag Skulls,6.19,2,14498,United Kingdom +581498,12/9/2019,21931,Jumbo Storage Bag Suki,6.19,6,14498,United Kingdom +581498,12/9/2019,21934,Skull Shoulder Bag,6.19,1,14498,United Kingdom +581498,12/9/2019,21935,Suki Shoulder Bag,6.19,7,14498,United Kingdom +581498,12/9/2019,21942,Skulls Design Flannel,6.19,1,14498,United Kingdom +581498,12/9/2019,21955,Doormat Union Jack Guns And Roses,6.19,1,14498,United Kingdo +581498,12/9/2019,21977,Pack Of 60 Pink Paisley Cake Cases,6.19,1,14498,United Kingd +581498,12/9/2019,21983,Pack Of 12 Blue Paisley Tissues,6.19,1,14498,United Kingdom +581498,12/9/2019,21987,Pack Of 6 Skull Paper Cups,6.19,2,14498,United Kingdom +581498,12/9/2019,21989,Pack Of 20 Skull Paper Napkins,6.19,1,14498,United Kingdom +581498,12/9/2019,22041,"Record Frame 7"" Single Size",6.19,2,14498,United Kingdom +581498,12/9/2019,22059,Ceramic Strawberry Design Mug,6.19,1,14498,United Kingdom +581498,12/9/2019,22069,Brown Pirate Treasure Chest,6.19,3,14498,United Kingdom +581498,12/9/2019,22077,6 Ribbons Rustic Charm,6.19,2,14498,United Kingdom +581498,12/9/2019,22083,Paper Chain Kit Retrospot,6.19,2,14498,United Kingdom +581498,12/9/2019,22086,Paper Chain Kit 50'S Christmas,6.19,52,14498,United Kingdom +581498,12/9/2019,22099,Caravan Square Tissue Box,6.19,2,14498,United Kingdom +581498,12/9/2019,22114,Hot Water Bottle Tea And Sympathy,6.19,4,14498,United Kingdo +581498,12/9/2019,22139,Retrospot Tea Set Ceramic 11 Pc,6.19,2,14498,United Kingdom +581498,12/9/2019,22141,Christmas Craft Tree Top Angel,6.19,7,14498,United Kingdom +581498,12/9/2019,22142,Christmas Craft White Fairy,6.19,2,14498,United Kingdom +581498,12/9/2019,22144,Christmas Craft Little Friends,6.19,8,14498,United Kingdom +581498,12/9/2019,22161,Heart Decoration Rustic Hanging,6.19,2,14498,United Kingdom +581498,12/9/2019,22173,Metal 4 Hook Hanger French Chateau,6.19,3,14498,United Kingd +581498,12/9/2019,22174,Photo Cube,6.19,3,14498,United Kingdom +581498,12/9/2019,22175,Pink Owl Soft Toy,6.19,1,14498,United Kingdom +581498,12/9/2019,22178,Victorian Glass Hanging T-Light,6.19,1,14498,United Kingdom +581498,12/9/2019,22179,Set 10 Night Owl Lights,6.19,1,14498,United Kingdom +581498,12/9/2019,22186,Red Star Card Holder,6.19,1,14498,United Kingdom +581498,12/9/2019,22187,Green Christmas Tree Card Holder,6.19,6,14498,United Kingdom +581498,12/9/2019,22193,Red Diner Wall Clock,6.19,1,14498,United Kingdom +581498,12/9/2019,22195,Large Heart Measuring Spoons,6.19,3,14498,United Kingdom +581498,12/9/2019,22196,Small Heart Measuring Spoons,6.19,2,14498,United Kingdom +581498,12/9/2019,22207,Frying Pan Union Flag,6.19,1,14498,United Kingdom +581498,12/9/2019,22278,Overnight Bag Vintage Rose Paisley,6.19,2,14498,United Kingd +581498,12/9/2019,22301,Coffee Mug Cat + Bird Design,6.19,2,14498,United Kingdom +581498,12/9/2019,22302,Coffee Mug Pears Design,6.19,4,14498,United Kingdom +581498,12/9/2019,22303,Coffee Mug Apples Design,6.19,4,14498,United Kingdom +581498,12/9/2019,22304,Coffee Mug Blue Paisley Design,6.19,1,14498,United Kingdom +581498,12/9/2019,22308,Tea Cosy Blue Stripe,6.19,2,14498,United Kingdom +581498,12/9/2019,22327,Round Snack Boxes Set Of 4 Skulls,6.19,4,14498,United Kingdo +581498,12/9/2019,22328,Round Snack Boxes Set Of 4 Fruits,6.19,4,14498,United Kingdo +581498,12/9/2019,22352,Lunch Box With Cutlery Retrospot,6.19,6,14498,United Kingdom +581498,12/9/2019,22357,Kings Choice Biscuit Tin,6.19,1,14498,United Kingdom +581498,12/9/2019,22358,Kings Choice Tea Caddy,6.19,1,14498,United Kingdom +581498,12/9/2019,22367,Childrens Apron Spaceboy Design,6.19,7,14498,United Kingdom +581498,12/9/2019,22371,Airline Bag Vintage Tokyo 78,6.19,1,14498,United Kingdom +581498,12/9/2019,22374,Airline Bag Vintage Jet Set Red,6.19,1,14498,United Kingdom +581498,12/9/2019,22378,Wall Tidy Retrospot,7.24,2,14498,United Kingdom +581498,12/9/2019,22379,Recycling Bag Retrospot,7.24,4,14498,United Kingdom +581498,12/9/2019,22381,Toy Tidy Pink Polkadot,7.24,1,14498,United Kingdom +581498,12/9/2019,22411,Jumbo Shopper Vintage Red Paisley,7.24,2,14498,United Kingdo +581498,12/9/2019,22422,Toothpaste Tube Pen,7.24,1,14498,United Kingdom +581498,12/9/2019,22424,Enamel Bread Bin Cream,7.24,1,14498,United Kingdom +581498,12/9/2019,22429,Enamel Measuring Jug Cream,7.24,1,14498,United Kingdom +581498,12/9/2019,22456,Natural Slate Chalkboard Large,7.24,4,14498,United Kingdom +581498,12/9/2019,22457,Natural Slate Heart Chalkboard,7.24,2,14498,United Kingdom +581498,12/9/2019,22471,Tv Dinner Tray Air Hostess,7.24,1,14498,United Kingdom +581498,12/9/2019,22474,Spaceboy Tv Dinner Tray,7.24,1,14498,United Kingdom +581498,12/9/2019,22488,Natural Slate Rectangle Chalkboard,7.24,2,14498,United Kingd +581498,12/9/2019,22498,Wooden Regatta Bunting,7.24,1,14498,United Kingdom +581498,12/9/2019,22507,Memo Board Retrospot Design,7.24,1,14498,United Kingdom +581498,12/9/2019,22526,Wheelbarrow For Children,7.24,1,14498,United Kingdom +581498,12/9/2019,22553,Plasters In Tin Skulls,7.24,1,14498,United Kingdom +581498,12/9/2019,22557,Plasters In Tin Vintage Paisley,7.24,1,14498,United Kingdom +581498,12/9/2019,22619,Set Of 6 Soldier Skittles,7.24,1,14498,United Kingdom +581498,12/9/2019,22622,Box Of Vintage Alphabet Blocks,7.24,1,14498,United Kingdom +581498,12/9/2019,22624,Ivory Kitchen Scales,7.24,1,14498,United Kingdom +581498,12/9/2019,22629,Spaceboy Lunch Box,7.24,2,14498,United Kingdom +581498,12/9/2019,22632,Hand Warmer Red Retrospot,7.24,1,14498,United Kingdom +581498,12/9/2019,22645,Ceramic Heart Fairy Cake Money Bank,7.24,4,14498,United King +581498,12/9/2019,22654,Deluxe Sewing Kit,6.19,2,14498,United Kingdom +581498,12/9/2019,22659,Lunch Box I Love London,6.19,1,14498,United Kingdom +581498,12/9/2019,22666,Recipe Box Pantry Yellow Design,6.19,11,14498,United Kingdom +581498,12/9/2019,22676,French Blue Metal Door Sign 1,6.04,1,14498,United Kingdom +581498,12/9/2019,22684,French Blue Metal Door Sign 9,6.04,1,14498,United Kingdom +581498,12/9/2019,22694,Wicker Star,6.04,1,14498,United Kingdom +581498,12/9/2019,22697,Green Regency Teacup And Saucer,6.04,6,14498,United Kingdom +581498,12/9/2019,22698,Pink Regency Teacup And Saucer,6.04,9,14498,United Kingdom +581498,12/9/2019,22699,Roses Regency Teacup And Saucer,6.19,6,14498,United Kingdom +581498,12/9/2019,22722,Set Of 6 Spice Tins Pantry Design,6.19,3,14498,United Kingdo +581498,12/9/2019,22733,3d Traditional Christmas Stickers,6.19,1,14498,United Kingdo +581498,12/9/2019,22734,Set Of 6 Ribbons Vintage Christmas,6.19,5,14498,United Kingd +581498,12/9/2019,22776,Sweetheart 3 Tier Cake Stand,6.19,1,14498,United Kingdom +581498,12/9/2019,22795,Sweetheart Recipe Book Stand,6.19,1,14498,United Kingdom +581498,12/9/2019,22807,Set Of 6 T-Lights Toadstools,6.19,2,14498,United Kingdom +581498,12/9/2019,22813,Pack 3 Boxes Bird Panettone,6.19,4,14498,United Kingdom +581498,12/9/2019,22838,3 Tier Cake Tin Red And Cream,6.19,1,14498,United Kingdom +581498,12/9/2019,22844,Vintage Cream Dog Food Container,6.19,2,14498,United Kingdom +581498,12/9/2019,22845,Vintage Cream Cat Food Container,6.19,1,14498,United Kingdom +581498,12/9/2019,22865,Hand Warmer Owl Design,6.19,1,14498,United Kingdom +581498,12/9/2019,22866,Hand Warmer Scotty Dog Design,6.19,2,14498,United Kingdom +581498,12/9/2019,22891,Tea For One Polkadot,6.19,1,14498,United Kingdom +581498,12/9/2019,22900,Set 2 Tea Towels I Love London,6.19,2,14498,United Kingdom +581498,12/9/2019,22910,Paper Chain Kit Vintage Christmas,6.19,5,14498,United Kingdo +581498,12/9/2019,22952,60 Cake Cases Vintage Christmas,6.19,7,14498,United Kingdom +581498,12/9/2019,22960,Jam Making Set With Jars,6.19,5,14498,United Kingdom +581498,12/9/2019,22961,Jam Making Set Printed,6.19,4,14498,United Kingdom +581498,12/9/2019,22966,Gingerbread Man Cookie Cutter,6.19,2,14498,United Kingdom +581498,12/9/2019,22993,Set Of 4 Pantry Jelly Moulds,6.19,2,14498,United Kingdom +581498,12/9/2019,23012,Glass Apothecary Bottle Perfume,6.19,1,14498,United Kingdom +581498,12/9/2019,23013,Glass Apothecary Bottle Tonic,6.19,1,14498,United Kingdom +581498,12/9/2019,23014,Glass Apothecary Bottle Elixir,7.24,2,14498,United Kingdom +581498,12/9/2019,23080,Red Metal Box Top Secret,7.24,5,14498,United Kingdom +581498,12/9/2019,23170,Regency Tea Plate Roses,7.24,4,14498,United Kingdom +581498,12/9/2019,23171,Regency Tea Plate Green,7.24,5,14498,United Kingdom +581498,12/9/2019,23172,Regency Tea Plate Pink,6.19,4,14498,United Kingdom +581498,12/9/2019,23181,Bull Dog Bottle Top Wall Clock,6.19,1,14498,United Kingdom +581498,12/9/2019,23196,Vintage Leaf Magnetic Notepad,6.19,1,14498,United Kingdom +581498,12/9/2019,23198,Pantry Magnetic Shopping List,6.19,2,14498,United Kingdom +581498,12/9/2019,23245,Set Of 3 Regency Cake Tins,6.19,5,14498,United Kingdom +581498,12/9/2019,23295,Set Of 12 Mini Loaf Baking Cases,6.19,1,14498,United Kingdom +581498,12/9/2019,23298,Spotty Bunting,6.19,1,14498,United Kingdom +581498,12/9/2019,23300,Gardeners Kneeling Pad Cup Of Tea,6.19,9,14498,United Kingdo +581498,12/9/2019,23301,Gardeners Kneeling Pad Keep Calm,6.19,32,14498,United Kingdo +581498,12/9/2019,23311,Vintage Christmas Stocking,6.19,6,14498,United Kingdom +581498,12/9/2019,23312,Vintage Christmas Gift Sack,6.19,3,14498,United Kingdom +581498,12/9/2019,23328,Set 6 School Milk Bottles In Crate,6.19,6,14498,United Kingd +581498,12/9/2019,23349,Roll Wrap Vintage Christmas,6.19,8,14498,United Kingdom +581498,12/9/2019,23351,Roll Wrap 50'S Christmas,6.19,22,14498,United Kingdom +581498,12/9/2019,23352,Roll Wrap 50'S Red Christmas,6.19,8,14498,United Kingdom +581498,12/9/2019,23353,6 Gift Tags Vintage Christmas,6.19,10,14498,United Kingdom +581498,12/9/2019,23354,6 Gift Tags 50'S Christmas,6.19,9,14498,United Kingdom +581498,12/9/2019,23368,Set 12 Colour Pencils Dolly Girl,6.19,3,14498,United Kingdom +581498,12/9/2019,23369,Set 36 Colour Pencils Love London,6.19,1,14498,United Kingdo +581498,12/9/2019,23370,Set 36 Colouring Pencils Doily,6.19,3,14498,United Kingdom +581498,12/9/2019,23382,Box Of 6 Christmas Cake Decorations,6.19,10,14498,United Kin +581498,12/9/2019,23388,Woodland Mini Backpack,6.19,1,14498,United Kingdom +581498,12/9/2019,23480,Mini Lights Woodland Mushrooms,7.24,1,14498,United Kingdom +581498,12/9/2019,23493,Vintage Doily Travel Sewing Kit,7.24,1,14498,United Kingdom +581498,12/9/2019,23494,Vintage Doily Deluxe Sewing Kit,7.24,1,14498,United Kingdom +581498,12/9/2019,23497,Classic Chrome Bicycle Bell,7.24,1,14498,United Kingdom +581498,12/9/2019,23501,Key Ring Baseball Boot Union Jack,7.24,1,14498,United Kingdo +581498,12/9/2019,23564,Egg Cup Milkmaid Ingrid,7.24,1,14498,United Kingdom +581498,12/9/2019,35970,Zinc Folkart Sleigh Bells,7.24,6,14498,United Kingdom +581498,12/9/2019,48138,Doormat Union Flag,7.24,1,14498,United Kingdom +581498,12/9/2019,71053,White Moroccan Metal Lantern,7.24,1,14498,United Kingdom +581498,12/9/2019,72349B,Set/6 Purple Butterfly T-Lights,7.24,2,14498,United Kingdom +581498,12/9/2019,79321,Chilli Lights,7.24,10,14498,United Kingdom +581498,12/9/2019,82001S,Silver Record Cover Frame,6.19,2,14498,United Kingdom +581498,12/9/2019,82482,Wooden Picture Frame White Finish,6.04,4,14498,United Kingdo +581498,12/9/2019,82552,Washroom Metal Sign,6.04,1,14498,United Kingdom +581498,12/9/2019,21171,Bathroom Metal Sign,6.19,1,14498,United Kingdom +581498,12/9/2019,82581,Toilet Metal Sign,6.19,1,14498,United Kingdom +581498,12/9/2019,82600,N0 Singing Metal Sign,6.19,4,14498,United Kingdom +581498,12/9/2019,84029E,Red Woolly Hottie White Heart,6.19,4,14498,United Kingdom +581498,12/9/2019,84032A,Charlie+Lola Pink Hot Water Bottle,6.19,4,14498,United King +581498,12/9/2019,84032B,Charlie + Lola Red Hot Water Bottle,6.19,3,14498,United Kin +581498,12/9/2019,84375,Set Of 20 Kids Cookie Cutters,6.19,3,14498,United Kingdom +581498,12/9/2019,84509A,Set Of 4 English Rose Placemats,6.19,1,14498,United Kingdom +581498,12/9/2019,84558A,3d Dog Picture Playing Cards,6.19,1,14498,United Kingdom +581498,12/9/2019,84832,Zinc Willie Winkie Candle Stick,6.19,26,14498,United Kingdom +581498,12/9/2019,84968E,Set Of 16 Vintage Black Cutlery,6.19,1,14498,United Kingdom +581498,12/9/2019,84970S,Hanging Heart Zinc T-Light Holder,6.19,1,14498,United Kingd +581498,12/9/2019,84997A,Childrens Cutlery Polkadot Green,6.19,2,14498,United Kingdo +581498,12/9/2019,84997B,Childrens Cutlery Retrospot Red,6.19,3,14498,United Kingdom +581498,12/9/2019,84997D,Childrens Cutlery Polkadot Pink,6.19,1,14498,United Kingdom +581498,12/9/2019,85038,6 Chocolate Love Heart T-Lights,6.19,1,14498,United Kingdom +581498,12/9/2019,85048,15cm Christmas Glass Ball 20 Lights,6.19,1,14498,United King +581498,12/9/2019,85049A,Traditional Christmas Ribbons,6.17,5,14498,United Kingdom +581498,12/9/2019,85049E,Scandinavian Reds Ribbons,6.19,4,14498,United Kingdom +581498,12/9/2019,85150,Ladies & Gentlemen Metal Sign,6.19,1,14498,United Kingdom +581498,12/9/2019,85174,S/4 Cacti Candles,6.19,1,14498,United Kingdom +581498,12/9/2019,20712,Jumbo Bag Woodland Animals,6.19,3,14498,United Kingdom +581498,12/9/2019,20713,Jumbo Bag Owls,6.19,8,14498,United Kingdom +581498,12/9/2019,21928,Jumbo Bag Scandinavian Blue Paisley,6.19,2,14498,United King +581498,12/9/2019,22386,Jumbo Bag Pink Polkadot,7.24,1,14498,United Kingdom +581498,12/9/2019,22663,Jumbo Bag Dolly Girl Design,6.19,2,14498,United Kingdom +581498,12/9/2019,23199,Jumbo Bag Apples,6.19,6,14498,United Kingdom +581498,12/9/2019,23201,Jumbo Bag Alphabet,6.19,6,14498,United Kingdom +581498,12/9/2019,85099B,Jumbo Bag Red Retrospot,6.19,5,14498,United Kingdom +581498,12/9/2019,85099C,Jumbo Bag Baroque Black White,6.19,4,14498,United Kingdom +581498,12/9/2019,20726,Lunch Bag Woodland,6.19,3,14498,United Kingdom +581498,12/9/2019,20728,Lunch Bag Cars Blue,6.19,4,14498,United Kingdom +581498,12/9/2019,22384,Lunch Bag Pink Polkadot,7.24,1,14498,United Kingdom +581498,12/9/2019,23437,50'S Christmas Gift Bag Large,7.24,1,14498,United Kingdom +581500,12/9/2019,82486,3 Drawer Antique White Wood Cabinet,7.24,4,15344,United King +581500,12/9/2019,85066,Cream Sweetheart Mini Chest,7.24,4,15344,United Kingdom +581500,12/9/2019,48187,Doormat New England,7.24,2,15344,United Kingdom +581501,12/9/2019,22319,Hairclips Forties Fabric Assorted,7.24,180,12985,United King +581501,12/9/2019,20704,Mr Robot Soft Toy,7.24,8,12985,United Kingdom +581501,12/9/2019,21564,Pink Heart Shape Love Bucket,6.19,24,12985,United Kingdom +581501,12/9/2019,21563,Red Heart Shape Love Bucket,7.24,24,12985,United Kingdom +581501,12/9/2019,22165,Diamante Heart Shaped Wall Mirror,7.24,12,12985,United Kingd +581501,12/9/2019,22299,Pig Keyring With Light & Sound,7.24,48,12985,United Kingdom +581501,12/9/2019,22447,Pin Cushion Babushka Blue,7.24,12,12985,United Kingdom +581501,12/9/2019,22442,Grow Your Own Flowers Set Of 3,7.24,12,12985,United Kingdom +581501,12/9/2019,22495,Set Of 2 Round Tins Camembert,7.24,12,12985,United Kingdom +581501,12/9/2019,22544,Mini Jigsaw Spaceboy,7.24,96,12985,United Kingdom +581501,12/9/2019,22695,Wicker Wreath Small,7.24,24,12985,United Kingdom +581501,12/9/2019,22785,Squarecushion Cover Pink Union Jack,7.24,12,12985,United Kin +581501,12/9/2019,22811,Set Of 6 T-Lights Cacti,7.24,12,12985,United Kingdom +581501,12/9/2019,22807,Set Of 6 T-Lights Toadstools,7.24,12,12985,United Kingdom +581501,12/9/2019,22942,Christmas Lights 10 Santas,7.24,12,12985,United Kingdom +581501,12/9/2019,22808,Set Of 6 T-Lights Easter Chicks,6.19,12,12985,United Kingdom +581501,12/9/2019,23143,Zinc Wire Kitchen Organiser,7.24,4,12985,United Kingdom +581501,12/9/2019,23151,Zinc Sweetheart Soap Dish,7.24,12,12985,United Kingdom +581501,12/9/2019,23425,Storage Tin Home Sweet Home,7.24,12,12985,United Kingdom +581501,12/9/2019,84356,Pompom Curtain,7.24,12,12985,United Kingdom +581501,12/9/2019,85173,Set/6 Frog Prince T-Light Candles,7.24,12,12985,United Kingd +581501,12/9/2019,21731,Red Toadstool Led Night Light,7.24,24,12985,United Kingdom +581501,12/9/2019,23480,Mini Lights Woodland Mushrooms,7.24,8,12985,United Kingdom +581501,12/9/2019,22545,Mini Jigsaw Bunnies,7.24,96,12985,United Kingdom +581502,12/9/2019,22087,Paper Bunting White Lace,7.24,6,15910,United Kingdom +581502,12/9/2019,21209,Multicolour Honeycomb Fan,7.24,5,15910,United Kingdom +581502,12/9/2019,20668,Disco Ball Christmas Decoration,7.24,24,15910,United Kingdom +581502,12/9/2019,21790,Vintage Snap Cards,7.24,6,15910,United Kingdom +581502,12/9/2019,23270,Set Of 2 Ceramic Painted Hearts,7.24,4,15910,United Kingdom +581502,12/9/2019,23103,Jingle Bell Heart Decoration,7.24,8,15910,United Kingdom +581502,12/9/2019,22576,Swallow Wooden Christmas Decoration,7.24,2,15910,United King +581502,12/9/2019,22153,Angel Decoration Stars On Dress,7.24,13,15910,United Kingdom +581502,12/9/2019,21810,Christmas Hanging Star With Bell,7.24,6,15910,United Kingdom +581502,12/9/2019,22155,Star Decoration Rustic,7.24,6,15910,United Kingdom +581502,12/9/2019,23210,White Rocking Horse Hand Painted,7.24,12,15910,United Kingdo +581502,12/9/2019,22573,Star Wooden Christmas Decoration,7.24,8,15910,United Kingdom +581502,12/9/2019,22075,6 Ribbons Elegant Christmas,7.24,4,15910,United Kingdom +581502,12/9/2019,85049A,Traditional Christmas Ribbons,7.24,4,15910,United Kingdom +581502,12/9/2019,22734,Set Of 6 Ribbons Vintage Christmas,7.24,4,15910,United Kingd +581502,12/9/2019,23274,Star T-Light Holder Willie Winkie,7.24,8,15910,United Kingdo +581502,12/9/2019,22153,Angel Decoration Stars On Dress,7.24,1,15910,United Kingdom +581502,12/9/2019,22596,Christmas Star Wish List Chalkboard,7.24,24,15910,United Kin +581502,12/9/2019,22952,60 Cake Cases Vintage Christmas,7.24,10,15910,United Kingdom +581502,12/9/2019,22141,Christmas Craft Tree Top Angel,7.24,3,15910,United Kingdom +581514,12/9/2019,22753,Small Yellow Babushka Notebook,7.24,12,17754,United Kingdom +581514,12/9/2019,22755,Small Purple Babushka Notebook,7.24,12,17754,United Kingdom +581514,12/9/2019,22754,Small Red Babushka Notebook,6.19,12,17754,United Kingdom +581514,12/9/2019,22721,Set Of 3 Cake Tins Sketchbook,6.19,4,17754,United Kingdom +581514,12/9/2019,22059,Ceramic Strawberry Design Mug,6.19,12,17754,United Kingdom +581514,12/9/2019,22199,Frying Pan Red Retrospot,6.19,13,17754,United Kingdom +581514,12/9/2019,22200,Frying Pan Pink Polkadot,6.19,2,17754,United Kingdom +581514,12/9/2019,84032A,Charlie+Lola Pink Hot Water Bottle,6.19,9,17754,United King +581514,12/9/2019,84032B,Charlie + Lola Red Hot Water Bottle,6.19,9,17754,United Kin +581514,12/9/2019,84031A,Charlie+Lola Red Hot Water Bottle,6.19,10,17754,United King +581514,12/9/2019,84031B,Charlie Lola Blue Hot Water Bottle,6.19,14,17754,United Kin +581514,12/9/2019,22646,Ceramic Strawberry Cake Money Bank,6.19,4,17754,United Kingd +581514,12/9/2019,22644,Ceramic Cherry Cake Money Bank,6.19,4,17754,United Kingdom +581514,12/9/2019,22645,Ceramic Heart Fairy Cake Money Bank,6.19,4,17754,United King +581514,12/9/2019,22394,Paperweight Kings Choice,6.04,12,17754,United Kingdom +581514,12/9/2019,17091J,Vanilla Incense In Tin,6.04,66,17754,United Kingdom +581514,12/9/2019,35471D,Set Of 3 Bird Light Pink Feather,6.04,12,17754,United Kingd +581514,12/9/2019,22075,6 Ribbons Elegant Christmas,6.04,24,17754,United Kingdom +581514,12/9/2019,17091J,Vanilla Incense In Tin,6.19,24,17754,United Kingdom +581514,12/9/2019,22069,Brown Pirate Treasure Chest,6.19,20,17754,United Kingdom +581514,12/9/2019,22068,Black Pirate Treasure Chest,6.19,14,17754,United Kingdom +581514,12/9/2019,22500,Set Of 2 Tins Jardin De Provence,6.19,4,17754,United Kingdom +581514,12/9/2019,22075,6 Ribbons Elegant Christmas,6.19,24,17754,United Kingdom +581514,12/9/2019,21705,Bag 500g Swirly Marbles,6.19,84,17754,United Kingdom +581516,12/9/2019,21109,Large Cake Towel Chocolate Spots,6.19,12,14422,United Kingdo +581516,12/9/2019,21111,Swiss Roll Towel Chocolate Spots,6.19,24,14422,United Kingdo +581516,12/9/2019,21705,Bag 500g Swirly Marbles,6.19,24,14422,United Kingdom +581516,12/9/2019,22185,Slate Tile Natural Hanging,6.19,12,14422,United Kingdom +581516,12/9/2019,22442,Grow Your Own Flowers Set Of 3,6.19,12,14422,United Kingdom +581516,12/9/2019,21620,Set Of 4 Rose Botanical Candles,6.19,12,14422,United Kingdom +581516,12/9/2019,84029G,Knitted Union Flag Hot Water Bottle,6.19,8,14422,United Kin +581516,12/9/2019,21485,Retrospot Heart Hot Water Bottle,6.19,3,14422,United Kingdom +581516,12/9/2019,22111,Scottie Dog Hot Water Bottle,6.19,6,14422,United Kingdom +581516,12/9/2019,23355,Hot Water Bottle Keep Calm,6.19,8,14422,United Kingdom +581516,12/9/2019,22112,Chocolate Hot Water Bottle,6.19,6,14422,United Kingdom +581516,12/9/2019,23356,Love Hot Water Bottle,6.19,6,14422,United Kingdom +581516,12/9/2019,21108,Fairy Cake Flannel Assorted Colour,6.19,18,14422,United King +581516,12/9/2019,22171,3 Hook Photo Shelf Antique White,6.19,4,14422,United Kingdom +581516,12/9/2019,23301,Gardeners Kneeling Pad Keep Calm,6.19,24,14422,United Kingdo +581538,12/9/2019,23193,Buffalo Bill Treasure Book Box,6.19,6,14446,United Kingdom +581538,12/9/2019,23194,Gymkhana Treasure Book Box,6.19,1,14446,United Kingdom +581538,12/9/2019,23084,Rabbit Night Light,6.19,2,14446,United Kingdom +581538,12/9/2019,22068,Black Pirate Treasure Chest,6.19,1,14446,United Kingdom +581538,12/9/2019,22956,36 Foil Heart Cake Cases,6.19,1,14446,United Kingdom +581538,12/9/2019,20936,Forked Cactus Candle,6.19,1,14446,United Kingdom +581538,12/9/2019,23040,Paper Lantern 9 Point Snow Star,6.19,1,14446,United Kingdom +581538,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,6.19,1,14446,United King +581538,12/9/2019,21222,Set/4 Badges Beetles,6.19,1,14446,United Kingdom +581538,12/9/2019,21220,Set/4 Badges Dogs,6.19,1,14446,United Kingdom +581538,12/9/2019,21224,Set/4 Skull Badges,6.19,1,14446,United Kingdom +581538,12/9/2019,85123A,Cream Hanging Heart T-Light Holder,6.19,1,14446,United King +581538,12/9/2019,22992,Revolver Wooden Ruler,6.19,1,14446,United Kingdom +581538,12/9/2019,79066K,Retro Mod Tray,6.19,1,14446,United Kingdom +581538,12/9/2019,84380,Set Of 3 Butterfly Cookie Cutters,6.19,1,14446,United Kingdo +581538,12/9/2019,23371,Set 36 Colour Pencils Spaceboy,6.19,1,14446,United Kingdom +581538,12/9/2019,22694,Wicker Star,6.19,1,14446,United Kingdom +581538,12/9/2019,22095,Lads Only Tissue Box,6.19,1,14446,United Kingdom +581538,12/9/2019,23275,Set Of 3 Hanging Owls Ollie Beak,6.19,1,14446,United Kingdom +581538,12/9/2019,21673,White Spot Blue Ceramic Drawer Knob,6.19,1,14446,United King +581538,12/9/2019,21670,Blue Spot Ceramic Drawer Knob,6.19,1,14446,United Kingdom +581538,12/9/2019,85071C,"Charlie+Lola""Extremely Busy"" Sign",6.19,1,14446,United K +581538,12/9/2019,23349,Roll Wrap Vintage Christmas,6.19,3,14446,United Kingdom +581538,12/9/2019,23034,Drawer Knob Ceramic Black,6.19,1,14446,United Kingdom +581538,12/9/2019,21669,Blue Stripe Ceramic Drawer Knob,6.19,1,14446,United Kingdom +581538,12/9/2019,23033,Drawer Knob Ceramic Red,6.19,1,14446,United Kingdom +581538,12/9/2019,21668,Red Stripe Ceramic Drawer Knob,6.19,1,14446,United Kingdom +581538,12/9/2019,23275,Set Of 3 Hanging Owls Ollie Beak,6.19,1,14446,United Kingdom +581538,12/9/2019,23318,Box Of 6 Mini Vintage Crackers,6.19,1,14446,United Kingdom +581538,12/9/2019,23382,Box Of 6 Christmas Cake Decorations,6.19,1,14446,United King +581538,12/9/2019,22469,Heart Of Wicker Small,6.19,1,14446,United Kingdom +581538,12/9/2019,22899,Children's Apron Dolly Girl,6.19,2,14446,United Kingdom +581538,12/9/2019,22367,Childrens Apron Spaceboy Design,6.19,1,14446,United Kingdom +581538,12/9/2019,22899,Children's Apron Dolly Girl,6.19,3,14446,United Kingdom +581538,12/9/2019,23527,Wall Art Animals And Nature,6.19,1,14446,United Kingdom +581538,12/9/2019,23524,Wall Art Horse & Pony,6.19,1,14446,United Kingdom +581538,12/9/2019,23525,Wall Art Buffalo Bill,6.19,1,14446,United Kingdom +581538,12/9/2019,84380,Set Of 3 Butterfly Cookie Cutters,6.19,4,14446,United Kingdo +581538,12/9/2019,23122,Party Charms 50 Pieces,7.24,1,14446,United Kingdom +581538,12/9/2019,21990,Modern Floral Stationery Set,7.24,1,14446,United Kingdom +581538,12/9/2019,21329,Dinosaurs Writing Set,7.24,1,14446,United Kingdom +581538,12/9/2019,21328,Balloons Writing Set,7.24,1,14446,United Kingdom +581538,12/9/2019,22561,Wooden School Colouring Set,7.24,1,14446,United Kingdom +581538,12/9/2019,84519A,Tomato Charlie+Lola Coaster Set,7.24,1,14446,United Kingdom +581538,12/9/2019,84519B,Carrot Charlie+Lola Coaster Set,7.24,1,14446,United Kingdom +581538,12/9/2019,35004B,Set Of 3 Black Flying Ducks,7.24,2,14446,United Kingdom +581538,12/9/2019,22068,Black Pirate Treasure Chest,7.24,1,14446,United Kingdom +581538,12/9/2019,23353,6 Gift Tags Vintage Christmas,6.19,1,14446,United Kingdom +581538,12/9/2019,21591,Cosy Hour Cigar Box Matches,6.19,1,14446,United Kingdom +581538,12/9/2019,22197,Popcorn Holder,6.19,4,14446,United Kingdom +581538,12/9/2019,23320,Giant 50'S Christmas Cracker,6.19,1,14446,United Kingdom +581538,12/9/2019,23349,Roll Wrap Vintage Christmas,6.19,1,14446,United Kingdom +581538,12/9/2019,22985,Wrap Billboard Fonts Design,6.19,25,14446,United Kingdom +581538,12/9/2019,23040,Paper Lantern 9 Point Snow Star,6.19,2,14446,United Kingdom +581538,12/9/2019,23040,Paper Lantern 9 Point Snow Star,6.19,3,14446,United Kingdom +581538,12/9/2019,21194,Pink Honeycomb Paper Fan,6.19,2,14446,United Kingdom +581538,12/9/2019,21208,Pastel Colour Honeycomb Fan,6.19,1,14446,United Kingdom +581538,12/9/2019,79190D,Retro Plastic Daisy Tray,6.19,1,14446,United Kingdom +581538,12/9/2019,79190B,Retro Plastic Polka Tray,6.19,1,14446,United Kingdom +581538,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,6.02,2,14446,United King +581538,12/9/2019,23318,Box Of 6 Mini Vintage Crackers,6.02,1,14446,United Kingdom +581538,12/9/2019,23319,Box Of 6 Mini 50'S Crackers,6.02,1,14446,United Kingdom +581538,12/9/2019,23537,Wall Art I Love London,6.19,1,14446,United Kingdom +581538,12/9/2019,22992,Revolver Wooden Ruler,6.19,1,14446,United Kingdom +581538,12/9/2019,22991,Giraffe Wooden Ruler,6.19,1,14446,United Kingdom +581538,12/9/2019,23190,Bundle Of 3 School Exercise Books,6.19,1,14446,United Kingdo +581538,12/9/2019,21194,Pink Honeycomb Paper Fan,6.19,1,14446,United Kingdom +581538,12/9/2019,35004B,Set Of 3 Black Flying Ducks,6.19,1,14446,United Kingdom +581538,12/9/2019,22694,Wicker Star,6.19,1,14446,United Kingdom +581538,12/9/2019,21355,Toast Its - I Love You,6.19,1,14446,United Kingdom +581538,12/9/2019,23343,Jumbo Bag Vintage Christmas,6.19,1,14446,United Kingdom +581538,12/9/2019,23343,Jumbo Bag Vintage Christmas,6.19,1,14446,United Kingdom +581538,12/9/2019,20727,Lunch Bag Black Skull,6.19,1,14446,United Kingdom +581538,12/9/2019,20725,Lunch Bag Red Retrospot,6.19,1,14446,United Kingdom +581566,12/9/2019,23404,Home Sweet Home Blackboard,6.19,144,18102,United Kingdom +581567,12/9/2019,21417,Cockle Shell Dish,6.19,84,16626,United Kingdom +581567,12/9/2019,22464,Hanging Metal Heart Lantern,6.19,24,16626,United Kingdom +581567,12/9/2019,22465,Hanging Metal Star Lantern,6.19,24,16626,United Kingdom +581567,12/9/2019,84971S,Small Heart Flowers Hook,6.19,48,16626,United Kingdom +581567,12/9/2019,22624,Ivory Kitchen Scales,6.19,2,16626,United Kingdom +581567,12/9/2019,22627,Mint Kitchen Scales,6.19,2,16626,United Kingdom +581567,12/9/2019,22625,Red Kitchen Scales,6.19,2,16626,United Kingdom +581567,12/9/2019,23355,Hot Water Bottle Keep Calm,6.19,4,16626,United Kingdom +581567,12/9/2019,21326,Aged Glass Silver T-Light Holder,6.19,144,16626,United Kingd +581567,12/9/2019,21479,White Skull Hot Water Bottle,6.19,4,16626,United Kingdom +581567,12/9/2019,23356,Love Hot Water Bottle,6.19,3,16626,United Kingdom +581567,12/9/2019,21137,Black Record Cover Frame,6.19,24,16626,United Kingdom +581570,12/9/2019,22141,Christmas Craft Tree Top Angel,6.19,6,12662,Germany +581570,12/9/2019,22175,Pink Owl Soft Toy,6.19,6,12662,Germany +581570,12/9/2019,21481,Fawn Blue Hot Water Bottle,6.19,4,12662,Germany +581570,12/9/2019,23570,Traditional Pick Up Sticks Game,6.19,12,12662,Germany +581570,12/9/2019,22326,Round Snack Boxes Set Of4 Woodland,6.19,6,12662,Germany +581570,12/9/2019,22331,Woodland Party Bag + Sticker Set,6.19,8,12662,Germany +581570,12/9/2019,22834,Hand Warmer Babushka Design,6.19,12,12662,Germany +581570,12/9/2019,21914,Blue Harmonica In Box,6.19,12,12662,Germany +581570,12/9/2019,22139,Retrospot Tea Set Ceramic 11 Pc,6.19,3,12662,Germany +581570,12/9/2019,23077,Doughnut Lip Gloss,6.19,20,12662,Germany +581570,12/9/2019,20750,Red Retrospot Mini Cases,6.19,2,12662,Germany +581570,12/9/2019,22505,Memo Board Cottage Design,6.19,4,12662,Germany +581571,12/9/2019,23326,Hanging Mini Coloured Bottles,6.19,6,15311,United Kingdom +581571,12/9/2019,21313,Glass Heart T-Light Holder,6.19,1,15311,United Kingdom +581571,12/9/2019,48187,Doormat New England,6.19,1,15311,United Kingdom +581571,12/9/2019,23317,Blue Refectory Clock,6.19,1,15311,United Kingdom +581571,12/9/2019,23197,Sketchbook Magnetic Shopping List,6.19,4,15311,United Kingdo +581571,12/9/2019,21012,Antique All Glass Candlestick,6.19,2,15311,United Kingdom +581571,12/9/2019,22227,Hanging Heart Mirror Decoration,6.19,10,15311,United Kingdom +581571,12/9/2019,22794,Sweetheart Wire Magazine Rack,6.19,1,15311,United Kingdom +581571,12/9/2019,23182,Toilet Sign Occupied Or Vacant,6.19,1,15311,United Kingdom +581571,12/9/2019,21755,Love Building Block Word,6.19,1,15311,United Kingdom +581571,12/9/2019,85053,French Enamel Candleholder,6.19,2,15311,United Kingdom +581571,12/9/2019,23110,Parisienne Key Cabinet,6.19,2,15311,United Kingdom +581571,12/9/2019,21169,You're Confusing Me Metal Sign,6.19,1,15311,United Kingdom +581571,12/9/2019,21258,Victorian Sewing Box Large,6.19,8,15311,United Kingdom +581571,12/9/2019,23168,Classic Cafe Sugar Dispenser,6.19,36,15311,United Kingdom +581571,12/9/2019,23167,Small Ceramic Top Storage Jar,6.19,96,15311,United Kingdom +581571,12/9/2019,21314,Small Glass Heart Trinket Pot,6.19,48,15311,United Kingdom +581571,12/9/2019,21137,Black Record Cover Frame,6.19,24,15311,United Kingdom +581571,12/9/2019,44234,Assorted Circular Mobile,6.19,1,15311,United Kingdom +581571,12/9/2019,84347,Rotating Silver Angels T-Light Hldr,6.19,24,15311,United Kin +581572,12/9/2019,23328,Set 6 School Milk Bottles In Crate,6.19,48,16705,United King +581572,12/9/2019,22627,Mint Kitchen Scales,6.19,4,16705,United Kingdom +581572,12/9/2019,22624,Ivory Kitchen Scales,6.19,4,16705,United Kingdom +581572,12/9/2019,23245,Set Of 3 Regency Cake Tins,6.19,4,16705,United Kingdom +581574,12/9/2019,22326,Round Snack Boxes Set Of4 Woodland,6.19,6,12526,Germany +581574,12/9/2019,22328,Round Snack Boxes Set Of 4 Fruits,6.19,6,12526,Germany +581574,12/9/2019,23238,Set Of 4 Knick Knack Tins London,6.19,6,12526,Germany +581574,12/9/2019,23237,Set Of 4 Knick Knack Tins Leaf,6.19,6,12526,Germany +581574,12/9/2019,21257,Victorian Sewing Box Medium,6.19,2,12526,Germany +581574,12/9/2019,21258,Victorian Sewing Box Large,6.19,2,12526,Germany +581574,12/9/2019,23111,Parisienne Sewing Box,6.19,2,12526,Germany +581574,12/9/2019,22077,6 Ribbons Rustic Charm,6.19,12,12526,Germany +581574,12/9/2019,22074,6 Ribbons Shimmering Pinks,6.19,12,12526,Germany +581574,12/9/2019,22621,Traditional Knitting Nancy,6.19,12,12526,Germany +581574,12/9/2019,23199,Jumbo Bag Apples,6.19,10,12526,Germany +581574,12/9/2019,23581,Jumbo Bag Paisley Park,6.19,10,12526,Germany +581578,12/9/2019,21124,Set/10 Blue Polkadot Party Candles,6.19,24,12713,Germany +581578,12/9/2019,21122,Set/10 Pink Polkadot Party Candles,6.19,24,12713,Germany +581578,12/9/2019,21121,Set/10 Red Polkadot Party Candles,6.19,24,12713,Germany +581578,12/9/2019,23389,Spaceboy Mini Backpack,6.04,4,12713,Germany +581578,12/9/2019,22556,Plasters In Tin Circus Parade,6.19,12,12713,Germany +581578,12/9/2019,22976,Circus Parade Childrens Egg Cup,6.19,12,12713,Germany +581578,12/9/2019,23255,Childrens Cutlery Circus Parade,7.24,12,12713,Germany +581578,12/9/2019,84997D,Childrens Cutlery Polkadot Pink,7.24,8,12713,Germany +581578,12/9/2019,84997B,Childrens Cutlery Retrospot Red,7.24,8,12713,Germany +581578,12/9/2019,84997C,Childrens Cutlery Polkadot Blue,7.24,8,12713,Germany +581578,12/9/2019,22555,Plasters In Tin Strongman,7.24,12,12713,Germany +581578,12/9/2019,21914,Blue Harmonica In Box,7.24,12,12713,Germany +581578,12/9/2019,22549,Picture Dominoes,7.24,24,12713,Germany +581578,12/9/2019,21918,Set 12 Kids Colour Chalk Sticks,7.24,24,12713,Germany +581578,12/9/2019,22992,Revolver Wooden Ruler,7.24,12,12713,Germany +581578,12/9/2019,22991,Giraffe Wooden Ruler,7.24,12,12713,Germany +581578,12/9/2019,23229,Vintage Donkey Tail Game,7.24,6,12713,Germany +581578,12/9/2019,22622,Box Of Vintage Alphabet Blocks,6.19,6,12713,Germany +581578,12/9/2019,21506,Fancy Font Birthday Card,6.19,12,12713,Germany +581578,12/9/2019,21507,Elephant Birthday Card,6.19,12,12713,Germany +581578,12/9/2019,23037,Candle Holder Silver Madeline,6.19,12,12713,Germany +581578,12/9/2019,23550,Wrap Alphabet Poster,6.19,25,12713,Germany +581578,12/9/2019,22711,Wrap Circus Parade,6.19,25,12713,Germany +581578,12/9/2019,21497,Fancy Fonts Birthday Wrap,6.19,25,12713,Germany +581578,12/9/2019,22704,Wrap Red Apples,6.19,25,12713,Germany +581578,12/9/2019,22585,Pack Of 6 Birdy Gift Tags,6.19,12,12713,Germany diff --git a/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/java-solution/Task.java b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/java-solution/Task.java new file mode 100644 index 000000000000..e15c9167342d --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/java-solution/Task.java @@ -0,0 +1,212 @@ +/* + * 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. + */ + +// beam-playground: +// name: FinalSolution1 +// description: Final challenge solution 1. +// multifile: true +// files: +// - name: input.csv +// context_line: 50 +// categories: +// - Quickstart +// complexity: ADVANCED +// tags: +// - hellobeam + +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.coders.Coder; +import org.apache.beam.sdk.io.TextIO; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +import org.apache.beam.sdk.schemas.JavaFieldSchema; +import org.apache.beam.sdk.schemas.annotations.DefaultSchema; +import org.apache.beam.sdk.schemas.annotations.SchemaCreate; +import org.apache.beam.sdk.transforms.Combine; +import org.apache.beam.sdk.transforms.Filter; +import org.apache.beam.sdk.transforms.MapElements; +import org.apache.beam.sdk.transforms.ParDo; +import org.apache.beam.sdk.transforms.DoFn; +import org.apache.beam.sdk.transforms.Partition; +import org.apache.beam.sdk.transforms.PTransform; +import org.apache.beam.sdk.transforms.windowing.AfterProcessingTime; +import org.apache.beam.sdk.transforms.windowing.FixedWindows; +import org.apache.beam.sdk.transforms.windowing.Trigger; +import org.apache.beam.sdk.transforms.windowing.Window; +import org.apache.beam.sdk.transforms.windowing.Repeatedly; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.PCollectionList; +import org.apache.beam.sdk.values.TypeDescriptor; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.sdk.values.TypeDescriptors; +import org.joda.time.Duration; + +import java.io.*; +import java.util.List; +import java.util.stream.Collectors; + +public class Task { + private static final Integer WINDOW_TIME = 30; + private static final Integer TIME_OUTPUT_AFTER_FIRST_ELEMENT = 5; + private static final Integer ALLOWED_LATENESS_TIME = 1; + + private static final String REGEX_FOR_CSV = ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)"; + + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.fromArgs(args).create(); + Pipeline pipeline = Pipeline.create(options); + + Window window = Window.into(FixedWindows.of(Duration.standardSeconds(WINDOW_TIME))); + + Trigger trigger = AfterProcessingTime.pastFirstElementInPane().plusDelayOf(Duration.standardSeconds(TIME_OUTPUT_AFTER_FIRST_ELEMENT)); + + PCollection input = pipeline.apply(TextIO.read().from("input.csv")) + .apply("Data", ParDo.of(new ExtractDataFn())) + .setCoder(TransactionSerializableCoder.of()); + + PCollectionList parts = input + .apply(window.triggering(Repeatedly.forever(trigger)).withAllowedLateness(Duration.standardMinutes(ALLOWED_LATENESS_TIME)).discardingFiredPanes()) + .apply(Filter.by(it -> it.quantity >= 20)) + .apply(new TransactionPartitionFn()); + + parts.get(0) + .apply(MapElements.into(TypeDescriptors.kvs(TypeDescriptors.strings(), TypeDescriptors.doubles())).via(it -> KV.of(it.productId, it.price))) + .apply(Combine.perKey(new SumDoubleBinaryCombineFn())) + .apply(MapElements.into(TypeDescriptor.of(String.class)).via(it -> it.toString())) + .apply("WriteToFile", TextIO.write().withoutSharding().to("price_more_than_10").withSuffix(".txt")); + + parts.get(1) + .apply(MapElements.into(TypeDescriptors.kvs(TypeDescriptors.strings(), TypeDescriptors.doubles())).via(it -> KV.of(it.productId, it.price))) + .apply(Combine.perKey(new SumDoubleBinaryCombineFn())) + .apply(MapElements.into(TypeDescriptor.of(String.class)).via(it -> it.toString())) + .apply("WriteToFile", TextIO.write().withoutSharding().to("price_less_than_10").withSuffix(".txt")); + + pipeline.run().waitUntilFinish(); + } + + static class SumDoubleBinaryCombineFn extends Combine.BinaryCombineFn { + @Override + public Double apply(Double left, Double right) { + return left + right; + } + + } + + static class TransactionPartitionFn extends PTransform, PCollectionList> { + @Override + public PCollectionList expand(PCollection input) { + return input.apply(Partition.of(2, + (Partition.PartitionFn) (transaction, numPartitions) -> { + if (transaction.price > 10) { + return 0; + } else { + return 1; + } + })); + } + } + + static class TransactionSerializableCoder extends Coder { + private static final TransactionSerializableCoder INSTANCE = new TransactionSerializableCoder(); + + public static TransactionSerializableCoder of() { + return INSTANCE; + } + + private static final String NAMES_SEPARATOR = "_"; + + @Override + public void encode(Transaction transaction, OutputStream outStream) throws IOException { + String serializableRecord = transaction.id + NAMES_SEPARATOR + transaction.date + NAMES_SEPARATOR + transaction.productId + + NAMES_SEPARATOR + transaction.productName + NAMES_SEPARATOR + transaction.price + NAMES_SEPARATOR + transaction.quantity + + NAMES_SEPARATOR + transaction.customerId + NAMES_SEPARATOR + transaction.country; + outStream.write(serializableRecord.getBytes()); + } + + @Override + public Transaction decode(InputStream inStream) { + String serializedRecord = new BufferedReader(new InputStreamReader(inStream)).lines() + .parallel().collect(Collectors.joining("\n")); + String[] items = serializedRecord.split(NAMES_SEPARATOR); + return new Transaction(Long.valueOf(items[0]), items[1], items[2], items[3], Double.valueOf(items[4]), Integer.parseInt(items[5]), Long.valueOf(items[6]), items[7]); + } + + @Override + public List> getCoderArguments() { + return null; + } + + @Override + public void verifyDeterministic() { + } + } + + + static class ExtractDataFn extends DoFn { + @ProcessElement + public void processElement(ProcessContext c) { + String[] items = c.element().split(REGEX_FOR_CSV); + try { + c.output(new Transaction(Long.valueOf(items[0]), items[1], items[2], items[3], Double.valueOf(items[4]), Integer.parseInt(items[5]), Long.valueOf(items[6]), items[7])); + } catch (Exception e) { + System.out.println("Skip header"); + } + } + } + + @DefaultSchema(JavaFieldSchema.class) + public static class Transaction { + public Long id; + public String date; + public String productId; + public String productName; + public Double price; + public Integer quantity; + public Long customerId; + public String country; + + public Transaction() { + } + + @SchemaCreate + public Transaction(Long id, String date, String productId, String productName, Double price, Integer quantity, Long customerId, String country) { + this.id = id; + this.date = date; + this.productId = productId; + this.productName = productName; + this.price = price; + this.quantity = quantity; + this.customerId = customerId; + this.country = country; + } + + @Override + public String toString() { + return "Transaction{" + + "id=" + id + + ", date='" + date + '\'' + + ", productId='" + productId + '\'' + + ", productName='" + productName + '\'' + + ", price='" + price + '\'' + + ", quantity=" + quantity + + ", customerId=" + customerId + + ", country='" + country + '\'' + + '}'; + } + } +} \ No newline at end of file diff --git a/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/java-solution/input.csv b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/java-solution/input.csv new file mode 100644 index 000000000000..85854a2d4358 --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/java-solution/input.csv @@ -0,0 +1,1500 @@ +TransactionNo,Date,ProductNo,ProductName,Price,Quantity,CustomerNo,Country +581482,12/9/2019,22485,Set Of 2 Wooden Market Crates,21.47,12,17490,United Kingdom +581475,12/9/2019,22596,Christmas Star Wish List Chalkboard,10.65,36,13069,United Ki +581475,12/9/2019,23235,Storage Tin Vintage Leaf,11.53,12,13069,United Kingdom +581475,12/9/2019,23272,Tree T-Light Holder Willie Winkie,10.65,12,13069,United King +581475,12/9/2019,23239,Set Of 4 Knick Knack Tins Poppies,11.94,6,13069,United Kingd +581475,12/9/2019,21705,Bag 500g Swirly Marbles,10.65,24,13069,United Kingdom +581475,12/9/2019,22118,Joy Wooden Block Letters,11.53,18,13069,United Kingdom +581475,12/9/2019,22119,Peace Wooden Block Letters,12.25,12,13069,United Kingdom +581475,12/9/2019,22217,T-Light Holder Hanging Lace,10.65,12,13069,United Kingdom +581475,12/9/2019,22216,T-Light Holder White Lace,10.55,24,13069,United Kingdom +581475,12/9/2019,22380,Toy Tidy Spaceboy,11.06,20,13069,United Kingdom +581475,12/9/2019,22442,Grow Your Own Flowers Set Of 3,12.25,12,13069,United Kingdom +581475,12/9/2019,22664,Toy Tidy Dolly Girl Design,11.06,20,13069,United Kingdom +581475,12/9/2019,22721,Set Of 3 Cake Tins Sketchbook,12.25,12,13069,United Kingdom +581475,12/9/2019,22723,Set Of 6 Herb Tins Sketchbook,11.53,12,13069,United Kingdom +581475,12/9/2019,22785,Squarecushion Cover Pink Union Jack,11.53,12,13069,United Ki +581475,12/9/2019,22955,36 Foil Star Cake Cases,11.06,24,13069,United Kingdom +581475,12/9/2019,23141,Triple Wire Hook Pink Heart,11.06,12,13069,United Kingdom +581475,12/9/2019,22956,36 Foil Heart Cake Cases,11.06,24,13069,United Kingdom +581475,12/9/2019,22581,Wood Stocking Christmas Scandispot,10.55,48,13069,United Kin +581476,12/9/2019,23198,Pantry Magnetic Shopping List,11.53,48,12433,Norway +581476,12/9/2019,23197,Sketchbook Magnetic Shopping List,11.74,24,12433,Norway +581476,12/9/2019,23184,Bull Dog Bottle Opener,15.32,8,12433,Norway +581476,12/9/2019,23168,Classic Cafe Sugar Dispenser,11.53,12,12433,Norway +581476,12/9/2019,23167,Small Ceramic Top Storage Jar,10.96,96,12433,Norway +581476,12/9/2019,23166,Medium Ceramic Top Storage Jar,11.32,48,12433,Norway +581476,12/9/2019,23165,Large Ceramic Top Storage Jar,11.74,48,12433,Norway +581476,12/9/2019,23004,Travel Card Wallet Pantry,10.68,48,12433,Norway +581476,12/9/2019,23002,Travel Card Wallet Skulls,10.68,24,12433,Norway +581476,12/9/2019,23000,Travel Card Wallet Transport,10.68,24,12433,Norway +581476,12/9/2019,22998,Travel Card Wallet Keep Calm,10.68,72,12433,Norway +581476,12/9/2019,22994,Travel Card Wallet Retrospot,10.68,48,12433,Norway +581476,12/9/2019,22835,Hot Water Bottle I Am So Poorly,15.32,8,12433,Norway +581476,12/9/2019,22730,Alarm Clock Bakelike Ivory,14.09,4,12433,Norway +581476,12/9/2019,22728,Alarm Clock Bakelike Pink,14.09,8,12433,Norway +581476,12/9/2019,22727,Alarm Clock Bakelike Red,14.09,8,12433,Norway +581476,12/9/2019,22726,Alarm Clock Bakelike Green,14.09,4,12433,Norway +581476,12/9/2019,22720,Set Of 3 Cake Tins Pantry Design,14.61,16,12433,Norway +581476,12/9/2019,22693,Grow A Flytrap Or Sunflower In Tin,11.34,192,12433,Norway +581476,12/9/2019,22670,French Wc Sign Blue Metal,11.53,24,12433,Norway +581476,12/9/2019,22667,Recipe Box Retrospot,12.86,24,12433,Norway +581476,12/9/2019,22666,Recipe Box Pantry Yellow Design,12.86,24,12433,Norway +581476,12/9/2019,22631,Circus Parade Lunch Box,12.25,12,12433,Norway +581476,12/9/2019,22628,Picnic Boxes Set Of 3 Retrospot,15.32,16,12433,Norway +581476,12/9/2019,22467,Gumball Coat Rack,12.86,6,12433,Norway +581476,12/9/2019,22197,Popcorn Holder,10.99,100,12433,Norway +581476,12/9/2019,22114,Hot Water Bottle Tea And Sympathy,14.61,8,12433,Norway +581476,12/9/2019,22112,Chocolate Hot Water Bottle,15.32,9,12433,Norway +581476,12/9/2019,21908,Chocolate This Way Metal Sign,12.40,36,12433,Norway +581476,12/9/2019,21874,Gin And Tonic Mug,11.74,36,12433,Norway +581476,12/9/2019,21872,Glamorous Mug,11.53,12,12433,Norway +581476,12/9/2019,21871,Save The Planet Mug,11.74,36,12433,Norway +581476,12/9/2019,21533,Retrospot Large Milk Jug,15.32,6,12433,Norway +581476,12/9/2019,21481,Fawn Blue Hot Water Bottle,14.09,12,12433,Norway +581476,12/9/2019,21479,White Skull Hot Water Bottle,14.61,4,12433,Norway +581476,12/9/2019,21248,Door Hanger Mum + Dads Room,11.74,12,12433,Norway +581476,12/9/2019,21216,Set 3 Retrospot Tea/Coffee/Sugar,14.61,24,12433,Norway +581476,12/9/2019,21181,Please One Person Metal Sign,12.15,48,12433,Norway +581476,12/9/2019,21175,Gin And Tonic Diet Metal Sign,12.38,48,12433,Norway +581476,12/9/2019,21169,You're Confusing Me Metal Sign,11.74,48,12433,Norway +581476,12/9/2019,21162,Toxic Area Door Hanger,10.65,24,12433,Norway +581476,12/9/2019,21159,Moody Boy Door Hanger,10.65,24,12433,Norway +581476,12/9/2019,21158,Moody Girl Door Hanger,10.65,24,12433,Norway +581476,12/9/2019,21154,Red Retrospot Oven Glove,11.53,10,12433,Norway +581476,12/9/2019,16016,Large Chinese Style Scissor,11.12,40,12433,Norway +581476,12/9/2019,16014,Small Chinese Style Scissor,10.68,60,12433,Norway +581476,12/9/2019,16008,Small Folding Scissor(Pointed Edge),10.37,240,12433,Norway +581476,12/9/2019,85152,Hand Over The Chocolate Sign,12.15,48,12433,Norway +581476,12/9/2019,84596F,Small Marshmallows Pink Bowl,10.68,32,12433,Norway +581476,12/9/2019,84596B,Small Dolly Mix Design Orange Bowl,10.68,16,12433,Norway +581476,12/9/2019,84510A,Set Of 4 English Rose Coasters,11.53,20,12433,Norway +581476,12/9/2019,82600,N0 Singing Metal Sign,12.15,48,12433,Norway +581476,12/9/2019,82581,Toilet Metal Sign,10.81,48,12433,Norway +581476,12/9/2019,72232,Feng Shui Pillar Candle,10.44,144,12433,Norway +581476,12/9/2019,47559B,Tea Time Oven Glove,11.53,10,12433,Norway +581476,12/9/2019,47504H,English Rose Spirit Level,11.06,36,12433,Norway +581476,12/9/2019,23493,Vintage Doily Travel Sewing Kit,12.25,30,12433,Norway +581476,12/9/2019,23430,Blue Retro Kitchen Wall Clock,18.60,2,12433,Norway +581476,12/9/2019,23429,Red Retro Kitchen Wall Clock,18.60,2,12433,Norway +581476,12/9/2019,23428,Ivory Retro Kitchen Wall Clock,18.60,2,12433,Norway +581476,12/9/2019,23358,Hot Stuff Hot Water Bottle,11.53,18,12433,Norway +581476,12/9/2019,23293,Set Of 12 Fairy Cake Baking Cases,11.10,32,12433,Norway +581476,12/9/2019,23243,Set Of Tea Coffee Sugar Tins Pantry,15.32,12,12433,Norway +581476,12/9/2019,23240,Set Of 4 Knick Knack Tins Doily,14.50,6,12433,Norway +581477,12/9/2019,48111,Doormat 3 Smiley Cats,17.51,10,13426,United Kingdom +581477,12/9/2019,22464,Hanging Metal Heart Lantern,11.06,12,13426,United Kingdom +581477,12/9/2019,20982,12 Pencils Tall Tube Skulls,11.12,12,13426,United Kingdom +581477,12/9/2019,20981,12 Pencils Tall Tube Woodland,11.12,12,13426,United Kingdom +581477,12/9/2019,23424,Gingham Recipe Book Box,15.32,8,13426,United Kingdom +581477,12/9/2019,23338,Egg Frying Pan Red,12.15,48,13426,United Kingdom +581477,12/9/2019,84970L,Single Heart Zinc T-Light Holder,11.53,12,13426,United King +581477,12/9/2019,22457,Natural Slate Heart Chalkboard,13.27,6,13426,United Kingdom +581477,12/9/2019,22469,Heart Of Wicker Small,11.94,12,13426,United Kingdom +581477,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,11.12,12,13426,United Ki +581478,12/9/2019,84947,Antique Silver Tea Glass Engraved,11.53,24,17364,United King +581478,12/9/2019,23503,Playing Cards Keep Calm & Carry On,11.53,12,17364,United Kin +581478,12/9/2019,23445,Ice Cream Bubbles,11.10,20,17364,United Kingdom +581478,12/9/2019,23530,Wall Art Only One Person,15.32,12,17364,United Kingdom +581478,12/9/2019,84997C,Childrens Cutlery Polkadot Blue,14.50,4,17364,United Kingdo +581478,12/9/2019,84997D,Childrens Cutlery Polkadot Pink,14.50,4,17364,United Kingdo +581478,12/9/2019,84077,World War 2 Gliders Asstd Designs,10.55,48,17364,United King +581478,12/9/2019,22749,Feltcraft Princess Charlotte Doll,14.09,4,17364,United Kingd +581478,12/9/2019,23127,Feltcraft Girl Nicole Kit,15.32,4,17364,United Kingdom +581478,12/9/2019,23126,Feltcraft Girl Amelie Kit,15.32,4,17364,United Kingdom +581478,12/9/2019,22747,Poppy's Playhouse Bathroom,12.40,6,17364,United Kingdom +581478,12/9/2019,22078,Ribbon Reel Lace Design,12.40,10,17364,United Kingdom +581478,12/9/2019,84946,Antique Silver T-Light Glass,11.53,12,17364,United Kingdom +581478,12/9/2019,22791,T-Light Glass Fluted Antique,11.53,12,17364,United Kingdom +581478,12/9/2019,21326,Aged Glass Silver T-Light Holder,10.92,12,17364,United Kingd +581478,12/9/2019,22170,Picture Frame Wood Triple Portrait,17.17,8,17364,United King +581478,12/9/2019,23082,Set 6 Paper Table Lantern Hearts,14.09,6,17364,United Kingdo +581478,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,11.12,24,17364,United Ki +581479,12/9/2019,22087,Paper Bunting White Lace,13.27,10,17364,United Kingdom +581480,12/9/2019,23464,Vintage Zinc Watering Can Small,15.32,4,14441,United Kingdom +581480,12/9/2019,22411,Jumbo Shopper Vintage Red Paisley,12.38,10,14441,United King +581480,12/9/2019,84029E,Red Woolly Hottie White Heart,14.61,8,14441,United Kingdom +581480,12/9/2019,22633,Hand Warmer Union Jack,12.40,12,14441,United Kingdom +581480,12/9/2019,23355,Hot Water Bottle Keep Calm,15.32,12,14441,United Kingdom +581480,12/9/2019,84029G,Knitted Union Flag Hot Water Bottle,14.61,12,14441,United K +581480,12/9/2019,22112,Chocolate Hot Water Bottle,15.32,6,14441,United Kingdom +581480,12/9/2019,84347,Rotating Silver Angels T-Light Hldr,12.86,18,14441,United Ki +581481,12/9/2019,21115,Rose Caravan Doorstop,12.25,8,17490,United Kingdom +581481,12/9/2019,22059,Ceramic Strawberry Design Mug,10.65,24,17490,United Kingdom +581481,12/9/2019,22072,Red Retrospot Tea Cup And Saucer,11.53,24,17490,United Kingd +581481,12/9/2019,22123,Ping Microwave Apron,11.06,24,17490,United Kingdom +581481,12/9/2019,22476,Empire Union Jack Tv Dinner Tray,12.25,8,17490,United Kingdo +581481,12/9/2019,22495,Set Of 2 Round Tins Camembert,11.06,12,17490,United Kingdom +581481,12/9/2019,22496,Set Of 2 Round Tins Dutch Cheese,11.06,12,17490,United Kingd +581481,12/9/2019,22513,Doorstop Football Design,11.06,8,17490,United Kingdom +581481,12/9/2019,22500,Set Of 2 Tins Jardin De Provence,11.53,12,17490,United Kingd +581481,12/9/2019,22664,Toy Tidy Dolly Girl Design,11.06,20,17490,United Kingdom +581481,12/9/2019,22721,Set Of 3 Cake Tins Sketchbook,12.25,12,17490,United Kingdom +581481,12/9/2019,22785,Squarecushion Cover Pink Union Jack,11.53,12,17490,United Ki +581481,12/9/2019,23178,Jam Clock Magnet,11.53,12,17490,United Kingdom +581481,12/9/2019,23302,Kneeling Mat Housework Design,11.06,24,17490,United Kingdom +581481,12/9/2019,23533,Wall Art Garden Haven,12.25,6,17490,United Kingdom +581481,12/9/2019,84819,Danish Rose Round Sewing Box,11.06,16,17490,United Kingdom +581482,12/9/2019,22371,Airline Bag Vintage Tokyo 78,14.30,12,17490,United Kingdom +581482,12/9/2019,21875,Kings Choice Mug,11.34,36,17490,United Kingdom +581482,12/9/2019,23251,Vintage Red Enamel Trim Mug,11.32,96,17490,United Kingdom +581482,12/9/2019,23300,Gardeners Kneeling Pad Cup Of Tea,11.74,48,17490,United King +581482,12/9/2019,22138,Baking Set 9 Piece Retrospot,14.61,24,17490,United Kingdom +581483,12/9/2019,23843,Paper Craft Little Birdie,12.38,80995,16446,United Kingdom +581485,12/9/2019,22617,Baking Set Spaceboy Design,15.32,18,17389,United Kingdom +581485,12/9/2019,20749,Assorted Colour Mini Cases,16.76,84,17389,United Kingdom +581486,12/9/2019,22910,Paper Chain Kit Vintage Christmas,13.27,12,17001,United King +581486,12/9/2019,22086,Paper Chain Kit 50'S Christmas,13.27,12,17001,United Kingdom +581486,12/9/2019,23351,Roll Wrap 50'S Christmas,6.19,12,17001,United Kingdom +581486,12/9/2019,23352,Roll Wrap 50'S Red Christmas,6.19,12,17001,United Kingdom +581486,12/9/2019,22727,Alarm Clock Bakelike Red,6.19,8,17001,United Kingdom +581486,12/9/2019,22730,Alarm Clock Bakelike Ivory,6.19,4,17001,United Kingdom +581486,12/9/2019,22491,Pack Of 12 Coloured Pencils,6.04,12,17001,United Kingdom +581486,12/9/2019,22561,Wooden School Colouring Set,6.04,12,17001,United Kingdom +581486,12/9/2019,22489,Pack Of 12 Traditional Crayons,6.04,24,17001,United Kingdom +581486,12/9/2019,22560,Traditional Modelling Clay,6.04,24,17001,United Kingdom +581486,12/9/2019,22139,Retrospot Tea Set Ceramic 11 Pc,6.04,6,17001,United Kingdom +581486,12/9/2019,23344,Jumbo Bag 50'S Christmas,6.19,20,17001,United Kingdom +581486,12/9/2019,23203,Jumbo Bag Vintage Doily,6.19,20,17001,United Kingdom +581486,12/9/2019,85099B,Jumbo Bag Red Retrospot,6.19,10,17001,United Kingdom +581486,12/9/2019,23201,Jumbo Bag Alphabet,6.19,20,17001,United Kingdom +581486,12/9/2019,23207,Lunch Bag Alphabet Design,6.19,10,17001,United Kingdom +581487,12/9/2019,21137,Black Record Cover Frame,6.04,120,15694,United Kingdom +581488,12/9/2019,23118,Parisienne Jewellery Drawer,6.04,16,17428,United Kingdom +581488,12/9/2019,23111,Parisienne Sewing Box,6.04,16,17428,United Kingdom +581488,12/9/2019,22179,Set 10 Night Owl Lights,6.04,24,17428,United Kingdom +581489,12/9/2019,22061,Large Cake Stand Hanging Strawbery,7.24,48,16954,United King +581489,12/9/2019,22182,Cake Stand Victorian Filigree Small,7.24,24,16954,United Kin +581491,12/9/2019,23571,Traditional Naughts & Crosses,7.24,12,12433,Norway +581492,12/9/2019,23369,Set 36 Colour Pencils Love London,6.19,2,15492,United Kingdo +581492,12/9/2019,23370,Set 36 Colouring Pencils Doily,6.19,2,15492,United Kingdom +581492,12/9/2019,23371,Set 36 Colour Pencils Spaceboy,6.19,3,15492,United Kingdom +581492,12/9/2019,23372,Set 36 Colour Pencils Dolly Girl,6.19,1,15492,United Kingdom +581492,12/9/2019,23376,Pack Of 12 Vintage Christmas Tissue,6.19,3,15492,United King +581492,12/9/2019,23377,Pack Of 12 Dolly Girl Tissues,6.19,6,15492,United Kingdom +581492,12/9/2019,23378,Pack Of 12 50'S Christmas Tissues,6.19,9,15492,United Kingdo +581492,12/9/2019,23379,Pack Of 12 Red Apple Tissues,6.19,4,15492,United Kingdom +581492,12/9/2019,23380,Pack Of 12 Vintage Doily Tissues,6.19,3,15492,United Kingdom +581492,12/9/2019,23381,Pack Of 12 Vintage Leaf Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,23382,Box Of 6 Christmas Cake Decorations,6.19,4,15492,United King +581492,12/9/2019,23391,I Love London Mini Backpack,6.19,2,15492,United Kingdom +581492,12/9/2019,23392,Spaceboy Rocket Lolly Makers,6.19,2,15492,United Kingdom +581492,12/9/2019,23399,Home Sweet Home Hanging Heart,6.19,4,15492,United Kingdom +581492,12/9/2019,23405,Home Sweet Home 2 Drawer Cabinet,6.19,3,15492,United Kingdom +581492,12/9/2019,23418,Lavender Toilette Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,23426,Metal Sign Drop Your Pants,6.19,1,15492,United Kingdom +581492,12/9/2019,23434,3 Raffia Ribbons 50'S Christmas,6.19,9,15492,United Kingdom +581492,12/9/2019,23435,3 Raffia Ribbons Vintage Christmas,6.04,3,15492,United Kingd +581492,12/9/2019,23439,Hand Warmer Red Love Heart,6.19,1,15492,United Kingdom +581492,12/9/2019,23451,Square Mini Portrait Frame,6.19,1,15492,United Kingdom +581492,12/9/2019,23467,Vintage Zinc Planter,6.19,1,15492,United Kingdom +581492,12/9/2019,23469,Card Holder Love Bird Small,6.19,3,15492,United Kingdom +581492,12/9/2019,23480,Mini Lights Woodland Mushrooms,6.19,2,15492,United Kingdom +581492,12/9/2019,23493,Vintage Doily Travel Sewing Kit,6.19,3,15492,United Kingdom +581492,12/9/2019,23494,Vintage Doily Deluxe Sewing Kit,6.19,1,15492,United Kingdom +581492,12/9/2019,23495,Set Of 3 Pantry Wooden Spoons,6.19,1,15492,United Kingdom +581492,12/9/2019,23497,Classic Chrome Bicycle Bell,6.19,4,15492,United Kingdom +581492,12/9/2019,23498,Classic Bicycle Clips,6.19,2,15492,United Kingdom +581492,12/9/2019,23501,Key Ring Baseball Boot Union Jack,6.19,3,15492,United Kingdo +581492,12/9/2019,23506,Mini Playing Cards Spaceboy,6.04,1,15492,United Kingdom +581492,12/9/2019,23508,Mini Playing Cards Dolly Girl,6.04,2,15492,United Kingdom +581492,12/9/2019,23510,Mini Playing Cards Gymkhana,6.04,1,15492,United Kingdom +581492,12/9/2019,23521,Wall Art Cat And Bird,6.04,1,15492,United Kingdom +581492,12/9/2019,23526,Wall Art Dog Licence,6.04,4,15492,United Kingdom +581492,12/9/2019,23530,Wall Art Only One Person,6.04,2,15492,United Kingdom +581492,12/9/2019,23534,Wall Art Stop For Tea,6.19,6,15492,United Kingdom +581492,12/9/2019,23535,Wall Art Bicycle Safety,6.19,4,15492,United Kingdom +581492,12/9/2019,23536,Wall Art Village Show,6.19,1,15492,United Kingdom +581492,12/9/2019,23538,Wall Art Vintage Heart,6.19,1,15492,United Kingdom +581492,12/9/2019,23551,Pack Of 12 Paisley Park Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,23552,Bicycle Puncture Repair Kit,6.19,12,15492,United Kingdom +581492,12/9/2019,23555,Landmark Frame Notting Hill,6.19,1,15492,United Kingdom +581492,12/9/2019,23559,Woodland Bunnies Lolly Makers,6.19,5,15492,United Kingdom +581492,12/9/2019,23561,Set Of 6 Ribbons Party,6.19,1,15492,United Kingdom +581492,12/9/2019,23564,Egg Cup Milkmaid Ingrid,6.19,2,15492,United Kingdom +581492,12/9/2019,23565,Egg Cup Milkmaid Helga,6.19,2,15492,United Kingdom +581492,12/9/2019,23567,Egg Cup Henrietta Hen Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,23569,Tradtional Alphabet Stamp Set,6.19,2,15492,United Kingdom +581492,12/9/2019,23570,Traditional Pick Up Sticks Game,6.19,7,15492,United Kingdom +581492,12/9/2019,23571,Traditional Naughts & Crosses,6.19,2,15492,United Kingdom +581492,12/9/2019,23575,Snack Tray Paisley Park,6.19,3,15492,United Kingdom +581492,12/9/2019,23579,Snack Tray I Love London,6.19,1,15492,United Kingdom +581492,12/9/2019,23611,Set 10 Cards Red Riding Hood 17214,6.19,3,15492,United Kingd +581492,12/9/2019,23616,Set 10 Cards Jingle Bells 17217,6.19,1,15492,United Kingdom +581492,12/9/2019,23621,Set 10 Cards David's Madonna 17074,6.19,3,15492,United Kingd +581492,12/9/2019,23635,Set 10 Cards Christmas Holly 17259,6.19,1,15492,United Kingd +581492,12/9/2019,23644,Set 10 Cards Christmas Tree 16955,6.19,1,15492,United Kingdo +581492,12/9/2019,23660,Henrietta Hen Mug,6.19,1,15492,United Kingdom +581492,12/9/2019,23661,Milk Maids Mug,6.19,1,15492,United Kingdom +581492,12/9/2019,35095A,Blue Victorian Fabric Oval Box,6.19,1,15492,United Kingdom +581492,12/9/2019,35095B,Red Victorian Fabric Oval Box,6.19,1,15492,United Kingdom +581492,12/9/2019,35646,Vintage Bead Pink Evening Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,35648,Vintage Bead Pink Purse,6.19,2,15492,United Kingdom +581492,12/9/2019,35953,Folkart Star Christmas Decorations,6.19,12,15492,United King +581492,12/9/2019,35964,Folkart Clip On Stars,6.19,4,15492,United Kingdom +581492,12/9/2019,35970,Zinc Folkart Sleigh Bells,6.04,1,15492,United Kingdom +581492,12/9/2019,46118,Funky Monkey Cushion Cover,6.19,1,15492,United Kingdom +581492,12/9/2019,46776A,Woven Bubble Gum Cushion Cover,7.24,2,15492,United Kingdom +581492,12/9/2019,46776B,Woven Berries Cushion Cover,7.24,3,15492,United Kingdom +581492,12/9/2019,46776C,Woven Frost Cushion Cover,7.24,1,15492,United Kingdom +581492,12/9/2019,46776D,Woven Sunset Cushion Cover,7.24,2,15492,United Kingdom +581492,12/9/2019,46776E,Woven Candy Cushion Cover,7.24,5,15492,United Kingdom +581492,12/9/2019,46776F,Woven Rose Garden Cushion Cover,7.24,6,15492,United Kingdom +581492,12/9/2019,47310M,Small Pop Box Funky Monkey,6.19,1,15492,United Kingdom +581492,12/9/2019,47480,Hanging Photo Clip Rope Ladder,6.19,3,15492,United Kingdom +581492,12/9/2019,47504H,English Rose Spirit Level,7.24,1,15492,United Kingdom +581492,12/9/2019,47559B,Tea Time Oven Glove,7.24,3,15492,United Kingdom +581492,12/9/2019,47563A,Retro Longboard Ironing Board Cover,7.24,2,15492,United Kin +581492,12/9/2019,47566,Party Bunting,7.24,2,15492,United Kingdom +581492,12/9/2019,47590B,Pink Happy Birthday Bunting,7.24,1,15492,United Kingdom +581492,12/9/2019,51014A,Feather Pen Hot Pink,7.24,2,15492,United Kingdom +581492,12/9/2019,51014L,Feather Pen Light Pink,7.24,1,15492,United Kingdom +581492,12/9/2019,71270,Photo Clip Line,7.24,1,15492,United Kingdom +581492,12/9/2019,72349B,Set/6 Purple Butterfly T-Lights,6.39,1,15492,United Kingdom +581492,12/9/2019,72741,Grand Chocolatecandle,7.24,3,15492,United Kingdom +581492,12/9/2019,72800E,4 Ivory Dinner Candles Silver Flock,7.24,3,15492,United Kin +581492,12/9/2019,79321,Chilli Lights,6.19,1,15492,United Kingdom +581492,12/9/2019,82484,Wood Black Board Ant White Finish,6.19,2,15492,United Kingdo +581492,12/9/2019,82567,Airline Lounge Metal Sign,6.19,2,15492,United Kingdom +581492,12/9/2019,82582,Area Patrolled Metal Sign,6.19,1,15492,United Kingdom +581492,12/9/2019,82600,N0 Singing Metal Sign,6.19,1,15492,United Kingdom +581492,12/9/2019,84031A,Charlie+Lola Red Hot Water Bottle,6.19,4,15492,United Kingd +581492,12/9/2019,84077,World War 2 Gliders Asstd Designs,6.19,1,15492,United Kingdo +581492,12/9/2019,84249A,Greeting Card Square Doughnuts,6.19,1,15492,United Kingdom +581492,12/9/2019,84347,Rotating Silver Angels T-Light Hldr,6.19,2,15492,United King +581492,12/9/2019,84375,Set Of 20 Kids Cookie Cutters,6.19,1,15492,United Kingdom +581492,12/9/2019,84378,Set Of 3 Heart Cookie Cutters,6.19,4,15492,United Kingdom +581492,12/9/2019,84519B,Carrot Charlie+Lola Coaster Set,6.19,1,15492,United Kingdom +581492,12/9/2019,84559A,3d Sheet Of Dog Stickers,6.19,2,15492,United Kingdom +581492,12/9/2019,84568,Girls Alphabet Iron On Patches,6.19,31,15492,United Kingdom +581492,12/9/2019,84569D,Pack 6 Heart/Ice-Cream Patches,6.19,1,15492,United Kingdom +581492,12/9/2019,84596B,Small Dolly Mix Design Orange Bowl,6.19,4,15492,United King +581492,12/9/2019,84596F,Small Marshmallows Pink Bowl,6.19,4,15492,United Kingdom +581492,12/9/2019,84598,Boys Alphabet Iron On Patches,6.19,5,15492,United Kingdom +581492,12/9/2019,84692,Box Of 24 Cocktail Parasols,6.19,1,15492,United Kingdom +581492,12/9/2019,84755,Colour Glass T-Light Holder Hanging,6.19,4,15492,United King +581492,12/9/2019,84828,Jungle Popsicles Ice Lolly Moulds,6.19,1,15492,United Kingdo +581492,12/9/2019,84879,Assorted Colour Bird Ornament,6.19,16,15492,United Kingdom +581492,12/9/2019,84923,Pink Butterfly Handbag W Bobbles,6.04,3,15492,United Kingdom +581492,12/9/2019,84946,Antique Silver T-Light Glass,6.04,18,15492,United Kingdom +581492,12/9/2019,84970S,Hanging Heart Zinc T-Light Holder,6.04,3,15492,United Kingd +581492,12/9/2019,84978,Hanging Heart Jar T-Light Holder,6.04,4,15492,United Kingdom +581492,12/9/2019,84991,60 Teatime Fairy Cake Cases,6.04,1,15492,United Kingdom +581492,12/9/2019,84997A,Childrens Cutlery Polkadot Green,6.04,1,15492,United Kingdo +581492,12/9/2019,84997B,Childrens Cutlery Retrospot Red,6.04,1,15492,United Kingdom +581492,12/9/2019,20733,Gold Mini Tape Measure,6.04,3,15492,United Kingdom +581492,12/9/2019,20777,Chrysanthemum Notebook,6.19,2,15492,United Kingdom +581492,12/9/2019,20782,Camouflage Ear Muff Headphones,6.19,1,15492,United Kingdom +581492,12/9/2019,20914,Set/5 Red Retrospot Lid Glass Bowls,6.19,2,15492,United King +581492,12/9/2019,20931,Blue Pot Plant Candle,6.19,1,15492,United Kingdom +581492,12/9/2019,20970,Pink Floral Feltcraft Shoulder Bag,6.19,1,15492,United Kingd +581492,12/9/2019,20971,Pink Blue Felt Craft Trinket Box,6.19,2,15492,United Kingdom +581492,12/9/2019,20972,Pink Cream Felt Craft Trinket Box,6.19,3,15492,United Kingdo +581492,12/9/2019,20973,12 Pencil Small Tube Woodland,6.19,4,15492,United Kingdom +581492,12/9/2019,20978,36 Pencils Tube Skulls,6.19,1,15492,United Kingdom +581492,12/9/2019,20979,36 Pencils Tube Red Retrospot,6.19,3,15492,United Kingdom +581492,12/9/2019,20982,12 Pencils Tall Tube Skulls,6.19,2,15492,United Kingdom +581492,12/9/2019,20983,12 Pencils Tall Tube Red Retrospot,6.19,4,15492,United Kingd +581492,12/9/2019,20985,Heart Calculator,6.19,1,15492,United Kingdom +581492,12/9/2019,20986,Blue Calculator Ruler,6.19,1,15492,United Kingdom +581492,12/9/2019,21000,Rose Du Sud Cosmetics Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,21012,Antique All Glass Candlestick,6.19,3,15492,United Kingdom +581492,12/9/2019,21015,Dark Bird House Tree Decoration,6.19,8,15492,United Kingdom +581492,12/9/2019,21026,Space Owl,6.19,1,15492,United Kingdom +581492,12/9/2019,21035,Set/2 Red Retrospot Tea Towels,6.19,1,15492,United Kingdom +581492,12/9/2019,21064,Boom Box Speaker Boys,6.19,4,15492,United Kingdom +581492,12/9/2019,21065,Boom Box Speaker Girls,6.19,2,15492,United Kingdom +581492,12/9/2019,21098,Christmas Toilet Roll,6.19,1,15492,United Kingdom +581492,12/9/2019,21123,Set/10 Ivory Polkadot Party Candles,6.19,1,15492,United King +581492,12/9/2019,21125,Set 6 Football Celebration Candles,6.19,1,15492,United Kingd +581492,12/9/2019,21126,Set Of 6 Girls Celebration Candles,6.19,1,15492,United Kingd +581492,12/9/2019,21137,Black Record Cover Frame,6.19,17,15492,United Kingdom +581492,12/9/2019,21154,Red Retrospot Oven Glove,6.19,2,15492,United Kingdom +581492,12/9/2019,21158,Moody Girl Door Hanger,6.19,1,15492,United Kingdom +581492,12/9/2019,21162,Toxic Area Door Hanger,6.19,1,15492,United Kingdom +581492,12/9/2019,21166,Cook With Wine Metal Sign,6.19,2,15492,United Kingdom +581492,12/9/2019,21172,Party Metal Sign,6.19,1,15492,United Kingdom +581492,12/9/2019,21174,Pottering In The Shed Metal Sign,6.19,2,15492,United Kingdom +581492,12/9/2019,21175,Gin And Tonic Diet Metal Sign,6.19,2,15492,United Kingdom +581492,12/9/2019,21200,Multicolour Honeycomb Paper Garland,6.04,6,15492,United King +581492,12/9/2019,21201,Tropical Honeycomb Paper Garland,6.04,4,15492,United Kingdom +581492,12/9/2019,21212,Pack Of 72 Retrospot Cake Cases,6.04,2,15492,United Kingdom +581492,12/9/2019,21213,Pack Of 72 Skull Cake Cases,6.04,2,15492,United Kingdom +581492,12/9/2019,21220,Set/4 Badges Dogs,6.19,2,15492,United Kingdom +581492,12/9/2019,21224,Set/4 Skull Badges,6.19,1,15492,United Kingdom +581492,12/9/2019,21232,Strawberry Ceramic Trinket Pot,6.19,1,15492,United Kingdom +581492,12/9/2019,21257,Victorian Sewing Box Medium,6.19,2,15492,United Kingdom +581492,12/9/2019,21258,Victorian Sewing Box Large,6.19,1,15492,United Kingdom +581492,12/9/2019,21259,Victorian Sewing Box Small,6.19,1,15492,United Kingdom +581492,12/9/2019,21313,Glass Heart T-Light Holder,6.19,1,15492,United Kingdom +581492,12/9/2019,21314,Small Glass Heart Trinket Pot,6.19,2,15492,United Kingdom +581492,12/9/2019,21328,Balloons Writing Set,6.19,2,15492,United Kingdom +581492,12/9/2019,21329,Dinosaurs Writing Set,6.19,2,15492,United Kingdom +581492,12/9/2019,21356,Toast Its - Fairy Flower,6.19,16,15492,United Kingdom +581492,12/9/2019,21378,Small Tall Camphor Wood Toadstool,6.19,2,15492,United Kingdo +581492,12/9/2019,21379,Camphor Wood Portobello Mushroom,6.19,1,15492,United Kingdom +581492,12/9/2019,21383,Pack Of 12 Sticky Bunnies,6.19,1,15492,United Kingdom +581492,12/9/2019,21402,Red Egg Spoon,6.19,1,15492,United Kingdom +581492,12/9/2019,21408,Spotty Pink Duck Doorstop,6.19,2,15492,United Kingdom +581492,12/9/2019,21411,Gingham Heart Doorstop Red,6.19,1,15492,United Kingdom +581492,12/9/2019,21467,Cherry Crochet Food Cover,6.19,1,15492,United Kingdom +581492,12/9/2019,21471,Strawberry Raffia Food Cover,6.19,2,15492,United Kingdom +581492,12/9/2019,21479,White Skull Hot Water Bottle,6.19,2,15492,United Kingdom +581492,12/9/2019,21481,Fawn Blue Hot Water Bottle,6.19,3,15492,United Kingdom +581492,12/9/2019,21484,Chick Grey Hot Water Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,21485,Retrospot Heart Hot Water Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,21494,Rotating Leaves T-Light Holder,6.19,11,15492,United Kingdom +581492,12/9/2019,21506,Fancy Font Birthday Card,6.19,3,15492,United Kingdom +581492,12/9/2019,21507,Elephant Birthday Card,7.24,1,15492,United Kingdom +581492,12/9/2019,21508,Vintage Kid Dolly Card,7.24,1,15492,United Kingdom +581492,12/9/2019,21509,Cowboys And Indians Birthday Card,7.24,2,15492,United Kingdo +581492,12/9/2019,21528,Dairy Maid Traditional Teapot,7.24,1,15492,United Kingdom +581492,12/9/2019,21544,Skulls Water Transfer Tattoos,7.24,2,15492,United Kingdom +581492,12/9/2019,21558,Skull Lunch Box With Cutlery,6.39,1,15492,United Kingdom +581492,12/9/2019,21559,Strawberry Lunch Box With Cutlery,7.24,1,15492,United Kingdo +581492,12/9/2019,21615,4 Lavender Botanical Dinner Candles,7.24,2,15492,United King +581492,12/9/2019,21616,4 Pear Botanical Dinner Candles,7.24,6,15492,United Kingdom +581492,12/9/2019,21620,Set Of 4 Rose Botanical Candles,7.24,5,15492,United Kingdom +581492,12/9/2019,21642,Assorted Tutti Frutti Pen,7.24,4,15492,United Kingdom +581492,12/9/2019,21648,Assorted Tutti Frutti Small Purse,7.24,2,15492,United Kingdo +581492,12/9/2019,21650,Assorted Tutti Frutti Bracelet,7.24,14,15492,United Kingdom +581492,12/9/2019,21675,Butterflies Stickers,6.19,2,15492,United Kingdom +581492,12/9/2019,21677,Hearts Stickers,6.19,1,15492,United Kingdom +581492,12/9/2019,21678,Paisley Pattern Stickers,6.19,2,15492,United Kingdom +581492,12/9/2019,21680,Woodland Stickers,6.19,1,15492,United Kingdom +581492,12/9/2019,21703,Bag 125g Swirly Marbles,6.19,1,15492,United Kingdom +581492,12/9/2019,21704,Bag 250g Swirly Marbles,6.19,1,15492,United Kingdom +581492,12/9/2019,21716,Boys Vintage Tin Seaside Bucket,6.19,1,15492,United Kingdom +581492,12/9/2019,21718,Red Metal Beach Spade,6.19,1,15492,United Kingdom +581492,12/9/2019,21724,Panda And Bunnies Sticker Sheet,6.19,1,15492,United Kingdom +581492,12/9/2019,21731,Red Toadstool Led Night Light,6.19,6,15492,United Kingdom +581492,12/9/2019,21739,Cosy Slipper Shoes Small Green,6.19,2,15492,United Kingdom +581492,12/9/2019,21774,Decorative Cats Bathroom Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,21786,Polkadot Rain Hat,6.19,3,15492,United Kingdom +581492,12/9/2019,21787,Rain Poncho Retrospot,6.19,2,15492,United Kingdom +581492,12/9/2019,21790,Vintage Snap Cards,6.19,5,15492,United Kingdom +581492,12/9/2019,21791,Vintage Heads And Tails Card Game,6.19,1,15492,United Kingdo +581492,12/9/2019,21808,Christmas Garland Stars Trees,6.19,3,15492,United Kingdom +581492,12/9/2019,21810,Christmas Hanging Star With Bell,6.19,25,15492,United Kingdo +581492,12/9/2019,21812,Garland With Hearts And Bells,6.19,7,15492,United Kingdom +581492,12/9/2019,21813,Garland With Stars And Bells,6.19,3,15492,United Kingdom +581492,12/9/2019,21822,Glitter Christmas Tree With Bells,6.19,12,15492,United Kingd +581492,12/9/2019,21828,Eight Piece Snake Set,6.19,1,15492,United Kingdom +581492,12/9/2019,21832,Chocolate Calculator,6.19,1,15492,United Kingdom +581492,12/9/2019,21833,Camouflage Led Torch,6.04,2,15492,United Kingdom +581492,12/9/2019,21871,Save The Planet Mug,6.19,1,15492,United Kingdom +581492,12/9/2019,21874,Gin And Tonic Mug,6.19,2,15492,United Kingdom +581492,12/9/2019,21876,Pottering Mug,6.19,4,15492,United Kingdom +581492,12/9/2019,21879,Hearts Gift Tape,6.19,1,15492,United Kingdom +581492,12/9/2019,21889,Wooden Box Of Dominoes,6.19,3,15492,United Kingdom +581492,12/9/2019,21890,S/6 Wooden Skittles In Cotton Bag,6.19,1,15492,United Kingdo +581492,12/9/2019,21892,Traditional Wooden Catch Cup Game,6.19,1,15492,United Kingdo +581492,12/9/2019,21900,Key Fob Shed,6.19,4,15492,United Kingdom +581492,12/9/2019,21901,Key Fob Back Door,6.19,2,15492,United Kingdom +581492,12/9/2019,21902,Key Fob Front Door,6.19,1,15492,United Kingdom +581492,12/9/2019,21905,More Butter Metal Sign,6.19,1,15492,United Kingdom +581492,12/9/2019,21906,Pharmacie First Aid Tin,6.19,1,15492,United Kingdom +581492,12/9/2019,21914,Blue Harmonica In Box,6.19,2,15492,United Kingdom +581492,12/9/2019,21916,Set 12 Retro White Chalk Sticks,6.19,2,15492,United Kingdom +581492,12/9/2019,21930,Jumbo Storage Bag Skulls,6.19,1,15492,United Kingdom +581492,12/9/2019,21931,Jumbo Storage Bag Suki,6.19,1,15492,United Kingdom +581492,12/9/2019,21932,Scandinavian Paisley Picnic Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,21934,Skull Shoulder Bag,6.19,3,15492,United Kingdom +581492,12/9/2019,21935,Suki Shoulder Bag,6.19,9,15492,United Kingdom +581492,12/9/2019,21936,Red Retrospot Picnic Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,21942,Skulls Design Flannel,6.19,2,15492,United Kingdom +581492,12/9/2019,21945,Strawberries Design Flannel,6.19,2,15492,United Kingdom +581492,12/9/2019,21947,Set Of 6 Heart Chopsticks,6.19,1,15492,United Kingdom +581492,12/9/2019,21949,Set Of 6 Strawberry Chopsticks,6.19,2,15492,United Kingdom +581492,12/9/2019,21967,Pack Of 12 Skull Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,21976,Pack Of 60 Mushroom Cake Cases,6.19,3,15492,United Kingdom +581492,12/9/2019,21977,Pack Of 60 Pink Paisley Cake Cases,6.19,2,15492,United Kingd +581492,12/9/2019,21980,Pack Of 12 Red Retrospot Tissues,6.19,2,15492,United Kingdom +581492,12/9/2019,21981,Pack Of 12 Woodland Tissues,6.19,4,15492,United Kingdom +581492,12/9/2019,21982,Pack Of 12 Suki Tissues,6.19,2,15492,United Kingdom +581492,12/9/2019,21983,Pack Of 12 Blue Paisley Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,21984,Pack Of 12 Pink Paisley Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,21986,Pack Of 12 Pink Polkadot Tissues,6.19,3,15492,United Kingdom +581492,12/9/2019,21989,Pack Of 20 Skull Paper Napkins,6.19,2,15492,United Kingdom +581492,12/9/2019,21990,Modern Floral Stationery Set,6.19,8,15492,United Kingdom +581492,12/9/2019,21993,Floral Folk Stationery Set,6.19,8,15492,United Kingdom +581492,12/9/2019,22024,Rainy Ladies Birthday Card,6.19,3,15492,United Kingdom +581492,12/9/2019,22025,Ring Of Roses Birthday Card,6.19,3,15492,United Kingdom +581492,12/9/2019,22026,Banquet Birthday Card,6.19,4,15492,United Kingdom +581492,12/9/2019,22027,Tea Party Birthday Card,6.19,2,15492,United Kingdom +581492,12/9/2019,22028,Penny Farthing Birthday Card,6.19,1,15492,United Kingdom +581492,12/9/2019,22029,Spaceboy Birthday Card,6.19,4,15492,United Kingdom +581492,12/9/2019,22031,Botanical Lavender Birthday Card,6.19,1,15492,United Kingdom +581492,12/9/2019,22037,Robot Birthday Card,6.19,4,15492,United Kingdom +581492,12/9/2019,22064,Pink Doughnut Trinket Pot,6.19,1,15492,United Kingdom +581492,12/9/2019,22065,Christmas Pudding Trinket Pot,6.19,2,15492,United Kingdom +581492,12/9/2019,22068,Black Pirate Treasure Chest,6.19,1,15492,United Kingdom +581492,12/9/2019,22070,Small Red Retrospot Mug In Box,6.19,3,15492,United Kingdom +581492,12/9/2019,22071,Small White Retrospot Mug In Box,6.19,1,15492,United Kingdom +581492,12/9/2019,22074,6 Ribbons Shimmering Pinks,6.19,1,15492,United Kingdom +581492,12/9/2019,22075,6 Ribbons Elegant Christmas,6.19,8,15492,United Kingdom +581492,12/9/2019,22076,6 Ribbons Empire,6.19,4,15492,United Kingdom +581492,12/9/2019,22083,Paper Chain Kit Retrospot,6.19,1,15492,United Kingdom +581492,12/9/2019,22085,Paper Chain Kit Skulls,6.19,1,15492,United Kingdom +581492,12/9/2019,22086,Paper Chain Kit 50'S Christmas,6.19,38,15492,United Kingdom +581492,12/9/2019,22091,Empire Tissue Box,6.19,1,15492,United Kingdom +581492,12/9/2019,22099,Caravan Square Tissue Box,6.19,3,15492,United Kingdom +581492,12/9/2019,22104,Mirror Mosaic Candle Plate,6.19,4,15492,United Kingdom +581492,12/9/2019,22106,Mirror Mosaic Hurricane Lamp,6.19,1,15492,United Kingdom +581492,12/9/2019,22107,Pizza Plate In Box,6.19,10,15492,United Kingdom +581492,12/9/2019,22108,Ping! Microwave Plate,6.04,2,15492,United Kingdom +581492,12/9/2019,22109,Full English Breakfast Plate,6.04,2,15492,United Kingdom +581492,12/9/2019,22110,Bird House Hot Water Bottle,6.04,3,15492,United Kingdom +581492,12/9/2019,22111,Scottie Dog Hot Water Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,22112,Chocolate Hot Water Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,22114,Hot Water Bottle Tea And Sympathy,6.19,4,15492,United Kingdo +581492,12/9/2019,22116,Metal Sign His Dinner Is Served,6.19,2,15492,United Kingdom +581492,12/9/2019,22121,Noel Wooden Block Letters,6.19,1,15492,United Kingdom +581492,12/9/2019,22123,Ping Microwave Apron,6.19,1,15492,United Kingdom +581492,12/9/2019,22124,Set Of 2 Tea Towels Ping Microwave,6.19,1,15492,United Kingd +581492,12/9/2019,22129,Party Cones Candy Decoration,6.19,3,15492,United Kingdom +581492,12/9/2019,22134,Mini Ladle Love Heart Red,6.19,1,15492,United Kingdom +581492,12/9/2019,15036,Assorted Colours Silk Fan,6.19,1,15492,United Kingdom +581492,12/9/2019,15039,Sandalwood Fan,6.19,1,15492,United Kingdom +581492,12/9/2019,15058C,Ice Cream Design Garden Parasol,6.19,1,15492,United Kingdom +581492,12/9/2019,16218,Cartoon Pencil Sharpeners,6.19,5,15492,United Kingdom +581492,12/9/2019,16225,Rattle Snake Eggs,6.19,1,15492,United Kingdom +581492,12/9/2019,16235,Recycled Pencil With Rabbit Eraser,6.19,3,15492,United Kingd +581492,12/9/2019,16237,Sleeping Cat Erasers,6.19,1,15492,United Kingdom +581492,12/9/2019,17038,Porcelain Budah Incense Holder,6.19,1,15492,United Kingdom +581492,12/9/2019,17084N,Fairy Dreams Incense,6.19,1,15492,United Kingdom +581492,12/9/2019,20659,Economy Luggage Tag,6.19,7,15492,United Kingdom +581492,12/9/2019,20665,Red Retrospot Purse,6.19,2,15492,United Kingdom +581492,12/9/2019,20668,Disco Ball Christmas Decoration,6.19,1,15492,United Kingdom +581492,12/9/2019,20718,Red Retrospot Shopper Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,20719,Woodland Charlotte Bag,6.19,7,15492,United Kingdom +581492,12/9/2019,20723,Strawberry Charlotte Bag,6.19,2,15492,United Kingdom +581492,12/9/2019,20724,Red Retrospot Charlotte Bag,6.19,4,15492,United Kingdom +581492,12/9/2019,22135,Mini Ladle Love Heart Pink,6.19,6,15492,United Kingdom +581492,12/9/2019,22138,Baking Set 9 Piece Retrospot,6.19,1,15492,United Kingdom +581492,12/9/2019,22141,Christmas Craft Tree Top Angel,6.19,2,15492,United Kingdom +581492,12/9/2019,22150,3 Stripey Mice Feltcraft,7.24,2,15492,United Kingdom +581492,12/9/2019,22153,Angel Decoration Stars On Dress,7.24,2,15492,United Kingdom +581492,12/9/2019,22154,Angel Decoration 3 Buttons,7.24,3,15492,United Kingdom +581492,12/9/2019,22155,Star Decoration Rustic,7.24,7,15492,United Kingdom +581492,12/9/2019,22156,Heart Decoration With Pearls,7.24,4,15492,United Kingdom +581492,12/9/2019,22163,Heart String Memo Holder Hanging,7.24,9,15492,United Kingdom +581492,12/9/2019,22165,Diamante Heart Shaped Wall Mirror,7.24,1,15492,United Kingdo +581492,12/9/2019,22167,Oval Wall Mirror Diamante,7.24,1,15492,United Kingdom +581492,12/9/2019,22170,Picture Frame Wood Triple Portrait,7.24,1,15492,United Kingd +581492,12/9/2019,22173,Metal 4 Hook Hanger French Chateau,7.24,2,15492,United Kingd +581492,12/9/2019,22174,Photo Cube,6.19,7,15492,United Kingdom +581492,12/9/2019,22178,Victorian Glass Hanging T-Light,6.19,5,15492,United Kingdom +581492,12/9/2019,22186,Red Star Card Holder,7.24,2,15492,United Kingdom +581492,12/9/2019,22190,Local Cafe Mug,7.24,3,15492,United Kingdom +581492,12/9/2019,22193,Red Diner Wall Clock,7.24,1,15492,United Kingdom +581492,12/9/2019,22195,Large Heart Measuring Spoons,7.24,1,15492,United Kingdom +581492,12/9/2019,22196,Small Heart Measuring Spoons,7.24,11,15492,United Kingdom +581492,12/9/2019,22197,Popcorn Holder,7.24,34,15492,United Kingdom +581492,12/9/2019,22199,Frying Pan Red Retrospot,7.24,1,15492,United Kingdom +581492,12/9/2019,22209,Wood Stamp Set Happy Birthday,7.24,1,15492,United Kingdom +581492,12/9/2019,22212,Four Hook White Lovebirds,7.24,1,15492,United Kingdom +581492,12/9/2019,22219,Lovebird Hanging Decoration White,7.24,4,15492,United Kingdo +581492,12/9/2019,22224,White Lovebird Lantern,7.24,4,15492,United Kingdom +581492,12/9/2019,22227,Hanging Heart Mirror Decoration,7.24,1,15492,United Kingdom +581492,12/9/2019,22260,Felt Egg Cosy Blue Rabbit,6.39,2,15492,United Kingdom +581492,12/9/2019,22261,Felt Egg Cosy White Rabbit,7.24,1,15492,United Kingdom +581492,12/9/2019,22264,Felt Farm Animal White Bunny,7.24,1,15492,United Kingdom +581492,12/9/2019,22273,Feltcraft Doll Molly,7.24,2,15492,United Kingdom +581492,12/9/2019,22277,Cosmetic Bag Vintage Rose Paisley,7.24,1,15492,United Kingdo +581492,12/9/2019,22279,Pocket Bag Blue Paisley Red Spot,7.24,5,15492,United Kingdom +581492,12/9/2019,22280,Pocket Bag Pink Paisely Brown Spot,7.24,4,15492,United Kingd +581492,12/9/2019,22300,Coffee Mug Dog + Ball Design,7.24,1,15492,United Kingdom +581492,12/9/2019,22301,Coffee Mug Cat + Bird Design,7.24,1,15492,United Kingdom +581492,12/9/2019,22307,Gold Mug Bone China Tree Of Life,7.24,1,15492,United Kingdom +581492,12/9/2019,22308,Tea Cosy Blue Stripe,7.24,2,15492,United Kingdom +581492,12/9/2019,22309,Tea Cosy Red Stripe,7.24,2,15492,United Kingdom +581492,12/9/2019,22324,Blue Polkadot Kids Bag,7.24,2,15492,United Kingdom +581492,12/9/2019,22326,Round Snack Boxes Set Of4 Woodland,7.24,3,15492,United Kingd +581492,12/9/2019,22327,Round Snack Boxes Set Of 4 Skulls,7.24,2,15492,United Kingdo +581492,12/9/2019,22329,Round Container Set Of 5 Retrospot,6.19,2,15492,United Kingd +581492,12/9/2019,22338,Star Decoration Painted Zinc,6.19,4,15492,United Kingdom +581492,12/9/2019,22340,Noel Garland Painted Zinc,6.19,17,15492,United Kingdom +581492,12/9/2019,22342,Home Garland Painted Zinc,6.19,7,15492,United Kingdom +581492,12/9/2019,22348,Tea Bag Plate Red Retrospot,6.19,3,15492,United Kingdom +581492,12/9/2019,22355,Charlotte Bag Suki Design,6.19,3,15492,United Kingdom +581492,12/9/2019,22356,Charlotte Bag Pink Polkadot,6.19,1,15492,United Kingdom +581492,12/9/2019,22357,Kings Choice Biscuit Tin,6.19,2,15492,United Kingdom +581492,12/9/2019,22358,Kings Choice Tea Caddy,6.19,1,15492,United Kingdom +581492,12/9/2019,22361,Glass Jar Daisy Fresh Cotton Wool,6.19,2,15492,United Kingdo +581492,12/9/2019,22362,Glass Jar Peacock Bath Salts,6.19,2,15492,United Kingdom +581492,12/9/2019,22367,Childrens Apron Spaceboy Design,6.19,1,15492,United Kingdom +581492,12/9/2019,22372,Airline Bag Vintage World Champion,6.19,1,15492,United Kingd +581492,12/9/2019,22374,Airline Bag Vintage Jet Set Red,6.19,1,15492,United Kingdom +581492,12/9/2019,85014B,Red Retrospot Umbrella,6.19,1,15492,United Kingdom +581492,12/9/2019,85032C,Curious Images Gift Wrap Set,6.19,1,15492,United Kingdom +581492,12/9/2019,85038,6 Chocolate Love Heart T-Lights,6.19,1,15492,United Kingdom +581492,12/9/2019,85039A,Set/4 Red Mini Rose Candle In Bowl,6.19,5,15492,United King +581492,12/9/2019,85039B,S/4 Ivory Mini Rose Candle In Bowl,6.19,4,15492,United King +581492,12/9/2019,85040A,S/4 Pink Flower Candles In Bowl,6.19,1,15492,United Kingdom +581492,12/9/2019,85048,15cm Christmas Glass Ball 20 Lights,6.19,2,15492,United King +581492,12/9/2019,85049C,Romantic Pinks Ribbons,6.19,1,15492,United Kingdom +581492,12/9/2019,85049G,Chocolate Box Ribbons,6.19,1,15492,United Kingdom +581492,12/9/2019,85049H,Urban Black Ribbons,6.19,2,15492,United Kingdom +581492,12/9/2019,85053,French Enamel Candleholder,6.19,1,15492,United Kingdom +581492,12/9/2019,85059,French Enamel Water Basin,6.19,1,15492,United Kingdom +581492,12/9/2019,85066,Cream Sweetheart Mini Chest,6.19,1,15492,United Kingdom +581492,12/9/2019,85094,Candy Spot Egg Warmer Rabbit,6.19,2,15492,United Kingdom +581492,12/9/2019,85114C,Red Enchanted Forest Placemat,6.19,1,15492,United Kingdom +581492,12/9/2019,85123A,Cream Hanging Heart T-Light Holder,6.19,3,15492,United King +581492,12/9/2019,85131B,Beaded Crystal Heart Green On Stick,6.19,1,15492,United Kin +581492,12/9/2019,85131D,Beaded Crystal Heart Pink On Stick,6.19,2,15492,United King +581492,12/9/2019,85152,Hand Over The Chocolate Sign,6.19,1,15492,United Kingdom +581492,12/9/2019,85168B,Black Baroque Carriage Clock,6.19,3,15492,United Kingdom +581492,12/9/2019,85169C,Eau De Nil Love Bird Candle,6.19,1,15492,United Kingdom +581492,12/9/2019,85170C,Set/6 Eau De Nil Bird T-Lights,6.19,1,15492,United Kingdom +581492,12/9/2019,85173,Set/6 Frog Prince T-Light Candles,6.19,1,15492,United Kingdo +581492,12/9/2019,85177,Basket Of Flowers Sewing Kit,6.19,1,15492,United Kingdom +581492,12/9/2019,85178,Victorian Sewing Kit,6.19,1,15492,United Kingdom +581492,12/9/2019,85179A,Green Bitty Light Chain,6.19,4,15492,United Kingdom +581492,12/9/2019,85199S,Small Hanging Ivory/Red Wood Bird,6.19,9,15492,United Kingd +581492,12/9/2019,85227,Set Of 6 3d Kit Cards For Kids,6.19,3,15492,United Kingdom +581492,12/9/2019,90003C,Midnight Blue Pair Heart Hair Slide,6.19,1,15492,United Kin +581492,12/9/2019,90003E,Green Pair Heart Hair Slides,6.19,2,15492,United Kingdom +581492,12/9/2019,90010A,Midnight Blue Glass/Silver Bracelet,6.04,1,15492,United Kin +581492,12/9/2019,90013A,Midnight Blue Vintage Earrings,6.19,3,15492,United Kingdom +581492,12/9/2019,90013C,Green Vintage Earrings,6.19,2,15492,United Kingdom +581492,12/9/2019,90014A,Silver Mop Orbit Necklace,6.19,1,15492,United Kingdom +581492,12/9/2019,90016B,Gold/Mop Pendant Orbit Necklace,6.19,1,15492,United Kingdom +581492,12/9/2019,90018B,Gold Mop Orbit Drop Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90019B,Gold Mop Orbit Bracelet,6.19,1,15492,United Kingdom +581492,12/9/2019,90027D,Glass Bead Hoop Earrings Amethyst,6.19,1,15492,United Kingd +581492,12/9/2019,90030B,Red Kukui Coconut Seed Necklace,6.19,1,15492,United Kingdom +581492,12/9/2019,90055,Cracked Glaze Earrings Brown,6.19,1,15492,United Kingdom +581492,12/9/2019,90059A,Diamante Hair Grip Pack/2 Crystal,6.19,1,15492,United Kingd +581492,12/9/2019,90059D,Diamante Hair Grip Pack/2 Peridot,6.19,2,15492,United Kingd +581492,12/9/2019,90059E,Diamante Hair Grip Pack/2 Ruby,6.04,1,15492,United Kingdom +581492,12/9/2019,90059F,Diamante Hair Grip Pack/2 Lt Rose,6.19,1,15492,United Kingd +581492,12/9/2019,90072,Ruby Drop Chandelier Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90086,Crystal Frog Phone Charm,6.19,1,15492,United Kingdom +581492,12/9/2019,90120B,Blue Murano Twist Bracelet,6.19,2,15492,United Kingdom +581492,12/9/2019,90120C,Green Murano Twist Bracelet,6.19,1,15492,United Kingdom +581492,12/9/2019,90130B,Turq Stone/Crystal Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90130C,Green Stone/Crystal Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90134,Old Rose Combo Bead Necklace,6.19,1,15492,United Kingdom +581492,12/9/2019,90138,White/Pink Mini Crystals Necklace,6.19,1,15492,United Kingdo +581492,12/9/2019,90141B,Ivory Pendant Triple Shell Necklace,6.19,1,15492,United Kin +581492,12/9/2019,90145,Silver Hoop Earrings With Flower,6.19,1,15492,United Kingdom +581492,12/9/2019,90155,Resin Necklace W Pastel Beads,6.19,1,15492,United Kingdom +581492,12/9/2019,90161D,Ant Copper Pink Boudicca Bracelet,6.19,1,15492,United Kingd +581492,12/9/2019,90163A,Pink Rosebud & Pearl Necklace,6.19,2,15492,United Kingdom +581492,12/9/2019,90165B,White Rosebud Pearl Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90168,2 Daisies Hair Comb,6.19,1,15492,United Kingdom +581492,12/9/2019,90169,Daisy Hair Comb,6.19,1,15492,United Kingdom +581492,12/9/2019,90170,Daisy Hair Band,6.19,1,15492,United Kingdom +581492,12/9/2019,90174,Butterfly Hair Band,6.19,2,15492,United Kingdom +581492,12/9/2019,90175A,White Glass Chunky Charm Bracelet,6.19,2,15492,United Kingd +581492,12/9/2019,90175D,Tigris Eye Chunky Charm Bracelet,6.19,1,15492,United Kingdo +581492,12/9/2019,90177A,Classic Diamante Earrings Jet,6.19,1,15492,United Kingdom +581492,12/9/2019,90177C,Drop Diamante Earrings Crystal,6.19,1,15492,United Kingdom +581492,12/9/2019,90181B,Amethyst Glass/Shell/Pearl Necklace,6.04,1,15492,United Kin +581492,12/9/2019,90182C,Black 3 Bead Drop Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90183A,Amber Drop Earrings W Long Beads,6.19,2,15492,United Kingdo +581492,12/9/2019,90183C,Black Drop Earrings W Long Beads,6.19,1,15492,United Kingdo +581492,12/9/2019,90184C,Black Chunky Bead Bracelet W Strap,6.19,1,15492,United King +581492,12/9/2019,90185B,Amethyst Diamante Expandable Ring,6.19,1,15492,United Kingd +581492,12/9/2019,90188,Drop Earrings W Flower & Leaf,6.19,2,15492,United Kingdom +581492,12/9/2019,90191,Silver Lariat 40cm,6.19,2,15492,United Kingdom +581492,12/9/2019,90192,Jade Drop Earrings W Filigree,6.19,1,15492,United Kingdom +581492,12/9/2019,90198A,Vintage Rose Bead Bracelet Raspberr,6.19,2,15492,United Kin +581492,12/9/2019,90200A,Purple Sweetheart Bracelet,6.19,1,15492,United Kingdom +581492,12/9/2019,90201A,Purple Enamel Flower Ring,6.19,2,15492,United Kingdom +581492,12/9/2019,90201B,Black Enamel Flower Ring,6.19,1,15492,United Kingdom +581492,12/9/2019,90201C,Red Enamel Flower Ring,6.19,1,15492,United Kingdom +581492,12/9/2019,90201D,Green Enamel Flower Ring,6.19,1,15492,United Kingdom +581492,12/9/2019,90202C,Green Enamel Flower Hair Tie,6.19,1,15492,United Kingdom +581492,12/9/2019,90202D,Pink Enamel Flower Hair Tie,6.19,1,15492,United Kingdom +581492,12/9/2019,90206C,Crystal Diamante Star Brooch,6.19,1,15492,United Kingdom +581492,12/9/2019,90208,Pair Of Pink Flower Cluster Slide,6.19,1,15492,United Kingdo +581492,12/9/2019,90210A,Grey Acrylic Faceted Bangle,6.19,1,15492,United Kingdom +581492,12/9/2019,22378,Wall Tidy Retrospot,6.19,2,15492,United Kingdom +581492,12/9/2019,22379,Recycling Bag Retrospot,6.19,1,15492,United Kingdom +581492,12/9/2019,22380,Toy Tidy Spaceboy,6.19,2,15492,United Kingdom +581492,12/9/2019,22396,Magnets Pack Of 4 Retro Photo,6.19,1,15492,United Kingdom +581492,12/9/2019,22411,Jumbo Shopper Vintage Red Paisley,6.19,1,15492,United Kingdo +581492,12/9/2019,22418,10 Colour Spaceboy Pen,6.19,3,15492,United Kingdom +581492,12/9/2019,22419,Lipstick Pen Red,6.19,3,15492,United Kingdom +581492,12/9/2019,22420,Lipstick Pen Baby Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,22421,Lipstick Pen Fuschia,6.19,2,15492,United Kingdom +581492,12/9/2019,22422,Toothpaste Tube Pen,6.19,4,15492,United Kingdom +581492,12/9/2019,22437,Set Of 9 Black Skull Balloons,7.24,1,15492,United Kingdom +581492,12/9/2019,22441,Grow Your Own Basil In Enamel Mug,7.24,1,15492,United Kingdo +581492,12/9/2019,22446,Pin Cushion Babushka Pink,7.24,7,15492,United Kingdom +581492,12/9/2019,22457,Natural Slate Heart Chalkboard,7.24,1,15492,United Kingdom +581492,12/9/2019,22464,Hanging Metal Heart Lantern,7.24,1,15492,United Kingdom +581492,12/9/2019,22466,Fairy Tale Cottage Night Light,7.24,1,15492,United Kingdom +581492,12/9/2019,22467,Gumball Coat Rack,7.24,1,15492,United Kingdom +581492,12/9/2019,22478,Birdhouse Garden Marker,7.24,1,15492,United Kingdom +581492,12/9/2019,22486,Plasmatronic Lamp,7.24,1,15492,United Kingdom +581492,12/9/2019,22488,Natural Slate Rectangle Chalkboard,7.24,1,15492,United Kingd +581492,12/9/2019,22489,Pack Of 12 Traditional Crayons,7.24,5,15492,United Kingdom +581492,12/9/2019,22495,Set Of 2 Round Tins Camembert,7.24,1,15492,United Kingdom +581492,12/9/2019,22540,Mini Jigsaw Circus Parade,7.24,1,15492,United Kingdom +581492,12/9/2019,22544,Mini Jigsaw Spaceboy,7.24,1,15492,United Kingdom +581492,12/9/2019,22549,Picture Dominoes,7.24,3,15492,United Kingdom +581492,12/9/2019,22551,Plasters In Tin Spaceboy,7.24,2,15492,United Kingdom +581492,12/9/2019,22553,Plasters In Tin Skulls,7.24,2,15492,United Kingdom +581492,12/9/2019,22554,Plasters In Tin Woodland Animals,7.24,3,15492,United Kingdom +581492,12/9/2019,22555,Plasters In Tin Strongman,7.24,3,15492,United Kingdom +581492,12/9/2019,22557,Plasters In Tin Vintage Paisley,7.24,2,15492,United Kingdom +581492,12/9/2019,22558,Clothes Pegs Retrospot Pack 24,7.24,3,15492,United Kingdom +581492,12/9/2019,22560,Traditional Modelling Clay,7.24,5,15492,United Kingdom +581492,12/9/2019,22565,Feltcraft Hairbands Pink And White,7.24,4,15492,United Kingd +581492,12/9/2019,22566,Feltcraft Hairband Pink And Purple,7.24,3,15492,United Kingd +581492,12/9/2019,22571,Rocking Horse Red Christmas,7.24,4,15492,United Kingdom +581492,12/9/2019,22573,Star Wooden Christmas Decoration,6.39,2,15492,United Kingdom +581492,12/9/2019,22574,Heart Wooden Christmas Decoration,7.24,5,15492,United Kingdo +581492,12/9/2019,22576,Swallow Wooden Christmas Decoration,7.24,3,15492,United King +581492,12/9/2019,22577,Wooden Heart Christmas Scandinavian,7.24,4,15492,United King +581492,12/9/2019,22578,Wooden Star Christmas Scandinavian,7.24,19,15492,United King +581492,12/9/2019,22580,Advent Calendar Gingham Sack,7.24,9,15492,United Kingdom +581492,12/9/2019,22581,Wood Stocking Christmas Scandispot,7.24,11,15492,United King +581492,12/9/2019,22585,Pack Of 6 Birdy Gift Tags,7.24,2,15492,United Kingdom +581492,12/9/2019,22586,Feltcraft Hairband Pink And Blue,7.24,2,15492,United Kingdom +581492,12/9/2019,22589,Cardholder Gingham Star,7.24,6,15492,United Kingdom +581492,12/9/2019,22591,Cardholder Gingham Christmas Tree,7.24,1,15492,United Kingdo +581492,12/9/2019,22592,Cardholder Holly Wreath Metal,7.24,3,15492,United Kingdom +581492,12/9/2019,22593,Christmas Gingham Star,6.39,2,15492,United Kingdom +581492,12/9/2019,22594,Christmas Gingham Tree,7.24,3,15492,United Kingdom +581492,12/9/2019,22597,Musical Zinc Heart Decoration,7.24,9,15492,United Kingdom +581492,12/9/2019,22598,Christmas Musical Zinc Tree,7.24,4,15492,United Kingdom +581492,12/9/2019,22599,Christmas Musical Zinc Star,6.19,5,15492,United Kingdom +581492,12/9/2019,22600,Christmas Retrospot Star Wood,6.19,2,15492,United Kingdom +581492,12/9/2019,22601,Christmas Retrospot Angel Wood,6.19,3,15492,United Kingdom +581492,12/9/2019,22602,Retrospot Wooden Heart Decoration,6.19,3,15492,United Kingdo +581492,12/9/2019,22608,Pens Assorted Funky Jeweled,6.19,3,15492,United Kingdom +581492,12/9/2019,22614,Pack Of 12 Spaceboy Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,22615,Pack Of 12 Circus Parade Tissues,6.19,4,15492,United Kingdom +581492,12/9/2019,22616,Pack Of 12 London Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,22619,Set Of 6 Soldier Skittles,6.19,4,15492,United Kingdom +581492,12/9/2019,22620,4 Traditional Spinning Tops,6.19,3,15492,United Kingdom +581492,12/9/2019,22621,Traditional Knitting Nancy,6.19,2,15492,United Kingdom +581492,12/9/2019,22629,Spaceboy Lunch Box,6.19,1,15492,United Kingdom +581492,12/9/2019,22630,Dolly Girl Lunch Box,6.19,1,15492,United Kingdom +581492,12/9/2019,22632,Hand Warmer Red Retrospot,6.19,1,15492,United Kingdom +581492,12/9/2019,22633,Hand Warmer Union Jack,6.19,1,15492,United Kingdom +581492,12/9/2019,22634,Childs Breakfast Set Spaceboy,6.19,1,15492,United Kingdom +581492,12/9/2019,22650,Ceramic Pirate Chest Money Bank,6.19,2,15492,United Kingdom +581492,12/9/2019,22651,Gentleman Shirt Repair Kit,6.19,1,15492,United Kingdom +581492,12/9/2019,22653,Button Box,6.19,16,15492,United Kingdom +581492,12/9/2019,22654,Deluxe Sewing Kit,6.19,2,15492,United Kingdom +581492,12/9/2019,22659,Lunch Box I Love London,6.19,1,15492,United Kingdom +581492,12/9/2019,22666,Recipe Box Pantry Yellow Design,6.19,5,15492,United Kingdom +581492,12/9/2019,22693,Grow A Flytrap Or Sunflower In Tin,6.19,3,15492,United Kingd +581492,12/9/2019,22694,Wicker Star,6.19,1,15492,United Kingdom +581492,12/9/2019,22697,Green Regency Teacup And Saucer,6.19,1,15492,United Kingdom +581492,12/9/2019,22699,Roses Regency Teacup And Saucer,6.19,2,15492,United Kingdom +581492,12/9/2019,22701,Pink Dog Bowl,6.19,5,15492,United Kingdom +581492,12/9/2019,22703,Pink Cat Bowl,6.19,6,15492,United Kingdom +581492,12/9/2019,22712,Card Dolly Girl,6.19,1,15492,United Kingdom +581492,12/9/2019,22713,Card I Love London,6.19,1,15492,United Kingdom +581492,12/9/2019,22714,Card Birthday Cowboy,6.19,2,15492,United Kingdom +581492,12/9/2019,22716,Card Circus Parade,6.19,3,15492,United Kingdom +581492,12/9/2019,22717,Card Dog And Ball,6.19,1,15492,United Kingdom +581492,12/9/2019,22720,Set Of 3 Cake Tins Pantry Design,6.19,2,15492,United Kingdom +581492,12/9/2019,22725,Alarm Clock Bakelike Chocolate,6.19,1,15492,United Kingdom +581492,12/9/2019,22726,Alarm Clock Bakelike Green,6.19,4,15492,United Kingdom +581492,12/9/2019,22727,Alarm Clock Bakelike Red,6.19,4,15492,United Kingdom +581492,12/9/2019,22730,Alarm Clock Bakelike Ivory,6.19,1,15492,United Kingdom +581492,12/9/2019,22741,Funky Diva Pen,6.19,4,15492,United Kingdom +581492,12/9/2019,22745,Poppy's Playhouse Bedroom,6.19,2,15492,United Kingdom +581492,12/9/2019,22748,Poppy's Playhouse Kitchen,6.19,1,15492,United Kingdom +581492,12/9/2019,22749,Feltcraft Princess Charlotte Doll,6.19,1,15492,United Kingdo +581492,12/9/2019,22751,Feltcraft Princess Olivia Doll,6.19,2,15492,United Kingdom +581492,12/9/2019,22753,Small Yellow Babushka Notebook,6.19,1,15492,United Kingdom +581492,12/9/2019,22754,Small Red Babushka Notebook,6.19,1,15492,United Kingdom +581492,12/9/2019,22757,Large Red Babushka Notebook,6.19,3,15492,United Kingdom +581492,12/9/2019,22758,Large Purple Babushka Notebook,6.19,2,15492,United Kingdom +581492,12/9/2019,22763,Key Cabinet Ma Campagne,6.19,1,15492,United Kingdom +581492,12/9/2019,22768,Family Photo Frame Cornice,6.19,2,15492,United Kingdom +581492,12/9/2019,22776,Sweetheart 3 Tier Cake Stand,6.19,1,15492,United Kingdom +581492,12/9/2019,22795,Sweetheart Recipe Book Stand,6.19,1,15492,United Kingdom +581492,12/9/2019,22798,Antique Glass Dressing Table Pot,6.19,3,15492,United Kingdom +581492,12/9/2019,22800,Antique Tall Swirlglass Trinket Pot,6.19,3,15492,United King +581492,12/9/2019,22809,Set Of 6 T-Lights Santa,6.19,1,15492,United Kingdom +581492,12/9/2019,22811,Set Of 6 T-Lights Cacti,6.19,1,15492,United Kingdom +581492,12/9/2019,22814,Card Party Games,6.19,9,15492,United Kingdom +581492,12/9/2019,22815,Card Psychedelic Apples,6.19,18,15492,United Kingdom +581492,12/9/2019,22816,Card Motorbike Santa,6.19,2,15492,United Kingdom +581492,12/9/2019,22817,Card Suki Birthday,6.19,5,15492,United Kingdom +581492,12/9/2019,22818,Card Christmas Village,7.24,6,15492,United Kingdom +581492,12/9/2019,22819,Birthday Card Retro Spot,7.24,3,15492,United Kingdom +581492,12/9/2019,22835,Hot Water Bottle I Am So Poorly,7.24,3,15492,United Kingdom +581492,12/9/2019,22865,Hand Warmer Owl Design,7.24,2,15492,United Kingdom +581492,12/9/2019,22866,Hand Warmer Scotty Dog Design,7.24,3,15492,United Kingdom +581492,12/9/2019,22867,Hand Warmer Bird Design,7.24,4,15492,United Kingdom +581492,12/9/2019,22881,Number Tile Vintage Font 2,7.24,1,15492,United Kingdom +581492,12/9/2019,22885,Number Tile Vintage Font 6,7.24,1,15492,United Kingdom +581492,12/9/2019,22888,Number Tile Vintage Font 9,7.24,1,15492,United Kingdom +581492,12/9/2019,22890,Novelty Biscuits Cake Stand 3 Tier,7.24,1,15492,United Kingd +581492,12/9/2019,22898,Childrens Apron Apples Design,7.24,1,15492,United Kingdom +581492,12/9/2019,22899,Children's Apron Dolly Girl,7.24,2,15492,United Kingdom +581492,12/9/2019,22900,Set 2 Tea Towels I Love London,7.24,3,15492,United Kingdom +581492,12/9/2019,22905,Calendar In Season Design,7.24,1,15492,United Kingdom +581492,12/9/2019,22907,Pack Of 20 Napkins Pantry Design,6.39,1,15492,United Kingdom +581492,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,7.24,5,15492,United King +581492,12/9/2019,22910,Paper Chain Kit Vintage Christmas,7.24,7,15492,United Kingdo +581492,12/9/2019,22914,Blue Coat Rack Paris Fashion,7.24,1,15492,United Kingdom +581492,12/9/2019,22922,Fridge Magnets Us Diner Assorted,7.24,6,15492,United Kingdom +581492,12/9/2019,22924,Fridge Magnets La Vie En Rose,7.24,6,15492,United Kingdom +581492,12/9/2019,22928,Yellow Giant Garden Thermometer,7.24,1,15492,United Kingdom +581492,12/9/2019,22940,Feltcraft Christmas Fairy,6.19,1,15492,United Kingdom +581492,12/9/2019,22941,Christmas Lights 10 Reindeer,6.19,2,15492,United Kingdom +581492,12/9/2019,22943,Christmas Lights 10 Vintage Baubles,6.19,1,15492,United King +581492,12/9/2019,22948,Metal Decoration Naughty Children,6.19,4,15492,United Kingdo +581492,12/9/2019,22951,60 Cake Cases Dolly Girl Design,6.19,2,15492,United Kingdom +581492,12/9/2019,22952,60 Cake Cases Vintage Christmas,6.19,2,15492,United Kingdom +581492,12/9/2019,22955,36 Foil Star Cake Cases,6.19,1,15492,United Kingdom +581492,12/9/2019,22960,Jam Making Set With Jars,6.19,2,15492,United Kingdom +581492,12/9/2019,22961,Jam Making Set Printed,6.19,9,15492,United Kingdom +581492,12/9/2019,22962,Jam Jar With Pink Lid,6.19,3,15492,United Kingdom +581492,12/9/2019,22963,Jam Jar With Green Lid,6.19,3,15492,United Kingdom +581492,12/9/2019,22964,3 Piece Spaceboy Cookie Cutter Set,6.19,1,15492,United Kingd +581492,12/9/2019,22965,3 Traditional Biscuit Cutters Set,6.19,1,15492,United Kingdo +581492,12/9/2019,22966,Gingerbread Man Cookie Cutter,6.19,4,15492,United Kingdom +581492,12/9/2019,22969,Homemade Jam Scented Candles,6.19,6,15492,United Kingdom +581492,12/9/2019,22975,Spaceboy Childrens Egg Cup,6.19,2,15492,United Kingdom +581492,12/9/2019,22976,Circus Parade Childrens Egg Cup,6.19,1,15492,United Kingdom +581492,12/9/2019,22977,Dolly Girl Childrens Egg Cup,6.19,1,15492,United Kingdom +581492,12/9/2019,22979,Pantry Washing Up Brush,6.19,2,15492,United Kingdom +581492,12/9/2019,22980,Pantry Scrubbing Brush,6.19,1,15492,United Kingdom +581492,12/9/2019,22982,Pantry Pastry Brush,6.19,3,15492,United Kingdom +581492,12/9/2019,22983,Card Billboard Font,6.19,1,15492,United Kingdom +581492,12/9/2019,22984,Card Gingham Rose,6.19,1,15492,United Kingdom +581492,12/9/2019,22988,Soldiers Egg Cup,6.19,1,15492,United Kingdom +581492,12/9/2019,22989,Set 2 Pantry Design Tea Towels,6.19,2,15492,United Kingdom +581492,12/9/2019,22992,Revolver Wooden Ruler,6.19,3,15492,United Kingdom +581492,12/9/2019,22993,Set Of 4 Pantry Jelly Moulds,6.19,3,15492,United Kingdom +581492,12/9/2019,22995,Travel Card Wallet Suki,6.19,4,15492,United Kingdom +581492,12/9/2019,22996,Travel Card Wallet Vintage Ticket,6.19,5,15492,United Kingdo +581492,12/9/2019,22997,Travel Card Wallet Union Jack,6.19,1,15492,United Kingdom +581492,12/9/2019,22998,Travel Card Wallet Keep Calm,6.19,4,15492,United Kingdom +581492,12/9/2019,22999,Travel Card Wallet Vintage Leaf,6.19,1,15492,United Kingdom +581492,12/9/2019,23005,Travel Card Wallet I Love London,6.19,4,15492,United Kingdom +581492,12/9/2019,23007,Spaceboy Baby Gift Set,6.19,1,15492,United Kingdom +581492,12/9/2019,23009,I Love London Baby Gift Set,6.19,2,15492,United Kingdom +581492,12/9/2019,23012,Glass Apothecary Bottle Perfume,6.19,1,15492,United Kingdom +581492,12/9/2019,23013,Glass Apothecary Bottle Tonic,6.19,2,15492,United Kingdom +581492,12/9/2019,23014,Glass Apothecary Bottle Elixir,6.19,1,15492,United Kingdom +581492,12/9/2019,23050,Recycled Acapulco Mat Green,6.19,1,15492,United Kingdom +581492,12/9/2019,23051,Recycled Acapulco Mat Blue,6.19,1,15492,United Kingdom +581492,12/9/2019,23052,Recycled Acapulco Mat Turquoise,6.19,5,15492,United Kingdom +581492,12/9/2019,23053,Recycled Acapulco Mat Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,23054,Recycled Acapulco Mat Lavender,6.19,1,15492,United Kingdom +581492,12/9/2019,23074,Embossed Heart Trinket Box,6.19,1,15492,United Kingdom +581492,12/9/2019,23076,Ice Cream Sundae Lip Gloss,6.19,3,15492,United Kingdom +581492,12/9/2019,23077,Doughnut Lip Gloss,6.19,3,15492,United Kingdom +581492,12/9/2019,23082,Set 6 Paper Table Lantern Hearts,6.19,1,15492,United Kingdom +581492,12/9/2019,23083,Set 6 Paper Table Lantern Stars,6.19,1,15492,United Kingdom +581492,12/9/2019,23084,Rabbit Night Light,6.19,57,15492,United Kingdom +581492,12/9/2019,23088,Zinc Heart Flower T-Light Holder,6.19,1,15492,United Kingdom +581492,12/9/2019,23089,Glass Bon Bon Jar,6.19,4,15492,United Kingdom +581492,12/9/2019,23093,Small Parisienne Heart Photo Frame,6.19,3,15492,United Kingd +581492,12/9/2019,23103,Jingle Bell Heart Decoration,6.19,2,15492,United Kingdom +581492,12/9/2019,23110,Parisienne Key Cabinet,6.19,1,15492,United Kingdom +581492,12/9/2019,23111,Parisienne Sewing Box,6.19,1,15492,United Kingdom +581492,12/9/2019,23112,Parisienne Curio Cabinet,6.19,1,15492,United Kingdom +581492,12/9/2019,23118,Parisienne Jewellery Drawer,6.19,1,15492,United Kingdom +581492,12/9/2019,23158,Set Of 5 Lucky Cat Magnets,6.19,1,15492,United Kingdom +581492,12/9/2019,23165,Large Ceramic Top Storage Jar,6.19,2,15492,United Kingdom +581492,12/9/2019,23166,Medium Ceramic Top Storage Jar,6.19,2,15492,United Kingdom +581492,12/9/2019,23168,Classic Cafe Sugar Dispenser,6.19,2,15492,United Kingdom +581492,12/9/2019,23171,Regency Tea Plate Green,6.19,1,15492,United Kingdom +581492,12/9/2019,23172,Regency Tea Plate Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,23173,Regency Teapot Roses,6.19,1,15492,United Kingdom +581492,12/9/2019,23175,Regency Milk Jug Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,23177,Treasure Island Book Box,6.19,1,15492,United Kingdom +581492,12/9/2019,23183,Mother's Kitchen Spoon Rest,6.19,3,15492,United Kingdom +581492,12/9/2019,23184,Bull Dog Bottle Opener,6.19,2,15492,United Kingdom +581492,12/9/2019,23188,Vintage 2 Metre Folding Ruler,6.19,1,15492,United Kingdom +581492,12/9/2019,23191,Bundle Of 3 Retro Note Books,6.19,1,15492,United Kingdom +581492,12/9/2019,23194,Gymkhana Treasure Book Box,6.19,1,15492,United Kingdom +581492,12/9/2019,23196,Vintage Leaf Magnetic Notepad,6.19,1,15492,United Kingdom +581492,12/9/2019,23197,Sketchbook Magnetic Shopping List,6.19,2,15492,United Kingdo +581492,12/9/2019,23198,Pantry Magnetic Shopping List,6.19,2,15492,United Kingdom +581492,12/9/2019,23204,Charlotte Bag Apples Design,6.19,6,15492,United Kingdom +581492,12/9/2019,23205,Charlotte Bag Vintage Alphabet,6.19,3,15492,United Kingdom +581492,12/9/2019,23212,Heart Wreath Decoration With Bell,6.19,7,15492,United Kingdo +581492,12/9/2019,23213,Star Wreath Decoration With Bell,6.19,7,15492,United Kingdom +581492,12/9/2019,23220,Reindeer Heart Decoration Gold,6.19,2,15492,United Kingdom +581492,12/9/2019,23224,Cherub Heart Decoration Gold,6.19,1,15492,United Kingdom +581492,12/9/2019,23229,Vintage Donkey Tail Game,6.19,2,15492,United Kingdom +581492,12/9/2019,23234,Biscuit Tin Vintage Christmas,6.19,4,15492,United Kingdom +581492,12/9/2019,23241,Treasure Tin Gymkhana Design,6.19,3,15492,United Kingdom +581492,12/9/2019,23243,Set Of Tea Coffee Sugar Tins Pantry,6.19,1,15492,United King +581492,12/9/2019,23245,Set Of 3 Regency Cake Tins,6.19,7,15492,United Kingdom +581492,12/9/2019,23247,Biscuit Tin 50'S Christmas,6.19,3,15492,United Kingdom +581492,12/9/2019,23264,Set Of 3 Wooden Sleigh Decorations,6.19,3,15492,United Kingd +581492,12/9/2019,23265,Set Of 3 Wooden Tree Decorations,6.19,3,15492,United Kingdom +581492,12/9/2019,23266,Set Of 3 Wooden Stocking Decoration,6.19,2,15492,United King +581492,12/9/2019,23274,Star T-Light Holder Willie Winkie,6.19,3,15492,United Kingdo +581492,12/9/2019,23275,Set Of 3 Hanging Owls Ollie Beak,6.19,2,15492,United Kingdom +581492,12/9/2019,23280,Folding Butterfly Mirror Hot Pink,6.19,2,15492,United Kingdo +581492,12/9/2019,23284,Doormat Keep Calm And Come In,6.19,1,15492,United Kingdom +581492,12/9/2019,23285,Pink Vintage Spot Beaker,6.19,1,15492,United Kingdom +581492,12/9/2019,23287,Red Vintage Spot Beaker,6.19,1,15492,United Kingdom +581492,12/9/2019,23290,Spaceboy Childrens Bowl,6.19,1,15492,United Kingdom +581492,12/9/2019,23292,Spaceboy Childrens Cup,6.19,1,15492,United Kingdom +581492,12/9/2019,23293,Set Of 12 Fairy Cake Baking Cases,6.19,3,15492,United Kingdo +581492,12/9/2019,23294,Set Of 6 Snack Loaf Baking Cases,6.19,1,15492,United Kingdom +581492,12/9/2019,23295,Set Of 12 Mini Loaf Baking Cases,6.19,4,15492,United Kingdom +581492,12/9/2019,23298,Spotty Bunting,6.19,2,15492,United Kingdom +581492,12/9/2019,23299,Food Cover With Beads Set 2,6.19,1,15492,United Kingdom +581492,12/9/2019,23300,Gardeners Kneeling Pad Cup Of Tea,6.19,3,15492,United Kingdo +581492,12/9/2019,23301,Gardeners Kneeling Pad Keep Calm,6.19,6,15492,United Kingdom +581492,12/9/2019,23307,Set Of 60 Pantry Design Cake Cases,6.19,7,15492,United Kingd +581492,12/9/2019,23308,Set Of 60 Vintage Leaf Cake Cases,6.19,1,15492,United Kingdo +581492,12/9/2019,23309,Set Of 60 I Love London Cake Cases,6.19,2,15492,United Kingd +581492,12/9/2019,23310,Bubblegum Ring Assorted,6.19,4,15492,United Kingdom +581492,12/9/2019,23311,Vintage Christmas Stocking,6.19,1,15492,United Kingdom +581492,12/9/2019,23312,Vintage Christmas Gift Sack,6.19,6,15492,United Kingdom +581492,12/9/2019,23313,Vintage Christmas Bunting,6.19,4,15492,United Kingdom +581492,12/9/2019,23314,Vintage Christmas Tablecloth,6.19,1,15492,United Kingdom +581492,12/9/2019,23319,Box Of 6 Mini 50'S Crackers,6.19,3,15492,United Kingdom +581492,12/9/2019,23322,Large White Heart Of Wicker,6.19,1,15492,United Kingdom +581492,12/9/2019,23323,White Wicker Star,6.19,6,15492,United Kingdom +581492,12/9/2019,23328,Set 6 School Milk Bottles In Crate,6.19,5,15492,United Kingd +581492,12/9/2019,23332,Ivory Wicker Heart Large,6.19,1,15492,United Kingdom +581492,12/9/2019,23334,Ivory Wicker Heart Small,6.19,1,15492,United Kingdom +581492,12/9/2019,23336,Egg Frying Pan Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,23340,Vintage Christmas Cake Frill,6.19,3,15492,United Kingdom +581492,12/9/2019,23345,Dolly Girl Beaker,6.19,1,15492,United Kingdom +581492,12/9/2019,23347,I Love London Beaker,6.19,1,15492,United Kingdom +581492,12/9/2019,23349,Roll Wrap Vintage Christmas,6.19,2,15492,United Kingdom +581492,12/9/2019,23351,Roll Wrap 50'S Christmas,6.19,5,15492,United Kingdom +581492,12/9/2019,23352,Roll Wrap 50'S Red Christmas,6.19,1,15492,United Kingdom +581492,12/9/2019,23353,6 Gift Tags Vintage Christmas,6.19,3,15492,United Kingdom +581492,12/9/2019,23354,6 Gift Tags 50'S Christmas,6.19,4,15492,United Kingdom +581492,12/9/2019,23357,Hot Water Bottle Sex Bomb,6.19,1,15492,United Kingdom +581492,12/9/2019,23358,Hot Stuff Hot Water Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,23365,Set 12 Colour Pencils Love London,6.19,1,15492,United Kingdo +581492,12/9/2019,23366,Set 12 Colouring Pencils Doily,6.04,5,15492,United Kingdom +581492,12/9/2019,23367,Set 12 Colour Pencils Spaceboy,6.04,10,15492,United Kingdom +581492,12/9/2019,23368,Set 12 Colour Pencils Dolly Girl,6.19,2,15492,United Kingdom +581492,12/9/2019,23581,Jumbo Bag Paisley Park,6.19,3,15492,United Kingdom +581492,12/9/2019,21928,Jumbo Bag Scandinavian Blue Paisley,6.19,2,15492,United King +581492,12/9/2019,21929,Jumbo Bag Pink Vintage Paisley,6.19,1,15492,United Kingdom +581492,12/9/2019,85099C,Jumbo Bag Baroque Black White,6.19,7,15492,United Kingdom +581492,12/9/2019,23199,Jumbo Bag Apples,6.19,2,15492,United Kingdom +581492,12/9/2019,23200,Jumbo Bag Pears,6.19,1,15492,United Kingdom +581492,12/9/2019,23202,Jumbo Bag Vintage Leaf,6.19,2,15492,United Kingdom +581492,12/9/2019,23343,Jumbo Bag Vintage Christmas,6.19,4,15492,United Kingdom +581492,12/9/2019,23344,Jumbo Bag 50'S Christmas,6.19,5,15492,United Kingdom +581492,12/9/2019,23583,Lunch Bag Paisley Park,6.19,2,15492,United Kingdom +581492,12/9/2019,20727,Lunch Bag Black Skull,6.04,2,15492,United Kingdom +581492,12/9/2019,20728,Lunch Bag Cars Blue,6.04,1,15492,United Kingdom +581492,12/9/2019,20725,Lunch Bag Red Retrospot,6.19,1,15492,United Kingdom +581492,12/9/2019,20726,Lunch Bag Woodland,6.19,1,15492,United Kingdom +581492,12/9/2019,22662,Lunch Bag Dolly Girl Design,6.19,1,15492,United Kingdom +581492,12/9/2019,23206,Lunch Bag Apple Design,6.19,3,15492,United Kingdom +581492,12/9/2019,23208,Lunch Bag Vintage Leaf Design,6.19,3,15492,United Kingdom +581492,12/9/2019,23375,50'S Christmas Paper Gift Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,23437,50'S Christmas Gift Bag Large,6.19,1,15492,United Kingdom +581492,12/9/2019,22821,Gift Bag Psychedelic Apples,7.24,3,15492,United Kingdom +581493,12/9/2019,79190B,Retro Plastic Polka Tray,7.24,15,12423,Belgium +581493,12/9/2019,79190A,Retro Plastic 70'S Tray,7.24,15,12423,Belgium +581493,12/9/2019,22915,Assorted Bottle Top Magnets,7.24,12,12423,Belgium +581493,12/9/2019,22151,Place Setting White Heart,7.24,24,12423,Belgium +581493,12/9/2019,22632,Hand Warmer Red Retrospot,7.24,12,12423,Belgium +581493,12/9/2019,22865,Hand Warmer Owl Design,7.24,12,12423,Belgium +581493,12/9/2019,20718,Red Retrospot Shopper Bag,7.24,10,12423,Belgium +581493,12/9/2019,79190B,Retro Plastic Polka Tray,7.24,12,12423,Belgium +581493,12/9/2019,71459,Hanging Jam Jar T-Light Holders,7.24,12,12423,Belgium +581493,12/9/2019,84945,Multi Colour Silver T-Light Holder,7.24,12,12423,Belgium +581493,12/9/2019,22356,Charlotte Bag Pink Polkadot,7.24,10,12423,Belgium +581493,12/9/2019,20724,Red Retrospot Charlotte Bag,7.24,10,12423,Belgium +581493,12/9/2019,23204,Charlotte Bag Apples Design,7.24,10,12423,Belgium +581493,12/9/2019,21108,Fairy Cake Flannel Assorted Colour,7.24,18,12423,Belgium +581493,12/9/2019,22252,Birdcage Decoration Tealight Holder,7.24,12,12423,Belgium +581493,12/9/2019,22807,Set Of 6 T-Lights Toadstools,6.19,6,12423,Belgium +581494,12/9/2019,23084,Rabbit Night Light,6.19,24,12518,Germany +581494,12/9/2019,21559,Strawberry Lunch Box With Cutlery,6.19,6,12518,Germany +581494,12/9/2019,21506,Fancy Font Birthday Card,6.19,12,12518,Germany +581494,12/9/2019,22716,Card Circus Parade,6.19,12,12518,Germany +581494,12/9/2019,22556,Plasters In Tin Circus Parade,6.19,12,12518,Germany +581494,12/9/2019,22328,Round Snack Boxes Set Of 4 Fruits,6.19,6,12518,Germany +581494,12/9/2019,22730,Alarm Clock Bakelike Ivory,6.19,4,12518,Germany +581494,12/9/2019,22633,Hand Warmer Union Jack,6.19,12,12518,Germany +581494,12/9/2019,22326,Round Snack Boxes Set Of4 Woodland,6.19,6,12518,Germany +581494,12/9/2019,10125,Mini Funky Design Tapes,6.19,20,12518,Germany +581494,12/9/2019,23367,Set 12 Colour Pencils Spaceboy,6.19,24,12518,Germany +581494,12/9/2019,22551,Plasters In Tin Spaceboy,6.04,12,12518,Germany +581494,12/9/2019,22554,Plasters In Tin Woodland Animals,6.04,12,12518,Germany +581494,12/9/2019,22549,Picture Dominoes,6.19,12,12518,Germany +581494,12/9/2019,23388,Woodland Mini Backpack,6.19,4,12518,Germany +581494,12/9/2019,23390,Dolly Girl Mini Backpack,6.19,4,12518,Germany +581494,12/9/2019,23389,Spaceboy Mini Backpack,6.19,4,12518,Germany +581495,12/9/2019,23535,Wall Art Bicycle Safety,6.19,12,14051,United Kingdom +581495,12/9/2019,22699,Roses Regency Teacup And Saucer,6.19,12,14051,United Kingdom +581495,12/9/2019,22698,Pink Regency Teacup And Saucer,6.19,12,14051,United Kingdom +581495,12/9/2019,22697,Green Regency Teacup And Saucer,6.19,12,14051,United Kingdom +581495,12/9/2019,22633,Hand Warmer Union Jack,6.04,18,14051,United Kingdom +581495,12/9/2019,15056N,Edwardian Parasol Natural,6.19,36,14051,United Kingdom +581495,12/9/2019,23439,Hand Warmer Red Love Heart,6.19,36,14051,United Kingdom +581495,12/9/2019,48138,Doormat Union Flag,6.19,10,14051,United Kingdom +581495,12/9/2019,21523,Doormat Fancy Font Home Sweet Home,6.19,10,14051,United King +581495,12/9/2019,21877,Home Sweet Home Mug,6.19,12,14051,United Kingdom +581495,12/9/2019,21871,Save The Planet Mug,6.19,18,14051,United Kingdom +581495,12/9/2019,22798,Antique Glass Dressing Table Pot,6.19,36,14051,United Kingdo +581495,12/9/2019,23173,Regency Teapot Roses,6.19,6,14051,United Kingdom +581495,12/9/2019,22423,Regency Cakestand 3 Tier,6.19,10,14051,United Kingdom +581496,12/9/2019,22664,Toy Tidy Dolly Girl Design,6.19,20,16558,United Kingdom +581496,12/9/2019,22721,Set Of 3 Cake Tins Sketchbook,6.19,12,16558,United Kingdom +581496,12/9/2019,72800E,4 Ivory Dinner Candles Silver Flock,6.19,12,16558,United Ki +581496,12/9/2019,23313,Vintage Christmas Bunting,6.19,10,16558,United Kingdom +581496,12/9/2019,22952,60 Cake Cases Vintage Christmas,6.19,24,16558,United Kingdom +581496,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,6.04,12,16558,United Kin +581496,12/9/2019,23298,Spotty Bunting,6.19,3,16558,United Kingdom +581496,12/9/2019,23598,Paper Bunting Vintage Party,6.19,6,16558,United Kingdom +581496,12/9/2019,16169E,Wrap 50'S Christmas,6.19,25,16558,United Kingdom +581496,12/9/2019,23351,Roll Wrap 50'S Christmas,6.19,12,16558,United Kingdom +581496,12/9/2019,23350,Roll Wrap Vintage Spot,6.19,24,16558,United Kingdom +581496,12/9/2019,22865,Hand Warmer Owl Design,6.19,24,16558,United Kingdom +581496,12/9/2019,22632,Hand Warmer Red Retrospot,6.19,12,16558,United Kingdom +581496,12/9/2019,22835,Hot Water Bottle I Am So Poorly,6.19,4,16558,United Kingdom +581496,12/9/2019,22112,Chocolate Hot Water Bottle,6.19,6,16558,United Kingdom +581496,12/9/2019,23355,Hot Water Bottle Keep Calm,6.19,4,16558,United Kingdom +581496,12/9/2019,22314,Office Mug Warmer Choc+Blue,6.19,24,16558,United Kingdom +581496,12/9/2019,22313,Office Mug Warmer Pink,6.19,12,16558,United Kingdom +581496,12/9/2019,23084,Rabbit Night Light,6.19,18,16558,United Kingdom +581496,12/9/2019,20831,Gold Photo Frame,6.19,12,16558,United Kingdom +581496,12/9/2019,21115,Rose Caravan Doorstop,6.19,8,16558,United Kingdom +581496,12/9/2019,21462,Nursery A B C Painted Letters,7.24,8,16558,United Kingdom +581496,12/9/2019,22076,6 Ribbons Empire,7.24,24,16558,United Kingdom +581496,12/9/2019,22190,Local Cafe Mug,7.24,24,16558,United Kingdom +581496,12/9/2019,22215,Cake Stand White Two Tier Lace,7.24,6,16558,United Kingdom +581496,12/9/2019,22220,Cake Stand Lovebird 2 Tier White,7.24,6,16558,United Kingdom +581496,12/9/2019,22464,Hanging Metal Heart Lantern,7.24,12,16558,United Kingdom +581496,12/9/2019,22465,Hanging Metal Star Lantern,7.24,12,16558,United Kingdom +581496,12/9/2019,22539,Mini Jigsaw Dolly Girl,7.24,48,16558,United Kingdom +581496,12/9/2019,22544,Mini Jigsaw Spaceboy,7.24,48,16558,United Kingdom +581496,12/9/2019,23438,Red Spot Gift Bag Large,6.19,12,16558,United Kingdom +581496,12/9/2019,23437,50'S Christmas Gift Bag Large,6.19,12,16558,United Kingdom +581497,12/9/2019,20719,Woodland Charlotte Bag,6.19,33,17497,United Kingdom +581497,12/9/2019,20723,Strawberry Charlotte Bag,6.19,42,17497,United Kingdom +581497,12/9/2019,20724,Red Retrospot Charlotte Bag,6.19,55,17497,United Kingdom +581497,12/9/2019,21212,Pack Of 72 Retrospot Cake Cases,7.24,7,17497,United Kingdom +581497,12/9/2019,21238,Red Retrospot Cup,7.24,8,17497,United Kingdom +581497,12/9/2019,21242,Red Retrospot Plate,7.24,2,17497,United Kingdom +581497,12/9/2019,21479,White Skull Hot Water Bottle,7.24,25,17497,United Kingdom +581497,12/9/2019,21481,Fawn Blue Hot Water Bottle,7.24,1,17497,United Kingdom +581497,12/9/2019,21481,Fawn Blue Hot Water Bottle,7.24,1,17497,United Kingdom +581497,12/9/2019,21484,Chick Grey Hot Water Bottle,7.24,1,17497,United Kingdom +581497,12/9/2019,21668,Red Stripe Ceramic Drawer Knob,7.24,1,17497,United Kingdom +581497,12/9/2019,21670,Blue Spot Ceramic Drawer Knob,7.24,1,17497,United Kingdom +581497,12/9/2019,21671,Red Spot Ceramic Drawer Knob,7.24,1,17497,United Kingdom +581497,12/9/2019,21672,White Spot Red Ceramic Drawer Knob,7.24,6,17497,United Kingd +581497,12/9/2019,21673,White Spot Blue Ceramic Drawer Knob,7.24,1,17497,United King +581497,12/9/2019,21714,Citronella Candle Garden Pot,7.24,2,17497,United Kingdom +581497,12/9/2019,22110,Bird House Hot Water Bottle,7.24,7,17497,United Kingdom +581497,12/9/2019,22111,Scottie Dog Hot Water Bottle,7.24,5,17497,United Kingdom +581497,12/9/2019,22112,Chocolate Hot Water Bottle,7.24,13,17497,United Kingdom +581497,12/9/2019,22114,Hot Water Bottle Tea And Sympathy,7.24,48,17497,United Kingd +581497,12/9/2019,22197,Popcorn Holder,7.24,68,17497,United Kingdom +581497,12/9/2019,22355,Charlotte Bag Suki Design,7.24,110,17497,United Kingdom +581497,12/9/2019,22356,Charlotte Bag Pink Polkadot,7.24,25,17497,United Kingdom +581497,12/9/2019,22356,Charlotte Bag Pink Polkadot,7.24,1,17497,United Kingdom +581497,12/9/2019,22423,Regency Cakestand 3 Tier,7.24,8,17497,United Kingdom +581497,12/9/2019,22725,Alarm Clock Bakelike Chocolate,7.24,3,17497,United Kingdom +581497,12/9/2019,22726,Alarm Clock Bakelike Green,7.24,1,17497,United Kingdom +581497,12/9/2019,22727,Alarm Clock Bakelike Red,7.24,10,17497,United Kingdom +581497,12/9/2019,22730,Alarm Clock Bakelike Ivory,7.24,5,17497,United Kingdom +581497,12/9/2019,22735,Ribbon Reel Socks And Mittens,7.24,2,17497,United Kingdom +581497,12/9/2019,22736,Ribbon Reel Making Snowmen,7.24,3,17497,United Kingdom +581497,12/9/2019,22738,Ribbon Reel Snowy Village,7.24,1,17497,United Kingdom +581497,12/9/2019,22805,Blue Drawer Knob Acrylic Edwardian,7.24,1,17497,United Kingd +581497,12/9/2019,22835,Hot Water Bottle I Am So Poorly,7.24,4,17497,United Kingdom +581497,12/9/2019,22895,Set Of 2 Tea Towels Apple And Pears,7.24,1,17497,United King +581497,12/9/2019,22896,Peg Bag Apples Design,7.24,2,17497,United Kingdom +581497,12/9/2019,22898,Childrens Apron Apples Design,7.24,2,17497,United Kingdom +581497,12/9/2019,22943,Christmas Lights 10 Vintage Baubles,7.24,1,17497,United King +581497,12/9/2019,23084,Rabbit Night Light,6.19,37,17497,United Kingdom +581497,12/9/2019,23168,Classic Cafe Sugar Dispenser,6.19,1,17497,United Kingdom +581497,12/9/2019,23204,Charlotte Bag Apples Design,6.04,13,17497,United Kingdom +581497,12/9/2019,23205,Charlotte Bag Vintage Alphabet,6.04,8,17497,United Kingdom +581497,12/9/2019,23301,Gardeners Kneeling Pad Keep Calm,6.19,1,17497,United Kingdom +581497,12/9/2019,23355,Hot Water Bottle Keep Calm,6.19,36,17497,United Kingdom +581497,12/9/2019,23356,Love Hot Water Bottle,6.19,1,17497,United Kingdom +581497,12/9/2019,23357,Hot Water Bottle Sex Bomb,6.19,2,17497,United Kingdom +581497,12/9/2019,23358,Hot Stuff Hot Water Bottle,6.19,2,17497,United Kingdom +581497,12/9/2019,35970,Zinc Folkart Sleigh Bells,6.19,2,17497,United Kingdom +581497,12/9/2019,47566,Party Bunting,6.19,5,17497,United Kingdom +581497,12/9/2019,82583,Hot Baths Metal Sign,6.19,4,17497,United Kingdom +581497,12/9/2019,84029G,Knitted Union Flag Hot Water Bottle,6.19,11,17497,United Ki +581497,12/9/2019,84997C,Childrens Cutlery Polkadot Blue,6.19,3,17497,United Kingdom +581497,12/9/2019,85049G,Chocolate Box Ribbons,6.19,2,17497,United Kingdom +581497,12/9/2019,20727,Lunch Bag Black Skull,6.19,8,17497,United Kingdom +581497,12/9/2019,22383,Lunch Bag Suki Design,7.24,2,17497,United Kingdom +581497,12/9/2019,23206,Lunch Bag Apple Design,6.04,3,17497,United Kingdom +581497,12/9/2019,23206,Lunch Bag Apple Design,6.04,1,17497,United Kingdom +581497,12/9/2019,23207,Lunch Bag Alphabet Design,6.19,1,17497,United Kingdom +581497,12/9/2019,23208,Lunch Bag Vintage Leaf Design,6.19,3,17497,United Kingdom +581498,12/9/2019,20669,Red Heart Luggage Tag,6.19,3,14498,United Kingdom +581498,12/9/2019,20679,Edwardian Parasol Red,6.19,5,14498,United Kingdom +581498,12/9/2019,20717,Strawberry Shopper Bag,6.19,1,14498,United Kingdom +581498,12/9/2019,20718,Red Retrospot Shopper Bag,6.19,1,14498,United Kingdom +581498,12/9/2019,20750,Red Retrospot Mini Cases,6.19,1,14498,United Kingdom +581498,12/9/2019,20961,Strawberry Bath Sponge,6.19,1,14498,United Kingdom +581498,12/9/2019,20963,Apple Bath Sponge,6.19,1,14498,United Kingdom +581498,12/9/2019,21115,Rose Caravan Doorstop,6.19,1,14498,United Kingdom +581498,12/9/2019,21125,Set 6 Football Celebration Candles,6.19,3,14498,United Kingd +581498,12/9/2019,21137,Black Record Cover Frame,6.19,4,14498,United Kingdom +581498,12/9/2019,21155,Red Retrospot Peg Bag,6.19,4,14498,United Kingdom +581498,12/9/2019,21166,Cook With Wine Metal Sign,6.19,3,14498,United Kingdom +581498,12/9/2019,21169,You're Confusing Me Metal Sign,6.19,2,14498,United Kingdom +581498,12/9/2019,21174,Pottering In The Shed Metal Sign,6.19,2,14498,United Kingdom +581498,12/9/2019,21181,Please One Person Metal Sign,6.19,6,14498,United Kingdom +581498,12/9/2019,21216,Set 3 Retrospot Tea/Coffee/Sugar,6.19,2,14498,United Kingdom +581498,12/9/2019,21217,Red Retrospot Round Cake Tins,6.19,3,14498,United Kingdom +581498,12/9/2019,21218,Red Spotty Biscuit Tin,6.19,4,14498,United Kingdom +581498,12/9/2019,21232,Strawberry Ceramic Trinket Pot,6.19,13,14498,United Kingdom +581498,12/9/2019,21239,Pink Polkadot Cup,6.19,1,14498,United Kingdom +581498,12/9/2019,21257,Victorian Sewing Box Medium,6.19,3,14498,United Kingdom +581498,12/9/2019,21327,Skulls Writing Set,6.19,1,14498,United Kingdom +581498,12/9/2019,21328,Balloons Writing Set,6.19,1,14498,United Kingdom +581498,12/9/2019,21329,Dinosaurs Writing Set,6.19,1,14498,United Kingdom +581498,12/9/2019,21411,Gingham Heart Doorstop Red,6.19,1,14498,United Kingdom +581498,12/9/2019,21430,Set/3 Red Gingham Rose Storage Box,6.19,3,14498,United Kingd +581498,12/9/2019,21494,Rotating Leaves T-Light Holder,6.19,7,14498,United Kingdom +581498,12/9/2019,21523,Doormat Fancy Font Home Sweet Home,6.19,1,14498,United Kingd +581498,12/9/2019,21557,Set Of 6 Funky Beakers,6.19,1,14498,United Kingdom +581498,12/9/2019,21558,Skull Lunch Box With Cutlery,6.19,1,14498,United Kingdom +581498,12/9/2019,21731,Red Toadstool Led Night Light,6.19,9,14498,United Kingdom +581498,12/9/2019,21754,Home Building Block Word,6.19,2,14498,United Kingdom +581498,12/9/2019,21790,Vintage Snap Cards,6.19,1,14498,United Kingdom +581498,12/9/2019,21843,Red Retrospot Cake Stand,6.19,5,14498,United Kingdom +581498,12/9/2019,21864,Union Jack Flag Passport Cover,6.19,2,14498,United Kingdom +581498,12/9/2019,21874,Gin And Tonic Mug,6.19,2,14498,United Kingdom +581498,12/9/2019,21876,Pottering Mug,6.19,4,14498,United Kingdom +581498,12/9/2019,21890,S/6 Wooden Skittles In Cotton Bag,6.19,1,14498,United Kingdo +581498,12/9/2019,21912,Vintage Snakes & Ladders,6.19,1,14498,United Kingdom +581498,12/9/2019,21916,Set 12 Retro White Chalk Sticks,6.19,7,14498,United Kingdom +581498,12/9/2019,21930,Jumbo Storage Bag Skulls,6.19,2,14498,United Kingdom +581498,12/9/2019,21931,Jumbo Storage Bag Suki,6.19,6,14498,United Kingdom +581498,12/9/2019,21934,Skull Shoulder Bag,6.19,1,14498,United Kingdom +581498,12/9/2019,21935,Suki Shoulder Bag,6.19,7,14498,United Kingdom +581498,12/9/2019,21942,Skulls Design Flannel,6.19,1,14498,United Kingdom +581498,12/9/2019,21955,Doormat Union Jack Guns And Roses,6.19,1,14498,United Kingdo +581498,12/9/2019,21977,Pack Of 60 Pink Paisley Cake Cases,6.19,1,14498,United Kingd +581498,12/9/2019,21983,Pack Of 12 Blue Paisley Tissues,6.19,1,14498,United Kingdom +581498,12/9/2019,21987,Pack Of 6 Skull Paper Cups,6.19,2,14498,United Kingdom +581498,12/9/2019,21989,Pack Of 20 Skull Paper Napkins,6.19,1,14498,United Kingdom +581498,12/9/2019,22041,"Record Frame 7"" Single Size",6.19,2,14498,United Kingdom +581498,12/9/2019,22059,Ceramic Strawberry Design Mug,6.19,1,14498,United Kingdom +581498,12/9/2019,22069,Brown Pirate Treasure Chest,6.19,3,14498,United Kingdom +581498,12/9/2019,22077,6 Ribbons Rustic Charm,6.19,2,14498,United Kingdom +581498,12/9/2019,22083,Paper Chain Kit Retrospot,6.19,2,14498,United Kingdom +581498,12/9/2019,22086,Paper Chain Kit 50'S Christmas,6.19,52,14498,United Kingdom +581498,12/9/2019,22099,Caravan Square Tissue Box,6.19,2,14498,United Kingdom +581498,12/9/2019,22114,Hot Water Bottle Tea And Sympathy,6.19,4,14498,United Kingdo +581498,12/9/2019,22139,Retrospot Tea Set Ceramic 11 Pc,6.19,2,14498,United Kingdom +581498,12/9/2019,22141,Christmas Craft Tree Top Angel,6.19,7,14498,United Kingdom +581498,12/9/2019,22142,Christmas Craft White Fairy,6.19,2,14498,United Kingdom +581498,12/9/2019,22144,Christmas Craft Little Friends,6.19,8,14498,United Kingdom +581498,12/9/2019,22161,Heart Decoration Rustic Hanging,6.19,2,14498,United Kingdom +581498,12/9/2019,22173,Metal 4 Hook Hanger French Chateau,6.19,3,14498,United Kingd +581498,12/9/2019,22174,Photo Cube,6.19,3,14498,United Kingdom +581498,12/9/2019,22175,Pink Owl Soft Toy,6.19,1,14498,United Kingdom +581498,12/9/2019,22178,Victorian Glass Hanging T-Light,6.19,1,14498,United Kingdom +581498,12/9/2019,22179,Set 10 Night Owl Lights,6.19,1,14498,United Kingdom +581498,12/9/2019,22186,Red Star Card Holder,6.19,1,14498,United Kingdom +581498,12/9/2019,22187,Green Christmas Tree Card Holder,6.19,6,14498,United Kingdom +581498,12/9/2019,22193,Red Diner Wall Clock,6.19,1,14498,United Kingdom +581498,12/9/2019,22195,Large Heart Measuring Spoons,6.19,3,14498,United Kingdom +581498,12/9/2019,22196,Small Heart Measuring Spoons,6.19,2,14498,United Kingdom +581498,12/9/2019,22207,Frying Pan Union Flag,6.19,1,14498,United Kingdom +581498,12/9/2019,22278,Overnight Bag Vintage Rose Paisley,6.19,2,14498,United Kingd +581498,12/9/2019,22301,Coffee Mug Cat + Bird Design,6.19,2,14498,United Kingdom +581498,12/9/2019,22302,Coffee Mug Pears Design,6.19,4,14498,United Kingdom +581498,12/9/2019,22303,Coffee Mug Apples Design,6.19,4,14498,United Kingdom +581498,12/9/2019,22304,Coffee Mug Blue Paisley Design,6.19,1,14498,United Kingdom +581498,12/9/2019,22308,Tea Cosy Blue Stripe,6.19,2,14498,United Kingdom +581498,12/9/2019,22327,Round Snack Boxes Set Of 4 Skulls,6.19,4,14498,United Kingdo +581498,12/9/2019,22328,Round Snack Boxes Set Of 4 Fruits,6.19,4,14498,United Kingdo +581498,12/9/2019,22352,Lunch Box With Cutlery Retrospot,6.19,6,14498,United Kingdom +581498,12/9/2019,22357,Kings Choice Biscuit Tin,6.19,1,14498,United Kingdom +581498,12/9/2019,22358,Kings Choice Tea Caddy,6.19,1,14498,United Kingdom +581498,12/9/2019,22367,Childrens Apron Spaceboy Design,6.19,7,14498,United Kingdom +581498,12/9/2019,22371,Airline Bag Vintage Tokyo 78,6.19,1,14498,United Kingdom +581498,12/9/2019,22374,Airline Bag Vintage Jet Set Red,6.19,1,14498,United Kingdom +581498,12/9/2019,22378,Wall Tidy Retrospot,7.24,2,14498,United Kingdom +581498,12/9/2019,22379,Recycling Bag Retrospot,7.24,4,14498,United Kingdom +581498,12/9/2019,22381,Toy Tidy Pink Polkadot,7.24,1,14498,United Kingdom +581498,12/9/2019,22411,Jumbo Shopper Vintage Red Paisley,7.24,2,14498,United Kingdo +581498,12/9/2019,22422,Toothpaste Tube Pen,7.24,1,14498,United Kingdom +581498,12/9/2019,22424,Enamel Bread Bin Cream,7.24,1,14498,United Kingdom +581498,12/9/2019,22429,Enamel Measuring Jug Cream,7.24,1,14498,United Kingdom +581498,12/9/2019,22456,Natural Slate Chalkboard Large,7.24,4,14498,United Kingdom +581498,12/9/2019,22457,Natural Slate Heart Chalkboard,7.24,2,14498,United Kingdom +581498,12/9/2019,22471,Tv Dinner Tray Air Hostess,7.24,1,14498,United Kingdom +581498,12/9/2019,22474,Spaceboy Tv Dinner Tray,7.24,1,14498,United Kingdom +581498,12/9/2019,22488,Natural Slate Rectangle Chalkboard,7.24,2,14498,United Kingd +581498,12/9/2019,22498,Wooden Regatta Bunting,7.24,1,14498,United Kingdom +581498,12/9/2019,22507,Memo Board Retrospot Design,7.24,1,14498,United Kingdom +581498,12/9/2019,22526,Wheelbarrow For Children,7.24,1,14498,United Kingdom +581498,12/9/2019,22553,Plasters In Tin Skulls,7.24,1,14498,United Kingdom +581498,12/9/2019,22557,Plasters In Tin Vintage Paisley,7.24,1,14498,United Kingdom +581498,12/9/2019,22619,Set Of 6 Soldier Skittles,7.24,1,14498,United Kingdom +581498,12/9/2019,22622,Box Of Vintage Alphabet Blocks,7.24,1,14498,United Kingdom +581498,12/9/2019,22624,Ivory Kitchen Scales,7.24,1,14498,United Kingdom +581498,12/9/2019,22629,Spaceboy Lunch Box,7.24,2,14498,United Kingdom +581498,12/9/2019,22632,Hand Warmer Red Retrospot,7.24,1,14498,United Kingdom +581498,12/9/2019,22645,Ceramic Heart Fairy Cake Money Bank,7.24,4,14498,United King +581498,12/9/2019,22654,Deluxe Sewing Kit,6.19,2,14498,United Kingdom +581498,12/9/2019,22659,Lunch Box I Love London,6.19,1,14498,United Kingdom +581498,12/9/2019,22666,Recipe Box Pantry Yellow Design,6.19,11,14498,United Kingdom +581498,12/9/2019,22676,French Blue Metal Door Sign 1,6.04,1,14498,United Kingdom +581498,12/9/2019,22684,French Blue Metal Door Sign 9,6.04,1,14498,United Kingdom +581498,12/9/2019,22694,Wicker Star,6.04,1,14498,United Kingdom +581498,12/9/2019,22697,Green Regency Teacup And Saucer,6.04,6,14498,United Kingdom +581498,12/9/2019,22698,Pink Regency Teacup And Saucer,6.04,9,14498,United Kingdom +581498,12/9/2019,22699,Roses Regency Teacup And Saucer,6.19,6,14498,United Kingdom +581498,12/9/2019,22722,Set Of 6 Spice Tins Pantry Design,6.19,3,14498,United Kingdo +581498,12/9/2019,22733,3d Traditional Christmas Stickers,6.19,1,14498,United Kingdo +581498,12/9/2019,22734,Set Of 6 Ribbons Vintage Christmas,6.19,5,14498,United Kingd +581498,12/9/2019,22776,Sweetheart 3 Tier Cake Stand,6.19,1,14498,United Kingdom +581498,12/9/2019,22795,Sweetheart Recipe Book Stand,6.19,1,14498,United Kingdom +581498,12/9/2019,22807,Set Of 6 T-Lights Toadstools,6.19,2,14498,United Kingdom +581498,12/9/2019,22813,Pack 3 Boxes Bird Panettone,6.19,4,14498,United Kingdom +581498,12/9/2019,22838,3 Tier Cake Tin Red And Cream,6.19,1,14498,United Kingdom +581498,12/9/2019,22844,Vintage Cream Dog Food Container,6.19,2,14498,United Kingdom +581498,12/9/2019,22845,Vintage Cream Cat Food Container,6.19,1,14498,United Kingdom +581498,12/9/2019,22865,Hand Warmer Owl Design,6.19,1,14498,United Kingdom +581498,12/9/2019,22866,Hand Warmer Scotty Dog Design,6.19,2,14498,United Kingdom +581498,12/9/2019,22891,Tea For One Polkadot,6.19,1,14498,United Kingdom +581498,12/9/2019,22900,Set 2 Tea Towels I Love London,6.19,2,14498,United Kingdom +581498,12/9/2019,22910,Paper Chain Kit Vintage Christmas,6.19,5,14498,United Kingdo +581498,12/9/2019,22952,60 Cake Cases Vintage Christmas,6.19,7,14498,United Kingdom +581498,12/9/2019,22960,Jam Making Set With Jars,6.19,5,14498,United Kingdom +581498,12/9/2019,22961,Jam Making Set Printed,6.19,4,14498,United Kingdom +581498,12/9/2019,22966,Gingerbread Man Cookie Cutter,6.19,2,14498,United Kingdom +581498,12/9/2019,22993,Set Of 4 Pantry Jelly Moulds,6.19,2,14498,United Kingdom +581498,12/9/2019,23012,Glass Apothecary Bottle Perfume,6.19,1,14498,United Kingdom +581498,12/9/2019,23013,Glass Apothecary Bottle Tonic,6.19,1,14498,United Kingdom +581498,12/9/2019,23014,Glass Apothecary Bottle Elixir,7.24,2,14498,United Kingdom +581498,12/9/2019,23080,Red Metal Box Top Secret,7.24,5,14498,United Kingdom +581498,12/9/2019,23170,Regency Tea Plate Roses,7.24,4,14498,United Kingdom +581498,12/9/2019,23171,Regency Tea Plate Green,7.24,5,14498,United Kingdom +581498,12/9/2019,23172,Regency Tea Plate Pink,6.19,4,14498,United Kingdom +581498,12/9/2019,23181,Bull Dog Bottle Top Wall Clock,6.19,1,14498,United Kingdom +581498,12/9/2019,23196,Vintage Leaf Magnetic Notepad,6.19,1,14498,United Kingdom +581498,12/9/2019,23198,Pantry Magnetic Shopping List,6.19,2,14498,United Kingdom +581498,12/9/2019,23245,Set Of 3 Regency Cake Tins,6.19,5,14498,United Kingdom +581498,12/9/2019,23295,Set Of 12 Mini Loaf Baking Cases,6.19,1,14498,United Kingdom +581498,12/9/2019,23298,Spotty Bunting,6.19,1,14498,United Kingdom +581498,12/9/2019,23300,Gardeners Kneeling Pad Cup Of Tea,6.19,9,14498,United Kingdo +581498,12/9/2019,23301,Gardeners Kneeling Pad Keep Calm,6.19,32,14498,United Kingdo +581498,12/9/2019,23311,Vintage Christmas Stocking,6.19,6,14498,United Kingdom +581498,12/9/2019,23312,Vintage Christmas Gift Sack,6.19,3,14498,United Kingdom +581498,12/9/2019,23328,Set 6 School Milk Bottles In Crate,6.19,6,14498,United Kingd +581498,12/9/2019,23349,Roll Wrap Vintage Christmas,6.19,8,14498,United Kingdom +581498,12/9/2019,23351,Roll Wrap 50'S Christmas,6.19,22,14498,United Kingdom +581498,12/9/2019,23352,Roll Wrap 50'S Red Christmas,6.19,8,14498,United Kingdom +581498,12/9/2019,23353,6 Gift Tags Vintage Christmas,6.19,10,14498,United Kingdom +581498,12/9/2019,23354,6 Gift Tags 50'S Christmas,6.19,9,14498,United Kingdom +581498,12/9/2019,23368,Set 12 Colour Pencils Dolly Girl,6.19,3,14498,United Kingdom +581498,12/9/2019,23369,Set 36 Colour Pencils Love London,6.19,1,14498,United Kingdo +581498,12/9/2019,23370,Set 36 Colouring Pencils Doily,6.19,3,14498,United Kingdom +581498,12/9/2019,23382,Box Of 6 Christmas Cake Decorations,6.19,10,14498,United Kin +581498,12/9/2019,23388,Woodland Mini Backpack,6.19,1,14498,United Kingdom +581498,12/9/2019,23480,Mini Lights Woodland Mushrooms,7.24,1,14498,United Kingdom +581498,12/9/2019,23493,Vintage Doily Travel Sewing Kit,7.24,1,14498,United Kingdom +581498,12/9/2019,23494,Vintage Doily Deluxe Sewing Kit,7.24,1,14498,United Kingdom +581498,12/9/2019,23497,Classic Chrome Bicycle Bell,7.24,1,14498,United Kingdom +581498,12/9/2019,23501,Key Ring Baseball Boot Union Jack,7.24,1,14498,United Kingdo +581498,12/9/2019,23564,Egg Cup Milkmaid Ingrid,7.24,1,14498,United Kingdom +581498,12/9/2019,35970,Zinc Folkart Sleigh Bells,7.24,6,14498,United Kingdom +581498,12/9/2019,48138,Doormat Union Flag,7.24,1,14498,United Kingdom +581498,12/9/2019,71053,White Moroccan Metal Lantern,7.24,1,14498,United Kingdom +581498,12/9/2019,72349B,Set/6 Purple Butterfly T-Lights,7.24,2,14498,United Kingdom +581498,12/9/2019,79321,Chilli Lights,7.24,10,14498,United Kingdom +581498,12/9/2019,82001S,Silver Record Cover Frame,6.19,2,14498,United Kingdom +581498,12/9/2019,82482,Wooden Picture Frame White Finish,6.04,4,14498,United Kingdo +581498,12/9/2019,82552,Washroom Metal Sign,6.04,1,14498,United Kingdom +581498,12/9/2019,21171,Bathroom Metal Sign,6.19,1,14498,United Kingdom +581498,12/9/2019,82581,Toilet Metal Sign,6.19,1,14498,United Kingdom +581498,12/9/2019,82600,N0 Singing Metal Sign,6.19,4,14498,United Kingdom +581498,12/9/2019,84029E,Red Woolly Hottie White Heart,6.19,4,14498,United Kingdom +581498,12/9/2019,84032A,Charlie+Lola Pink Hot Water Bottle,6.19,4,14498,United King +581498,12/9/2019,84032B,Charlie + Lola Red Hot Water Bottle,6.19,3,14498,United Kin +581498,12/9/2019,84375,Set Of 20 Kids Cookie Cutters,6.19,3,14498,United Kingdom +581498,12/9/2019,84509A,Set Of 4 English Rose Placemats,6.19,1,14498,United Kingdom +581498,12/9/2019,84558A,3d Dog Picture Playing Cards,6.19,1,14498,United Kingdom +581498,12/9/2019,84832,Zinc Willie Winkie Candle Stick,6.19,26,14498,United Kingdom +581498,12/9/2019,84968E,Set Of 16 Vintage Black Cutlery,6.19,1,14498,United Kingdom +581498,12/9/2019,84970S,Hanging Heart Zinc T-Light Holder,6.19,1,14498,United Kingd +581498,12/9/2019,84997A,Childrens Cutlery Polkadot Green,6.19,2,14498,United Kingdo +581498,12/9/2019,84997B,Childrens Cutlery Retrospot Red,6.19,3,14498,United Kingdom +581498,12/9/2019,84997D,Childrens Cutlery Polkadot Pink,6.19,1,14498,United Kingdom +581498,12/9/2019,85038,6 Chocolate Love Heart T-Lights,6.19,1,14498,United Kingdom +581498,12/9/2019,85048,15cm Christmas Glass Ball 20 Lights,6.19,1,14498,United King +581498,12/9/2019,85049A,Traditional Christmas Ribbons,6.17,5,14498,United Kingdom +581498,12/9/2019,85049E,Scandinavian Reds Ribbons,6.19,4,14498,United Kingdom +581498,12/9/2019,85150,Ladies & Gentlemen Metal Sign,6.19,1,14498,United Kingdom +581498,12/9/2019,85174,S/4 Cacti Candles,6.19,1,14498,United Kingdom +581498,12/9/2019,20712,Jumbo Bag Woodland Animals,6.19,3,14498,United Kingdom +581498,12/9/2019,20713,Jumbo Bag Owls,6.19,8,14498,United Kingdom +581498,12/9/2019,21928,Jumbo Bag Scandinavian Blue Paisley,6.19,2,14498,United King +581498,12/9/2019,22386,Jumbo Bag Pink Polkadot,7.24,1,14498,United Kingdom +581498,12/9/2019,22663,Jumbo Bag Dolly Girl Design,6.19,2,14498,United Kingdom +581498,12/9/2019,23199,Jumbo Bag Apples,6.19,6,14498,United Kingdom +581498,12/9/2019,23201,Jumbo Bag Alphabet,6.19,6,14498,United Kingdom +581498,12/9/2019,85099B,Jumbo Bag Red Retrospot,6.19,5,14498,United Kingdom +581498,12/9/2019,85099C,Jumbo Bag Baroque Black White,6.19,4,14498,United Kingdom +581498,12/9/2019,20726,Lunch Bag Woodland,6.19,3,14498,United Kingdom +581498,12/9/2019,20728,Lunch Bag Cars Blue,6.19,4,14498,United Kingdom +581498,12/9/2019,22384,Lunch Bag Pink Polkadot,7.24,1,14498,United Kingdom +581498,12/9/2019,23437,50'S Christmas Gift Bag Large,7.24,1,14498,United Kingdom +581500,12/9/2019,82486,3 Drawer Antique White Wood Cabinet,7.24,4,15344,United King +581500,12/9/2019,85066,Cream Sweetheart Mini Chest,7.24,4,15344,United Kingdom +581500,12/9/2019,48187,Doormat New England,7.24,2,15344,United Kingdom +581501,12/9/2019,22319,Hairclips Forties Fabric Assorted,7.24,180,12985,United King +581501,12/9/2019,20704,Mr Robot Soft Toy,7.24,8,12985,United Kingdom +581501,12/9/2019,21564,Pink Heart Shape Love Bucket,6.19,24,12985,United Kingdom +581501,12/9/2019,21563,Red Heart Shape Love Bucket,7.24,24,12985,United Kingdom +581501,12/9/2019,22165,Diamante Heart Shaped Wall Mirror,7.24,12,12985,United Kingd +581501,12/9/2019,22299,Pig Keyring With Light & Sound,7.24,48,12985,United Kingdom +581501,12/9/2019,22447,Pin Cushion Babushka Blue,7.24,12,12985,United Kingdom +581501,12/9/2019,22442,Grow Your Own Flowers Set Of 3,7.24,12,12985,United Kingdom +581501,12/9/2019,22495,Set Of 2 Round Tins Camembert,7.24,12,12985,United Kingdom +581501,12/9/2019,22544,Mini Jigsaw Spaceboy,7.24,96,12985,United Kingdom +581501,12/9/2019,22695,Wicker Wreath Small,7.24,24,12985,United Kingdom +581501,12/9/2019,22785,Squarecushion Cover Pink Union Jack,7.24,12,12985,United Kin +581501,12/9/2019,22811,Set Of 6 T-Lights Cacti,7.24,12,12985,United Kingdom +581501,12/9/2019,22807,Set Of 6 T-Lights Toadstools,7.24,12,12985,United Kingdom +581501,12/9/2019,22942,Christmas Lights 10 Santas,7.24,12,12985,United Kingdom +581501,12/9/2019,22808,Set Of 6 T-Lights Easter Chicks,6.19,12,12985,United Kingdom +581501,12/9/2019,23143,Zinc Wire Kitchen Organiser,7.24,4,12985,United Kingdom +581501,12/9/2019,23151,Zinc Sweetheart Soap Dish,7.24,12,12985,United Kingdom +581501,12/9/2019,23425,Storage Tin Home Sweet Home,7.24,12,12985,United Kingdom +581501,12/9/2019,84356,Pompom Curtain,7.24,12,12985,United Kingdom +581501,12/9/2019,85173,Set/6 Frog Prince T-Light Candles,7.24,12,12985,United Kingd +581501,12/9/2019,21731,Red Toadstool Led Night Light,7.24,24,12985,United Kingdom +581501,12/9/2019,23480,Mini Lights Woodland Mushrooms,7.24,8,12985,United Kingdom +581501,12/9/2019,22545,Mini Jigsaw Bunnies,7.24,96,12985,United Kingdom +581502,12/9/2019,22087,Paper Bunting White Lace,7.24,6,15910,United Kingdom +581502,12/9/2019,21209,Multicolour Honeycomb Fan,7.24,5,15910,United Kingdom +581502,12/9/2019,20668,Disco Ball Christmas Decoration,7.24,24,15910,United Kingdom +581502,12/9/2019,21790,Vintage Snap Cards,7.24,6,15910,United Kingdom +581502,12/9/2019,23270,Set Of 2 Ceramic Painted Hearts,7.24,4,15910,United Kingdom +581502,12/9/2019,23103,Jingle Bell Heart Decoration,7.24,8,15910,United Kingdom +581502,12/9/2019,22576,Swallow Wooden Christmas Decoration,7.24,2,15910,United King +581502,12/9/2019,22153,Angel Decoration Stars On Dress,7.24,13,15910,United Kingdom +581502,12/9/2019,21810,Christmas Hanging Star With Bell,7.24,6,15910,United Kingdom +581502,12/9/2019,22155,Star Decoration Rustic,7.24,6,15910,United Kingdom +581502,12/9/2019,23210,White Rocking Horse Hand Painted,7.24,12,15910,United Kingdo +581502,12/9/2019,22573,Star Wooden Christmas Decoration,7.24,8,15910,United Kingdom +581502,12/9/2019,22075,6 Ribbons Elegant Christmas,7.24,4,15910,United Kingdom +581502,12/9/2019,85049A,Traditional Christmas Ribbons,7.24,4,15910,United Kingdom +581502,12/9/2019,22734,Set Of 6 Ribbons Vintage Christmas,7.24,4,15910,United Kingd +581502,12/9/2019,23274,Star T-Light Holder Willie Winkie,7.24,8,15910,United Kingdo +581502,12/9/2019,22153,Angel Decoration Stars On Dress,7.24,1,15910,United Kingdom +581502,12/9/2019,22596,Christmas Star Wish List Chalkboard,7.24,24,15910,United Kin +581502,12/9/2019,22952,60 Cake Cases Vintage Christmas,7.24,10,15910,United Kingdom +581502,12/9/2019,22141,Christmas Craft Tree Top Angel,7.24,3,15910,United Kingdom +581514,12/9/2019,22753,Small Yellow Babushka Notebook,7.24,12,17754,United Kingdom +581514,12/9/2019,22755,Small Purple Babushka Notebook,7.24,12,17754,United Kingdom +581514,12/9/2019,22754,Small Red Babushka Notebook,6.19,12,17754,United Kingdom +581514,12/9/2019,22721,Set Of 3 Cake Tins Sketchbook,6.19,4,17754,United Kingdom +581514,12/9/2019,22059,Ceramic Strawberry Design Mug,6.19,12,17754,United Kingdom +581514,12/9/2019,22199,Frying Pan Red Retrospot,6.19,13,17754,United Kingdom +581514,12/9/2019,22200,Frying Pan Pink Polkadot,6.19,2,17754,United Kingdom +581514,12/9/2019,84032A,Charlie+Lola Pink Hot Water Bottle,6.19,9,17754,United King +581514,12/9/2019,84032B,Charlie + Lola Red Hot Water Bottle,6.19,9,17754,United Kin +581514,12/9/2019,84031A,Charlie+Lola Red Hot Water Bottle,6.19,10,17754,United King +581514,12/9/2019,84031B,Charlie Lola Blue Hot Water Bottle,6.19,14,17754,United Kin +581514,12/9/2019,22646,Ceramic Strawberry Cake Money Bank,6.19,4,17754,United Kingd +581514,12/9/2019,22644,Ceramic Cherry Cake Money Bank,6.19,4,17754,United Kingdom +581514,12/9/2019,22645,Ceramic Heart Fairy Cake Money Bank,6.19,4,17754,United King +581514,12/9/2019,22394,Paperweight Kings Choice,6.04,12,17754,United Kingdom +581514,12/9/2019,17091J,Vanilla Incense In Tin,6.04,66,17754,United Kingdom +581514,12/9/2019,35471D,Set Of 3 Bird Light Pink Feather,6.04,12,17754,United Kingd +581514,12/9/2019,22075,6 Ribbons Elegant Christmas,6.04,24,17754,United Kingdom +581514,12/9/2019,17091J,Vanilla Incense In Tin,6.19,24,17754,United Kingdom +581514,12/9/2019,22069,Brown Pirate Treasure Chest,6.19,20,17754,United Kingdom +581514,12/9/2019,22068,Black Pirate Treasure Chest,6.19,14,17754,United Kingdom +581514,12/9/2019,22500,Set Of 2 Tins Jardin De Provence,6.19,4,17754,United Kingdom +581514,12/9/2019,22075,6 Ribbons Elegant Christmas,6.19,24,17754,United Kingdom +581514,12/9/2019,21705,Bag 500g Swirly Marbles,6.19,84,17754,United Kingdom +581516,12/9/2019,21109,Large Cake Towel Chocolate Spots,6.19,12,14422,United Kingdo +581516,12/9/2019,21111,Swiss Roll Towel Chocolate Spots,6.19,24,14422,United Kingdo +581516,12/9/2019,21705,Bag 500g Swirly Marbles,6.19,24,14422,United Kingdom +581516,12/9/2019,22185,Slate Tile Natural Hanging,6.19,12,14422,United Kingdom +581516,12/9/2019,22442,Grow Your Own Flowers Set Of 3,6.19,12,14422,United Kingdom +581516,12/9/2019,21620,Set Of 4 Rose Botanical Candles,6.19,12,14422,United Kingdom +581516,12/9/2019,84029G,Knitted Union Flag Hot Water Bottle,6.19,8,14422,United Kin +581516,12/9/2019,21485,Retrospot Heart Hot Water Bottle,6.19,3,14422,United Kingdom +581516,12/9/2019,22111,Scottie Dog Hot Water Bottle,6.19,6,14422,United Kingdom +581516,12/9/2019,23355,Hot Water Bottle Keep Calm,6.19,8,14422,United Kingdom +581516,12/9/2019,22112,Chocolate Hot Water Bottle,6.19,6,14422,United Kingdom +581516,12/9/2019,23356,Love Hot Water Bottle,6.19,6,14422,United Kingdom +581516,12/9/2019,21108,Fairy Cake Flannel Assorted Colour,6.19,18,14422,United King +581516,12/9/2019,22171,3 Hook Photo Shelf Antique White,6.19,4,14422,United Kingdom +581516,12/9/2019,23301,Gardeners Kneeling Pad Keep Calm,6.19,24,14422,United Kingdo +581538,12/9/2019,23193,Buffalo Bill Treasure Book Box,6.19,6,14446,United Kingdom +581538,12/9/2019,23194,Gymkhana Treasure Book Box,6.19,1,14446,United Kingdom +581538,12/9/2019,23084,Rabbit Night Light,6.19,2,14446,United Kingdom +581538,12/9/2019,22068,Black Pirate Treasure Chest,6.19,1,14446,United Kingdom +581538,12/9/2019,22956,36 Foil Heart Cake Cases,6.19,1,14446,United Kingdom +581538,12/9/2019,20936,Forked Cactus Candle,6.19,1,14446,United Kingdom +581538,12/9/2019,23040,Paper Lantern 9 Point Snow Star,6.19,1,14446,United Kingdom +581538,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,6.19,1,14446,United King +581538,12/9/2019,21222,Set/4 Badges Beetles,6.19,1,14446,United Kingdom +581538,12/9/2019,21220,Set/4 Badges Dogs,6.19,1,14446,United Kingdom +581538,12/9/2019,21224,Set/4 Skull Badges,6.19,1,14446,United Kingdom +581538,12/9/2019,85123A,Cream Hanging Heart T-Light Holder,6.19,1,14446,United King +581538,12/9/2019,22992,Revolver Wooden Ruler,6.19,1,14446,United Kingdom +581538,12/9/2019,79066K,Retro Mod Tray,6.19,1,14446,United Kingdom +581538,12/9/2019,84380,Set Of 3 Butterfly Cookie Cutters,6.19,1,14446,United Kingdo +581538,12/9/2019,23371,Set 36 Colour Pencils Spaceboy,6.19,1,14446,United Kingdom +581538,12/9/2019,22694,Wicker Star,6.19,1,14446,United Kingdom +581538,12/9/2019,22095,Lads Only Tissue Box,6.19,1,14446,United Kingdom +581538,12/9/2019,23275,Set Of 3 Hanging Owls Ollie Beak,6.19,1,14446,United Kingdom +581538,12/9/2019,21673,White Spot Blue Ceramic Drawer Knob,6.19,1,14446,United King +581538,12/9/2019,21670,Blue Spot Ceramic Drawer Knob,6.19,1,14446,United Kingdom +581538,12/9/2019,85071C,"Charlie+Lola""Extremely Busy"" Sign",6.19,1,14446,United K +581538,12/9/2019,23349,Roll Wrap Vintage Christmas,6.19,3,14446,United Kingdom +581538,12/9/2019,23034,Drawer Knob Ceramic Black,6.19,1,14446,United Kingdom +581538,12/9/2019,21669,Blue Stripe Ceramic Drawer Knob,6.19,1,14446,United Kingdom +581538,12/9/2019,23033,Drawer Knob Ceramic Red,6.19,1,14446,United Kingdom +581538,12/9/2019,21668,Red Stripe Ceramic Drawer Knob,6.19,1,14446,United Kingdom +581538,12/9/2019,23275,Set Of 3 Hanging Owls Ollie Beak,6.19,1,14446,United Kingdom +581538,12/9/2019,23318,Box Of 6 Mini Vintage Crackers,6.19,1,14446,United Kingdom +581538,12/9/2019,23382,Box Of 6 Christmas Cake Decorations,6.19,1,14446,United King +581538,12/9/2019,22469,Heart Of Wicker Small,6.19,1,14446,United Kingdom +581538,12/9/2019,22899,Children's Apron Dolly Girl,6.19,2,14446,United Kingdom +581538,12/9/2019,22367,Childrens Apron Spaceboy Design,6.19,1,14446,United Kingdom +581538,12/9/2019,22899,Children's Apron Dolly Girl,6.19,3,14446,United Kingdom +581538,12/9/2019,23527,Wall Art Animals And Nature,6.19,1,14446,United Kingdom +581538,12/9/2019,23524,Wall Art Horse & Pony,6.19,1,14446,United Kingdom +581538,12/9/2019,23525,Wall Art Buffalo Bill,6.19,1,14446,United Kingdom +581538,12/9/2019,84380,Set Of 3 Butterfly Cookie Cutters,6.19,4,14446,United Kingdo +581538,12/9/2019,23122,Party Charms 50 Pieces,7.24,1,14446,United Kingdom +581538,12/9/2019,21990,Modern Floral Stationery Set,7.24,1,14446,United Kingdom +581538,12/9/2019,21329,Dinosaurs Writing Set,7.24,1,14446,United Kingdom +581538,12/9/2019,21328,Balloons Writing Set,7.24,1,14446,United Kingdom +581538,12/9/2019,22561,Wooden School Colouring Set,7.24,1,14446,United Kingdom +581538,12/9/2019,84519A,Tomato Charlie+Lola Coaster Set,7.24,1,14446,United Kingdom +581538,12/9/2019,84519B,Carrot Charlie+Lola Coaster Set,7.24,1,14446,United Kingdom +581538,12/9/2019,35004B,Set Of 3 Black Flying Ducks,7.24,2,14446,United Kingdom +581538,12/9/2019,22068,Black Pirate Treasure Chest,7.24,1,14446,United Kingdom +581538,12/9/2019,23353,6 Gift Tags Vintage Christmas,6.19,1,14446,United Kingdom +581538,12/9/2019,21591,Cosy Hour Cigar Box Matches,6.19,1,14446,United Kingdom +581538,12/9/2019,22197,Popcorn Holder,6.19,4,14446,United Kingdom +581538,12/9/2019,23320,Giant 50'S Christmas Cracker,6.19,1,14446,United Kingdom +581538,12/9/2019,23349,Roll Wrap Vintage Christmas,6.19,1,14446,United Kingdom +581538,12/9/2019,22985,Wrap Billboard Fonts Design,6.19,25,14446,United Kingdom +581538,12/9/2019,23040,Paper Lantern 9 Point Snow Star,6.19,2,14446,United Kingdom +581538,12/9/2019,23040,Paper Lantern 9 Point Snow Star,6.19,3,14446,United Kingdom +581538,12/9/2019,21194,Pink Honeycomb Paper Fan,6.19,2,14446,United Kingdom +581538,12/9/2019,21208,Pastel Colour Honeycomb Fan,6.19,1,14446,United Kingdom +581538,12/9/2019,79190D,Retro Plastic Daisy Tray,6.19,1,14446,United Kingdom +581538,12/9/2019,79190B,Retro Plastic Polka Tray,6.19,1,14446,United Kingdom +581538,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,6.02,2,14446,United King +581538,12/9/2019,23318,Box Of 6 Mini Vintage Crackers,6.02,1,14446,United Kingdom +581538,12/9/2019,23319,Box Of 6 Mini 50'S Crackers,6.02,1,14446,United Kingdom +581538,12/9/2019,23537,Wall Art I Love London,6.19,1,14446,United Kingdom +581538,12/9/2019,22992,Revolver Wooden Ruler,6.19,1,14446,United Kingdom +581538,12/9/2019,22991,Giraffe Wooden Ruler,6.19,1,14446,United Kingdom +581538,12/9/2019,23190,Bundle Of 3 School Exercise Books,6.19,1,14446,United Kingdo +581538,12/9/2019,21194,Pink Honeycomb Paper Fan,6.19,1,14446,United Kingdom +581538,12/9/2019,35004B,Set Of 3 Black Flying Ducks,6.19,1,14446,United Kingdom +581538,12/9/2019,22694,Wicker Star,6.19,1,14446,United Kingdom +581538,12/9/2019,21355,Toast Its - I Love You,6.19,1,14446,United Kingdom +581538,12/9/2019,23343,Jumbo Bag Vintage Christmas,6.19,1,14446,United Kingdom +581538,12/9/2019,23343,Jumbo Bag Vintage Christmas,6.19,1,14446,United Kingdom +581538,12/9/2019,20727,Lunch Bag Black Skull,6.19,1,14446,United Kingdom +581538,12/9/2019,20725,Lunch Bag Red Retrospot,6.19,1,14446,United Kingdom +581566,12/9/2019,23404,Home Sweet Home Blackboard,6.19,144,18102,United Kingdom +581567,12/9/2019,21417,Cockle Shell Dish,6.19,84,16626,United Kingdom +581567,12/9/2019,22464,Hanging Metal Heart Lantern,6.19,24,16626,United Kingdom +581567,12/9/2019,22465,Hanging Metal Star Lantern,6.19,24,16626,United Kingdom +581567,12/9/2019,84971S,Small Heart Flowers Hook,6.19,48,16626,United Kingdom +581567,12/9/2019,22624,Ivory Kitchen Scales,6.19,2,16626,United Kingdom +581567,12/9/2019,22627,Mint Kitchen Scales,6.19,2,16626,United Kingdom +581567,12/9/2019,22625,Red Kitchen Scales,6.19,2,16626,United Kingdom +581567,12/9/2019,23355,Hot Water Bottle Keep Calm,6.19,4,16626,United Kingdom +581567,12/9/2019,21326,Aged Glass Silver T-Light Holder,6.19,144,16626,United Kingd +581567,12/9/2019,21479,White Skull Hot Water Bottle,6.19,4,16626,United Kingdom +581567,12/9/2019,23356,Love Hot Water Bottle,6.19,3,16626,United Kingdom +581567,12/9/2019,21137,Black Record Cover Frame,6.19,24,16626,United Kingdom +581570,12/9/2019,22141,Christmas Craft Tree Top Angel,6.19,6,12662,Germany +581570,12/9/2019,22175,Pink Owl Soft Toy,6.19,6,12662,Germany +581570,12/9/2019,21481,Fawn Blue Hot Water Bottle,6.19,4,12662,Germany +581570,12/9/2019,23570,Traditional Pick Up Sticks Game,6.19,12,12662,Germany +581570,12/9/2019,22326,Round Snack Boxes Set Of4 Woodland,6.19,6,12662,Germany +581570,12/9/2019,22331,Woodland Party Bag + Sticker Set,6.19,8,12662,Germany +581570,12/9/2019,22834,Hand Warmer Babushka Design,6.19,12,12662,Germany +581570,12/9/2019,21914,Blue Harmonica In Box,6.19,12,12662,Germany +581570,12/9/2019,22139,Retrospot Tea Set Ceramic 11 Pc,6.19,3,12662,Germany +581570,12/9/2019,23077,Doughnut Lip Gloss,6.19,20,12662,Germany +581570,12/9/2019,20750,Red Retrospot Mini Cases,6.19,2,12662,Germany +581570,12/9/2019,22505,Memo Board Cottage Design,6.19,4,12662,Germany +581571,12/9/2019,23326,Hanging Mini Coloured Bottles,6.19,6,15311,United Kingdom +581571,12/9/2019,21313,Glass Heart T-Light Holder,6.19,1,15311,United Kingdom +581571,12/9/2019,48187,Doormat New England,6.19,1,15311,United Kingdom +581571,12/9/2019,23317,Blue Refectory Clock,6.19,1,15311,United Kingdom +581571,12/9/2019,23197,Sketchbook Magnetic Shopping List,6.19,4,15311,United Kingdo +581571,12/9/2019,21012,Antique All Glass Candlestick,6.19,2,15311,United Kingdom +581571,12/9/2019,22227,Hanging Heart Mirror Decoration,6.19,10,15311,United Kingdom +581571,12/9/2019,22794,Sweetheart Wire Magazine Rack,6.19,1,15311,United Kingdom +581571,12/9/2019,23182,Toilet Sign Occupied Or Vacant,6.19,1,15311,United Kingdom +581571,12/9/2019,21755,Love Building Block Word,6.19,1,15311,United Kingdom +581571,12/9/2019,85053,French Enamel Candleholder,6.19,2,15311,United Kingdom +581571,12/9/2019,23110,Parisienne Key Cabinet,6.19,2,15311,United Kingdom +581571,12/9/2019,21169,You're Confusing Me Metal Sign,6.19,1,15311,United Kingdom +581571,12/9/2019,21258,Victorian Sewing Box Large,6.19,8,15311,United Kingdom +581571,12/9/2019,23168,Classic Cafe Sugar Dispenser,6.19,36,15311,United Kingdom +581571,12/9/2019,23167,Small Ceramic Top Storage Jar,6.19,96,15311,United Kingdom +581571,12/9/2019,21314,Small Glass Heart Trinket Pot,6.19,48,15311,United Kingdom +581571,12/9/2019,21137,Black Record Cover Frame,6.19,24,15311,United Kingdom +581571,12/9/2019,44234,Assorted Circular Mobile,6.19,1,15311,United Kingdom +581571,12/9/2019,84347,Rotating Silver Angels T-Light Hldr,6.19,24,15311,United Kin +581572,12/9/2019,23328,Set 6 School Milk Bottles In Crate,6.19,48,16705,United King +581572,12/9/2019,22627,Mint Kitchen Scales,6.19,4,16705,United Kingdom +581572,12/9/2019,22624,Ivory Kitchen Scales,6.19,4,16705,United Kingdom +581572,12/9/2019,23245,Set Of 3 Regency Cake Tins,6.19,4,16705,United Kingdom +581574,12/9/2019,22326,Round Snack Boxes Set Of4 Woodland,6.19,6,12526,Germany +581574,12/9/2019,22328,Round Snack Boxes Set Of 4 Fruits,6.19,6,12526,Germany +581574,12/9/2019,23238,Set Of 4 Knick Knack Tins London,6.19,6,12526,Germany +581574,12/9/2019,23237,Set Of 4 Knick Knack Tins Leaf,6.19,6,12526,Germany +581574,12/9/2019,21257,Victorian Sewing Box Medium,6.19,2,12526,Germany +581574,12/9/2019,21258,Victorian Sewing Box Large,6.19,2,12526,Germany +581574,12/9/2019,23111,Parisienne Sewing Box,6.19,2,12526,Germany +581574,12/9/2019,22077,6 Ribbons Rustic Charm,6.19,12,12526,Germany +581574,12/9/2019,22074,6 Ribbons Shimmering Pinks,6.19,12,12526,Germany +581574,12/9/2019,22621,Traditional Knitting Nancy,6.19,12,12526,Germany +581574,12/9/2019,23199,Jumbo Bag Apples,6.19,10,12526,Germany +581574,12/9/2019,23581,Jumbo Bag Paisley Park,6.19,10,12526,Germany +581578,12/9/2019,21124,Set/10 Blue Polkadot Party Candles,6.19,24,12713,Germany +581578,12/9/2019,21122,Set/10 Pink Polkadot Party Candles,6.19,24,12713,Germany +581578,12/9/2019,21121,Set/10 Red Polkadot Party Candles,6.19,24,12713,Germany +581578,12/9/2019,23389,Spaceboy Mini Backpack,6.04,4,12713,Germany +581578,12/9/2019,22556,Plasters In Tin Circus Parade,6.19,12,12713,Germany +581578,12/9/2019,22976,Circus Parade Childrens Egg Cup,6.19,12,12713,Germany +581578,12/9/2019,23255,Childrens Cutlery Circus Parade,7.24,12,12713,Germany +581578,12/9/2019,84997D,Childrens Cutlery Polkadot Pink,7.24,8,12713,Germany +581578,12/9/2019,84997B,Childrens Cutlery Retrospot Red,7.24,8,12713,Germany +581578,12/9/2019,84997C,Childrens Cutlery Polkadot Blue,7.24,8,12713,Germany +581578,12/9/2019,22555,Plasters In Tin Strongman,7.24,12,12713,Germany +581578,12/9/2019,21914,Blue Harmonica In Box,7.24,12,12713,Germany +581578,12/9/2019,22549,Picture Dominoes,7.24,24,12713,Germany +581578,12/9/2019,21918,Set 12 Kids Colour Chalk Sticks,7.24,24,12713,Germany +581578,12/9/2019,22992,Revolver Wooden Ruler,7.24,12,12713,Germany +581578,12/9/2019,22991,Giraffe Wooden Ruler,7.24,12,12713,Germany +581578,12/9/2019,23229,Vintage Donkey Tail Game,7.24,6,12713,Germany +581578,12/9/2019,22622,Box Of Vintage Alphabet Blocks,6.19,6,12713,Germany +581578,12/9/2019,21506,Fancy Font Birthday Card,6.19,12,12713,Germany +581578,12/9/2019,21507,Elephant Birthday Card,6.19,12,12713,Germany +581578,12/9/2019,23037,Candle Holder Silver Madeline,6.19,12,12713,Germany +581578,12/9/2019,23550,Wrap Alphabet Poster,6.19,25,12713,Germany +581578,12/9/2019,22711,Wrap Circus Parade,6.19,25,12713,Germany +581578,12/9/2019,21497,Fancy Fonts Birthday Wrap,6.19,25,12713,Germany +581578,12/9/2019,22704,Wrap Red Apples,6.19,25,12713,Germany +581578,12/9/2019,22585,Pack Of 6 Birdy Gift Tags,6.19,12,12713,Germany diff --git a/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/python-challenge/input.csv b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/python-challenge/input.csv new file mode 100644 index 000000000000..85854a2d4358 --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/python-challenge/input.csv @@ -0,0 +1,1500 @@ +TransactionNo,Date,ProductNo,ProductName,Price,Quantity,CustomerNo,Country +581482,12/9/2019,22485,Set Of 2 Wooden Market Crates,21.47,12,17490,United Kingdom +581475,12/9/2019,22596,Christmas Star Wish List Chalkboard,10.65,36,13069,United Ki +581475,12/9/2019,23235,Storage Tin Vintage Leaf,11.53,12,13069,United Kingdom +581475,12/9/2019,23272,Tree T-Light Holder Willie Winkie,10.65,12,13069,United King +581475,12/9/2019,23239,Set Of 4 Knick Knack Tins Poppies,11.94,6,13069,United Kingd +581475,12/9/2019,21705,Bag 500g Swirly Marbles,10.65,24,13069,United Kingdom +581475,12/9/2019,22118,Joy Wooden Block Letters,11.53,18,13069,United Kingdom +581475,12/9/2019,22119,Peace Wooden Block Letters,12.25,12,13069,United Kingdom +581475,12/9/2019,22217,T-Light Holder Hanging Lace,10.65,12,13069,United Kingdom +581475,12/9/2019,22216,T-Light Holder White Lace,10.55,24,13069,United Kingdom +581475,12/9/2019,22380,Toy Tidy Spaceboy,11.06,20,13069,United Kingdom +581475,12/9/2019,22442,Grow Your Own Flowers Set Of 3,12.25,12,13069,United Kingdom +581475,12/9/2019,22664,Toy Tidy Dolly Girl Design,11.06,20,13069,United Kingdom +581475,12/9/2019,22721,Set Of 3 Cake Tins Sketchbook,12.25,12,13069,United Kingdom +581475,12/9/2019,22723,Set Of 6 Herb Tins Sketchbook,11.53,12,13069,United Kingdom +581475,12/9/2019,22785,Squarecushion Cover Pink Union Jack,11.53,12,13069,United Ki +581475,12/9/2019,22955,36 Foil Star Cake Cases,11.06,24,13069,United Kingdom +581475,12/9/2019,23141,Triple Wire Hook Pink Heart,11.06,12,13069,United Kingdom +581475,12/9/2019,22956,36 Foil Heart Cake Cases,11.06,24,13069,United Kingdom +581475,12/9/2019,22581,Wood Stocking Christmas Scandispot,10.55,48,13069,United Kin +581476,12/9/2019,23198,Pantry Magnetic Shopping List,11.53,48,12433,Norway +581476,12/9/2019,23197,Sketchbook Magnetic Shopping List,11.74,24,12433,Norway +581476,12/9/2019,23184,Bull Dog Bottle Opener,15.32,8,12433,Norway +581476,12/9/2019,23168,Classic Cafe Sugar Dispenser,11.53,12,12433,Norway +581476,12/9/2019,23167,Small Ceramic Top Storage Jar,10.96,96,12433,Norway +581476,12/9/2019,23166,Medium Ceramic Top Storage Jar,11.32,48,12433,Norway +581476,12/9/2019,23165,Large Ceramic Top Storage Jar,11.74,48,12433,Norway +581476,12/9/2019,23004,Travel Card Wallet Pantry,10.68,48,12433,Norway +581476,12/9/2019,23002,Travel Card Wallet Skulls,10.68,24,12433,Norway +581476,12/9/2019,23000,Travel Card Wallet Transport,10.68,24,12433,Norway +581476,12/9/2019,22998,Travel Card Wallet Keep Calm,10.68,72,12433,Norway +581476,12/9/2019,22994,Travel Card Wallet Retrospot,10.68,48,12433,Norway +581476,12/9/2019,22835,Hot Water Bottle I Am So Poorly,15.32,8,12433,Norway +581476,12/9/2019,22730,Alarm Clock Bakelike Ivory,14.09,4,12433,Norway +581476,12/9/2019,22728,Alarm Clock Bakelike Pink,14.09,8,12433,Norway +581476,12/9/2019,22727,Alarm Clock Bakelike Red,14.09,8,12433,Norway +581476,12/9/2019,22726,Alarm Clock Bakelike Green,14.09,4,12433,Norway +581476,12/9/2019,22720,Set Of 3 Cake Tins Pantry Design,14.61,16,12433,Norway +581476,12/9/2019,22693,Grow A Flytrap Or Sunflower In Tin,11.34,192,12433,Norway +581476,12/9/2019,22670,French Wc Sign Blue Metal,11.53,24,12433,Norway +581476,12/9/2019,22667,Recipe Box Retrospot,12.86,24,12433,Norway +581476,12/9/2019,22666,Recipe Box Pantry Yellow Design,12.86,24,12433,Norway +581476,12/9/2019,22631,Circus Parade Lunch Box,12.25,12,12433,Norway +581476,12/9/2019,22628,Picnic Boxes Set Of 3 Retrospot,15.32,16,12433,Norway +581476,12/9/2019,22467,Gumball Coat Rack,12.86,6,12433,Norway +581476,12/9/2019,22197,Popcorn Holder,10.99,100,12433,Norway +581476,12/9/2019,22114,Hot Water Bottle Tea And Sympathy,14.61,8,12433,Norway +581476,12/9/2019,22112,Chocolate Hot Water Bottle,15.32,9,12433,Norway +581476,12/9/2019,21908,Chocolate This Way Metal Sign,12.40,36,12433,Norway +581476,12/9/2019,21874,Gin And Tonic Mug,11.74,36,12433,Norway +581476,12/9/2019,21872,Glamorous Mug,11.53,12,12433,Norway +581476,12/9/2019,21871,Save The Planet Mug,11.74,36,12433,Norway +581476,12/9/2019,21533,Retrospot Large Milk Jug,15.32,6,12433,Norway +581476,12/9/2019,21481,Fawn Blue Hot Water Bottle,14.09,12,12433,Norway +581476,12/9/2019,21479,White Skull Hot Water Bottle,14.61,4,12433,Norway +581476,12/9/2019,21248,Door Hanger Mum + Dads Room,11.74,12,12433,Norway +581476,12/9/2019,21216,Set 3 Retrospot Tea/Coffee/Sugar,14.61,24,12433,Norway +581476,12/9/2019,21181,Please One Person Metal Sign,12.15,48,12433,Norway +581476,12/9/2019,21175,Gin And Tonic Diet Metal Sign,12.38,48,12433,Norway +581476,12/9/2019,21169,You're Confusing Me Metal Sign,11.74,48,12433,Norway +581476,12/9/2019,21162,Toxic Area Door Hanger,10.65,24,12433,Norway +581476,12/9/2019,21159,Moody Boy Door Hanger,10.65,24,12433,Norway +581476,12/9/2019,21158,Moody Girl Door Hanger,10.65,24,12433,Norway +581476,12/9/2019,21154,Red Retrospot Oven Glove,11.53,10,12433,Norway +581476,12/9/2019,16016,Large Chinese Style Scissor,11.12,40,12433,Norway +581476,12/9/2019,16014,Small Chinese Style Scissor,10.68,60,12433,Norway +581476,12/9/2019,16008,Small Folding Scissor(Pointed Edge),10.37,240,12433,Norway +581476,12/9/2019,85152,Hand Over The Chocolate Sign,12.15,48,12433,Norway +581476,12/9/2019,84596F,Small Marshmallows Pink Bowl,10.68,32,12433,Norway +581476,12/9/2019,84596B,Small Dolly Mix Design Orange Bowl,10.68,16,12433,Norway +581476,12/9/2019,84510A,Set Of 4 English Rose Coasters,11.53,20,12433,Norway +581476,12/9/2019,82600,N0 Singing Metal Sign,12.15,48,12433,Norway +581476,12/9/2019,82581,Toilet Metal Sign,10.81,48,12433,Norway +581476,12/9/2019,72232,Feng Shui Pillar Candle,10.44,144,12433,Norway +581476,12/9/2019,47559B,Tea Time Oven Glove,11.53,10,12433,Norway +581476,12/9/2019,47504H,English Rose Spirit Level,11.06,36,12433,Norway +581476,12/9/2019,23493,Vintage Doily Travel Sewing Kit,12.25,30,12433,Norway +581476,12/9/2019,23430,Blue Retro Kitchen Wall Clock,18.60,2,12433,Norway +581476,12/9/2019,23429,Red Retro Kitchen Wall Clock,18.60,2,12433,Norway +581476,12/9/2019,23428,Ivory Retro Kitchen Wall Clock,18.60,2,12433,Norway +581476,12/9/2019,23358,Hot Stuff Hot Water Bottle,11.53,18,12433,Norway +581476,12/9/2019,23293,Set Of 12 Fairy Cake Baking Cases,11.10,32,12433,Norway +581476,12/9/2019,23243,Set Of Tea Coffee Sugar Tins Pantry,15.32,12,12433,Norway +581476,12/9/2019,23240,Set Of 4 Knick Knack Tins Doily,14.50,6,12433,Norway +581477,12/9/2019,48111,Doormat 3 Smiley Cats,17.51,10,13426,United Kingdom +581477,12/9/2019,22464,Hanging Metal Heart Lantern,11.06,12,13426,United Kingdom +581477,12/9/2019,20982,12 Pencils Tall Tube Skulls,11.12,12,13426,United Kingdom +581477,12/9/2019,20981,12 Pencils Tall Tube Woodland,11.12,12,13426,United Kingdom +581477,12/9/2019,23424,Gingham Recipe Book Box,15.32,8,13426,United Kingdom +581477,12/9/2019,23338,Egg Frying Pan Red,12.15,48,13426,United Kingdom +581477,12/9/2019,84970L,Single Heart Zinc T-Light Holder,11.53,12,13426,United King +581477,12/9/2019,22457,Natural Slate Heart Chalkboard,13.27,6,13426,United Kingdom +581477,12/9/2019,22469,Heart Of Wicker Small,11.94,12,13426,United Kingdom +581477,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,11.12,12,13426,United Ki +581478,12/9/2019,84947,Antique Silver Tea Glass Engraved,11.53,24,17364,United King +581478,12/9/2019,23503,Playing Cards Keep Calm & Carry On,11.53,12,17364,United Kin +581478,12/9/2019,23445,Ice Cream Bubbles,11.10,20,17364,United Kingdom +581478,12/9/2019,23530,Wall Art Only One Person,15.32,12,17364,United Kingdom +581478,12/9/2019,84997C,Childrens Cutlery Polkadot Blue,14.50,4,17364,United Kingdo +581478,12/9/2019,84997D,Childrens Cutlery Polkadot Pink,14.50,4,17364,United Kingdo +581478,12/9/2019,84077,World War 2 Gliders Asstd Designs,10.55,48,17364,United King +581478,12/9/2019,22749,Feltcraft Princess Charlotte Doll,14.09,4,17364,United Kingd +581478,12/9/2019,23127,Feltcraft Girl Nicole Kit,15.32,4,17364,United Kingdom +581478,12/9/2019,23126,Feltcraft Girl Amelie Kit,15.32,4,17364,United Kingdom +581478,12/9/2019,22747,Poppy's Playhouse Bathroom,12.40,6,17364,United Kingdom +581478,12/9/2019,22078,Ribbon Reel Lace Design,12.40,10,17364,United Kingdom +581478,12/9/2019,84946,Antique Silver T-Light Glass,11.53,12,17364,United Kingdom +581478,12/9/2019,22791,T-Light Glass Fluted Antique,11.53,12,17364,United Kingdom +581478,12/9/2019,21326,Aged Glass Silver T-Light Holder,10.92,12,17364,United Kingd +581478,12/9/2019,22170,Picture Frame Wood Triple Portrait,17.17,8,17364,United King +581478,12/9/2019,23082,Set 6 Paper Table Lantern Hearts,14.09,6,17364,United Kingdo +581478,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,11.12,24,17364,United Ki +581479,12/9/2019,22087,Paper Bunting White Lace,13.27,10,17364,United Kingdom +581480,12/9/2019,23464,Vintage Zinc Watering Can Small,15.32,4,14441,United Kingdom +581480,12/9/2019,22411,Jumbo Shopper Vintage Red Paisley,12.38,10,14441,United King +581480,12/9/2019,84029E,Red Woolly Hottie White Heart,14.61,8,14441,United Kingdom +581480,12/9/2019,22633,Hand Warmer Union Jack,12.40,12,14441,United Kingdom +581480,12/9/2019,23355,Hot Water Bottle Keep Calm,15.32,12,14441,United Kingdom +581480,12/9/2019,84029G,Knitted Union Flag Hot Water Bottle,14.61,12,14441,United K +581480,12/9/2019,22112,Chocolate Hot Water Bottle,15.32,6,14441,United Kingdom +581480,12/9/2019,84347,Rotating Silver Angels T-Light Hldr,12.86,18,14441,United Ki +581481,12/9/2019,21115,Rose Caravan Doorstop,12.25,8,17490,United Kingdom +581481,12/9/2019,22059,Ceramic Strawberry Design Mug,10.65,24,17490,United Kingdom +581481,12/9/2019,22072,Red Retrospot Tea Cup And Saucer,11.53,24,17490,United Kingd +581481,12/9/2019,22123,Ping Microwave Apron,11.06,24,17490,United Kingdom +581481,12/9/2019,22476,Empire Union Jack Tv Dinner Tray,12.25,8,17490,United Kingdo +581481,12/9/2019,22495,Set Of 2 Round Tins Camembert,11.06,12,17490,United Kingdom +581481,12/9/2019,22496,Set Of 2 Round Tins Dutch Cheese,11.06,12,17490,United Kingd +581481,12/9/2019,22513,Doorstop Football Design,11.06,8,17490,United Kingdom +581481,12/9/2019,22500,Set Of 2 Tins Jardin De Provence,11.53,12,17490,United Kingd +581481,12/9/2019,22664,Toy Tidy Dolly Girl Design,11.06,20,17490,United Kingdom +581481,12/9/2019,22721,Set Of 3 Cake Tins Sketchbook,12.25,12,17490,United Kingdom +581481,12/9/2019,22785,Squarecushion Cover Pink Union Jack,11.53,12,17490,United Ki +581481,12/9/2019,23178,Jam Clock Magnet,11.53,12,17490,United Kingdom +581481,12/9/2019,23302,Kneeling Mat Housework Design,11.06,24,17490,United Kingdom +581481,12/9/2019,23533,Wall Art Garden Haven,12.25,6,17490,United Kingdom +581481,12/9/2019,84819,Danish Rose Round Sewing Box,11.06,16,17490,United Kingdom +581482,12/9/2019,22371,Airline Bag Vintage Tokyo 78,14.30,12,17490,United Kingdom +581482,12/9/2019,21875,Kings Choice Mug,11.34,36,17490,United Kingdom +581482,12/9/2019,23251,Vintage Red Enamel Trim Mug,11.32,96,17490,United Kingdom +581482,12/9/2019,23300,Gardeners Kneeling Pad Cup Of Tea,11.74,48,17490,United King +581482,12/9/2019,22138,Baking Set 9 Piece Retrospot,14.61,24,17490,United Kingdom +581483,12/9/2019,23843,Paper Craft Little Birdie,12.38,80995,16446,United Kingdom +581485,12/9/2019,22617,Baking Set Spaceboy Design,15.32,18,17389,United Kingdom +581485,12/9/2019,20749,Assorted Colour Mini Cases,16.76,84,17389,United Kingdom +581486,12/9/2019,22910,Paper Chain Kit Vintage Christmas,13.27,12,17001,United King +581486,12/9/2019,22086,Paper Chain Kit 50'S Christmas,13.27,12,17001,United Kingdom +581486,12/9/2019,23351,Roll Wrap 50'S Christmas,6.19,12,17001,United Kingdom +581486,12/9/2019,23352,Roll Wrap 50'S Red Christmas,6.19,12,17001,United Kingdom +581486,12/9/2019,22727,Alarm Clock Bakelike Red,6.19,8,17001,United Kingdom +581486,12/9/2019,22730,Alarm Clock Bakelike Ivory,6.19,4,17001,United Kingdom +581486,12/9/2019,22491,Pack Of 12 Coloured Pencils,6.04,12,17001,United Kingdom +581486,12/9/2019,22561,Wooden School Colouring Set,6.04,12,17001,United Kingdom +581486,12/9/2019,22489,Pack Of 12 Traditional Crayons,6.04,24,17001,United Kingdom +581486,12/9/2019,22560,Traditional Modelling Clay,6.04,24,17001,United Kingdom +581486,12/9/2019,22139,Retrospot Tea Set Ceramic 11 Pc,6.04,6,17001,United Kingdom +581486,12/9/2019,23344,Jumbo Bag 50'S Christmas,6.19,20,17001,United Kingdom +581486,12/9/2019,23203,Jumbo Bag Vintage Doily,6.19,20,17001,United Kingdom +581486,12/9/2019,85099B,Jumbo Bag Red Retrospot,6.19,10,17001,United Kingdom +581486,12/9/2019,23201,Jumbo Bag Alphabet,6.19,20,17001,United Kingdom +581486,12/9/2019,23207,Lunch Bag Alphabet Design,6.19,10,17001,United Kingdom +581487,12/9/2019,21137,Black Record Cover Frame,6.04,120,15694,United Kingdom +581488,12/9/2019,23118,Parisienne Jewellery Drawer,6.04,16,17428,United Kingdom +581488,12/9/2019,23111,Parisienne Sewing Box,6.04,16,17428,United Kingdom +581488,12/9/2019,22179,Set 10 Night Owl Lights,6.04,24,17428,United Kingdom +581489,12/9/2019,22061,Large Cake Stand Hanging Strawbery,7.24,48,16954,United King +581489,12/9/2019,22182,Cake Stand Victorian Filigree Small,7.24,24,16954,United Kin +581491,12/9/2019,23571,Traditional Naughts & Crosses,7.24,12,12433,Norway +581492,12/9/2019,23369,Set 36 Colour Pencils Love London,6.19,2,15492,United Kingdo +581492,12/9/2019,23370,Set 36 Colouring Pencils Doily,6.19,2,15492,United Kingdom +581492,12/9/2019,23371,Set 36 Colour Pencils Spaceboy,6.19,3,15492,United Kingdom +581492,12/9/2019,23372,Set 36 Colour Pencils Dolly Girl,6.19,1,15492,United Kingdom +581492,12/9/2019,23376,Pack Of 12 Vintage Christmas Tissue,6.19,3,15492,United King +581492,12/9/2019,23377,Pack Of 12 Dolly Girl Tissues,6.19,6,15492,United Kingdom +581492,12/9/2019,23378,Pack Of 12 50'S Christmas Tissues,6.19,9,15492,United Kingdo +581492,12/9/2019,23379,Pack Of 12 Red Apple Tissues,6.19,4,15492,United Kingdom +581492,12/9/2019,23380,Pack Of 12 Vintage Doily Tissues,6.19,3,15492,United Kingdom +581492,12/9/2019,23381,Pack Of 12 Vintage Leaf Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,23382,Box Of 6 Christmas Cake Decorations,6.19,4,15492,United King +581492,12/9/2019,23391,I Love London Mini Backpack,6.19,2,15492,United Kingdom +581492,12/9/2019,23392,Spaceboy Rocket Lolly Makers,6.19,2,15492,United Kingdom +581492,12/9/2019,23399,Home Sweet Home Hanging Heart,6.19,4,15492,United Kingdom +581492,12/9/2019,23405,Home Sweet Home 2 Drawer Cabinet,6.19,3,15492,United Kingdom +581492,12/9/2019,23418,Lavender Toilette Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,23426,Metal Sign Drop Your Pants,6.19,1,15492,United Kingdom +581492,12/9/2019,23434,3 Raffia Ribbons 50'S Christmas,6.19,9,15492,United Kingdom +581492,12/9/2019,23435,3 Raffia Ribbons Vintage Christmas,6.04,3,15492,United Kingd +581492,12/9/2019,23439,Hand Warmer Red Love Heart,6.19,1,15492,United Kingdom +581492,12/9/2019,23451,Square Mini Portrait Frame,6.19,1,15492,United Kingdom +581492,12/9/2019,23467,Vintage Zinc Planter,6.19,1,15492,United Kingdom +581492,12/9/2019,23469,Card Holder Love Bird Small,6.19,3,15492,United Kingdom +581492,12/9/2019,23480,Mini Lights Woodland Mushrooms,6.19,2,15492,United Kingdom +581492,12/9/2019,23493,Vintage Doily Travel Sewing Kit,6.19,3,15492,United Kingdom +581492,12/9/2019,23494,Vintage Doily Deluxe Sewing Kit,6.19,1,15492,United Kingdom +581492,12/9/2019,23495,Set Of 3 Pantry Wooden Spoons,6.19,1,15492,United Kingdom +581492,12/9/2019,23497,Classic Chrome Bicycle Bell,6.19,4,15492,United Kingdom +581492,12/9/2019,23498,Classic Bicycle Clips,6.19,2,15492,United Kingdom +581492,12/9/2019,23501,Key Ring Baseball Boot Union Jack,6.19,3,15492,United Kingdo +581492,12/9/2019,23506,Mini Playing Cards Spaceboy,6.04,1,15492,United Kingdom +581492,12/9/2019,23508,Mini Playing Cards Dolly Girl,6.04,2,15492,United Kingdom +581492,12/9/2019,23510,Mini Playing Cards Gymkhana,6.04,1,15492,United Kingdom +581492,12/9/2019,23521,Wall Art Cat And Bird,6.04,1,15492,United Kingdom +581492,12/9/2019,23526,Wall Art Dog Licence,6.04,4,15492,United Kingdom +581492,12/9/2019,23530,Wall Art Only One Person,6.04,2,15492,United Kingdom +581492,12/9/2019,23534,Wall Art Stop For Tea,6.19,6,15492,United Kingdom +581492,12/9/2019,23535,Wall Art Bicycle Safety,6.19,4,15492,United Kingdom +581492,12/9/2019,23536,Wall Art Village Show,6.19,1,15492,United Kingdom +581492,12/9/2019,23538,Wall Art Vintage Heart,6.19,1,15492,United Kingdom +581492,12/9/2019,23551,Pack Of 12 Paisley Park Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,23552,Bicycle Puncture Repair Kit,6.19,12,15492,United Kingdom +581492,12/9/2019,23555,Landmark Frame Notting Hill,6.19,1,15492,United Kingdom +581492,12/9/2019,23559,Woodland Bunnies Lolly Makers,6.19,5,15492,United Kingdom +581492,12/9/2019,23561,Set Of 6 Ribbons Party,6.19,1,15492,United Kingdom +581492,12/9/2019,23564,Egg Cup Milkmaid Ingrid,6.19,2,15492,United Kingdom +581492,12/9/2019,23565,Egg Cup Milkmaid Helga,6.19,2,15492,United Kingdom +581492,12/9/2019,23567,Egg Cup Henrietta Hen Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,23569,Tradtional Alphabet Stamp Set,6.19,2,15492,United Kingdom +581492,12/9/2019,23570,Traditional Pick Up Sticks Game,6.19,7,15492,United Kingdom +581492,12/9/2019,23571,Traditional Naughts & Crosses,6.19,2,15492,United Kingdom +581492,12/9/2019,23575,Snack Tray Paisley Park,6.19,3,15492,United Kingdom +581492,12/9/2019,23579,Snack Tray I Love London,6.19,1,15492,United Kingdom +581492,12/9/2019,23611,Set 10 Cards Red Riding Hood 17214,6.19,3,15492,United Kingd +581492,12/9/2019,23616,Set 10 Cards Jingle Bells 17217,6.19,1,15492,United Kingdom +581492,12/9/2019,23621,Set 10 Cards David's Madonna 17074,6.19,3,15492,United Kingd +581492,12/9/2019,23635,Set 10 Cards Christmas Holly 17259,6.19,1,15492,United Kingd +581492,12/9/2019,23644,Set 10 Cards Christmas Tree 16955,6.19,1,15492,United Kingdo +581492,12/9/2019,23660,Henrietta Hen Mug,6.19,1,15492,United Kingdom +581492,12/9/2019,23661,Milk Maids Mug,6.19,1,15492,United Kingdom +581492,12/9/2019,35095A,Blue Victorian Fabric Oval Box,6.19,1,15492,United Kingdom +581492,12/9/2019,35095B,Red Victorian Fabric Oval Box,6.19,1,15492,United Kingdom +581492,12/9/2019,35646,Vintage Bead Pink Evening Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,35648,Vintage Bead Pink Purse,6.19,2,15492,United Kingdom +581492,12/9/2019,35953,Folkart Star Christmas Decorations,6.19,12,15492,United King +581492,12/9/2019,35964,Folkart Clip On Stars,6.19,4,15492,United Kingdom +581492,12/9/2019,35970,Zinc Folkart Sleigh Bells,6.04,1,15492,United Kingdom +581492,12/9/2019,46118,Funky Monkey Cushion Cover,6.19,1,15492,United Kingdom +581492,12/9/2019,46776A,Woven Bubble Gum Cushion Cover,7.24,2,15492,United Kingdom +581492,12/9/2019,46776B,Woven Berries Cushion Cover,7.24,3,15492,United Kingdom +581492,12/9/2019,46776C,Woven Frost Cushion Cover,7.24,1,15492,United Kingdom +581492,12/9/2019,46776D,Woven Sunset Cushion Cover,7.24,2,15492,United Kingdom +581492,12/9/2019,46776E,Woven Candy Cushion Cover,7.24,5,15492,United Kingdom +581492,12/9/2019,46776F,Woven Rose Garden Cushion Cover,7.24,6,15492,United Kingdom +581492,12/9/2019,47310M,Small Pop Box Funky Monkey,6.19,1,15492,United Kingdom +581492,12/9/2019,47480,Hanging Photo Clip Rope Ladder,6.19,3,15492,United Kingdom +581492,12/9/2019,47504H,English Rose Spirit Level,7.24,1,15492,United Kingdom +581492,12/9/2019,47559B,Tea Time Oven Glove,7.24,3,15492,United Kingdom +581492,12/9/2019,47563A,Retro Longboard Ironing Board Cover,7.24,2,15492,United Kin +581492,12/9/2019,47566,Party Bunting,7.24,2,15492,United Kingdom +581492,12/9/2019,47590B,Pink Happy Birthday Bunting,7.24,1,15492,United Kingdom +581492,12/9/2019,51014A,Feather Pen Hot Pink,7.24,2,15492,United Kingdom +581492,12/9/2019,51014L,Feather Pen Light Pink,7.24,1,15492,United Kingdom +581492,12/9/2019,71270,Photo Clip Line,7.24,1,15492,United Kingdom +581492,12/9/2019,72349B,Set/6 Purple Butterfly T-Lights,6.39,1,15492,United Kingdom +581492,12/9/2019,72741,Grand Chocolatecandle,7.24,3,15492,United Kingdom +581492,12/9/2019,72800E,4 Ivory Dinner Candles Silver Flock,7.24,3,15492,United Kin +581492,12/9/2019,79321,Chilli Lights,6.19,1,15492,United Kingdom +581492,12/9/2019,82484,Wood Black Board Ant White Finish,6.19,2,15492,United Kingdo +581492,12/9/2019,82567,Airline Lounge Metal Sign,6.19,2,15492,United Kingdom +581492,12/9/2019,82582,Area Patrolled Metal Sign,6.19,1,15492,United Kingdom +581492,12/9/2019,82600,N0 Singing Metal Sign,6.19,1,15492,United Kingdom +581492,12/9/2019,84031A,Charlie+Lola Red Hot Water Bottle,6.19,4,15492,United Kingd +581492,12/9/2019,84077,World War 2 Gliders Asstd Designs,6.19,1,15492,United Kingdo +581492,12/9/2019,84249A,Greeting Card Square Doughnuts,6.19,1,15492,United Kingdom +581492,12/9/2019,84347,Rotating Silver Angels T-Light Hldr,6.19,2,15492,United King +581492,12/9/2019,84375,Set Of 20 Kids Cookie Cutters,6.19,1,15492,United Kingdom +581492,12/9/2019,84378,Set Of 3 Heart Cookie Cutters,6.19,4,15492,United Kingdom +581492,12/9/2019,84519B,Carrot Charlie+Lola Coaster Set,6.19,1,15492,United Kingdom +581492,12/9/2019,84559A,3d Sheet Of Dog Stickers,6.19,2,15492,United Kingdom +581492,12/9/2019,84568,Girls Alphabet Iron On Patches,6.19,31,15492,United Kingdom +581492,12/9/2019,84569D,Pack 6 Heart/Ice-Cream Patches,6.19,1,15492,United Kingdom +581492,12/9/2019,84596B,Small Dolly Mix Design Orange Bowl,6.19,4,15492,United King +581492,12/9/2019,84596F,Small Marshmallows Pink Bowl,6.19,4,15492,United Kingdom +581492,12/9/2019,84598,Boys Alphabet Iron On Patches,6.19,5,15492,United Kingdom +581492,12/9/2019,84692,Box Of 24 Cocktail Parasols,6.19,1,15492,United Kingdom +581492,12/9/2019,84755,Colour Glass T-Light Holder Hanging,6.19,4,15492,United King +581492,12/9/2019,84828,Jungle Popsicles Ice Lolly Moulds,6.19,1,15492,United Kingdo +581492,12/9/2019,84879,Assorted Colour Bird Ornament,6.19,16,15492,United Kingdom +581492,12/9/2019,84923,Pink Butterfly Handbag W Bobbles,6.04,3,15492,United Kingdom +581492,12/9/2019,84946,Antique Silver T-Light Glass,6.04,18,15492,United Kingdom +581492,12/9/2019,84970S,Hanging Heart Zinc T-Light Holder,6.04,3,15492,United Kingd +581492,12/9/2019,84978,Hanging Heart Jar T-Light Holder,6.04,4,15492,United Kingdom +581492,12/9/2019,84991,60 Teatime Fairy Cake Cases,6.04,1,15492,United Kingdom +581492,12/9/2019,84997A,Childrens Cutlery Polkadot Green,6.04,1,15492,United Kingdo +581492,12/9/2019,84997B,Childrens Cutlery Retrospot Red,6.04,1,15492,United Kingdom +581492,12/9/2019,20733,Gold Mini Tape Measure,6.04,3,15492,United Kingdom +581492,12/9/2019,20777,Chrysanthemum Notebook,6.19,2,15492,United Kingdom +581492,12/9/2019,20782,Camouflage Ear Muff Headphones,6.19,1,15492,United Kingdom +581492,12/9/2019,20914,Set/5 Red Retrospot Lid Glass Bowls,6.19,2,15492,United King +581492,12/9/2019,20931,Blue Pot Plant Candle,6.19,1,15492,United Kingdom +581492,12/9/2019,20970,Pink Floral Feltcraft Shoulder Bag,6.19,1,15492,United Kingd +581492,12/9/2019,20971,Pink Blue Felt Craft Trinket Box,6.19,2,15492,United Kingdom +581492,12/9/2019,20972,Pink Cream Felt Craft Trinket Box,6.19,3,15492,United Kingdo +581492,12/9/2019,20973,12 Pencil Small Tube Woodland,6.19,4,15492,United Kingdom +581492,12/9/2019,20978,36 Pencils Tube Skulls,6.19,1,15492,United Kingdom +581492,12/9/2019,20979,36 Pencils Tube Red Retrospot,6.19,3,15492,United Kingdom +581492,12/9/2019,20982,12 Pencils Tall Tube Skulls,6.19,2,15492,United Kingdom +581492,12/9/2019,20983,12 Pencils Tall Tube Red Retrospot,6.19,4,15492,United Kingd +581492,12/9/2019,20985,Heart Calculator,6.19,1,15492,United Kingdom +581492,12/9/2019,20986,Blue Calculator Ruler,6.19,1,15492,United Kingdom +581492,12/9/2019,21000,Rose Du Sud Cosmetics Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,21012,Antique All Glass Candlestick,6.19,3,15492,United Kingdom +581492,12/9/2019,21015,Dark Bird House Tree Decoration,6.19,8,15492,United Kingdom +581492,12/9/2019,21026,Space Owl,6.19,1,15492,United Kingdom +581492,12/9/2019,21035,Set/2 Red Retrospot Tea Towels,6.19,1,15492,United Kingdom +581492,12/9/2019,21064,Boom Box Speaker Boys,6.19,4,15492,United Kingdom +581492,12/9/2019,21065,Boom Box Speaker Girls,6.19,2,15492,United Kingdom +581492,12/9/2019,21098,Christmas Toilet Roll,6.19,1,15492,United Kingdom +581492,12/9/2019,21123,Set/10 Ivory Polkadot Party Candles,6.19,1,15492,United King +581492,12/9/2019,21125,Set 6 Football Celebration Candles,6.19,1,15492,United Kingd +581492,12/9/2019,21126,Set Of 6 Girls Celebration Candles,6.19,1,15492,United Kingd +581492,12/9/2019,21137,Black Record Cover Frame,6.19,17,15492,United Kingdom +581492,12/9/2019,21154,Red Retrospot Oven Glove,6.19,2,15492,United Kingdom +581492,12/9/2019,21158,Moody Girl Door Hanger,6.19,1,15492,United Kingdom +581492,12/9/2019,21162,Toxic Area Door Hanger,6.19,1,15492,United Kingdom +581492,12/9/2019,21166,Cook With Wine Metal Sign,6.19,2,15492,United Kingdom +581492,12/9/2019,21172,Party Metal Sign,6.19,1,15492,United Kingdom +581492,12/9/2019,21174,Pottering In The Shed Metal Sign,6.19,2,15492,United Kingdom +581492,12/9/2019,21175,Gin And Tonic Diet Metal Sign,6.19,2,15492,United Kingdom +581492,12/9/2019,21200,Multicolour Honeycomb Paper Garland,6.04,6,15492,United King +581492,12/9/2019,21201,Tropical Honeycomb Paper Garland,6.04,4,15492,United Kingdom +581492,12/9/2019,21212,Pack Of 72 Retrospot Cake Cases,6.04,2,15492,United Kingdom +581492,12/9/2019,21213,Pack Of 72 Skull Cake Cases,6.04,2,15492,United Kingdom +581492,12/9/2019,21220,Set/4 Badges Dogs,6.19,2,15492,United Kingdom +581492,12/9/2019,21224,Set/4 Skull Badges,6.19,1,15492,United Kingdom +581492,12/9/2019,21232,Strawberry Ceramic Trinket Pot,6.19,1,15492,United Kingdom +581492,12/9/2019,21257,Victorian Sewing Box Medium,6.19,2,15492,United Kingdom +581492,12/9/2019,21258,Victorian Sewing Box Large,6.19,1,15492,United Kingdom +581492,12/9/2019,21259,Victorian Sewing Box Small,6.19,1,15492,United Kingdom +581492,12/9/2019,21313,Glass Heart T-Light Holder,6.19,1,15492,United Kingdom +581492,12/9/2019,21314,Small Glass Heart Trinket Pot,6.19,2,15492,United Kingdom +581492,12/9/2019,21328,Balloons Writing Set,6.19,2,15492,United Kingdom +581492,12/9/2019,21329,Dinosaurs Writing Set,6.19,2,15492,United Kingdom +581492,12/9/2019,21356,Toast Its - Fairy Flower,6.19,16,15492,United Kingdom +581492,12/9/2019,21378,Small Tall Camphor Wood Toadstool,6.19,2,15492,United Kingdo +581492,12/9/2019,21379,Camphor Wood Portobello Mushroom,6.19,1,15492,United Kingdom +581492,12/9/2019,21383,Pack Of 12 Sticky Bunnies,6.19,1,15492,United Kingdom +581492,12/9/2019,21402,Red Egg Spoon,6.19,1,15492,United Kingdom +581492,12/9/2019,21408,Spotty Pink Duck Doorstop,6.19,2,15492,United Kingdom +581492,12/9/2019,21411,Gingham Heart Doorstop Red,6.19,1,15492,United Kingdom +581492,12/9/2019,21467,Cherry Crochet Food Cover,6.19,1,15492,United Kingdom +581492,12/9/2019,21471,Strawberry Raffia Food Cover,6.19,2,15492,United Kingdom +581492,12/9/2019,21479,White Skull Hot Water Bottle,6.19,2,15492,United Kingdom +581492,12/9/2019,21481,Fawn Blue Hot Water Bottle,6.19,3,15492,United Kingdom +581492,12/9/2019,21484,Chick Grey Hot Water Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,21485,Retrospot Heart Hot Water Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,21494,Rotating Leaves T-Light Holder,6.19,11,15492,United Kingdom +581492,12/9/2019,21506,Fancy Font Birthday Card,6.19,3,15492,United Kingdom +581492,12/9/2019,21507,Elephant Birthday Card,7.24,1,15492,United Kingdom +581492,12/9/2019,21508,Vintage Kid Dolly Card,7.24,1,15492,United Kingdom +581492,12/9/2019,21509,Cowboys And Indians Birthday Card,7.24,2,15492,United Kingdo +581492,12/9/2019,21528,Dairy Maid Traditional Teapot,7.24,1,15492,United Kingdom +581492,12/9/2019,21544,Skulls Water Transfer Tattoos,7.24,2,15492,United Kingdom +581492,12/9/2019,21558,Skull Lunch Box With Cutlery,6.39,1,15492,United Kingdom +581492,12/9/2019,21559,Strawberry Lunch Box With Cutlery,7.24,1,15492,United Kingdo +581492,12/9/2019,21615,4 Lavender Botanical Dinner Candles,7.24,2,15492,United King +581492,12/9/2019,21616,4 Pear Botanical Dinner Candles,7.24,6,15492,United Kingdom +581492,12/9/2019,21620,Set Of 4 Rose Botanical Candles,7.24,5,15492,United Kingdom +581492,12/9/2019,21642,Assorted Tutti Frutti Pen,7.24,4,15492,United Kingdom +581492,12/9/2019,21648,Assorted Tutti Frutti Small Purse,7.24,2,15492,United Kingdo +581492,12/9/2019,21650,Assorted Tutti Frutti Bracelet,7.24,14,15492,United Kingdom +581492,12/9/2019,21675,Butterflies Stickers,6.19,2,15492,United Kingdom +581492,12/9/2019,21677,Hearts Stickers,6.19,1,15492,United Kingdom +581492,12/9/2019,21678,Paisley Pattern Stickers,6.19,2,15492,United Kingdom +581492,12/9/2019,21680,Woodland Stickers,6.19,1,15492,United Kingdom +581492,12/9/2019,21703,Bag 125g Swirly Marbles,6.19,1,15492,United Kingdom +581492,12/9/2019,21704,Bag 250g Swirly Marbles,6.19,1,15492,United Kingdom +581492,12/9/2019,21716,Boys Vintage Tin Seaside Bucket,6.19,1,15492,United Kingdom +581492,12/9/2019,21718,Red Metal Beach Spade,6.19,1,15492,United Kingdom +581492,12/9/2019,21724,Panda And Bunnies Sticker Sheet,6.19,1,15492,United Kingdom +581492,12/9/2019,21731,Red Toadstool Led Night Light,6.19,6,15492,United Kingdom +581492,12/9/2019,21739,Cosy Slipper Shoes Small Green,6.19,2,15492,United Kingdom +581492,12/9/2019,21774,Decorative Cats Bathroom Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,21786,Polkadot Rain Hat,6.19,3,15492,United Kingdom +581492,12/9/2019,21787,Rain Poncho Retrospot,6.19,2,15492,United Kingdom +581492,12/9/2019,21790,Vintage Snap Cards,6.19,5,15492,United Kingdom +581492,12/9/2019,21791,Vintage Heads And Tails Card Game,6.19,1,15492,United Kingdo +581492,12/9/2019,21808,Christmas Garland Stars Trees,6.19,3,15492,United Kingdom +581492,12/9/2019,21810,Christmas Hanging Star With Bell,6.19,25,15492,United Kingdo +581492,12/9/2019,21812,Garland With Hearts And Bells,6.19,7,15492,United Kingdom +581492,12/9/2019,21813,Garland With Stars And Bells,6.19,3,15492,United Kingdom +581492,12/9/2019,21822,Glitter Christmas Tree With Bells,6.19,12,15492,United Kingd +581492,12/9/2019,21828,Eight Piece Snake Set,6.19,1,15492,United Kingdom +581492,12/9/2019,21832,Chocolate Calculator,6.19,1,15492,United Kingdom +581492,12/9/2019,21833,Camouflage Led Torch,6.04,2,15492,United Kingdom +581492,12/9/2019,21871,Save The Planet Mug,6.19,1,15492,United Kingdom +581492,12/9/2019,21874,Gin And Tonic Mug,6.19,2,15492,United Kingdom +581492,12/9/2019,21876,Pottering Mug,6.19,4,15492,United Kingdom +581492,12/9/2019,21879,Hearts Gift Tape,6.19,1,15492,United Kingdom +581492,12/9/2019,21889,Wooden Box Of Dominoes,6.19,3,15492,United Kingdom +581492,12/9/2019,21890,S/6 Wooden Skittles In Cotton Bag,6.19,1,15492,United Kingdo +581492,12/9/2019,21892,Traditional Wooden Catch Cup Game,6.19,1,15492,United Kingdo +581492,12/9/2019,21900,Key Fob Shed,6.19,4,15492,United Kingdom +581492,12/9/2019,21901,Key Fob Back Door,6.19,2,15492,United Kingdom +581492,12/9/2019,21902,Key Fob Front Door,6.19,1,15492,United Kingdom +581492,12/9/2019,21905,More Butter Metal Sign,6.19,1,15492,United Kingdom +581492,12/9/2019,21906,Pharmacie First Aid Tin,6.19,1,15492,United Kingdom +581492,12/9/2019,21914,Blue Harmonica In Box,6.19,2,15492,United Kingdom +581492,12/9/2019,21916,Set 12 Retro White Chalk Sticks,6.19,2,15492,United Kingdom +581492,12/9/2019,21930,Jumbo Storage Bag Skulls,6.19,1,15492,United Kingdom +581492,12/9/2019,21931,Jumbo Storage Bag Suki,6.19,1,15492,United Kingdom +581492,12/9/2019,21932,Scandinavian Paisley Picnic Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,21934,Skull Shoulder Bag,6.19,3,15492,United Kingdom +581492,12/9/2019,21935,Suki Shoulder Bag,6.19,9,15492,United Kingdom +581492,12/9/2019,21936,Red Retrospot Picnic Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,21942,Skulls Design Flannel,6.19,2,15492,United Kingdom +581492,12/9/2019,21945,Strawberries Design Flannel,6.19,2,15492,United Kingdom +581492,12/9/2019,21947,Set Of 6 Heart Chopsticks,6.19,1,15492,United Kingdom +581492,12/9/2019,21949,Set Of 6 Strawberry Chopsticks,6.19,2,15492,United Kingdom +581492,12/9/2019,21967,Pack Of 12 Skull Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,21976,Pack Of 60 Mushroom Cake Cases,6.19,3,15492,United Kingdom +581492,12/9/2019,21977,Pack Of 60 Pink Paisley Cake Cases,6.19,2,15492,United Kingd +581492,12/9/2019,21980,Pack Of 12 Red Retrospot Tissues,6.19,2,15492,United Kingdom +581492,12/9/2019,21981,Pack Of 12 Woodland Tissues,6.19,4,15492,United Kingdom +581492,12/9/2019,21982,Pack Of 12 Suki Tissues,6.19,2,15492,United Kingdom +581492,12/9/2019,21983,Pack Of 12 Blue Paisley Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,21984,Pack Of 12 Pink Paisley Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,21986,Pack Of 12 Pink Polkadot Tissues,6.19,3,15492,United Kingdom +581492,12/9/2019,21989,Pack Of 20 Skull Paper Napkins,6.19,2,15492,United Kingdom +581492,12/9/2019,21990,Modern Floral Stationery Set,6.19,8,15492,United Kingdom +581492,12/9/2019,21993,Floral Folk Stationery Set,6.19,8,15492,United Kingdom +581492,12/9/2019,22024,Rainy Ladies Birthday Card,6.19,3,15492,United Kingdom +581492,12/9/2019,22025,Ring Of Roses Birthday Card,6.19,3,15492,United Kingdom +581492,12/9/2019,22026,Banquet Birthday Card,6.19,4,15492,United Kingdom +581492,12/9/2019,22027,Tea Party Birthday Card,6.19,2,15492,United Kingdom +581492,12/9/2019,22028,Penny Farthing Birthday Card,6.19,1,15492,United Kingdom +581492,12/9/2019,22029,Spaceboy Birthday Card,6.19,4,15492,United Kingdom +581492,12/9/2019,22031,Botanical Lavender Birthday Card,6.19,1,15492,United Kingdom +581492,12/9/2019,22037,Robot Birthday Card,6.19,4,15492,United Kingdom +581492,12/9/2019,22064,Pink Doughnut Trinket Pot,6.19,1,15492,United Kingdom +581492,12/9/2019,22065,Christmas Pudding Trinket Pot,6.19,2,15492,United Kingdom +581492,12/9/2019,22068,Black Pirate Treasure Chest,6.19,1,15492,United Kingdom +581492,12/9/2019,22070,Small Red Retrospot Mug In Box,6.19,3,15492,United Kingdom +581492,12/9/2019,22071,Small White Retrospot Mug In Box,6.19,1,15492,United Kingdom +581492,12/9/2019,22074,6 Ribbons Shimmering Pinks,6.19,1,15492,United Kingdom +581492,12/9/2019,22075,6 Ribbons Elegant Christmas,6.19,8,15492,United Kingdom +581492,12/9/2019,22076,6 Ribbons Empire,6.19,4,15492,United Kingdom +581492,12/9/2019,22083,Paper Chain Kit Retrospot,6.19,1,15492,United Kingdom +581492,12/9/2019,22085,Paper Chain Kit Skulls,6.19,1,15492,United Kingdom +581492,12/9/2019,22086,Paper Chain Kit 50'S Christmas,6.19,38,15492,United Kingdom +581492,12/9/2019,22091,Empire Tissue Box,6.19,1,15492,United Kingdom +581492,12/9/2019,22099,Caravan Square Tissue Box,6.19,3,15492,United Kingdom +581492,12/9/2019,22104,Mirror Mosaic Candle Plate,6.19,4,15492,United Kingdom +581492,12/9/2019,22106,Mirror Mosaic Hurricane Lamp,6.19,1,15492,United Kingdom +581492,12/9/2019,22107,Pizza Plate In Box,6.19,10,15492,United Kingdom +581492,12/9/2019,22108,Ping! Microwave Plate,6.04,2,15492,United Kingdom +581492,12/9/2019,22109,Full English Breakfast Plate,6.04,2,15492,United Kingdom +581492,12/9/2019,22110,Bird House Hot Water Bottle,6.04,3,15492,United Kingdom +581492,12/9/2019,22111,Scottie Dog Hot Water Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,22112,Chocolate Hot Water Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,22114,Hot Water Bottle Tea And Sympathy,6.19,4,15492,United Kingdo +581492,12/9/2019,22116,Metal Sign His Dinner Is Served,6.19,2,15492,United Kingdom +581492,12/9/2019,22121,Noel Wooden Block Letters,6.19,1,15492,United Kingdom +581492,12/9/2019,22123,Ping Microwave Apron,6.19,1,15492,United Kingdom +581492,12/9/2019,22124,Set Of 2 Tea Towels Ping Microwave,6.19,1,15492,United Kingd +581492,12/9/2019,22129,Party Cones Candy Decoration,6.19,3,15492,United Kingdom +581492,12/9/2019,22134,Mini Ladle Love Heart Red,6.19,1,15492,United Kingdom +581492,12/9/2019,15036,Assorted Colours Silk Fan,6.19,1,15492,United Kingdom +581492,12/9/2019,15039,Sandalwood Fan,6.19,1,15492,United Kingdom +581492,12/9/2019,15058C,Ice Cream Design Garden Parasol,6.19,1,15492,United Kingdom +581492,12/9/2019,16218,Cartoon Pencil Sharpeners,6.19,5,15492,United Kingdom +581492,12/9/2019,16225,Rattle Snake Eggs,6.19,1,15492,United Kingdom +581492,12/9/2019,16235,Recycled Pencil With Rabbit Eraser,6.19,3,15492,United Kingd +581492,12/9/2019,16237,Sleeping Cat Erasers,6.19,1,15492,United Kingdom +581492,12/9/2019,17038,Porcelain Budah Incense Holder,6.19,1,15492,United Kingdom +581492,12/9/2019,17084N,Fairy Dreams Incense,6.19,1,15492,United Kingdom +581492,12/9/2019,20659,Economy Luggage Tag,6.19,7,15492,United Kingdom +581492,12/9/2019,20665,Red Retrospot Purse,6.19,2,15492,United Kingdom +581492,12/9/2019,20668,Disco Ball Christmas Decoration,6.19,1,15492,United Kingdom +581492,12/9/2019,20718,Red Retrospot Shopper Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,20719,Woodland Charlotte Bag,6.19,7,15492,United Kingdom +581492,12/9/2019,20723,Strawberry Charlotte Bag,6.19,2,15492,United Kingdom +581492,12/9/2019,20724,Red Retrospot Charlotte Bag,6.19,4,15492,United Kingdom +581492,12/9/2019,22135,Mini Ladle Love Heart Pink,6.19,6,15492,United Kingdom +581492,12/9/2019,22138,Baking Set 9 Piece Retrospot,6.19,1,15492,United Kingdom +581492,12/9/2019,22141,Christmas Craft Tree Top Angel,6.19,2,15492,United Kingdom +581492,12/9/2019,22150,3 Stripey Mice Feltcraft,7.24,2,15492,United Kingdom +581492,12/9/2019,22153,Angel Decoration Stars On Dress,7.24,2,15492,United Kingdom +581492,12/9/2019,22154,Angel Decoration 3 Buttons,7.24,3,15492,United Kingdom +581492,12/9/2019,22155,Star Decoration Rustic,7.24,7,15492,United Kingdom +581492,12/9/2019,22156,Heart Decoration With Pearls,7.24,4,15492,United Kingdom +581492,12/9/2019,22163,Heart String Memo Holder Hanging,7.24,9,15492,United Kingdom +581492,12/9/2019,22165,Diamante Heart Shaped Wall Mirror,7.24,1,15492,United Kingdo +581492,12/9/2019,22167,Oval Wall Mirror Diamante,7.24,1,15492,United Kingdom +581492,12/9/2019,22170,Picture Frame Wood Triple Portrait,7.24,1,15492,United Kingd +581492,12/9/2019,22173,Metal 4 Hook Hanger French Chateau,7.24,2,15492,United Kingd +581492,12/9/2019,22174,Photo Cube,6.19,7,15492,United Kingdom +581492,12/9/2019,22178,Victorian Glass Hanging T-Light,6.19,5,15492,United Kingdom +581492,12/9/2019,22186,Red Star Card Holder,7.24,2,15492,United Kingdom +581492,12/9/2019,22190,Local Cafe Mug,7.24,3,15492,United Kingdom +581492,12/9/2019,22193,Red Diner Wall Clock,7.24,1,15492,United Kingdom +581492,12/9/2019,22195,Large Heart Measuring Spoons,7.24,1,15492,United Kingdom +581492,12/9/2019,22196,Small Heart Measuring Spoons,7.24,11,15492,United Kingdom +581492,12/9/2019,22197,Popcorn Holder,7.24,34,15492,United Kingdom +581492,12/9/2019,22199,Frying Pan Red Retrospot,7.24,1,15492,United Kingdom +581492,12/9/2019,22209,Wood Stamp Set Happy Birthday,7.24,1,15492,United Kingdom +581492,12/9/2019,22212,Four Hook White Lovebirds,7.24,1,15492,United Kingdom +581492,12/9/2019,22219,Lovebird Hanging Decoration White,7.24,4,15492,United Kingdo +581492,12/9/2019,22224,White Lovebird Lantern,7.24,4,15492,United Kingdom +581492,12/9/2019,22227,Hanging Heart Mirror Decoration,7.24,1,15492,United Kingdom +581492,12/9/2019,22260,Felt Egg Cosy Blue Rabbit,6.39,2,15492,United Kingdom +581492,12/9/2019,22261,Felt Egg Cosy White Rabbit,7.24,1,15492,United Kingdom +581492,12/9/2019,22264,Felt Farm Animal White Bunny,7.24,1,15492,United Kingdom +581492,12/9/2019,22273,Feltcraft Doll Molly,7.24,2,15492,United Kingdom +581492,12/9/2019,22277,Cosmetic Bag Vintage Rose Paisley,7.24,1,15492,United Kingdo +581492,12/9/2019,22279,Pocket Bag Blue Paisley Red Spot,7.24,5,15492,United Kingdom +581492,12/9/2019,22280,Pocket Bag Pink Paisely Brown Spot,7.24,4,15492,United Kingd +581492,12/9/2019,22300,Coffee Mug Dog + Ball Design,7.24,1,15492,United Kingdom +581492,12/9/2019,22301,Coffee Mug Cat + Bird Design,7.24,1,15492,United Kingdom +581492,12/9/2019,22307,Gold Mug Bone China Tree Of Life,7.24,1,15492,United Kingdom +581492,12/9/2019,22308,Tea Cosy Blue Stripe,7.24,2,15492,United Kingdom +581492,12/9/2019,22309,Tea Cosy Red Stripe,7.24,2,15492,United Kingdom +581492,12/9/2019,22324,Blue Polkadot Kids Bag,7.24,2,15492,United Kingdom +581492,12/9/2019,22326,Round Snack Boxes Set Of4 Woodland,7.24,3,15492,United Kingd +581492,12/9/2019,22327,Round Snack Boxes Set Of 4 Skulls,7.24,2,15492,United Kingdo +581492,12/9/2019,22329,Round Container Set Of 5 Retrospot,6.19,2,15492,United Kingd +581492,12/9/2019,22338,Star Decoration Painted Zinc,6.19,4,15492,United Kingdom +581492,12/9/2019,22340,Noel Garland Painted Zinc,6.19,17,15492,United Kingdom +581492,12/9/2019,22342,Home Garland Painted Zinc,6.19,7,15492,United Kingdom +581492,12/9/2019,22348,Tea Bag Plate Red Retrospot,6.19,3,15492,United Kingdom +581492,12/9/2019,22355,Charlotte Bag Suki Design,6.19,3,15492,United Kingdom +581492,12/9/2019,22356,Charlotte Bag Pink Polkadot,6.19,1,15492,United Kingdom +581492,12/9/2019,22357,Kings Choice Biscuit Tin,6.19,2,15492,United Kingdom +581492,12/9/2019,22358,Kings Choice Tea Caddy,6.19,1,15492,United Kingdom +581492,12/9/2019,22361,Glass Jar Daisy Fresh Cotton Wool,6.19,2,15492,United Kingdo +581492,12/9/2019,22362,Glass Jar Peacock Bath Salts,6.19,2,15492,United Kingdom +581492,12/9/2019,22367,Childrens Apron Spaceboy Design,6.19,1,15492,United Kingdom +581492,12/9/2019,22372,Airline Bag Vintage World Champion,6.19,1,15492,United Kingd +581492,12/9/2019,22374,Airline Bag Vintage Jet Set Red,6.19,1,15492,United Kingdom +581492,12/9/2019,85014B,Red Retrospot Umbrella,6.19,1,15492,United Kingdom +581492,12/9/2019,85032C,Curious Images Gift Wrap Set,6.19,1,15492,United Kingdom +581492,12/9/2019,85038,6 Chocolate Love Heart T-Lights,6.19,1,15492,United Kingdom +581492,12/9/2019,85039A,Set/4 Red Mini Rose Candle In Bowl,6.19,5,15492,United King +581492,12/9/2019,85039B,S/4 Ivory Mini Rose Candle In Bowl,6.19,4,15492,United King +581492,12/9/2019,85040A,S/4 Pink Flower Candles In Bowl,6.19,1,15492,United Kingdom +581492,12/9/2019,85048,15cm Christmas Glass Ball 20 Lights,6.19,2,15492,United King +581492,12/9/2019,85049C,Romantic Pinks Ribbons,6.19,1,15492,United Kingdom +581492,12/9/2019,85049G,Chocolate Box Ribbons,6.19,1,15492,United Kingdom +581492,12/9/2019,85049H,Urban Black Ribbons,6.19,2,15492,United Kingdom +581492,12/9/2019,85053,French Enamel Candleholder,6.19,1,15492,United Kingdom +581492,12/9/2019,85059,French Enamel Water Basin,6.19,1,15492,United Kingdom +581492,12/9/2019,85066,Cream Sweetheart Mini Chest,6.19,1,15492,United Kingdom +581492,12/9/2019,85094,Candy Spot Egg Warmer Rabbit,6.19,2,15492,United Kingdom +581492,12/9/2019,85114C,Red Enchanted Forest Placemat,6.19,1,15492,United Kingdom +581492,12/9/2019,85123A,Cream Hanging Heart T-Light Holder,6.19,3,15492,United King +581492,12/9/2019,85131B,Beaded Crystal Heart Green On Stick,6.19,1,15492,United Kin +581492,12/9/2019,85131D,Beaded Crystal Heart Pink On Stick,6.19,2,15492,United King +581492,12/9/2019,85152,Hand Over The Chocolate Sign,6.19,1,15492,United Kingdom +581492,12/9/2019,85168B,Black Baroque Carriage Clock,6.19,3,15492,United Kingdom +581492,12/9/2019,85169C,Eau De Nil Love Bird Candle,6.19,1,15492,United Kingdom +581492,12/9/2019,85170C,Set/6 Eau De Nil Bird T-Lights,6.19,1,15492,United Kingdom +581492,12/9/2019,85173,Set/6 Frog Prince T-Light Candles,6.19,1,15492,United Kingdo +581492,12/9/2019,85177,Basket Of Flowers Sewing Kit,6.19,1,15492,United Kingdom +581492,12/9/2019,85178,Victorian Sewing Kit,6.19,1,15492,United Kingdom +581492,12/9/2019,85179A,Green Bitty Light Chain,6.19,4,15492,United Kingdom +581492,12/9/2019,85199S,Small Hanging Ivory/Red Wood Bird,6.19,9,15492,United Kingd +581492,12/9/2019,85227,Set Of 6 3d Kit Cards For Kids,6.19,3,15492,United Kingdom +581492,12/9/2019,90003C,Midnight Blue Pair Heart Hair Slide,6.19,1,15492,United Kin +581492,12/9/2019,90003E,Green Pair Heart Hair Slides,6.19,2,15492,United Kingdom +581492,12/9/2019,90010A,Midnight Blue Glass/Silver Bracelet,6.04,1,15492,United Kin +581492,12/9/2019,90013A,Midnight Blue Vintage Earrings,6.19,3,15492,United Kingdom +581492,12/9/2019,90013C,Green Vintage Earrings,6.19,2,15492,United Kingdom +581492,12/9/2019,90014A,Silver Mop Orbit Necklace,6.19,1,15492,United Kingdom +581492,12/9/2019,90016B,Gold/Mop Pendant Orbit Necklace,6.19,1,15492,United Kingdom +581492,12/9/2019,90018B,Gold Mop Orbit Drop Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90019B,Gold Mop Orbit Bracelet,6.19,1,15492,United Kingdom +581492,12/9/2019,90027D,Glass Bead Hoop Earrings Amethyst,6.19,1,15492,United Kingd +581492,12/9/2019,90030B,Red Kukui Coconut Seed Necklace,6.19,1,15492,United Kingdom +581492,12/9/2019,90055,Cracked Glaze Earrings Brown,6.19,1,15492,United Kingdom +581492,12/9/2019,90059A,Diamante Hair Grip Pack/2 Crystal,6.19,1,15492,United Kingd +581492,12/9/2019,90059D,Diamante Hair Grip Pack/2 Peridot,6.19,2,15492,United Kingd +581492,12/9/2019,90059E,Diamante Hair Grip Pack/2 Ruby,6.04,1,15492,United Kingdom +581492,12/9/2019,90059F,Diamante Hair Grip Pack/2 Lt Rose,6.19,1,15492,United Kingd +581492,12/9/2019,90072,Ruby Drop Chandelier Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90086,Crystal Frog Phone Charm,6.19,1,15492,United Kingdom +581492,12/9/2019,90120B,Blue Murano Twist Bracelet,6.19,2,15492,United Kingdom +581492,12/9/2019,90120C,Green Murano Twist Bracelet,6.19,1,15492,United Kingdom +581492,12/9/2019,90130B,Turq Stone/Crystal Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90130C,Green Stone/Crystal Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90134,Old Rose Combo Bead Necklace,6.19,1,15492,United Kingdom +581492,12/9/2019,90138,White/Pink Mini Crystals Necklace,6.19,1,15492,United Kingdo +581492,12/9/2019,90141B,Ivory Pendant Triple Shell Necklace,6.19,1,15492,United Kin +581492,12/9/2019,90145,Silver Hoop Earrings With Flower,6.19,1,15492,United Kingdom +581492,12/9/2019,90155,Resin Necklace W Pastel Beads,6.19,1,15492,United Kingdom +581492,12/9/2019,90161D,Ant Copper Pink Boudicca Bracelet,6.19,1,15492,United Kingd +581492,12/9/2019,90163A,Pink Rosebud & Pearl Necklace,6.19,2,15492,United Kingdom +581492,12/9/2019,90165B,White Rosebud Pearl Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90168,2 Daisies Hair Comb,6.19,1,15492,United Kingdom +581492,12/9/2019,90169,Daisy Hair Comb,6.19,1,15492,United Kingdom +581492,12/9/2019,90170,Daisy Hair Band,6.19,1,15492,United Kingdom +581492,12/9/2019,90174,Butterfly Hair Band,6.19,2,15492,United Kingdom +581492,12/9/2019,90175A,White Glass Chunky Charm Bracelet,6.19,2,15492,United Kingd +581492,12/9/2019,90175D,Tigris Eye Chunky Charm Bracelet,6.19,1,15492,United Kingdo +581492,12/9/2019,90177A,Classic Diamante Earrings Jet,6.19,1,15492,United Kingdom +581492,12/9/2019,90177C,Drop Diamante Earrings Crystal,6.19,1,15492,United Kingdom +581492,12/9/2019,90181B,Amethyst Glass/Shell/Pearl Necklace,6.04,1,15492,United Kin +581492,12/9/2019,90182C,Black 3 Bead Drop Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90183A,Amber Drop Earrings W Long Beads,6.19,2,15492,United Kingdo +581492,12/9/2019,90183C,Black Drop Earrings W Long Beads,6.19,1,15492,United Kingdo +581492,12/9/2019,90184C,Black Chunky Bead Bracelet W Strap,6.19,1,15492,United King +581492,12/9/2019,90185B,Amethyst Diamante Expandable Ring,6.19,1,15492,United Kingd +581492,12/9/2019,90188,Drop Earrings W Flower & Leaf,6.19,2,15492,United Kingdom +581492,12/9/2019,90191,Silver Lariat 40cm,6.19,2,15492,United Kingdom +581492,12/9/2019,90192,Jade Drop Earrings W Filigree,6.19,1,15492,United Kingdom +581492,12/9/2019,90198A,Vintage Rose Bead Bracelet Raspberr,6.19,2,15492,United Kin +581492,12/9/2019,90200A,Purple Sweetheart Bracelet,6.19,1,15492,United Kingdom +581492,12/9/2019,90201A,Purple Enamel Flower Ring,6.19,2,15492,United Kingdom +581492,12/9/2019,90201B,Black Enamel Flower Ring,6.19,1,15492,United Kingdom +581492,12/9/2019,90201C,Red Enamel Flower Ring,6.19,1,15492,United Kingdom +581492,12/9/2019,90201D,Green Enamel Flower Ring,6.19,1,15492,United Kingdom +581492,12/9/2019,90202C,Green Enamel Flower Hair Tie,6.19,1,15492,United Kingdom +581492,12/9/2019,90202D,Pink Enamel Flower Hair Tie,6.19,1,15492,United Kingdom +581492,12/9/2019,90206C,Crystal Diamante Star Brooch,6.19,1,15492,United Kingdom +581492,12/9/2019,90208,Pair Of Pink Flower Cluster Slide,6.19,1,15492,United Kingdo +581492,12/9/2019,90210A,Grey Acrylic Faceted Bangle,6.19,1,15492,United Kingdom +581492,12/9/2019,22378,Wall Tidy Retrospot,6.19,2,15492,United Kingdom +581492,12/9/2019,22379,Recycling Bag Retrospot,6.19,1,15492,United Kingdom +581492,12/9/2019,22380,Toy Tidy Spaceboy,6.19,2,15492,United Kingdom +581492,12/9/2019,22396,Magnets Pack Of 4 Retro Photo,6.19,1,15492,United Kingdom +581492,12/9/2019,22411,Jumbo Shopper Vintage Red Paisley,6.19,1,15492,United Kingdo +581492,12/9/2019,22418,10 Colour Spaceboy Pen,6.19,3,15492,United Kingdom +581492,12/9/2019,22419,Lipstick Pen Red,6.19,3,15492,United Kingdom +581492,12/9/2019,22420,Lipstick Pen Baby Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,22421,Lipstick Pen Fuschia,6.19,2,15492,United Kingdom +581492,12/9/2019,22422,Toothpaste Tube Pen,6.19,4,15492,United Kingdom +581492,12/9/2019,22437,Set Of 9 Black Skull Balloons,7.24,1,15492,United Kingdom +581492,12/9/2019,22441,Grow Your Own Basil In Enamel Mug,7.24,1,15492,United Kingdo +581492,12/9/2019,22446,Pin Cushion Babushka Pink,7.24,7,15492,United Kingdom +581492,12/9/2019,22457,Natural Slate Heart Chalkboard,7.24,1,15492,United Kingdom +581492,12/9/2019,22464,Hanging Metal Heart Lantern,7.24,1,15492,United Kingdom +581492,12/9/2019,22466,Fairy Tale Cottage Night Light,7.24,1,15492,United Kingdom +581492,12/9/2019,22467,Gumball Coat Rack,7.24,1,15492,United Kingdom +581492,12/9/2019,22478,Birdhouse Garden Marker,7.24,1,15492,United Kingdom +581492,12/9/2019,22486,Plasmatronic Lamp,7.24,1,15492,United Kingdom +581492,12/9/2019,22488,Natural Slate Rectangle Chalkboard,7.24,1,15492,United Kingd +581492,12/9/2019,22489,Pack Of 12 Traditional Crayons,7.24,5,15492,United Kingdom +581492,12/9/2019,22495,Set Of 2 Round Tins Camembert,7.24,1,15492,United Kingdom +581492,12/9/2019,22540,Mini Jigsaw Circus Parade,7.24,1,15492,United Kingdom +581492,12/9/2019,22544,Mini Jigsaw Spaceboy,7.24,1,15492,United Kingdom +581492,12/9/2019,22549,Picture Dominoes,7.24,3,15492,United Kingdom +581492,12/9/2019,22551,Plasters In Tin Spaceboy,7.24,2,15492,United Kingdom +581492,12/9/2019,22553,Plasters In Tin Skulls,7.24,2,15492,United Kingdom +581492,12/9/2019,22554,Plasters In Tin Woodland Animals,7.24,3,15492,United Kingdom +581492,12/9/2019,22555,Plasters In Tin Strongman,7.24,3,15492,United Kingdom +581492,12/9/2019,22557,Plasters In Tin Vintage Paisley,7.24,2,15492,United Kingdom +581492,12/9/2019,22558,Clothes Pegs Retrospot Pack 24,7.24,3,15492,United Kingdom +581492,12/9/2019,22560,Traditional Modelling Clay,7.24,5,15492,United Kingdom +581492,12/9/2019,22565,Feltcraft Hairbands Pink And White,7.24,4,15492,United Kingd +581492,12/9/2019,22566,Feltcraft Hairband Pink And Purple,7.24,3,15492,United Kingd +581492,12/9/2019,22571,Rocking Horse Red Christmas,7.24,4,15492,United Kingdom +581492,12/9/2019,22573,Star Wooden Christmas Decoration,6.39,2,15492,United Kingdom +581492,12/9/2019,22574,Heart Wooden Christmas Decoration,7.24,5,15492,United Kingdo +581492,12/9/2019,22576,Swallow Wooden Christmas Decoration,7.24,3,15492,United King +581492,12/9/2019,22577,Wooden Heart Christmas Scandinavian,7.24,4,15492,United King +581492,12/9/2019,22578,Wooden Star Christmas Scandinavian,7.24,19,15492,United King +581492,12/9/2019,22580,Advent Calendar Gingham Sack,7.24,9,15492,United Kingdom +581492,12/9/2019,22581,Wood Stocking Christmas Scandispot,7.24,11,15492,United King +581492,12/9/2019,22585,Pack Of 6 Birdy Gift Tags,7.24,2,15492,United Kingdom +581492,12/9/2019,22586,Feltcraft Hairband Pink And Blue,7.24,2,15492,United Kingdom +581492,12/9/2019,22589,Cardholder Gingham Star,7.24,6,15492,United Kingdom +581492,12/9/2019,22591,Cardholder Gingham Christmas Tree,7.24,1,15492,United Kingdo +581492,12/9/2019,22592,Cardholder Holly Wreath Metal,7.24,3,15492,United Kingdom +581492,12/9/2019,22593,Christmas Gingham Star,6.39,2,15492,United Kingdom +581492,12/9/2019,22594,Christmas Gingham Tree,7.24,3,15492,United Kingdom +581492,12/9/2019,22597,Musical Zinc Heart Decoration,7.24,9,15492,United Kingdom +581492,12/9/2019,22598,Christmas Musical Zinc Tree,7.24,4,15492,United Kingdom +581492,12/9/2019,22599,Christmas Musical Zinc Star,6.19,5,15492,United Kingdom +581492,12/9/2019,22600,Christmas Retrospot Star Wood,6.19,2,15492,United Kingdom +581492,12/9/2019,22601,Christmas Retrospot Angel Wood,6.19,3,15492,United Kingdom +581492,12/9/2019,22602,Retrospot Wooden Heart Decoration,6.19,3,15492,United Kingdo +581492,12/9/2019,22608,Pens Assorted Funky Jeweled,6.19,3,15492,United Kingdom +581492,12/9/2019,22614,Pack Of 12 Spaceboy Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,22615,Pack Of 12 Circus Parade Tissues,6.19,4,15492,United Kingdom +581492,12/9/2019,22616,Pack Of 12 London Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,22619,Set Of 6 Soldier Skittles,6.19,4,15492,United Kingdom +581492,12/9/2019,22620,4 Traditional Spinning Tops,6.19,3,15492,United Kingdom +581492,12/9/2019,22621,Traditional Knitting Nancy,6.19,2,15492,United Kingdom +581492,12/9/2019,22629,Spaceboy Lunch Box,6.19,1,15492,United Kingdom +581492,12/9/2019,22630,Dolly Girl Lunch Box,6.19,1,15492,United Kingdom +581492,12/9/2019,22632,Hand Warmer Red Retrospot,6.19,1,15492,United Kingdom +581492,12/9/2019,22633,Hand Warmer Union Jack,6.19,1,15492,United Kingdom +581492,12/9/2019,22634,Childs Breakfast Set Spaceboy,6.19,1,15492,United Kingdom +581492,12/9/2019,22650,Ceramic Pirate Chest Money Bank,6.19,2,15492,United Kingdom +581492,12/9/2019,22651,Gentleman Shirt Repair Kit,6.19,1,15492,United Kingdom +581492,12/9/2019,22653,Button Box,6.19,16,15492,United Kingdom +581492,12/9/2019,22654,Deluxe Sewing Kit,6.19,2,15492,United Kingdom +581492,12/9/2019,22659,Lunch Box I Love London,6.19,1,15492,United Kingdom +581492,12/9/2019,22666,Recipe Box Pantry Yellow Design,6.19,5,15492,United Kingdom +581492,12/9/2019,22693,Grow A Flytrap Or Sunflower In Tin,6.19,3,15492,United Kingd +581492,12/9/2019,22694,Wicker Star,6.19,1,15492,United Kingdom +581492,12/9/2019,22697,Green Regency Teacup And Saucer,6.19,1,15492,United Kingdom +581492,12/9/2019,22699,Roses Regency Teacup And Saucer,6.19,2,15492,United Kingdom +581492,12/9/2019,22701,Pink Dog Bowl,6.19,5,15492,United Kingdom +581492,12/9/2019,22703,Pink Cat Bowl,6.19,6,15492,United Kingdom +581492,12/9/2019,22712,Card Dolly Girl,6.19,1,15492,United Kingdom +581492,12/9/2019,22713,Card I Love London,6.19,1,15492,United Kingdom +581492,12/9/2019,22714,Card Birthday Cowboy,6.19,2,15492,United Kingdom +581492,12/9/2019,22716,Card Circus Parade,6.19,3,15492,United Kingdom +581492,12/9/2019,22717,Card Dog And Ball,6.19,1,15492,United Kingdom +581492,12/9/2019,22720,Set Of 3 Cake Tins Pantry Design,6.19,2,15492,United Kingdom +581492,12/9/2019,22725,Alarm Clock Bakelike Chocolate,6.19,1,15492,United Kingdom +581492,12/9/2019,22726,Alarm Clock Bakelike Green,6.19,4,15492,United Kingdom +581492,12/9/2019,22727,Alarm Clock Bakelike Red,6.19,4,15492,United Kingdom +581492,12/9/2019,22730,Alarm Clock Bakelike Ivory,6.19,1,15492,United Kingdom +581492,12/9/2019,22741,Funky Diva Pen,6.19,4,15492,United Kingdom +581492,12/9/2019,22745,Poppy's Playhouse Bedroom,6.19,2,15492,United Kingdom +581492,12/9/2019,22748,Poppy's Playhouse Kitchen,6.19,1,15492,United Kingdom +581492,12/9/2019,22749,Feltcraft Princess Charlotte Doll,6.19,1,15492,United Kingdo +581492,12/9/2019,22751,Feltcraft Princess Olivia Doll,6.19,2,15492,United Kingdom +581492,12/9/2019,22753,Small Yellow Babushka Notebook,6.19,1,15492,United Kingdom +581492,12/9/2019,22754,Small Red Babushka Notebook,6.19,1,15492,United Kingdom +581492,12/9/2019,22757,Large Red Babushka Notebook,6.19,3,15492,United Kingdom +581492,12/9/2019,22758,Large Purple Babushka Notebook,6.19,2,15492,United Kingdom +581492,12/9/2019,22763,Key Cabinet Ma Campagne,6.19,1,15492,United Kingdom +581492,12/9/2019,22768,Family Photo Frame Cornice,6.19,2,15492,United Kingdom +581492,12/9/2019,22776,Sweetheart 3 Tier Cake Stand,6.19,1,15492,United Kingdom +581492,12/9/2019,22795,Sweetheart Recipe Book Stand,6.19,1,15492,United Kingdom +581492,12/9/2019,22798,Antique Glass Dressing Table Pot,6.19,3,15492,United Kingdom +581492,12/9/2019,22800,Antique Tall Swirlglass Trinket Pot,6.19,3,15492,United King +581492,12/9/2019,22809,Set Of 6 T-Lights Santa,6.19,1,15492,United Kingdom +581492,12/9/2019,22811,Set Of 6 T-Lights Cacti,6.19,1,15492,United Kingdom +581492,12/9/2019,22814,Card Party Games,6.19,9,15492,United Kingdom +581492,12/9/2019,22815,Card Psychedelic Apples,6.19,18,15492,United Kingdom +581492,12/9/2019,22816,Card Motorbike Santa,6.19,2,15492,United Kingdom +581492,12/9/2019,22817,Card Suki Birthday,6.19,5,15492,United Kingdom +581492,12/9/2019,22818,Card Christmas Village,7.24,6,15492,United Kingdom +581492,12/9/2019,22819,Birthday Card Retro Spot,7.24,3,15492,United Kingdom +581492,12/9/2019,22835,Hot Water Bottle I Am So Poorly,7.24,3,15492,United Kingdom +581492,12/9/2019,22865,Hand Warmer Owl Design,7.24,2,15492,United Kingdom +581492,12/9/2019,22866,Hand Warmer Scotty Dog Design,7.24,3,15492,United Kingdom +581492,12/9/2019,22867,Hand Warmer Bird Design,7.24,4,15492,United Kingdom +581492,12/9/2019,22881,Number Tile Vintage Font 2,7.24,1,15492,United Kingdom +581492,12/9/2019,22885,Number Tile Vintage Font 6,7.24,1,15492,United Kingdom +581492,12/9/2019,22888,Number Tile Vintage Font 9,7.24,1,15492,United Kingdom +581492,12/9/2019,22890,Novelty Biscuits Cake Stand 3 Tier,7.24,1,15492,United Kingd +581492,12/9/2019,22898,Childrens Apron Apples Design,7.24,1,15492,United Kingdom +581492,12/9/2019,22899,Children's Apron Dolly Girl,7.24,2,15492,United Kingdom +581492,12/9/2019,22900,Set 2 Tea Towels I Love London,7.24,3,15492,United Kingdom +581492,12/9/2019,22905,Calendar In Season Design,7.24,1,15492,United Kingdom +581492,12/9/2019,22907,Pack Of 20 Napkins Pantry Design,6.39,1,15492,United Kingdom +581492,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,7.24,5,15492,United King +581492,12/9/2019,22910,Paper Chain Kit Vintage Christmas,7.24,7,15492,United Kingdo +581492,12/9/2019,22914,Blue Coat Rack Paris Fashion,7.24,1,15492,United Kingdom +581492,12/9/2019,22922,Fridge Magnets Us Diner Assorted,7.24,6,15492,United Kingdom +581492,12/9/2019,22924,Fridge Magnets La Vie En Rose,7.24,6,15492,United Kingdom +581492,12/9/2019,22928,Yellow Giant Garden Thermometer,7.24,1,15492,United Kingdom +581492,12/9/2019,22940,Feltcraft Christmas Fairy,6.19,1,15492,United Kingdom +581492,12/9/2019,22941,Christmas Lights 10 Reindeer,6.19,2,15492,United Kingdom +581492,12/9/2019,22943,Christmas Lights 10 Vintage Baubles,6.19,1,15492,United King +581492,12/9/2019,22948,Metal Decoration Naughty Children,6.19,4,15492,United Kingdo +581492,12/9/2019,22951,60 Cake Cases Dolly Girl Design,6.19,2,15492,United Kingdom +581492,12/9/2019,22952,60 Cake Cases Vintage Christmas,6.19,2,15492,United Kingdom +581492,12/9/2019,22955,36 Foil Star Cake Cases,6.19,1,15492,United Kingdom +581492,12/9/2019,22960,Jam Making Set With Jars,6.19,2,15492,United Kingdom +581492,12/9/2019,22961,Jam Making Set Printed,6.19,9,15492,United Kingdom +581492,12/9/2019,22962,Jam Jar With Pink Lid,6.19,3,15492,United Kingdom +581492,12/9/2019,22963,Jam Jar With Green Lid,6.19,3,15492,United Kingdom +581492,12/9/2019,22964,3 Piece Spaceboy Cookie Cutter Set,6.19,1,15492,United Kingd +581492,12/9/2019,22965,3 Traditional Biscuit Cutters Set,6.19,1,15492,United Kingdo +581492,12/9/2019,22966,Gingerbread Man Cookie Cutter,6.19,4,15492,United Kingdom +581492,12/9/2019,22969,Homemade Jam Scented Candles,6.19,6,15492,United Kingdom +581492,12/9/2019,22975,Spaceboy Childrens Egg Cup,6.19,2,15492,United Kingdom +581492,12/9/2019,22976,Circus Parade Childrens Egg Cup,6.19,1,15492,United Kingdom +581492,12/9/2019,22977,Dolly Girl Childrens Egg Cup,6.19,1,15492,United Kingdom +581492,12/9/2019,22979,Pantry Washing Up Brush,6.19,2,15492,United Kingdom +581492,12/9/2019,22980,Pantry Scrubbing Brush,6.19,1,15492,United Kingdom +581492,12/9/2019,22982,Pantry Pastry Brush,6.19,3,15492,United Kingdom +581492,12/9/2019,22983,Card Billboard Font,6.19,1,15492,United Kingdom +581492,12/9/2019,22984,Card Gingham Rose,6.19,1,15492,United Kingdom +581492,12/9/2019,22988,Soldiers Egg Cup,6.19,1,15492,United Kingdom +581492,12/9/2019,22989,Set 2 Pantry Design Tea Towels,6.19,2,15492,United Kingdom +581492,12/9/2019,22992,Revolver Wooden Ruler,6.19,3,15492,United Kingdom +581492,12/9/2019,22993,Set Of 4 Pantry Jelly Moulds,6.19,3,15492,United Kingdom +581492,12/9/2019,22995,Travel Card Wallet Suki,6.19,4,15492,United Kingdom +581492,12/9/2019,22996,Travel Card Wallet Vintage Ticket,6.19,5,15492,United Kingdo +581492,12/9/2019,22997,Travel Card Wallet Union Jack,6.19,1,15492,United Kingdom +581492,12/9/2019,22998,Travel Card Wallet Keep Calm,6.19,4,15492,United Kingdom +581492,12/9/2019,22999,Travel Card Wallet Vintage Leaf,6.19,1,15492,United Kingdom +581492,12/9/2019,23005,Travel Card Wallet I Love London,6.19,4,15492,United Kingdom +581492,12/9/2019,23007,Spaceboy Baby Gift Set,6.19,1,15492,United Kingdom +581492,12/9/2019,23009,I Love London Baby Gift Set,6.19,2,15492,United Kingdom +581492,12/9/2019,23012,Glass Apothecary Bottle Perfume,6.19,1,15492,United Kingdom +581492,12/9/2019,23013,Glass Apothecary Bottle Tonic,6.19,2,15492,United Kingdom +581492,12/9/2019,23014,Glass Apothecary Bottle Elixir,6.19,1,15492,United Kingdom +581492,12/9/2019,23050,Recycled Acapulco Mat Green,6.19,1,15492,United Kingdom +581492,12/9/2019,23051,Recycled Acapulco Mat Blue,6.19,1,15492,United Kingdom +581492,12/9/2019,23052,Recycled Acapulco Mat Turquoise,6.19,5,15492,United Kingdom +581492,12/9/2019,23053,Recycled Acapulco Mat Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,23054,Recycled Acapulco Mat Lavender,6.19,1,15492,United Kingdom +581492,12/9/2019,23074,Embossed Heart Trinket Box,6.19,1,15492,United Kingdom +581492,12/9/2019,23076,Ice Cream Sundae Lip Gloss,6.19,3,15492,United Kingdom +581492,12/9/2019,23077,Doughnut Lip Gloss,6.19,3,15492,United Kingdom +581492,12/9/2019,23082,Set 6 Paper Table Lantern Hearts,6.19,1,15492,United Kingdom +581492,12/9/2019,23083,Set 6 Paper Table Lantern Stars,6.19,1,15492,United Kingdom +581492,12/9/2019,23084,Rabbit Night Light,6.19,57,15492,United Kingdom +581492,12/9/2019,23088,Zinc Heart Flower T-Light Holder,6.19,1,15492,United Kingdom +581492,12/9/2019,23089,Glass Bon Bon Jar,6.19,4,15492,United Kingdom +581492,12/9/2019,23093,Small Parisienne Heart Photo Frame,6.19,3,15492,United Kingd +581492,12/9/2019,23103,Jingle Bell Heart Decoration,6.19,2,15492,United Kingdom +581492,12/9/2019,23110,Parisienne Key Cabinet,6.19,1,15492,United Kingdom +581492,12/9/2019,23111,Parisienne Sewing Box,6.19,1,15492,United Kingdom +581492,12/9/2019,23112,Parisienne Curio Cabinet,6.19,1,15492,United Kingdom +581492,12/9/2019,23118,Parisienne Jewellery Drawer,6.19,1,15492,United Kingdom +581492,12/9/2019,23158,Set Of 5 Lucky Cat Magnets,6.19,1,15492,United Kingdom +581492,12/9/2019,23165,Large Ceramic Top Storage Jar,6.19,2,15492,United Kingdom +581492,12/9/2019,23166,Medium Ceramic Top Storage Jar,6.19,2,15492,United Kingdom +581492,12/9/2019,23168,Classic Cafe Sugar Dispenser,6.19,2,15492,United Kingdom +581492,12/9/2019,23171,Regency Tea Plate Green,6.19,1,15492,United Kingdom +581492,12/9/2019,23172,Regency Tea Plate Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,23173,Regency Teapot Roses,6.19,1,15492,United Kingdom +581492,12/9/2019,23175,Regency Milk Jug Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,23177,Treasure Island Book Box,6.19,1,15492,United Kingdom +581492,12/9/2019,23183,Mother's Kitchen Spoon Rest,6.19,3,15492,United Kingdom +581492,12/9/2019,23184,Bull Dog Bottle Opener,6.19,2,15492,United Kingdom +581492,12/9/2019,23188,Vintage 2 Metre Folding Ruler,6.19,1,15492,United Kingdom +581492,12/9/2019,23191,Bundle Of 3 Retro Note Books,6.19,1,15492,United Kingdom +581492,12/9/2019,23194,Gymkhana Treasure Book Box,6.19,1,15492,United Kingdom +581492,12/9/2019,23196,Vintage Leaf Magnetic Notepad,6.19,1,15492,United Kingdom +581492,12/9/2019,23197,Sketchbook Magnetic Shopping List,6.19,2,15492,United Kingdo +581492,12/9/2019,23198,Pantry Magnetic Shopping List,6.19,2,15492,United Kingdom +581492,12/9/2019,23204,Charlotte Bag Apples Design,6.19,6,15492,United Kingdom +581492,12/9/2019,23205,Charlotte Bag Vintage Alphabet,6.19,3,15492,United Kingdom +581492,12/9/2019,23212,Heart Wreath Decoration With Bell,6.19,7,15492,United Kingdo +581492,12/9/2019,23213,Star Wreath Decoration With Bell,6.19,7,15492,United Kingdom +581492,12/9/2019,23220,Reindeer Heart Decoration Gold,6.19,2,15492,United Kingdom +581492,12/9/2019,23224,Cherub Heart Decoration Gold,6.19,1,15492,United Kingdom +581492,12/9/2019,23229,Vintage Donkey Tail Game,6.19,2,15492,United Kingdom +581492,12/9/2019,23234,Biscuit Tin Vintage Christmas,6.19,4,15492,United Kingdom +581492,12/9/2019,23241,Treasure Tin Gymkhana Design,6.19,3,15492,United Kingdom +581492,12/9/2019,23243,Set Of Tea Coffee Sugar Tins Pantry,6.19,1,15492,United King +581492,12/9/2019,23245,Set Of 3 Regency Cake Tins,6.19,7,15492,United Kingdom +581492,12/9/2019,23247,Biscuit Tin 50'S Christmas,6.19,3,15492,United Kingdom +581492,12/9/2019,23264,Set Of 3 Wooden Sleigh Decorations,6.19,3,15492,United Kingd +581492,12/9/2019,23265,Set Of 3 Wooden Tree Decorations,6.19,3,15492,United Kingdom +581492,12/9/2019,23266,Set Of 3 Wooden Stocking Decoration,6.19,2,15492,United King +581492,12/9/2019,23274,Star T-Light Holder Willie Winkie,6.19,3,15492,United Kingdo +581492,12/9/2019,23275,Set Of 3 Hanging Owls Ollie Beak,6.19,2,15492,United Kingdom +581492,12/9/2019,23280,Folding Butterfly Mirror Hot Pink,6.19,2,15492,United Kingdo +581492,12/9/2019,23284,Doormat Keep Calm And Come In,6.19,1,15492,United Kingdom +581492,12/9/2019,23285,Pink Vintage Spot Beaker,6.19,1,15492,United Kingdom +581492,12/9/2019,23287,Red Vintage Spot Beaker,6.19,1,15492,United Kingdom +581492,12/9/2019,23290,Spaceboy Childrens Bowl,6.19,1,15492,United Kingdom +581492,12/9/2019,23292,Spaceboy Childrens Cup,6.19,1,15492,United Kingdom +581492,12/9/2019,23293,Set Of 12 Fairy Cake Baking Cases,6.19,3,15492,United Kingdo +581492,12/9/2019,23294,Set Of 6 Snack Loaf Baking Cases,6.19,1,15492,United Kingdom +581492,12/9/2019,23295,Set Of 12 Mini Loaf Baking Cases,6.19,4,15492,United Kingdom +581492,12/9/2019,23298,Spotty Bunting,6.19,2,15492,United Kingdom +581492,12/9/2019,23299,Food Cover With Beads Set 2,6.19,1,15492,United Kingdom +581492,12/9/2019,23300,Gardeners Kneeling Pad Cup Of Tea,6.19,3,15492,United Kingdo +581492,12/9/2019,23301,Gardeners Kneeling Pad Keep Calm,6.19,6,15492,United Kingdom +581492,12/9/2019,23307,Set Of 60 Pantry Design Cake Cases,6.19,7,15492,United Kingd +581492,12/9/2019,23308,Set Of 60 Vintage Leaf Cake Cases,6.19,1,15492,United Kingdo +581492,12/9/2019,23309,Set Of 60 I Love London Cake Cases,6.19,2,15492,United Kingd +581492,12/9/2019,23310,Bubblegum Ring Assorted,6.19,4,15492,United Kingdom +581492,12/9/2019,23311,Vintage Christmas Stocking,6.19,1,15492,United Kingdom +581492,12/9/2019,23312,Vintage Christmas Gift Sack,6.19,6,15492,United Kingdom +581492,12/9/2019,23313,Vintage Christmas Bunting,6.19,4,15492,United Kingdom +581492,12/9/2019,23314,Vintage Christmas Tablecloth,6.19,1,15492,United Kingdom +581492,12/9/2019,23319,Box Of 6 Mini 50'S Crackers,6.19,3,15492,United Kingdom +581492,12/9/2019,23322,Large White Heart Of Wicker,6.19,1,15492,United Kingdom +581492,12/9/2019,23323,White Wicker Star,6.19,6,15492,United Kingdom +581492,12/9/2019,23328,Set 6 School Milk Bottles In Crate,6.19,5,15492,United Kingd +581492,12/9/2019,23332,Ivory Wicker Heart Large,6.19,1,15492,United Kingdom +581492,12/9/2019,23334,Ivory Wicker Heart Small,6.19,1,15492,United Kingdom +581492,12/9/2019,23336,Egg Frying Pan Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,23340,Vintage Christmas Cake Frill,6.19,3,15492,United Kingdom +581492,12/9/2019,23345,Dolly Girl Beaker,6.19,1,15492,United Kingdom +581492,12/9/2019,23347,I Love London Beaker,6.19,1,15492,United Kingdom +581492,12/9/2019,23349,Roll Wrap Vintage Christmas,6.19,2,15492,United Kingdom +581492,12/9/2019,23351,Roll Wrap 50'S Christmas,6.19,5,15492,United Kingdom +581492,12/9/2019,23352,Roll Wrap 50'S Red Christmas,6.19,1,15492,United Kingdom +581492,12/9/2019,23353,6 Gift Tags Vintage Christmas,6.19,3,15492,United Kingdom +581492,12/9/2019,23354,6 Gift Tags 50'S Christmas,6.19,4,15492,United Kingdom +581492,12/9/2019,23357,Hot Water Bottle Sex Bomb,6.19,1,15492,United Kingdom +581492,12/9/2019,23358,Hot Stuff Hot Water Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,23365,Set 12 Colour Pencils Love London,6.19,1,15492,United Kingdo +581492,12/9/2019,23366,Set 12 Colouring Pencils Doily,6.04,5,15492,United Kingdom +581492,12/9/2019,23367,Set 12 Colour Pencils Spaceboy,6.04,10,15492,United Kingdom +581492,12/9/2019,23368,Set 12 Colour Pencils Dolly Girl,6.19,2,15492,United Kingdom +581492,12/9/2019,23581,Jumbo Bag Paisley Park,6.19,3,15492,United Kingdom +581492,12/9/2019,21928,Jumbo Bag Scandinavian Blue Paisley,6.19,2,15492,United King +581492,12/9/2019,21929,Jumbo Bag Pink Vintage Paisley,6.19,1,15492,United Kingdom +581492,12/9/2019,85099C,Jumbo Bag Baroque Black White,6.19,7,15492,United Kingdom +581492,12/9/2019,23199,Jumbo Bag Apples,6.19,2,15492,United Kingdom +581492,12/9/2019,23200,Jumbo Bag Pears,6.19,1,15492,United Kingdom +581492,12/9/2019,23202,Jumbo Bag Vintage Leaf,6.19,2,15492,United Kingdom +581492,12/9/2019,23343,Jumbo Bag Vintage Christmas,6.19,4,15492,United Kingdom +581492,12/9/2019,23344,Jumbo Bag 50'S Christmas,6.19,5,15492,United Kingdom +581492,12/9/2019,23583,Lunch Bag Paisley Park,6.19,2,15492,United Kingdom +581492,12/9/2019,20727,Lunch Bag Black Skull,6.04,2,15492,United Kingdom +581492,12/9/2019,20728,Lunch Bag Cars Blue,6.04,1,15492,United Kingdom +581492,12/9/2019,20725,Lunch Bag Red Retrospot,6.19,1,15492,United Kingdom +581492,12/9/2019,20726,Lunch Bag Woodland,6.19,1,15492,United Kingdom +581492,12/9/2019,22662,Lunch Bag Dolly Girl Design,6.19,1,15492,United Kingdom +581492,12/9/2019,23206,Lunch Bag Apple Design,6.19,3,15492,United Kingdom +581492,12/9/2019,23208,Lunch Bag Vintage Leaf Design,6.19,3,15492,United Kingdom +581492,12/9/2019,23375,50'S Christmas Paper Gift Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,23437,50'S Christmas Gift Bag Large,6.19,1,15492,United Kingdom +581492,12/9/2019,22821,Gift Bag Psychedelic Apples,7.24,3,15492,United Kingdom +581493,12/9/2019,79190B,Retro Plastic Polka Tray,7.24,15,12423,Belgium +581493,12/9/2019,79190A,Retro Plastic 70'S Tray,7.24,15,12423,Belgium +581493,12/9/2019,22915,Assorted Bottle Top Magnets,7.24,12,12423,Belgium +581493,12/9/2019,22151,Place Setting White Heart,7.24,24,12423,Belgium +581493,12/9/2019,22632,Hand Warmer Red Retrospot,7.24,12,12423,Belgium +581493,12/9/2019,22865,Hand Warmer Owl Design,7.24,12,12423,Belgium +581493,12/9/2019,20718,Red Retrospot Shopper Bag,7.24,10,12423,Belgium +581493,12/9/2019,79190B,Retro Plastic Polka Tray,7.24,12,12423,Belgium +581493,12/9/2019,71459,Hanging Jam Jar T-Light Holders,7.24,12,12423,Belgium +581493,12/9/2019,84945,Multi Colour Silver T-Light Holder,7.24,12,12423,Belgium +581493,12/9/2019,22356,Charlotte Bag Pink Polkadot,7.24,10,12423,Belgium +581493,12/9/2019,20724,Red Retrospot Charlotte Bag,7.24,10,12423,Belgium +581493,12/9/2019,23204,Charlotte Bag Apples Design,7.24,10,12423,Belgium +581493,12/9/2019,21108,Fairy Cake Flannel Assorted Colour,7.24,18,12423,Belgium +581493,12/9/2019,22252,Birdcage Decoration Tealight Holder,7.24,12,12423,Belgium +581493,12/9/2019,22807,Set Of 6 T-Lights Toadstools,6.19,6,12423,Belgium +581494,12/9/2019,23084,Rabbit Night Light,6.19,24,12518,Germany +581494,12/9/2019,21559,Strawberry Lunch Box With Cutlery,6.19,6,12518,Germany +581494,12/9/2019,21506,Fancy Font Birthday Card,6.19,12,12518,Germany +581494,12/9/2019,22716,Card Circus Parade,6.19,12,12518,Germany +581494,12/9/2019,22556,Plasters In Tin Circus Parade,6.19,12,12518,Germany +581494,12/9/2019,22328,Round Snack Boxes Set Of 4 Fruits,6.19,6,12518,Germany +581494,12/9/2019,22730,Alarm Clock Bakelike Ivory,6.19,4,12518,Germany +581494,12/9/2019,22633,Hand Warmer Union Jack,6.19,12,12518,Germany +581494,12/9/2019,22326,Round Snack Boxes Set Of4 Woodland,6.19,6,12518,Germany +581494,12/9/2019,10125,Mini Funky Design Tapes,6.19,20,12518,Germany +581494,12/9/2019,23367,Set 12 Colour Pencils Spaceboy,6.19,24,12518,Germany +581494,12/9/2019,22551,Plasters In Tin Spaceboy,6.04,12,12518,Germany +581494,12/9/2019,22554,Plasters In Tin Woodland Animals,6.04,12,12518,Germany +581494,12/9/2019,22549,Picture Dominoes,6.19,12,12518,Germany +581494,12/9/2019,23388,Woodland Mini Backpack,6.19,4,12518,Germany +581494,12/9/2019,23390,Dolly Girl Mini Backpack,6.19,4,12518,Germany +581494,12/9/2019,23389,Spaceboy Mini Backpack,6.19,4,12518,Germany +581495,12/9/2019,23535,Wall Art Bicycle Safety,6.19,12,14051,United Kingdom +581495,12/9/2019,22699,Roses Regency Teacup And Saucer,6.19,12,14051,United Kingdom +581495,12/9/2019,22698,Pink Regency Teacup And Saucer,6.19,12,14051,United Kingdom +581495,12/9/2019,22697,Green Regency Teacup And Saucer,6.19,12,14051,United Kingdom +581495,12/9/2019,22633,Hand Warmer Union Jack,6.04,18,14051,United Kingdom +581495,12/9/2019,15056N,Edwardian Parasol Natural,6.19,36,14051,United Kingdom +581495,12/9/2019,23439,Hand Warmer Red Love Heart,6.19,36,14051,United Kingdom +581495,12/9/2019,48138,Doormat Union Flag,6.19,10,14051,United Kingdom +581495,12/9/2019,21523,Doormat Fancy Font Home Sweet Home,6.19,10,14051,United King +581495,12/9/2019,21877,Home Sweet Home Mug,6.19,12,14051,United Kingdom +581495,12/9/2019,21871,Save The Planet Mug,6.19,18,14051,United Kingdom +581495,12/9/2019,22798,Antique Glass Dressing Table Pot,6.19,36,14051,United Kingdo +581495,12/9/2019,23173,Regency Teapot Roses,6.19,6,14051,United Kingdom +581495,12/9/2019,22423,Regency Cakestand 3 Tier,6.19,10,14051,United Kingdom +581496,12/9/2019,22664,Toy Tidy Dolly Girl Design,6.19,20,16558,United Kingdom +581496,12/9/2019,22721,Set Of 3 Cake Tins Sketchbook,6.19,12,16558,United Kingdom +581496,12/9/2019,72800E,4 Ivory Dinner Candles Silver Flock,6.19,12,16558,United Ki +581496,12/9/2019,23313,Vintage Christmas Bunting,6.19,10,16558,United Kingdom +581496,12/9/2019,22952,60 Cake Cases Vintage Christmas,6.19,24,16558,United Kingdom +581496,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,6.04,12,16558,United Kin +581496,12/9/2019,23298,Spotty Bunting,6.19,3,16558,United Kingdom +581496,12/9/2019,23598,Paper Bunting Vintage Party,6.19,6,16558,United Kingdom +581496,12/9/2019,16169E,Wrap 50'S Christmas,6.19,25,16558,United Kingdom +581496,12/9/2019,23351,Roll Wrap 50'S Christmas,6.19,12,16558,United Kingdom +581496,12/9/2019,23350,Roll Wrap Vintage Spot,6.19,24,16558,United Kingdom +581496,12/9/2019,22865,Hand Warmer Owl Design,6.19,24,16558,United Kingdom +581496,12/9/2019,22632,Hand Warmer Red Retrospot,6.19,12,16558,United Kingdom +581496,12/9/2019,22835,Hot Water Bottle I Am So Poorly,6.19,4,16558,United Kingdom +581496,12/9/2019,22112,Chocolate Hot Water Bottle,6.19,6,16558,United Kingdom +581496,12/9/2019,23355,Hot Water Bottle Keep Calm,6.19,4,16558,United Kingdom +581496,12/9/2019,22314,Office Mug Warmer Choc+Blue,6.19,24,16558,United Kingdom +581496,12/9/2019,22313,Office Mug Warmer Pink,6.19,12,16558,United Kingdom +581496,12/9/2019,23084,Rabbit Night Light,6.19,18,16558,United Kingdom +581496,12/9/2019,20831,Gold Photo Frame,6.19,12,16558,United Kingdom +581496,12/9/2019,21115,Rose Caravan Doorstop,6.19,8,16558,United Kingdom +581496,12/9/2019,21462,Nursery A B C Painted Letters,7.24,8,16558,United Kingdom +581496,12/9/2019,22076,6 Ribbons Empire,7.24,24,16558,United Kingdom +581496,12/9/2019,22190,Local Cafe Mug,7.24,24,16558,United Kingdom +581496,12/9/2019,22215,Cake Stand White Two Tier Lace,7.24,6,16558,United Kingdom +581496,12/9/2019,22220,Cake Stand Lovebird 2 Tier White,7.24,6,16558,United Kingdom +581496,12/9/2019,22464,Hanging Metal Heart Lantern,7.24,12,16558,United Kingdom +581496,12/9/2019,22465,Hanging Metal Star Lantern,7.24,12,16558,United Kingdom +581496,12/9/2019,22539,Mini Jigsaw Dolly Girl,7.24,48,16558,United Kingdom +581496,12/9/2019,22544,Mini Jigsaw Spaceboy,7.24,48,16558,United Kingdom +581496,12/9/2019,23438,Red Spot Gift Bag Large,6.19,12,16558,United Kingdom +581496,12/9/2019,23437,50'S Christmas Gift Bag Large,6.19,12,16558,United Kingdom +581497,12/9/2019,20719,Woodland Charlotte Bag,6.19,33,17497,United Kingdom +581497,12/9/2019,20723,Strawberry Charlotte Bag,6.19,42,17497,United Kingdom +581497,12/9/2019,20724,Red Retrospot Charlotte Bag,6.19,55,17497,United Kingdom +581497,12/9/2019,21212,Pack Of 72 Retrospot Cake Cases,7.24,7,17497,United Kingdom +581497,12/9/2019,21238,Red Retrospot Cup,7.24,8,17497,United Kingdom +581497,12/9/2019,21242,Red Retrospot Plate,7.24,2,17497,United Kingdom +581497,12/9/2019,21479,White Skull Hot Water Bottle,7.24,25,17497,United Kingdom +581497,12/9/2019,21481,Fawn Blue Hot Water Bottle,7.24,1,17497,United Kingdom +581497,12/9/2019,21481,Fawn Blue Hot Water Bottle,7.24,1,17497,United Kingdom +581497,12/9/2019,21484,Chick Grey Hot Water Bottle,7.24,1,17497,United Kingdom +581497,12/9/2019,21668,Red Stripe Ceramic Drawer Knob,7.24,1,17497,United Kingdom +581497,12/9/2019,21670,Blue Spot Ceramic Drawer Knob,7.24,1,17497,United Kingdom +581497,12/9/2019,21671,Red Spot Ceramic Drawer Knob,7.24,1,17497,United Kingdom +581497,12/9/2019,21672,White Spot Red Ceramic Drawer Knob,7.24,6,17497,United Kingd +581497,12/9/2019,21673,White Spot Blue Ceramic Drawer Knob,7.24,1,17497,United King +581497,12/9/2019,21714,Citronella Candle Garden Pot,7.24,2,17497,United Kingdom +581497,12/9/2019,22110,Bird House Hot Water Bottle,7.24,7,17497,United Kingdom +581497,12/9/2019,22111,Scottie Dog Hot Water Bottle,7.24,5,17497,United Kingdom +581497,12/9/2019,22112,Chocolate Hot Water Bottle,7.24,13,17497,United Kingdom +581497,12/9/2019,22114,Hot Water Bottle Tea And Sympathy,7.24,48,17497,United Kingd +581497,12/9/2019,22197,Popcorn Holder,7.24,68,17497,United Kingdom +581497,12/9/2019,22355,Charlotte Bag Suki Design,7.24,110,17497,United Kingdom +581497,12/9/2019,22356,Charlotte Bag Pink Polkadot,7.24,25,17497,United Kingdom +581497,12/9/2019,22356,Charlotte Bag Pink Polkadot,7.24,1,17497,United Kingdom +581497,12/9/2019,22423,Regency Cakestand 3 Tier,7.24,8,17497,United Kingdom +581497,12/9/2019,22725,Alarm Clock Bakelike Chocolate,7.24,3,17497,United Kingdom +581497,12/9/2019,22726,Alarm Clock Bakelike Green,7.24,1,17497,United Kingdom +581497,12/9/2019,22727,Alarm Clock Bakelike Red,7.24,10,17497,United Kingdom +581497,12/9/2019,22730,Alarm Clock Bakelike Ivory,7.24,5,17497,United Kingdom +581497,12/9/2019,22735,Ribbon Reel Socks And Mittens,7.24,2,17497,United Kingdom +581497,12/9/2019,22736,Ribbon Reel Making Snowmen,7.24,3,17497,United Kingdom +581497,12/9/2019,22738,Ribbon Reel Snowy Village,7.24,1,17497,United Kingdom +581497,12/9/2019,22805,Blue Drawer Knob Acrylic Edwardian,7.24,1,17497,United Kingd +581497,12/9/2019,22835,Hot Water Bottle I Am So Poorly,7.24,4,17497,United Kingdom +581497,12/9/2019,22895,Set Of 2 Tea Towels Apple And Pears,7.24,1,17497,United King +581497,12/9/2019,22896,Peg Bag Apples Design,7.24,2,17497,United Kingdom +581497,12/9/2019,22898,Childrens Apron Apples Design,7.24,2,17497,United Kingdom +581497,12/9/2019,22943,Christmas Lights 10 Vintage Baubles,7.24,1,17497,United King +581497,12/9/2019,23084,Rabbit Night Light,6.19,37,17497,United Kingdom +581497,12/9/2019,23168,Classic Cafe Sugar Dispenser,6.19,1,17497,United Kingdom +581497,12/9/2019,23204,Charlotte Bag Apples Design,6.04,13,17497,United Kingdom +581497,12/9/2019,23205,Charlotte Bag Vintage Alphabet,6.04,8,17497,United Kingdom +581497,12/9/2019,23301,Gardeners Kneeling Pad Keep Calm,6.19,1,17497,United Kingdom +581497,12/9/2019,23355,Hot Water Bottle Keep Calm,6.19,36,17497,United Kingdom +581497,12/9/2019,23356,Love Hot Water Bottle,6.19,1,17497,United Kingdom +581497,12/9/2019,23357,Hot Water Bottle Sex Bomb,6.19,2,17497,United Kingdom +581497,12/9/2019,23358,Hot Stuff Hot Water Bottle,6.19,2,17497,United Kingdom +581497,12/9/2019,35970,Zinc Folkart Sleigh Bells,6.19,2,17497,United Kingdom +581497,12/9/2019,47566,Party Bunting,6.19,5,17497,United Kingdom +581497,12/9/2019,82583,Hot Baths Metal Sign,6.19,4,17497,United Kingdom +581497,12/9/2019,84029G,Knitted Union Flag Hot Water Bottle,6.19,11,17497,United Ki +581497,12/9/2019,84997C,Childrens Cutlery Polkadot Blue,6.19,3,17497,United Kingdom +581497,12/9/2019,85049G,Chocolate Box Ribbons,6.19,2,17497,United Kingdom +581497,12/9/2019,20727,Lunch Bag Black Skull,6.19,8,17497,United Kingdom +581497,12/9/2019,22383,Lunch Bag Suki Design,7.24,2,17497,United Kingdom +581497,12/9/2019,23206,Lunch Bag Apple Design,6.04,3,17497,United Kingdom +581497,12/9/2019,23206,Lunch Bag Apple Design,6.04,1,17497,United Kingdom +581497,12/9/2019,23207,Lunch Bag Alphabet Design,6.19,1,17497,United Kingdom +581497,12/9/2019,23208,Lunch Bag Vintage Leaf Design,6.19,3,17497,United Kingdom +581498,12/9/2019,20669,Red Heart Luggage Tag,6.19,3,14498,United Kingdom +581498,12/9/2019,20679,Edwardian Parasol Red,6.19,5,14498,United Kingdom +581498,12/9/2019,20717,Strawberry Shopper Bag,6.19,1,14498,United Kingdom +581498,12/9/2019,20718,Red Retrospot Shopper Bag,6.19,1,14498,United Kingdom +581498,12/9/2019,20750,Red Retrospot Mini Cases,6.19,1,14498,United Kingdom +581498,12/9/2019,20961,Strawberry Bath Sponge,6.19,1,14498,United Kingdom +581498,12/9/2019,20963,Apple Bath Sponge,6.19,1,14498,United Kingdom +581498,12/9/2019,21115,Rose Caravan Doorstop,6.19,1,14498,United Kingdom +581498,12/9/2019,21125,Set 6 Football Celebration Candles,6.19,3,14498,United Kingd +581498,12/9/2019,21137,Black Record Cover Frame,6.19,4,14498,United Kingdom +581498,12/9/2019,21155,Red Retrospot Peg Bag,6.19,4,14498,United Kingdom +581498,12/9/2019,21166,Cook With Wine Metal Sign,6.19,3,14498,United Kingdom +581498,12/9/2019,21169,You're Confusing Me Metal Sign,6.19,2,14498,United Kingdom +581498,12/9/2019,21174,Pottering In The Shed Metal Sign,6.19,2,14498,United Kingdom +581498,12/9/2019,21181,Please One Person Metal Sign,6.19,6,14498,United Kingdom +581498,12/9/2019,21216,Set 3 Retrospot Tea/Coffee/Sugar,6.19,2,14498,United Kingdom +581498,12/9/2019,21217,Red Retrospot Round Cake Tins,6.19,3,14498,United Kingdom +581498,12/9/2019,21218,Red Spotty Biscuit Tin,6.19,4,14498,United Kingdom +581498,12/9/2019,21232,Strawberry Ceramic Trinket Pot,6.19,13,14498,United Kingdom +581498,12/9/2019,21239,Pink Polkadot Cup,6.19,1,14498,United Kingdom +581498,12/9/2019,21257,Victorian Sewing Box Medium,6.19,3,14498,United Kingdom +581498,12/9/2019,21327,Skulls Writing Set,6.19,1,14498,United Kingdom +581498,12/9/2019,21328,Balloons Writing Set,6.19,1,14498,United Kingdom +581498,12/9/2019,21329,Dinosaurs Writing Set,6.19,1,14498,United Kingdom +581498,12/9/2019,21411,Gingham Heart Doorstop Red,6.19,1,14498,United Kingdom +581498,12/9/2019,21430,Set/3 Red Gingham Rose Storage Box,6.19,3,14498,United Kingd +581498,12/9/2019,21494,Rotating Leaves T-Light Holder,6.19,7,14498,United Kingdom +581498,12/9/2019,21523,Doormat Fancy Font Home Sweet Home,6.19,1,14498,United Kingd +581498,12/9/2019,21557,Set Of 6 Funky Beakers,6.19,1,14498,United Kingdom +581498,12/9/2019,21558,Skull Lunch Box With Cutlery,6.19,1,14498,United Kingdom +581498,12/9/2019,21731,Red Toadstool Led Night Light,6.19,9,14498,United Kingdom +581498,12/9/2019,21754,Home Building Block Word,6.19,2,14498,United Kingdom +581498,12/9/2019,21790,Vintage Snap Cards,6.19,1,14498,United Kingdom +581498,12/9/2019,21843,Red Retrospot Cake Stand,6.19,5,14498,United Kingdom +581498,12/9/2019,21864,Union Jack Flag Passport Cover,6.19,2,14498,United Kingdom +581498,12/9/2019,21874,Gin And Tonic Mug,6.19,2,14498,United Kingdom +581498,12/9/2019,21876,Pottering Mug,6.19,4,14498,United Kingdom +581498,12/9/2019,21890,S/6 Wooden Skittles In Cotton Bag,6.19,1,14498,United Kingdo +581498,12/9/2019,21912,Vintage Snakes & Ladders,6.19,1,14498,United Kingdom +581498,12/9/2019,21916,Set 12 Retro White Chalk Sticks,6.19,7,14498,United Kingdom +581498,12/9/2019,21930,Jumbo Storage Bag Skulls,6.19,2,14498,United Kingdom +581498,12/9/2019,21931,Jumbo Storage Bag Suki,6.19,6,14498,United Kingdom +581498,12/9/2019,21934,Skull Shoulder Bag,6.19,1,14498,United Kingdom +581498,12/9/2019,21935,Suki Shoulder Bag,6.19,7,14498,United Kingdom +581498,12/9/2019,21942,Skulls Design Flannel,6.19,1,14498,United Kingdom +581498,12/9/2019,21955,Doormat Union Jack Guns And Roses,6.19,1,14498,United Kingdo +581498,12/9/2019,21977,Pack Of 60 Pink Paisley Cake Cases,6.19,1,14498,United Kingd +581498,12/9/2019,21983,Pack Of 12 Blue Paisley Tissues,6.19,1,14498,United Kingdom +581498,12/9/2019,21987,Pack Of 6 Skull Paper Cups,6.19,2,14498,United Kingdom +581498,12/9/2019,21989,Pack Of 20 Skull Paper Napkins,6.19,1,14498,United Kingdom +581498,12/9/2019,22041,"Record Frame 7"" Single Size",6.19,2,14498,United Kingdom +581498,12/9/2019,22059,Ceramic Strawberry Design Mug,6.19,1,14498,United Kingdom +581498,12/9/2019,22069,Brown Pirate Treasure Chest,6.19,3,14498,United Kingdom +581498,12/9/2019,22077,6 Ribbons Rustic Charm,6.19,2,14498,United Kingdom +581498,12/9/2019,22083,Paper Chain Kit Retrospot,6.19,2,14498,United Kingdom +581498,12/9/2019,22086,Paper Chain Kit 50'S Christmas,6.19,52,14498,United Kingdom +581498,12/9/2019,22099,Caravan Square Tissue Box,6.19,2,14498,United Kingdom +581498,12/9/2019,22114,Hot Water Bottle Tea And Sympathy,6.19,4,14498,United Kingdo +581498,12/9/2019,22139,Retrospot Tea Set Ceramic 11 Pc,6.19,2,14498,United Kingdom +581498,12/9/2019,22141,Christmas Craft Tree Top Angel,6.19,7,14498,United Kingdom +581498,12/9/2019,22142,Christmas Craft White Fairy,6.19,2,14498,United Kingdom +581498,12/9/2019,22144,Christmas Craft Little Friends,6.19,8,14498,United Kingdom +581498,12/9/2019,22161,Heart Decoration Rustic Hanging,6.19,2,14498,United Kingdom +581498,12/9/2019,22173,Metal 4 Hook Hanger French Chateau,6.19,3,14498,United Kingd +581498,12/9/2019,22174,Photo Cube,6.19,3,14498,United Kingdom +581498,12/9/2019,22175,Pink Owl Soft Toy,6.19,1,14498,United Kingdom +581498,12/9/2019,22178,Victorian Glass Hanging T-Light,6.19,1,14498,United Kingdom +581498,12/9/2019,22179,Set 10 Night Owl Lights,6.19,1,14498,United Kingdom +581498,12/9/2019,22186,Red Star Card Holder,6.19,1,14498,United Kingdom +581498,12/9/2019,22187,Green Christmas Tree Card Holder,6.19,6,14498,United Kingdom +581498,12/9/2019,22193,Red Diner Wall Clock,6.19,1,14498,United Kingdom +581498,12/9/2019,22195,Large Heart Measuring Spoons,6.19,3,14498,United Kingdom +581498,12/9/2019,22196,Small Heart Measuring Spoons,6.19,2,14498,United Kingdom +581498,12/9/2019,22207,Frying Pan Union Flag,6.19,1,14498,United Kingdom +581498,12/9/2019,22278,Overnight Bag Vintage Rose Paisley,6.19,2,14498,United Kingd +581498,12/9/2019,22301,Coffee Mug Cat + Bird Design,6.19,2,14498,United Kingdom +581498,12/9/2019,22302,Coffee Mug Pears Design,6.19,4,14498,United Kingdom +581498,12/9/2019,22303,Coffee Mug Apples Design,6.19,4,14498,United Kingdom +581498,12/9/2019,22304,Coffee Mug Blue Paisley Design,6.19,1,14498,United Kingdom +581498,12/9/2019,22308,Tea Cosy Blue Stripe,6.19,2,14498,United Kingdom +581498,12/9/2019,22327,Round Snack Boxes Set Of 4 Skulls,6.19,4,14498,United Kingdo +581498,12/9/2019,22328,Round Snack Boxes Set Of 4 Fruits,6.19,4,14498,United Kingdo +581498,12/9/2019,22352,Lunch Box With Cutlery Retrospot,6.19,6,14498,United Kingdom +581498,12/9/2019,22357,Kings Choice Biscuit Tin,6.19,1,14498,United Kingdom +581498,12/9/2019,22358,Kings Choice Tea Caddy,6.19,1,14498,United Kingdom +581498,12/9/2019,22367,Childrens Apron Spaceboy Design,6.19,7,14498,United Kingdom +581498,12/9/2019,22371,Airline Bag Vintage Tokyo 78,6.19,1,14498,United Kingdom +581498,12/9/2019,22374,Airline Bag Vintage Jet Set Red,6.19,1,14498,United Kingdom +581498,12/9/2019,22378,Wall Tidy Retrospot,7.24,2,14498,United Kingdom +581498,12/9/2019,22379,Recycling Bag Retrospot,7.24,4,14498,United Kingdom +581498,12/9/2019,22381,Toy Tidy Pink Polkadot,7.24,1,14498,United Kingdom +581498,12/9/2019,22411,Jumbo Shopper Vintage Red Paisley,7.24,2,14498,United Kingdo +581498,12/9/2019,22422,Toothpaste Tube Pen,7.24,1,14498,United Kingdom +581498,12/9/2019,22424,Enamel Bread Bin Cream,7.24,1,14498,United Kingdom +581498,12/9/2019,22429,Enamel Measuring Jug Cream,7.24,1,14498,United Kingdom +581498,12/9/2019,22456,Natural Slate Chalkboard Large,7.24,4,14498,United Kingdom +581498,12/9/2019,22457,Natural Slate Heart Chalkboard,7.24,2,14498,United Kingdom +581498,12/9/2019,22471,Tv Dinner Tray Air Hostess,7.24,1,14498,United Kingdom +581498,12/9/2019,22474,Spaceboy Tv Dinner Tray,7.24,1,14498,United Kingdom +581498,12/9/2019,22488,Natural Slate Rectangle Chalkboard,7.24,2,14498,United Kingd +581498,12/9/2019,22498,Wooden Regatta Bunting,7.24,1,14498,United Kingdom +581498,12/9/2019,22507,Memo Board Retrospot Design,7.24,1,14498,United Kingdom +581498,12/9/2019,22526,Wheelbarrow For Children,7.24,1,14498,United Kingdom +581498,12/9/2019,22553,Plasters In Tin Skulls,7.24,1,14498,United Kingdom +581498,12/9/2019,22557,Plasters In Tin Vintage Paisley,7.24,1,14498,United Kingdom +581498,12/9/2019,22619,Set Of 6 Soldier Skittles,7.24,1,14498,United Kingdom +581498,12/9/2019,22622,Box Of Vintage Alphabet Blocks,7.24,1,14498,United Kingdom +581498,12/9/2019,22624,Ivory Kitchen Scales,7.24,1,14498,United Kingdom +581498,12/9/2019,22629,Spaceboy Lunch Box,7.24,2,14498,United Kingdom +581498,12/9/2019,22632,Hand Warmer Red Retrospot,7.24,1,14498,United Kingdom +581498,12/9/2019,22645,Ceramic Heart Fairy Cake Money Bank,7.24,4,14498,United King +581498,12/9/2019,22654,Deluxe Sewing Kit,6.19,2,14498,United Kingdom +581498,12/9/2019,22659,Lunch Box I Love London,6.19,1,14498,United Kingdom +581498,12/9/2019,22666,Recipe Box Pantry Yellow Design,6.19,11,14498,United Kingdom +581498,12/9/2019,22676,French Blue Metal Door Sign 1,6.04,1,14498,United Kingdom +581498,12/9/2019,22684,French Blue Metal Door Sign 9,6.04,1,14498,United Kingdom +581498,12/9/2019,22694,Wicker Star,6.04,1,14498,United Kingdom +581498,12/9/2019,22697,Green Regency Teacup And Saucer,6.04,6,14498,United Kingdom +581498,12/9/2019,22698,Pink Regency Teacup And Saucer,6.04,9,14498,United Kingdom +581498,12/9/2019,22699,Roses Regency Teacup And Saucer,6.19,6,14498,United Kingdom +581498,12/9/2019,22722,Set Of 6 Spice Tins Pantry Design,6.19,3,14498,United Kingdo +581498,12/9/2019,22733,3d Traditional Christmas Stickers,6.19,1,14498,United Kingdo +581498,12/9/2019,22734,Set Of 6 Ribbons Vintage Christmas,6.19,5,14498,United Kingd +581498,12/9/2019,22776,Sweetheart 3 Tier Cake Stand,6.19,1,14498,United Kingdom +581498,12/9/2019,22795,Sweetheart Recipe Book Stand,6.19,1,14498,United Kingdom +581498,12/9/2019,22807,Set Of 6 T-Lights Toadstools,6.19,2,14498,United Kingdom +581498,12/9/2019,22813,Pack 3 Boxes Bird Panettone,6.19,4,14498,United Kingdom +581498,12/9/2019,22838,3 Tier Cake Tin Red And Cream,6.19,1,14498,United Kingdom +581498,12/9/2019,22844,Vintage Cream Dog Food Container,6.19,2,14498,United Kingdom +581498,12/9/2019,22845,Vintage Cream Cat Food Container,6.19,1,14498,United Kingdom +581498,12/9/2019,22865,Hand Warmer Owl Design,6.19,1,14498,United Kingdom +581498,12/9/2019,22866,Hand Warmer Scotty Dog Design,6.19,2,14498,United Kingdom +581498,12/9/2019,22891,Tea For One Polkadot,6.19,1,14498,United Kingdom +581498,12/9/2019,22900,Set 2 Tea Towels I Love London,6.19,2,14498,United Kingdom +581498,12/9/2019,22910,Paper Chain Kit Vintage Christmas,6.19,5,14498,United Kingdo +581498,12/9/2019,22952,60 Cake Cases Vintage Christmas,6.19,7,14498,United Kingdom +581498,12/9/2019,22960,Jam Making Set With Jars,6.19,5,14498,United Kingdom +581498,12/9/2019,22961,Jam Making Set Printed,6.19,4,14498,United Kingdom +581498,12/9/2019,22966,Gingerbread Man Cookie Cutter,6.19,2,14498,United Kingdom +581498,12/9/2019,22993,Set Of 4 Pantry Jelly Moulds,6.19,2,14498,United Kingdom +581498,12/9/2019,23012,Glass Apothecary Bottle Perfume,6.19,1,14498,United Kingdom +581498,12/9/2019,23013,Glass Apothecary Bottle Tonic,6.19,1,14498,United Kingdom +581498,12/9/2019,23014,Glass Apothecary Bottle Elixir,7.24,2,14498,United Kingdom +581498,12/9/2019,23080,Red Metal Box Top Secret,7.24,5,14498,United Kingdom +581498,12/9/2019,23170,Regency Tea Plate Roses,7.24,4,14498,United Kingdom +581498,12/9/2019,23171,Regency Tea Plate Green,7.24,5,14498,United Kingdom +581498,12/9/2019,23172,Regency Tea Plate Pink,6.19,4,14498,United Kingdom +581498,12/9/2019,23181,Bull Dog Bottle Top Wall Clock,6.19,1,14498,United Kingdom +581498,12/9/2019,23196,Vintage Leaf Magnetic Notepad,6.19,1,14498,United Kingdom +581498,12/9/2019,23198,Pantry Magnetic Shopping List,6.19,2,14498,United Kingdom +581498,12/9/2019,23245,Set Of 3 Regency Cake Tins,6.19,5,14498,United Kingdom +581498,12/9/2019,23295,Set Of 12 Mini Loaf Baking Cases,6.19,1,14498,United Kingdom +581498,12/9/2019,23298,Spotty Bunting,6.19,1,14498,United Kingdom +581498,12/9/2019,23300,Gardeners Kneeling Pad Cup Of Tea,6.19,9,14498,United Kingdo +581498,12/9/2019,23301,Gardeners Kneeling Pad Keep Calm,6.19,32,14498,United Kingdo +581498,12/9/2019,23311,Vintage Christmas Stocking,6.19,6,14498,United Kingdom +581498,12/9/2019,23312,Vintage Christmas Gift Sack,6.19,3,14498,United Kingdom +581498,12/9/2019,23328,Set 6 School Milk Bottles In Crate,6.19,6,14498,United Kingd +581498,12/9/2019,23349,Roll Wrap Vintage Christmas,6.19,8,14498,United Kingdom +581498,12/9/2019,23351,Roll Wrap 50'S Christmas,6.19,22,14498,United Kingdom +581498,12/9/2019,23352,Roll Wrap 50'S Red Christmas,6.19,8,14498,United Kingdom +581498,12/9/2019,23353,6 Gift Tags Vintage Christmas,6.19,10,14498,United Kingdom +581498,12/9/2019,23354,6 Gift Tags 50'S Christmas,6.19,9,14498,United Kingdom +581498,12/9/2019,23368,Set 12 Colour Pencils Dolly Girl,6.19,3,14498,United Kingdom +581498,12/9/2019,23369,Set 36 Colour Pencils Love London,6.19,1,14498,United Kingdo +581498,12/9/2019,23370,Set 36 Colouring Pencils Doily,6.19,3,14498,United Kingdom +581498,12/9/2019,23382,Box Of 6 Christmas Cake Decorations,6.19,10,14498,United Kin +581498,12/9/2019,23388,Woodland Mini Backpack,6.19,1,14498,United Kingdom +581498,12/9/2019,23480,Mini Lights Woodland Mushrooms,7.24,1,14498,United Kingdom +581498,12/9/2019,23493,Vintage Doily Travel Sewing Kit,7.24,1,14498,United Kingdom +581498,12/9/2019,23494,Vintage Doily Deluxe Sewing Kit,7.24,1,14498,United Kingdom +581498,12/9/2019,23497,Classic Chrome Bicycle Bell,7.24,1,14498,United Kingdom +581498,12/9/2019,23501,Key Ring Baseball Boot Union Jack,7.24,1,14498,United Kingdo +581498,12/9/2019,23564,Egg Cup Milkmaid Ingrid,7.24,1,14498,United Kingdom +581498,12/9/2019,35970,Zinc Folkart Sleigh Bells,7.24,6,14498,United Kingdom +581498,12/9/2019,48138,Doormat Union Flag,7.24,1,14498,United Kingdom +581498,12/9/2019,71053,White Moroccan Metal Lantern,7.24,1,14498,United Kingdom +581498,12/9/2019,72349B,Set/6 Purple Butterfly T-Lights,7.24,2,14498,United Kingdom +581498,12/9/2019,79321,Chilli Lights,7.24,10,14498,United Kingdom +581498,12/9/2019,82001S,Silver Record Cover Frame,6.19,2,14498,United Kingdom +581498,12/9/2019,82482,Wooden Picture Frame White Finish,6.04,4,14498,United Kingdo +581498,12/9/2019,82552,Washroom Metal Sign,6.04,1,14498,United Kingdom +581498,12/9/2019,21171,Bathroom Metal Sign,6.19,1,14498,United Kingdom +581498,12/9/2019,82581,Toilet Metal Sign,6.19,1,14498,United Kingdom +581498,12/9/2019,82600,N0 Singing Metal Sign,6.19,4,14498,United Kingdom +581498,12/9/2019,84029E,Red Woolly Hottie White Heart,6.19,4,14498,United Kingdom +581498,12/9/2019,84032A,Charlie+Lola Pink Hot Water Bottle,6.19,4,14498,United King +581498,12/9/2019,84032B,Charlie + Lola Red Hot Water Bottle,6.19,3,14498,United Kin +581498,12/9/2019,84375,Set Of 20 Kids Cookie Cutters,6.19,3,14498,United Kingdom +581498,12/9/2019,84509A,Set Of 4 English Rose Placemats,6.19,1,14498,United Kingdom +581498,12/9/2019,84558A,3d Dog Picture Playing Cards,6.19,1,14498,United Kingdom +581498,12/9/2019,84832,Zinc Willie Winkie Candle Stick,6.19,26,14498,United Kingdom +581498,12/9/2019,84968E,Set Of 16 Vintage Black Cutlery,6.19,1,14498,United Kingdom +581498,12/9/2019,84970S,Hanging Heart Zinc T-Light Holder,6.19,1,14498,United Kingd +581498,12/9/2019,84997A,Childrens Cutlery Polkadot Green,6.19,2,14498,United Kingdo +581498,12/9/2019,84997B,Childrens Cutlery Retrospot Red,6.19,3,14498,United Kingdom +581498,12/9/2019,84997D,Childrens Cutlery Polkadot Pink,6.19,1,14498,United Kingdom +581498,12/9/2019,85038,6 Chocolate Love Heart T-Lights,6.19,1,14498,United Kingdom +581498,12/9/2019,85048,15cm Christmas Glass Ball 20 Lights,6.19,1,14498,United King +581498,12/9/2019,85049A,Traditional Christmas Ribbons,6.17,5,14498,United Kingdom +581498,12/9/2019,85049E,Scandinavian Reds Ribbons,6.19,4,14498,United Kingdom +581498,12/9/2019,85150,Ladies & Gentlemen Metal Sign,6.19,1,14498,United Kingdom +581498,12/9/2019,85174,S/4 Cacti Candles,6.19,1,14498,United Kingdom +581498,12/9/2019,20712,Jumbo Bag Woodland Animals,6.19,3,14498,United Kingdom +581498,12/9/2019,20713,Jumbo Bag Owls,6.19,8,14498,United Kingdom +581498,12/9/2019,21928,Jumbo Bag Scandinavian Blue Paisley,6.19,2,14498,United King +581498,12/9/2019,22386,Jumbo Bag Pink Polkadot,7.24,1,14498,United Kingdom +581498,12/9/2019,22663,Jumbo Bag Dolly Girl Design,6.19,2,14498,United Kingdom +581498,12/9/2019,23199,Jumbo Bag Apples,6.19,6,14498,United Kingdom +581498,12/9/2019,23201,Jumbo Bag Alphabet,6.19,6,14498,United Kingdom +581498,12/9/2019,85099B,Jumbo Bag Red Retrospot,6.19,5,14498,United Kingdom +581498,12/9/2019,85099C,Jumbo Bag Baroque Black White,6.19,4,14498,United Kingdom +581498,12/9/2019,20726,Lunch Bag Woodland,6.19,3,14498,United Kingdom +581498,12/9/2019,20728,Lunch Bag Cars Blue,6.19,4,14498,United Kingdom +581498,12/9/2019,22384,Lunch Bag Pink Polkadot,7.24,1,14498,United Kingdom +581498,12/9/2019,23437,50'S Christmas Gift Bag Large,7.24,1,14498,United Kingdom +581500,12/9/2019,82486,3 Drawer Antique White Wood Cabinet,7.24,4,15344,United King +581500,12/9/2019,85066,Cream Sweetheart Mini Chest,7.24,4,15344,United Kingdom +581500,12/9/2019,48187,Doormat New England,7.24,2,15344,United Kingdom +581501,12/9/2019,22319,Hairclips Forties Fabric Assorted,7.24,180,12985,United King +581501,12/9/2019,20704,Mr Robot Soft Toy,7.24,8,12985,United Kingdom +581501,12/9/2019,21564,Pink Heart Shape Love Bucket,6.19,24,12985,United Kingdom +581501,12/9/2019,21563,Red Heart Shape Love Bucket,7.24,24,12985,United Kingdom +581501,12/9/2019,22165,Diamante Heart Shaped Wall Mirror,7.24,12,12985,United Kingd +581501,12/9/2019,22299,Pig Keyring With Light & Sound,7.24,48,12985,United Kingdom +581501,12/9/2019,22447,Pin Cushion Babushka Blue,7.24,12,12985,United Kingdom +581501,12/9/2019,22442,Grow Your Own Flowers Set Of 3,7.24,12,12985,United Kingdom +581501,12/9/2019,22495,Set Of 2 Round Tins Camembert,7.24,12,12985,United Kingdom +581501,12/9/2019,22544,Mini Jigsaw Spaceboy,7.24,96,12985,United Kingdom +581501,12/9/2019,22695,Wicker Wreath Small,7.24,24,12985,United Kingdom +581501,12/9/2019,22785,Squarecushion Cover Pink Union Jack,7.24,12,12985,United Kin +581501,12/9/2019,22811,Set Of 6 T-Lights Cacti,7.24,12,12985,United Kingdom +581501,12/9/2019,22807,Set Of 6 T-Lights Toadstools,7.24,12,12985,United Kingdom +581501,12/9/2019,22942,Christmas Lights 10 Santas,7.24,12,12985,United Kingdom +581501,12/9/2019,22808,Set Of 6 T-Lights Easter Chicks,6.19,12,12985,United Kingdom +581501,12/9/2019,23143,Zinc Wire Kitchen Organiser,7.24,4,12985,United Kingdom +581501,12/9/2019,23151,Zinc Sweetheart Soap Dish,7.24,12,12985,United Kingdom +581501,12/9/2019,23425,Storage Tin Home Sweet Home,7.24,12,12985,United Kingdom +581501,12/9/2019,84356,Pompom Curtain,7.24,12,12985,United Kingdom +581501,12/9/2019,85173,Set/6 Frog Prince T-Light Candles,7.24,12,12985,United Kingd +581501,12/9/2019,21731,Red Toadstool Led Night Light,7.24,24,12985,United Kingdom +581501,12/9/2019,23480,Mini Lights Woodland Mushrooms,7.24,8,12985,United Kingdom +581501,12/9/2019,22545,Mini Jigsaw Bunnies,7.24,96,12985,United Kingdom +581502,12/9/2019,22087,Paper Bunting White Lace,7.24,6,15910,United Kingdom +581502,12/9/2019,21209,Multicolour Honeycomb Fan,7.24,5,15910,United Kingdom +581502,12/9/2019,20668,Disco Ball Christmas Decoration,7.24,24,15910,United Kingdom +581502,12/9/2019,21790,Vintage Snap Cards,7.24,6,15910,United Kingdom +581502,12/9/2019,23270,Set Of 2 Ceramic Painted Hearts,7.24,4,15910,United Kingdom +581502,12/9/2019,23103,Jingle Bell Heart Decoration,7.24,8,15910,United Kingdom +581502,12/9/2019,22576,Swallow Wooden Christmas Decoration,7.24,2,15910,United King +581502,12/9/2019,22153,Angel Decoration Stars On Dress,7.24,13,15910,United Kingdom +581502,12/9/2019,21810,Christmas Hanging Star With Bell,7.24,6,15910,United Kingdom +581502,12/9/2019,22155,Star Decoration Rustic,7.24,6,15910,United Kingdom +581502,12/9/2019,23210,White Rocking Horse Hand Painted,7.24,12,15910,United Kingdo +581502,12/9/2019,22573,Star Wooden Christmas Decoration,7.24,8,15910,United Kingdom +581502,12/9/2019,22075,6 Ribbons Elegant Christmas,7.24,4,15910,United Kingdom +581502,12/9/2019,85049A,Traditional Christmas Ribbons,7.24,4,15910,United Kingdom +581502,12/9/2019,22734,Set Of 6 Ribbons Vintage Christmas,7.24,4,15910,United Kingd +581502,12/9/2019,23274,Star T-Light Holder Willie Winkie,7.24,8,15910,United Kingdo +581502,12/9/2019,22153,Angel Decoration Stars On Dress,7.24,1,15910,United Kingdom +581502,12/9/2019,22596,Christmas Star Wish List Chalkboard,7.24,24,15910,United Kin +581502,12/9/2019,22952,60 Cake Cases Vintage Christmas,7.24,10,15910,United Kingdom +581502,12/9/2019,22141,Christmas Craft Tree Top Angel,7.24,3,15910,United Kingdom +581514,12/9/2019,22753,Small Yellow Babushka Notebook,7.24,12,17754,United Kingdom +581514,12/9/2019,22755,Small Purple Babushka Notebook,7.24,12,17754,United Kingdom +581514,12/9/2019,22754,Small Red Babushka Notebook,6.19,12,17754,United Kingdom +581514,12/9/2019,22721,Set Of 3 Cake Tins Sketchbook,6.19,4,17754,United Kingdom +581514,12/9/2019,22059,Ceramic Strawberry Design Mug,6.19,12,17754,United Kingdom +581514,12/9/2019,22199,Frying Pan Red Retrospot,6.19,13,17754,United Kingdom +581514,12/9/2019,22200,Frying Pan Pink Polkadot,6.19,2,17754,United Kingdom +581514,12/9/2019,84032A,Charlie+Lola Pink Hot Water Bottle,6.19,9,17754,United King +581514,12/9/2019,84032B,Charlie + Lola Red Hot Water Bottle,6.19,9,17754,United Kin +581514,12/9/2019,84031A,Charlie+Lola Red Hot Water Bottle,6.19,10,17754,United King +581514,12/9/2019,84031B,Charlie Lola Blue Hot Water Bottle,6.19,14,17754,United Kin +581514,12/9/2019,22646,Ceramic Strawberry Cake Money Bank,6.19,4,17754,United Kingd +581514,12/9/2019,22644,Ceramic Cherry Cake Money Bank,6.19,4,17754,United Kingdom +581514,12/9/2019,22645,Ceramic Heart Fairy Cake Money Bank,6.19,4,17754,United King +581514,12/9/2019,22394,Paperweight Kings Choice,6.04,12,17754,United Kingdom +581514,12/9/2019,17091J,Vanilla Incense In Tin,6.04,66,17754,United Kingdom +581514,12/9/2019,35471D,Set Of 3 Bird Light Pink Feather,6.04,12,17754,United Kingd +581514,12/9/2019,22075,6 Ribbons Elegant Christmas,6.04,24,17754,United Kingdom +581514,12/9/2019,17091J,Vanilla Incense In Tin,6.19,24,17754,United Kingdom +581514,12/9/2019,22069,Brown Pirate Treasure Chest,6.19,20,17754,United Kingdom +581514,12/9/2019,22068,Black Pirate Treasure Chest,6.19,14,17754,United Kingdom +581514,12/9/2019,22500,Set Of 2 Tins Jardin De Provence,6.19,4,17754,United Kingdom +581514,12/9/2019,22075,6 Ribbons Elegant Christmas,6.19,24,17754,United Kingdom +581514,12/9/2019,21705,Bag 500g Swirly Marbles,6.19,84,17754,United Kingdom +581516,12/9/2019,21109,Large Cake Towel Chocolate Spots,6.19,12,14422,United Kingdo +581516,12/9/2019,21111,Swiss Roll Towel Chocolate Spots,6.19,24,14422,United Kingdo +581516,12/9/2019,21705,Bag 500g Swirly Marbles,6.19,24,14422,United Kingdom +581516,12/9/2019,22185,Slate Tile Natural Hanging,6.19,12,14422,United Kingdom +581516,12/9/2019,22442,Grow Your Own Flowers Set Of 3,6.19,12,14422,United Kingdom +581516,12/9/2019,21620,Set Of 4 Rose Botanical Candles,6.19,12,14422,United Kingdom +581516,12/9/2019,84029G,Knitted Union Flag Hot Water Bottle,6.19,8,14422,United Kin +581516,12/9/2019,21485,Retrospot Heart Hot Water Bottle,6.19,3,14422,United Kingdom +581516,12/9/2019,22111,Scottie Dog Hot Water Bottle,6.19,6,14422,United Kingdom +581516,12/9/2019,23355,Hot Water Bottle Keep Calm,6.19,8,14422,United Kingdom +581516,12/9/2019,22112,Chocolate Hot Water Bottle,6.19,6,14422,United Kingdom +581516,12/9/2019,23356,Love Hot Water Bottle,6.19,6,14422,United Kingdom +581516,12/9/2019,21108,Fairy Cake Flannel Assorted Colour,6.19,18,14422,United King +581516,12/9/2019,22171,3 Hook Photo Shelf Antique White,6.19,4,14422,United Kingdom +581516,12/9/2019,23301,Gardeners Kneeling Pad Keep Calm,6.19,24,14422,United Kingdo +581538,12/9/2019,23193,Buffalo Bill Treasure Book Box,6.19,6,14446,United Kingdom +581538,12/9/2019,23194,Gymkhana Treasure Book Box,6.19,1,14446,United Kingdom +581538,12/9/2019,23084,Rabbit Night Light,6.19,2,14446,United Kingdom +581538,12/9/2019,22068,Black Pirate Treasure Chest,6.19,1,14446,United Kingdom +581538,12/9/2019,22956,36 Foil Heart Cake Cases,6.19,1,14446,United Kingdom +581538,12/9/2019,20936,Forked Cactus Candle,6.19,1,14446,United Kingdom +581538,12/9/2019,23040,Paper Lantern 9 Point Snow Star,6.19,1,14446,United Kingdom +581538,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,6.19,1,14446,United King +581538,12/9/2019,21222,Set/4 Badges Beetles,6.19,1,14446,United Kingdom +581538,12/9/2019,21220,Set/4 Badges Dogs,6.19,1,14446,United Kingdom +581538,12/9/2019,21224,Set/4 Skull Badges,6.19,1,14446,United Kingdom +581538,12/9/2019,85123A,Cream Hanging Heart T-Light Holder,6.19,1,14446,United King +581538,12/9/2019,22992,Revolver Wooden Ruler,6.19,1,14446,United Kingdom +581538,12/9/2019,79066K,Retro Mod Tray,6.19,1,14446,United Kingdom +581538,12/9/2019,84380,Set Of 3 Butterfly Cookie Cutters,6.19,1,14446,United Kingdo +581538,12/9/2019,23371,Set 36 Colour Pencils Spaceboy,6.19,1,14446,United Kingdom +581538,12/9/2019,22694,Wicker Star,6.19,1,14446,United Kingdom +581538,12/9/2019,22095,Lads Only Tissue Box,6.19,1,14446,United Kingdom +581538,12/9/2019,23275,Set Of 3 Hanging Owls Ollie Beak,6.19,1,14446,United Kingdom +581538,12/9/2019,21673,White Spot Blue Ceramic Drawer Knob,6.19,1,14446,United King +581538,12/9/2019,21670,Blue Spot Ceramic Drawer Knob,6.19,1,14446,United Kingdom +581538,12/9/2019,85071C,"Charlie+Lola""Extremely Busy"" Sign",6.19,1,14446,United K +581538,12/9/2019,23349,Roll Wrap Vintage Christmas,6.19,3,14446,United Kingdom +581538,12/9/2019,23034,Drawer Knob Ceramic Black,6.19,1,14446,United Kingdom +581538,12/9/2019,21669,Blue Stripe Ceramic Drawer Knob,6.19,1,14446,United Kingdom +581538,12/9/2019,23033,Drawer Knob Ceramic Red,6.19,1,14446,United Kingdom +581538,12/9/2019,21668,Red Stripe Ceramic Drawer Knob,6.19,1,14446,United Kingdom +581538,12/9/2019,23275,Set Of 3 Hanging Owls Ollie Beak,6.19,1,14446,United Kingdom +581538,12/9/2019,23318,Box Of 6 Mini Vintage Crackers,6.19,1,14446,United Kingdom +581538,12/9/2019,23382,Box Of 6 Christmas Cake Decorations,6.19,1,14446,United King +581538,12/9/2019,22469,Heart Of Wicker Small,6.19,1,14446,United Kingdom +581538,12/9/2019,22899,Children's Apron Dolly Girl,6.19,2,14446,United Kingdom +581538,12/9/2019,22367,Childrens Apron Spaceboy Design,6.19,1,14446,United Kingdom +581538,12/9/2019,22899,Children's Apron Dolly Girl,6.19,3,14446,United Kingdom +581538,12/9/2019,23527,Wall Art Animals And Nature,6.19,1,14446,United Kingdom +581538,12/9/2019,23524,Wall Art Horse & Pony,6.19,1,14446,United Kingdom +581538,12/9/2019,23525,Wall Art Buffalo Bill,6.19,1,14446,United Kingdom +581538,12/9/2019,84380,Set Of 3 Butterfly Cookie Cutters,6.19,4,14446,United Kingdo +581538,12/9/2019,23122,Party Charms 50 Pieces,7.24,1,14446,United Kingdom +581538,12/9/2019,21990,Modern Floral Stationery Set,7.24,1,14446,United Kingdom +581538,12/9/2019,21329,Dinosaurs Writing Set,7.24,1,14446,United Kingdom +581538,12/9/2019,21328,Balloons Writing Set,7.24,1,14446,United Kingdom +581538,12/9/2019,22561,Wooden School Colouring Set,7.24,1,14446,United Kingdom +581538,12/9/2019,84519A,Tomato Charlie+Lola Coaster Set,7.24,1,14446,United Kingdom +581538,12/9/2019,84519B,Carrot Charlie+Lola Coaster Set,7.24,1,14446,United Kingdom +581538,12/9/2019,35004B,Set Of 3 Black Flying Ducks,7.24,2,14446,United Kingdom +581538,12/9/2019,22068,Black Pirate Treasure Chest,7.24,1,14446,United Kingdom +581538,12/9/2019,23353,6 Gift Tags Vintage Christmas,6.19,1,14446,United Kingdom +581538,12/9/2019,21591,Cosy Hour Cigar Box Matches,6.19,1,14446,United Kingdom +581538,12/9/2019,22197,Popcorn Holder,6.19,4,14446,United Kingdom +581538,12/9/2019,23320,Giant 50'S Christmas Cracker,6.19,1,14446,United Kingdom +581538,12/9/2019,23349,Roll Wrap Vintage Christmas,6.19,1,14446,United Kingdom +581538,12/9/2019,22985,Wrap Billboard Fonts Design,6.19,25,14446,United Kingdom +581538,12/9/2019,23040,Paper Lantern 9 Point Snow Star,6.19,2,14446,United Kingdom +581538,12/9/2019,23040,Paper Lantern 9 Point Snow Star,6.19,3,14446,United Kingdom +581538,12/9/2019,21194,Pink Honeycomb Paper Fan,6.19,2,14446,United Kingdom +581538,12/9/2019,21208,Pastel Colour Honeycomb Fan,6.19,1,14446,United Kingdom +581538,12/9/2019,79190D,Retro Plastic Daisy Tray,6.19,1,14446,United Kingdom +581538,12/9/2019,79190B,Retro Plastic Polka Tray,6.19,1,14446,United Kingdom +581538,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,6.02,2,14446,United King +581538,12/9/2019,23318,Box Of 6 Mini Vintage Crackers,6.02,1,14446,United Kingdom +581538,12/9/2019,23319,Box Of 6 Mini 50'S Crackers,6.02,1,14446,United Kingdom +581538,12/9/2019,23537,Wall Art I Love London,6.19,1,14446,United Kingdom +581538,12/9/2019,22992,Revolver Wooden Ruler,6.19,1,14446,United Kingdom +581538,12/9/2019,22991,Giraffe Wooden Ruler,6.19,1,14446,United Kingdom +581538,12/9/2019,23190,Bundle Of 3 School Exercise Books,6.19,1,14446,United Kingdo +581538,12/9/2019,21194,Pink Honeycomb Paper Fan,6.19,1,14446,United Kingdom +581538,12/9/2019,35004B,Set Of 3 Black Flying Ducks,6.19,1,14446,United Kingdom +581538,12/9/2019,22694,Wicker Star,6.19,1,14446,United Kingdom +581538,12/9/2019,21355,Toast Its - I Love You,6.19,1,14446,United Kingdom +581538,12/9/2019,23343,Jumbo Bag Vintage Christmas,6.19,1,14446,United Kingdom +581538,12/9/2019,23343,Jumbo Bag Vintage Christmas,6.19,1,14446,United Kingdom +581538,12/9/2019,20727,Lunch Bag Black Skull,6.19,1,14446,United Kingdom +581538,12/9/2019,20725,Lunch Bag Red Retrospot,6.19,1,14446,United Kingdom +581566,12/9/2019,23404,Home Sweet Home Blackboard,6.19,144,18102,United Kingdom +581567,12/9/2019,21417,Cockle Shell Dish,6.19,84,16626,United Kingdom +581567,12/9/2019,22464,Hanging Metal Heart Lantern,6.19,24,16626,United Kingdom +581567,12/9/2019,22465,Hanging Metal Star Lantern,6.19,24,16626,United Kingdom +581567,12/9/2019,84971S,Small Heart Flowers Hook,6.19,48,16626,United Kingdom +581567,12/9/2019,22624,Ivory Kitchen Scales,6.19,2,16626,United Kingdom +581567,12/9/2019,22627,Mint Kitchen Scales,6.19,2,16626,United Kingdom +581567,12/9/2019,22625,Red Kitchen Scales,6.19,2,16626,United Kingdom +581567,12/9/2019,23355,Hot Water Bottle Keep Calm,6.19,4,16626,United Kingdom +581567,12/9/2019,21326,Aged Glass Silver T-Light Holder,6.19,144,16626,United Kingd +581567,12/9/2019,21479,White Skull Hot Water Bottle,6.19,4,16626,United Kingdom +581567,12/9/2019,23356,Love Hot Water Bottle,6.19,3,16626,United Kingdom +581567,12/9/2019,21137,Black Record Cover Frame,6.19,24,16626,United Kingdom +581570,12/9/2019,22141,Christmas Craft Tree Top Angel,6.19,6,12662,Germany +581570,12/9/2019,22175,Pink Owl Soft Toy,6.19,6,12662,Germany +581570,12/9/2019,21481,Fawn Blue Hot Water Bottle,6.19,4,12662,Germany +581570,12/9/2019,23570,Traditional Pick Up Sticks Game,6.19,12,12662,Germany +581570,12/9/2019,22326,Round Snack Boxes Set Of4 Woodland,6.19,6,12662,Germany +581570,12/9/2019,22331,Woodland Party Bag + Sticker Set,6.19,8,12662,Germany +581570,12/9/2019,22834,Hand Warmer Babushka Design,6.19,12,12662,Germany +581570,12/9/2019,21914,Blue Harmonica In Box,6.19,12,12662,Germany +581570,12/9/2019,22139,Retrospot Tea Set Ceramic 11 Pc,6.19,3,12662,Germany +581570,12/9/2019,23077,Doughnut Lip Gloss,6.19,20,12662,Germany +581570,12/9/2019,20750,Red Retrospot Mini Cases,6.19,2,12662,Germany +581570,12/9/2019,22505,Memo Board Cottage Design,6.19,4,12662,Germany +581571,12/9/2019,23326,Hanging Mini Coloured Bottles,6.19,6,15311,United Kingdom +581571,12/9/2019,21313,Glass Heart T-Light Holder,6.19,1,15311,United Kingdom +581571,12/9/2019,48187,Doormat New England,6.19,1,15311,United Kingdom +581571,12/9/2019,23317,Blue Refectory Clock,6.19,1,15311,United Kingdom +581571,12/9/2019,23197,Sketchbook Magnetic Shopping List,6.19,4,15311,United Kingdo +581571,12/9/2019,21012,Antique All Glass Candlestick,6.19,2,15311,United Kingdom +581571,12/9/2019,22227,Hanging Heart Mirror Decoration,6.19,10,15311,United Kingdom +581571,12/9/2019,22794,Sweetheart Wire Magazine Rack,6.19,1,15311,United Kingdom +581571,12/9/2019,23182,Toilet Sign Occupied Or Vacant,6.19,1,15311,United Kingdom +581571,12/9/2019,21755,Love Building Block Word,6.19,1,15311,United Kingdom +581571,12/9/2019,85053,French Enamel Candleholder,6.19,2,15311,United Kingdom +581571,12/9/2019,23110,Parisienne Key Cabinet,6.19,2,15311,United Kingdom +581571,12/9/2019,21169,You're Confusing Me Metal Sign,6.19,1,15311,United Kingdom +581571,12/9/2019,21258,Victorian Sewing Box Large,6.19,8,15311,United Kingdom +581571,12/9/2019,23168,Classic Cafe Sugar Dispenser,6.19,36,15311,United Kingdom +581571,12/9/2019,23167,Small Ceramic Top Storage Jar,6.19,96,15311,United Kingdom +581571,12/9/2019,21314,Small Glass Heart Trinket Pot,6.19,48,15311,United Kingdom +581571,12/9/2019,21137,Black Record Cover Frame,6.19,24,15311,United Kingdom +581571,12/9/2019,44234,Assorted Circular Mobile,6.19,1,15311,United Kingdom +581571,12/9/2019,84347,Rotating Silver Angels T-Light Hldr,6.19,24,15311,United Kin +581572,12/9/2019,23328,Set 6 School Milk Bottles In Crate,6.19,48,16705,United King +581572,12/9/2019,22627,Mint Kitchen Scales,6.19,4,16705,United Kingdom +581572,12/9/2019,22624,Ivory Kitchen Scales,6.19,4,16705,United Kingdom +581572,12/9/2019,23245,Set Of 3 Regency Cake Tins,6.19,4,16705,United Kingdom +581574,12/9/2019,22326,Round Snack Boxes Set Of4 Woodland,6.19,6,12526,Germany +581574,12/9/2019,22328,Round Snack Boxes Set Of 4 Fruits,6.19,6,12526,Germany +581574,12/9/2019,23238,Set Of 4 Knick Knack Tins London,6.19,6,12526,Germany +581574,12/9/2019,23237,Set Of 4 Knick Knack Tins Leaf,6.19,6,12526,Germany +581574,12/9/2019,21257,Victorian Sewing Box Medium,6.19,2,12526,Germany +581574,12/9/2019,21258,Victorian Sewing Box Large,6.19,2,12526,Germany +581574,12/9/2019,23111,Parisienne Sewing Box,6.19,2,12526,Germany +581574,12/9/2019,22077,6 Ribbons Rustic Charm,6.19,12,12526,Germany +581574,12/9/2019,22074,6 Ribbons Shimmering Pinks,6.19,12,12526,Germany +581574,12/9/2019,22621,Traditional Knitting Nancy,6.19,12,12526,Germany +581574,12/9/2019,23199,Jumbo Bag Apples,6.19,10,12526,Germany +581574,12/9/2019,23581,Jumbo Bag Paisley Park,6.19,10,12526,Germany +581578,12/9/2019,21124,Set/10 Blue Polkadot Party Candles,6.19,24,12713,Germany +581578,12/9/2019,21122,Set/10 Pink Polkadot Party Candles,6.19,24,12713,Germany +581578,12/9/2019,21121,Set/10 Red Polkadot Party Candles,6.19,24,12713,Germany +581578,12/9/2019,23389,Spaceboy Mini Backpack,6.04,4,12713,Germany +581578,12/9/2019,22556,Plasters In Tin Circus Parade,6.19,12,12713,Germany +581578,12/9/2019,22976,Circus Parade Childrens Egg Cup,6.19,12,12713,Germany +581578,12/9/2019,23255,Childrens Cutlery Circus Parade,7.24,12,12713,Germany +581578,12/9/2019,84997D,Childrens Cutlery Polkadot Pink,7.24,8,12713,Germany +581578,12/9/2019,84997B,Childrens Cutlery Retrospot Red,7.24,8,12713,Germany +581578,12/9/2019,84997C,Childrens Cutlery Polkadot Blue,7.24,8,12713,Germany +581578,12/9/2019,22555,Plasters In Tin Strongman,7.24,12,12713,Germany +581578,12/9/2019,21914,Blue Harmonica In Box,7.24,12,12713,Germany +581578,12/9/2019,22549,Picture Dominoes,7.24,24,12713,Germany +581578,12/9/2019,21918,Set 12 Kids Colour Chalk Sticks,7.24,24,12713,Germany +581578,12/9/2019,22992,Revolver Wooden Ruler,7.24,12,12713,Germany +581578,12/9/2019,22991,Giraffe Wooden Ruler,7.24,12,12713,Germany +581578,12/9/2019,23229,Vintage Donkey Tail Game,7.24,6,12713,Germany +581578,12/9/2019,22622,Box Of Vintage Alphabet Blocks,6.19,6,12713,Germany +581578,12/9/2019,21506,Fancy Font Birthday Card,6.19,12,12713,Germany +581578,12/9/2019,21507,Elephant Birthday Card,6.19,12,12713,Germany +581578,12/9/2019,23037,Candle Holder Silver Madeline,6.19,12,12713,Germany +581578,12/9/2019,23550,Wrap Alphabet Poster,6.19,25,12713,Germany +581578,12/9/2019,22711,Wrap Circus Parade,6.19,25,12713,Germany +581578,12/9/2019,21497,Fancy Fonts Birthday Wrap,6.19,25,12713,Germany +581578,12/9/2019,22704,Wrap Red Apples,6.19,25,12713,Germany +581578,12/9/2019,22585,Pack Of 6 Birdy Gift Tags,6.19,12,12713,Germany diff --git a/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/python-challenge/task.py b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/python-challenge/task.py new file mode 100644 index 000000000000..5b2a00a98fbc --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/python-challenge/task.py @@ -0,0 +1,59 @@ +# 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. + +# beam-playground: +# name: FinalChallenge1 +# description: Final challenge 1. +# multifile: true +# files: +# - name: input.csv +# context_line: 50 +# categories: +# - Quickstart +# complexity: ADVANCED +# tags: +# - hellobeam + +import apache_beam as beam +import logging +import re +from apache_beam.transforms import window, trigger +from apache_beam.transforms.combiners import CountCombineFn + + +class Transaction: + def __init__(self, transaction_no, date, product_no, product_name, price, quantity, customer_no, country): + self.transaction_no = transaction_no + self.date = date + self.product_no = product_no + self.product_name = product_name + self.price = price + self.quantity = quantity + self.customer_no = customer_no + self.country = country + + def __str__(self): + return f"Transaction(transaction_no={self.transaction_no}, date='{self.date}', product_no='{self.product_no}', product_name='{self.product_name}', price={self.price}, quantity={self.quantity}, customer_no={self.customer_no}, country='{self.country}')" + + +def run(): + with beam.Pipeline() as pipeline: + transactions = (pipeline + | 'Read from text file' >> beam.io.ReadFromText('input.csv')) + + +if __name__ == '__main__': + run() diff --git a/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/python-solution/input.csv b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/python-solution/input.csv new file mode 100644 index 000000000000..85854a2d4358 --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/python-solution/input.csv @@ -0,0 +1,1500 @@ +TransactionNo,Date,ProductNo,ProductName,Price,Quantity,CustomerNo,Country +581482,12/9/2019,22485,Set Of 2 Wooden Market Crates,21.47,12,17490,United Kingdom +581475,12/9/2019,22596,Christmas Star Wish List Chalkboard,10.65,36,13069,United Ki +581475,12/9/2019,23235,Storage Tin Vintage Leaf,11.53,12,13069,United Kingdom +581475,12/9/2019,23272,Tree T-Light Holder Willie Winkie,10.65,12,13069,United King +581475,12/9/2019,23239,Set Of 4 Knick Knack Tins Poppies,11.94,6,13069,United Kingd +581475,12/9/2019,21705,Bag 500g Swirly Marbles,10.65,24,13069,United Kingdom +581475,12/9/2019,22118,Joy Wooden Block Letters,11.53,18,13069,United Kingdom +581475,12/9/2019,22119,Peace Wooden Block Letters,12.25,12,13069,United Kingdom +581475,12/9/2019,22217,T-Light Holder Hanging Lace,10.65,12,13069,United Kingdom +581475,12/9/2019,22216,T-Light Holder White Lace,10.55,24,13069,United Kingdom +581475,12/9/2019,22380,Toy Tidy Spaceboy,11.06,20,13069,United Kingdom +581475,12/9/2019,22442,Grow Your Own Flowers Set Of 3,12.25,12,13069,United Kingdom +581475,12/9/2019,22664,Toy Tidy Dolly Girl Design,11.06,20,13069,United Kingdom +581475,12/9/2019,22721,Set Of 3 Cake Tins Sketchbook,12.25,12,13069,United Kingdom +581475,12/9/2019,22723,Set Of 6 Herb Tins Sketchbook,11.53,12,13069,United Kingdom +581475,12/9/2019,22785,Squarecushion Cover Pink Union Jack,11.53,12,13069,United Ki +581475,12/9/2019,22955,36 Foil Star Cake Cases,11.06,24,13069,United Kingdom +581475,12/9/2019,23141,Triple Wire Hook Pink Heart,11.06,12,13069,United Kingdom +581475,12/9/2019,22956,36 Foil Heart Cake Cases,11.06,24,13069,United Kingdom +581475,12/9/2019,22581,Wood Stocking Christmas Scandispot,10.55,48,13069,United Kin +581476,12/9/2019,23198,Pantry Magnetic Shopping List,11.53,48,12433,Norway +581476,12/9/2019,23197,Sketchbook Magnetic Shopping List,11.74,24,12433,Norway +581476,12/9/2019,23184,Bull Dog Bottle Opener,15.32,8,12433,Norway +581476,12/9/2019,23168,Classic Cafe Sugar Dispenser,11.53,12,12433,Norway +581476,12/9/2019,23167,Small Ceramic Top Storage Jar,10.96,96,12433,Norway +581476,12/9/2019,23166,Medium Ceramic Top Storage Jar,11.32,48,12433,Norway +581476,12/9/2019,23165,Large Ceramic Top Storage Jar,11.74,48,12433,Norway +581476,12/9/2019,23004,Travel Card Wallet Pantry,10.68,48,12433,Norway +581476,12/9/2019,23002,Travel Card Wallet Skulls,10.68,24,12433,Norway +581476,12/9/2019,23000,Travel Card Wallet Transport,10.68,24,12433,Norway +581476,12/9/2019,22998,Travel Card Wallet Keep Calm,10.68,72,12433,Norway +581476,12/9/2019,22994,Travel Card Wallet Retrospot,10.68,48,12433,Norway +581476,12/9/2019,22835,Hot Water Bottle I Am So Poorly,15.32,8,12433,Norway +581476,12/9/2019,22730,Alarm Clock Bakelike Ivory,14.09,4,12433,Norway +581476,12/9/2019,22728,Alarm Clock Bakelike Pink,14.09,8,12433,Norway +581476,12/9/2019,22727,Alarm Clock Bakelike Red,14.09,8,12433,Norway +581476,12/9/2019,22726,Alarm Clock Bakelike Green,14.09,4,12433,Norway +581476,12/9/2019,22720,Set Of 3 Cake Tins Pantry Design,14.61,16,12433,Norway +581476,12/9/2019,22693,Grow A Flytrap Or Sunflower In Tin,11.34,192,12433,Norway +581476,12/9/2019,22670,French Wc Sign Blue Metal,11.53,24,12433,Norway +581476,12/9/2019,22667,Recipe Box Retrospot,12.86,24,12433,Norway +581476,12/9/2019,22666,Recipe Box Pantry Yellow Design,12.86,24,12433,Norway +581476,12/9/2019,22631,Circus Parade Lunch Box,12.25,12,12433,Norway +581476,12/9/2019,22628,Picnic Boxes Set Of 3 Retrospot,15.32,16,12433,Norway +581476,12/9/2019,22467,Gumball Coat Rack,12.86,6,12433,Norway +581476,12/9/2019,22197,Popcorn Holder,10.99,100,12433,Norway +581476,12/9/2019,22114,Hot Water Bottle Tea And Sympathy,14.61,8,12433,Norway +581476,12/9/2019,22112,Chocolate Hot Water Bottle,15.32,9,12433,Norway +581476,12/9/2019,21908,Chocolate This Way Metal Sign,12.40,36,12433,Norway +581476,12/9/2019,21874,Gin And Tonic Mug,11.74,36,12433,Norway +581476,12/9/2019,21872,Glamorous Mug,11.53,12,12433,Norway +581476,12/9/2019,21871,Save The Planet Mug,11.74,36,12433,Norway +581476,12/9/2019,21533,Retrospot Large Milk Jug,15.32,6,12433,Norway +581476,12/9/2019,21481,Fawn Blue Hot Water Bottle,14.09,12,12433,Norway +581476,12/9/2019,21479,White Skull Hot Water Bottle,14.61,4,12433,Norway +581476,12/9/2019,21248,Door Hanger Mum + Dads Room,11.74,12,12433,Norway +581476,12/9/2019,21216,Set 3 Retrospot Tea/Coffee/Sugar,14.61,24,12433,Norway +581476,12/9/2019,21181,Please One Person Metal Sign,12.15,48,12433,Norway +581476,12/9/2019,21175,Gin And Tonic Diet Metal Sign,12.38,48,12433,Norway +581476,12/9/2019,21169,You're Confusing Me Metal Sign,11.74,48,12433,Norway +581476,12/9/2019,21162,Toxic Area Door Hanger,10.65,24,12433,Norway +581476,12/9/2019,21159,Moody Boy Door Hanger,10.65,24,12433,Norway +581476,12/9/2019,21158,Moody Girl Door Hanger,10.65,24,12433,Norway +581476,12/9/2019,21154,Red Retrospot Oven Glove,11.53,10,12433,Norway +581476,12/9/2019,16016,Large Chinese Style Scissor,11.12,40,12433,Norway +581476,12/9/2019,16014,Small Chinese Style Scissor,10.68,60,12433,Norway +581476,12/9/2019,16008,Small Folding Scissor(Pointed Edge),10.37,240,12433,Norway +581476,12/9/2019,85152,Hand Over The Chocolate Sign,12.15,48,12433,Norway +581476,12/9/2019,84596F,Small Marshmallows Pink Bowl,10.68,32,12433,Norway +581476,12/9/2019,84596B,Small Dolly Mix Design Orange Bowl,10.68,16,12433,Norway +581476,12/9/2019,84510A,Set Of 4 English Rose Coasters,11.53,20,12433,Norway +581476,12/9/2019,82600,N0 Singing Metal Sign,12.15,48,12433,Norway +581476,12/9/2019,82581,Toilet Metal Sign,10.81,48,12433,Norway +581476,12/9/2019,72232,Feng Shui Pillar Candle,10.44,144,12433,Norway +581476,12/9/2019,47559B,Tea Time Oven Glove,11.53,10,12433,Norway +581476,12/9/2019,47504H,English Rose Spirit Level,11.06,36,12433,Norway +581476,12/9/2019,23493,Vintage Doily Travel Sewing Kit,12.25,30,12433,Norway +581476,12/9/2019,23430,Blue Retro Kitchen Wall Clock,18.60,2,12433,Norway +581476,12/9/2019,23429,Red Retro Kitchen Wall Clock,18.60,2,12433,Norway +581476,12/9/2019,23428,Ivory Retro Kitchen Wall Clock,18.60,2,12433,Norway +581476,12/9/2019,23358,Hot Stuff Hot Water Bottle,11.53,18,12433,Norway +581476,12/9/2019,23293,Set Of 12 Fairy Cake Baking Cases,11.10,32,12433,Norway +581476,12/9/2019,23243,Set Of Tea Coffee Sugar Tins Pantry,15.32,12,12433,Norway +581476,12/9/2019,23240,Set Of 4 Knick Knack Tins Doily,14.50,6,12433,Norway +581477,12/9/2019,48111,Doormat 3 Smiley Cats,17.51,10,13426,United Kingdom +581477,12/9/2019,22464,Hanging Metal Heart Lantern,11.06,12,13426,United Kingdom +581477,12/9/2019,20982,12 Pencils Tall Tube Skulls,11.12,12,13426,United Kingdom +581477,12/9/2019,20981,12 Pencils Tall Tube Woodland,11.12,12,13426,United Kingdom +581477,12/9/2019,23424,Gingham Recipe Book Box,15.32,8,13426,United Kingdom +581477,12/9/2019,23338,Egg Frying Pan Red,12.15,48,13426,United Kingdom +581477,12/9/2019,84970L,Single Heart Zinc T-Light Holder,11.53,12,13426,United King +581477,12/9/2019,22457,Natural Slate Heart Chalkboard,13.27,6,13426,United Kingdom +581477,12/9/2019,22469,Heart Of Wicker Small,11.94,12,13426,United Kingdom +581477,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,11.12,12,13426,United Ki +581478,12/9/2019,84947,Antique Silver Tea Glass Engraved,11.53,24,17364,United King +581478,12/9/2019,23503,Playing Cards Keep Calm & Carry On,11.53,12,17364,United Kin +581478,12/9/2019,23445,Ice Cream Bubbles,11.10,20,17364,United Kingdom +581478,12/9/2019,23530,Wall Art Only One Person,15.32,12,17364,United Kingdom +581478,12/9/2019,84997C,Childrens Cutlery Polkadot Blue,14.50,4,17364,United Kingdo +581478,12/9/2019,84997D,Childrens Cutlery Polkadot Pink,14.50,4,17364,United Kingdo +581478,12/9/2019,84077,World War 2 Gliders Asstd Designs,10.55,48,17364,United King +581478,12/9/2019,22749,Feltcraft Princess Charlotte Doll,14.09,4,17364,United Kingd +581478,12/9/2019,23127,Feltcraft Girl Nicole Kit,15.32,4,17364,United Kingdom +581478,12/9/2019,23126,Feltcraft Girl Amelie Kit,15.32,4,17364,United Kingdom +581478,12/9/2019,22747,Poppy's Playhouse Bathroom,12.40,6,17364,United Kingdom +581478,12/9/2019,22078,Ribbon Reel Lace Design,12.40,10,17364,United Kingdom +581478,12/9/2019,84946,Antique Silver T-Light Glass,11.53,12,17364,United Kingdom +581478,12/9/2019,22791,T-Light Glass Fluted Antique,11.53,12,17364,United Kingdom +581478,12/9/2019,21326,Aged Glass Silver T-Light Holder,10.92,12,17364,United Kingd +581478,12/9/2019,22170,Picture Frame Wood Triple Portrait,17.17,8,17364,United King +581478,12/9/2019,23082,Set 6 Paper Table Lantern Hearts,14.09,6,17364,United Kingdo +581478,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,11.12,24,17364,United Ki +581479,12/9/2019,22087,Paper Bunting White Lace,13.27,10,17364,United Kingdom +581480,12/9/2019,23464,Vintage Zinc Watering Can Small,15.32,4,14441,United Kingdom +581480,12/9/2019,22411,Jumbo Shopper Vintage Red Paisley,12.38,10,14441,United King +581480,12/9/2019,84029E,Red Woolly Hottie White Heart,14.61,8,14441,United Kingdom +581480,12/9/2019,22633,Hand Warmer Union Jack,12.40,12,14441,United Kingdom +581480,12/9/2019,23355,Hot Water Bottle Keep Calm,15.32,12,14441,United Kingdom +581480,12/9/2019,84029G,Knitted Union Flag Hot Water Bottle,14.61,12,14441,United K +581480,12/9/2019,22112,Chocolate Hot Water Bottle,15.32,6,14441,United Kingdom +581480,12/9/2019,84347,Rotating Silver Angels T-Light Hldr,12.86,18,14441,United Ki +581481,12/9/2019,21115,Rose Caravan Doorstop,12.25,8,17490,United Kingdom +581481,12/9/2019,22059,Ceramic Strawberry Design Mug,10.65,24,17490,United Kingdom +581481,12/9/2019,22072,Red Retrospot Tea Cup And Saucer,11.53,24,17490,United Kingd +581481,12/9/2019,22123,Ping Microwave Apron,11.06,24,17490,United Kingdom +581481,12/9/2019,22476,Empire Union Jack Tv Dinner Tray,12.25,8,17490,United Kingdo +581481,12/9/2019,22495,Set Of 2 Round Tins Camembert,11.06,12,17490,United Kingdom +581481,12/9/2019,22496,Set Of 2 Round Tins Dutch Cheese,11.06,12,17490,United Kingd +581481,12/9/2019,22513,Doorstop Football Design,11.06,8,17490,United Kingdom +581481,12/9/2019,22500,Set Of 2 Tins Jardin De Provence,11.53,12,17490,United Kingd +581481,12/9/2019,22664,Toy Tidy Dolly Girl Design,11.06,20,17490,United Kingdom +581481,12/9/2019,22721,Set Of 3 Cake Tins Sketchbook,12.25,12,17490,United Kingdom +581481,12/9/2019,22785,Squarecushion Cover Pink Union Jack,11.53,12,17490,United Ki +581481,12/9/2019,23178,Jam Clock Magnet,11.53,12,17490,United Kingdom +581481,12/9/2019,23302,Kneeling Mat Housework Design,11.06,24,17490,United Kingdom +581481,12/9/2019,23533,Wall Art Garden Haven,12.25,6,17490,United Kingdom +581481,12/9/2019,84819,Danish Rose Round Sewing Box,11.06,16,17490,United Kingdom +581482,12/9/2019,22371,Airline Bag Vintage Tokyo 78,14.30,12,17490,United Kingdom +581482,12/9/2019,21875,Kings Choice Mug,11.34,36,17490,United Kingdom +581482,12/9/2019,23251,Vintage Red Enamel Trim Mug,11.32,96,17490,United Kingdom +581482,12/9/2019,23300,Gardeners Kneeling Pad Cup Of Tea,11.74,48,17490,United King +581482,12/9/2019,22138,Baking Set 9 Piece Retrospot,14.61,24,17490,United Kingdom +581483,12/9/2019,23843,Paper Craft Little Birdie,12.38,80995,16446,United Kingdom +581485,12/9/2019,22617,Baking Set Spaceboy Design,15.32,18,17389,United Kingdom +581485,12/9/2019,20749,Assorted Colour Mini Cases,16.76,84,17389,United Kingdom +581486,12/9/2019,22910,Paper Chain Kit Vintage Christmas,13.27,12,17001,United King +581486,12/9/2019,22086,Paper Chain Kit 50'S Christmas,13.27,12,17001,United Kingdom +581486,12/9/2019,23351,Roll Wrap 50'S Christmas,6.19,12,17001,United Kingdom +581486,12/9/2019,23352,Roll Wrap 50'S Red Christmas,6.19,12,17001,United Kingdom +581486,12/9/2019,22727,Alarm Clock Bakelike Red,6.19,8,17001,United Kingdom +581486,12/9/2019,22730,Alarm Clock Bakelike Ivory,6.19,4,17001,United Kingdom +581486,12/9/2019,22491,Pack Of 12 Coloured Pencils,6.04,12,17001,United Kingdom +581486,12/9/2019,22561,Wooden School Colouring Set,6.04,12,17001,United Kingdom +581486,12/9/2019,22489,Pack Of 12 Traditional Crayons,6.04,24,17001,United Kingdom +581486,12/9/2019,22560,Traditional Modelling Clay,6.04,24,17001,United Kingdom +581486,12/9/2019,22139,Retrospot Tea Set Ceramic 11 Pc,6.04,6,17001,United Kingdom +581486,12/9/2019,23344,Jumbo Bag 50'S Christmas,6.19,20,17001,United Kingdom +581486,12/9/2019,23203,Jumbo Bag Vintage Doily,6.19,20,17001,United Kingdom +581486,12/9/2019,85099B,Jumbo Bag Red Retrospot,6.19,10,17001,United Kingdom +581486,12/9/2019,23201,Jumbo Bag Alphabet,6.19,20,17001,United Kingdom +581486,12/9/2019,23207,Lunch Bag Alphabet Design,6.19,10,17001,United Kingdom +581487,12/9/2019,21137,Black Record Cover Frame,6.04,120,15694,United Kingdom +581488,12/9/2019,23118,Parisienne Jewellery Drawer,6.04,16,17428,United Kingdom +581488,12/9/2019,23111,Parisienne Sewing Box,6.04,16,17428,United Kingdom +581488,12/9/2019,22179,Set 10 Night Owl Lights,6.04,24,17428,United Kingdom +581489,12/9/2019,22061,Large Cake Stand Hanging Strawbery,7.24,48,16954,United King +581489,12/9/2019,22182,Cake Stand Victorian Filigree Small,7.24,24,16954,United Kin +581491,12/9/2019,23571,Traditional Naughts & Crosses,7.24,12,12433,Norway +581492,12/9/2019,23369,Set 36 Colour Pencils Love London,6.19,2,15492,United Kingdo +581492,12/9/2019,23370,Set 36 Colouring Pencils Doily,6.19,2,15492,United Kingdom +581492,12/9/2019,23371,Set 36 Colour Pencils Spaceboy,6.19,3,15492,United Kingdom +581492,12/9/2019,23372,Set 36 Colour Pencils Dolly Girl,6.19,1,15492,United Kingdom +581492,12/9/2019,23376,Pack Of 12 Vintage Christmas Tissue,6.19,3,15492,United King +581492,12/9/2019,23377,Pack Of 12 Dolly Girl Tissues,6.19,6,15492,United Kingdom +581492,12/9/2019,23378,Pack Of 12 50'S Christmas Tissues,6.19,9,15492,United Kingdo +581492,12/9/2019,23379,Pack Of 12 Red Apple Tissues,6.19,4,15492,United Kingdom +581492,12/9/2019,23380,Pack Of 12 Vintage Doily Tissues,6.19,3,15492,United Kingdom +581492,12/9/2019,23381,Pack Of 12 Vintage Leaf Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,23382,Box Of 6 Christmas Cake Decorations,6.19,4,15492,United King +581492,12/9/2019,23391,I Love London Mini Backpack,6.19,2,15492,United Kingdom +581492,12/9/2019,23392,Spaceboy Rocket Lolly Makers,6.19,2,15492,United Kingdom +581492,12/9/2019,23399,Home Sweet Home Hanging Heart,6.19,4,15492,United Kingdom +581492,12/9/2019,23405,Home Sweet Home 2 Drawer Cabinet,6.19,3,15492,United Kingdom +581492,12/9/2019,23418,Lavender Toilette Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,23426,Metal Sign Drop Your Pants,6.19,1,15492,United Kingdom +581492,12/9/2019,23434,3 Raffia Ribbons 50'S Christmas,6.19,9,15492,United Kingdom +581492,12/9/2019,23435,3 Raffia Ribbons Vintage Christmas,6.04,3,15492,United Kingd +581492,12/9/2019,23439,Hand Warmer Red Love Heart,6.19,1,15492,United Kingdom +581492,12/9/2019,23451,Square Mini Portrait Frame,6.19,1,15492,United Kingdom +581492,12/9/2019,23467,Vintage Zinc Planter,6.19,1,15492,United Kingdom +581492,12/9/2019,23469,Card Holder Love Bird Small,6.19,3,15492,United Kingdom +581492,12/9/2019,23480,Mini Lights Woodland Mushrooms,6.19,2,15492,United Kingdom +581492,12/9/2019,23493,Vintage Doily Travel Sewing Kit,6.19,3,15492,United Kingdom +581492,12/9/2019,23494,Vintage Doily Deluxe Sewing Kit,6.19,1,15492,United Kingdom +581492,12/9/2019,23495,Set Of 3 Pantry Wooden Spoons,6.19,1,15492,United Kingdom +581492,12/9/2019,23497,Classic Chrome Bicycle Bell,6.19,4,15492,United Kingdom +581492,12/9/2019,23498,Classic Bicycle Clips,6.19,2,15492,United Kingdom +581492,12/9/2019,23501,Key Ring Baseball Boot Union Jack,6.19,3,15492,United Kingdo +581492,12/9/2019,23506,Mini Playing Cards Spaceboy,6.04,1,15492,United Kingdom +581492,12/9/2019,23508,Mini Playing Cards Dolly Girl,6.04,2,15492,United Kingdom +581492,12/9/2019,23510,Mini Playing Cards Gymkhana,6.04,1,15492,United Kingdom +581492,12/9/2019,23521,Wall Art Cat And Bird,6.04,1,15492,United Kingdom +581492,12/9/2019,23526,Wall Art Dog Licence,6.04,4,15492,United Kingdom +581492,12/9/2019,23530,Wall Art Only One Person,6.04,2,15492,United Kingdom +581492,12/9/2019,23534,Wall Art Stop For Tea,6.19,6,15492,United Kingdom +581492,12/9/2019,23535,Wall Art Bicycle Safety,6.19,4,15492,United Kingdom +581492,12/9/2019,23536,Wall Art Village Show,6.19,1,15492,United Kingdom +581492,12/9/2019,23538,Wall Art Vintage Heart,6.19,1,15492,United Kingdom +581492,12/9/2019,23551,Pack Of 12 Paisley Park Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,23552,Bicycle Puncture Repair Kit,6.19,12,15492,United Kingdom +581492,12/9/2019,23555,Landmark Frame Notting Hill,6.19,1,15492,United Kingdom +581492,12/9/2019,23559,Woodland Bunnies Lolly Makers,6.19,5,15492,United Kingdom +581492,12/9/2019,23561,Set Of 6 Ribbons Party,6.19,1,15492,United Kingdom +581492,12/9/2019,23564,Egg Cup Milkmaid Ingrid,6.19,2,15492,United Kingdom +581492,12/9/2019,23565,Egg Cup Milkmaid Helga,6.19,2,15492,United Kingdom +581492,12/9/2019,23567,Egg Cup Henrietta Hen Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,23569,Tradtional Alphabet Stamp Set,6.19,2,15492,United Kingdom +581492,12/9/2019,23570,Traditional Pick Up Sticks Game,6.19,7,15492,United Kingdom +581492,12/9/2019,23571,Traditional Naughts & Crosses,6.19,2,15492,United Kingdom +581492,12/9/2019,23575,Snack Tray Paisley Park,6.19,3,15492,United Kingdom +581492,12/9/2019,23579,Snack Tray I Love London,6.19,1,15492,United Kingdom +581492,12/9/2019,23611,Set 10 Cards Red Riding Hood 17214,6.19,3,15492,United Kingd +581492,12/9/2019,23616,Set 10 Cards Jingle Bells 17217,6.19,1,15492,United Kingdom +581492,12/9/2019,23621,Set 10 Cards David's Madonna 17074,6.19,3,15492,United Kingd +581492,12/9/2019,23635,Set 10 Cards Christmas Holly 17259,6.19,1,15492,United Kingd +581492,12/9/2019,23644,Set 10 Cards Christmas Tree 16955,6.19,1,15492,United Kingdo +581492,12/9/2019,23660,Henrietta Hen Mug,6.19,1,15492,United Kingdom +581492,12/9/2019,23661,Milk Maids Mug,6.19,1,15492,United Kingdom +581492,12/9/2019,35095A,Blue Victorian Fabric Oval Box,6.19,1,15492,United Kingdom +581492,12/9/2019,35095B,Red Victorian Fabric Oval Box,6.19,1,15492,United Kingdom +581492,12/9/2019,35646,Vintage Bead Pink Evening Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,35648,Vintage Bead Pink Purse,6.19,2,15492,United Kingdom +581492,12/9/2019,35953,Folkart Star Christmas Decorations,6.19,12,15492,United King +581492,12/9/2019,35964,Folkart Clip On Stars,6.19,4,15492,United Kingdom +581492,12/9/2019,35970,Zinc Folkart Sleigh Bells,6.04,1,15492,United Kingdom +581492,12/9/2019,46118,Funky Monkey Cushion Cover,6.19,1,15492,United Kingdom +581492,12/9/2019,46776A,Woven Bubble Gum Cushion Cover,7.24,2,15492,United Kingdom +581492,12/9/2019,46776B,Woven Berries Cushion Cover,7.24,3,15492,United Kingdom +581492,12/9/2019,46776C,Woven Frost Cushion Cover,7.24,1,15492,United Kingdom +581492,12/9/2019,46776D,Woven Sunset Cushion Cover,7.24,2,15492,United Kingdom +581492,12/9/2019,46776E,Woven Candy Cushion Cover,7.24,5,15492,United Kingdom +581492,12/9/2019,46776F,Woven Rose Garden Cushion Cover,7.24,6,15492,United Kingdom +581492,12/9/2019,47310M,Small Pop Box Funky Monkey,6.19,1,15492,United Kingdom +581492,12/9/2019,47480,Hanging Photo Clip Rope Ladder,6.19,3,15492,United Kingdom +581492,12/9/2019,47504H,English Rose Spirit Level,7.24,1,15492,United Kingdom +581492,12/9/2019,47559B,Tea Time Oven Glove,7.24,3,15492,United Kingdom +581492,12/9/2019,47563A,Retro Longboard Ironing Board Cover,7.24,2,15492,United Kin +581492,12/9/2019,47566,Party Bunting,7.24,2,15492,United Kingdom +581492,12/9/2019,47590B,Pink Happy Birthday Bunting,7.24,1,15492,United Kingdom +581492,12/9/2019,51014A,Feather Pen Hot Pink,7.24,2,15492,United Kingdom +581492,12/9/2019,51014L,Feather Pen Light Pink,7.24,1,15492,United Kingdom +581492,12/9/2019,71270,Photo Clip Line,7.24,1,15492,United Kingdom +581492,12/9/2019,72349B,Set/6 Purple Butterfly T-Lights,6.39,1,15492,United Kingdom +581492,12/9/2019,72741,Grand Chocolatecandle,7.24,3,15492,United Kingdom +581492,12/9/2019,72800E,4 Ivory Dinner Candles Silver Flock,7.24,3,15492,United Kin +581492,12/9/2019,79321,Chilli Lights,6.19,1,15492,United Kingdom +581492,12/9/2019,82484,Wood Black Board Ant White Finish,6.19,2,15492,United Kingdo +581492,12/9/2019,82567,Airline Lounge Metal Sign,6.19,2,15492,United Kingdom +581492,12/9/2019,82582,Area Patrolled Metal Sign,6.19,1,15492,United Kingdom +581492,12/9/2019,82600,N0 Singing Metal Sign,6.19,1,15492,United Kingdom +581492,12/9/2019,84031A,Charlie+Lola Red Hot Water Bottle,6.19,4,15492,United Kingd +581492,12/9/2019,84077,World War 2 Gliders Asstd Designs,6.19,1,15492,United Kingdo +581492,12/9/2019,84249A,Greeting Card Square Doughnuts,6.19,1,15492,United Kingdom +581492,12/9/2019,84347,Rotating Silver Angels T-Light Hldr,6.19,2,15492,United King +581492,12/9/2019,84375,Set Of 20 Kids Cookie Cutters,6.19,1,15492,United Kingdom +581492,12/9/2019,84378,Set Of 3 Heart Cookie Cutters,6.19,4,15492,United Kingdom +581492,12/9/2019,84519B,Carrot Charlie+Lola Coaster Set,6.19,1,15492,United Kingdom +581492,12/9/2019,84559A,3d Sheet Of Dog Stickers,6.19,2,15492,United Kingdom +581492,12/9/2019,84568,Girls Alphabet Iron On Patches,6.19,31,15492,United Kingdom +581492,12/9/2019,84569D,Pack 6 Heart/Ice-Cream Patches,6.19,1,15492,United Kingdom +581492,12/9/2019,84596B,Small Dolly Mix Design Orange Bowl,6.19,4,15492,United King +581492,12/9/2019,84596F,Small Marshmallows Pink Bowl,6.19,4,15492,United Kingdom +581492,12/9/2019,84598,Boys Alphabet Iron On Patches,6.19,5,15492,United Kingdom +581492,12/9/2019,84692,Box Of 24 Cocktail Parasols,6.19,1,15492,United Kingdom +581492,12/9/2019,84755,Colour Glass T-Light Holder Hanging,6.19,4,15492,United King +581492,12/9/2019,84828,Jungle Popsicles Ice Lolly Moulds,6.19,1,15492,United Kingdo +581492,12/9/2019,84879,Assorted Colour Bird Ornament,6.19,16,15492,United Kingdom +581492,12/9/2019,84923,Pink Butterfly Handbag W Bobbles,6.04,3,15492,United Kingdom +581492,12/9/2019,84946,Antique Silver T-Light Glass,6.04,18,15492,United Kingdom +581492,12/9/2019,84970S,Hanging Heart Zinc T-Light Holder,6.04,3,15492,United Kingd +581492,12/9/2019,84978,Hanging Heart Jar T-Light Holder,6.04,4,15492,United Kingdom +581492,12/9/2019,84991,60 Teatime Fairy Cake Cases,6.04,1,15492,United Kingdom +581492,12/9/2019,84997A,Childrens Cutlery Polkadot Green,6.04,1,15492,United Kingdo +581492,12/9/2019,84997B,Childrens Cutlery Retrospot Red,6.04,1,15492,United Kingdom +581492,12/9/2019,20733,Gold Mini Tape Measure,6.04,3,15492,United Kingdom +581492,12/9/2019,20777,Chrysanthemum Notebook,6.19,2,15492,United Kingdom +581492,12/9/2019,20782,Camouflage Ear Muff Headphones,6.19,1,15492,United Kingdom +581492,12/9/2019,20914,Set/5 Red Retrospot Lid Glass Bowls,6.19,2,15492,United King +581492,12/9/2019,20931,Blue Pot Plant Candle,6.19,1,15492,United Kingdom +581492,12/9/2019,20970,Pink Floral Feltcraft Shoulder Bag,6.19,1,15492,United Kingd +581492,12/9/2019,20971,Pink Blue Felt Craft Trinket Box,6.19,2,15492,United Kingdom +581492,12/9/2019,20972,Pink Cream Felt Craft Trinket Box,6.19,3,15492,United Kingdo +581492,12/9/2019,20973,12 Pencil Small Tube Woodland,6.19,4,15492,United Kingdom +581492,12/9/2019,20978,36 Pencils Tube Skulls,6.19,1,15492,United Kingdom +581492,12/9/2019,20979,36 Pencils Tube Red Retrospot,6.19,3,15492,United Kingdom +581492,12/9/2019,20982,12 Pencils Tall Tube Skulls,6.19,2,15492,United Kingdom +581492,12/9/2019,20983,12 Pencils Tall Tube Red Retrospot,6.19,4,15492,United Kingd +581492,12/9/2019,20985,Heart Calculator,6.19,1,15492,United Kingdom +581492,12/9/2019,20986,Blue Calculator Ruler,6.19,1,15492,United Kingdom +581492,12/9/2019,21000,Rose Du Sud Cosmetics Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,21012,Antique All Glass Candlestick,6.19,3,15492,United Kingdom +581492,12/9/2019,21015,Dark Bird House Tree Decoration,6.19,8,15492,United Kingdom +581492,12/9/2019,21026,Space Owl,6.19,1,15492,United Kingdom +581492,12/9/2019,21035,Set/2 Red Retrospot Tea Towels,6.19,1,15492,United Kingdom +581492,12/9/2019,21064,Boom Box Speaker Boys,6.19,4,15492,United Kingdom +581492,12/9/2019,21065,Boom Box Speaker Girls,6.19,2,15492,United Kingdom +581492,12/9/2019,21098,Christmas Toilet Roll,6.19,1,15492,United Kingdom +581492,12/9/2019,21123,Set/10 Ivory Polkadot Party Candles,6.19,1,15492,United King +581492,12/9/2019,21125,Set 6 Football Celebration Candles,6.19,1,15492,United Kingd +581492,12/9/2019,21126,Set Of 6 Girls Celebration Candles,6.19,1,15492,United Kingd +581492,12/9/2019,21137,Black Record Cover Frame,6.19,17,15492,United Kingdom +581492,12/9/2019,21154,Red Retrospot Oven Glove,6.19,2,15492,United Kingdom +581492,12/9/2019,21158,Moody Girl Door Hanger,6.19,1,15492,United Kingdom +581492,12/9/2019,21162,Toxic Area Door Hanger,6.19,1,15492,United Kingdom +581492,12/9/2019,21166,Cook With Wine Metal Sign,6.19,2,15492,United Kingdom +581492,12/9/2019,21172,Party Metal Sign,6.19,1,15492,United Kingdom +581492,12/9/2019,21174,Pottering In The Shed Metal Sign,6.19,2,15492,United Kingdom +581492,12/9/2019,21175,Gin And Tonic Diet Metal Sign,6.19,2,15492,United Kingdom +581492,12/9/2019,21200,Multicolour Honeycomb Paper Garland,6.04,6,15492,United King +581492,12/9/2019,21201,Tropical Honeycomb Paper Garland,6.04,4,15492,United Kingdom +581492,12/9/2019,21212,Pack Of 72 Retrospot Cake Cases,6.04,2,15492,United Kingdom +581492,12/9/2019,21213,Pack Of 72 Skull Cake Cases,6.04,2,15492,United Kingdom +581492,12/9/2019,21220,Set/4 Badges Dogs,6.19,2,15492,United Kingdom +581492,12/9/2019,21224,Set/4 Skull Badges,6.19,1,15492,United Kingdom +581492,12/9/2019,21232,Strawberry Ceramic Trinket Pot,6.19,1,15492,United Kingdom +581492,12/9/2019,21257,Victorian Sewing Box Medium,6.19,2,15492,United Kingdom +581492,12/9/2019,21258,Victorian Sewing Box Large,6.19,1,15492,United Kingdom +581492,12/9/2019,21259,Victorian Sewing Box Small,6.19,1,15492,United Kingdom +581492,12/9/2019,21313,Glass Heart T-Light Holder,6.19,1,15492,United Kingdom +581492,12/9/2019,21314,Small Glass Heart Trinket Pot,6.19,2,15492,United Kingdom +581492,12/9/2019,21328,Balloons Writing Set,6.19,2,15492,United Kingdom +581492,12/9/2019,21329,Dinosaurs Writing Set,6.19,2,15492,United Kingdom +581492,12/9/2019,21356,Toast Its - Fairy Flower,6.19,16,15492,United Kingdom +581492,12/9/2019,21378,Small Tall Camphor Wood Toadstool,6.19,2,15492,United Kingdo +581492,12/9/2019,21379,Camphor Wood Portobello Mushroom,6.19,1,15492,United Kingdom +581492,12/9/2019,21383,Pack Of 12 Sticky Bunnies,6.19,1,15492,United Kingdom +581492,12/9/2019,21402,Red Egg Spoon,6.19,1,15492,United Kingdom +581492,12/9/2019,21408,Spotty Pink Duck Doorstop,6.19,2,15492,United Kingdom +581492,12/9/2019,21411,Gingham Heart Doorstop Red,6.19,1,15492,United Kingdom +581492,12/9/2019,21467,Cherry Crochet Food Cover,6.19,1,15492,United Kingdom +581492,12/9/2019,21471,Strawberry Raffia Food Cover,6.19,2,15492,United Kingdom +581492,12/9/2019,21479,White Skull Hot Water Bottle,6.19,2,15492,United Kingdom +581492,12/9/2019,21481,Fawn Blue Hot Water Bottle,6.19,3,15492,United Kingdom +581492,12/9/2019,21484,Chick Grey Hot Water Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,21485,Retrospot Heart Hot Water Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,21494,Rotating Leaves T-Light Holder,6.19,11,15492,United Kingdom +581492,12/9/2019,21506,Fancy Font Birthday Card,6.19,3,15492,United Kingdom +581492,12/9/2019,21507,Elephant Birthday Card,7.24,1,15492,United Kingdom +581492,12/9/2019,21508,Vintage Kid Dolly Card,7.24,1,15492,United Kingdom +581492,12/9/2019,21509,Cowboys And Indians Birthday Card,7.24,2,15492,United Kingdo +581492,12/9/2019,21528,Dairy Maid Traditional Teapot,7.24,1,15492,United Kingdom +581492,12/9/2019,21544,Skulls Water Transfer Tattoos,7.24,2,15492,United Kingdom +581492,12/9/2019,21558,Skull Lunch Box With Cutlery,6.39,1,15492,United Kingdom +581492,12/9/2019,21559,Strawberry Lunch Box With Cutlery,7.24,1,15492,United Kingdo +581492,12/9/2019,21615,4 Lavender Botanical Dinner Candles,7.24,2,15492,United King +581492,12/9/2019,21616,4 Pear Botanical Dinner Candles,7.24,6,15492,United Kingdom +581492,12/9/2019,21620,Set Of 4 Rose Botanical Candles,7.24,5,15492,United Kingdom +581492,12/9/2019,21642,Assorted Tutti Frutti Pen,7.24,4,15492,United Kingdom +581492,12/9/2019,21648,Assorted Tutti Frutti Small Purse,7.24,2,15492,United Kingdo +581492,12/9/2019,21650,Assorted Tutti Frutti Bracelet,7.24,14,15492,United Kingdom +581492,12/9/2019,21675,Butterflies Stickers,6.19,2,15492,United Kingdom +581492,12/9/2019,21677,Hearts Stickers,6.19,1,15492,United Kingdom +581492,12/9/2019,21678,Paisley Pattern Stickers,6.19,2,15492,United Kingdom +581492,12/9/2019,21680,Woodland Stickers,6.19,1,15492,United Kingdom +581492,12/9/2019,21703,Bag 125g Swirly Marbles,6.19,1,15492,United Kingdom +581492,12/9/2019,21704,Bag 250g Swirly Marbles,6.19,1,15492,United Kingdom +581492,12/9/2019,21716,Boys Vintage Tin Seaside Bucket,6.19,1,15492,United Kingdom +581492,12/9/2019,21718,Red Metal Beach Spade,6.19,1,15492,United Kingdom +581492,12/9/2019,21724,Panda And Bunnies Sticker Sheet,6.19,1,15492,United Kingdom +581492,12/9/2019,21731,Red Toadstool Led Night Light,6.19,6,15492,United Kingdom +581492,12/9/2019,21739,Cosy Slipper Shoes Small Green,6.19,2,15492,United Kingdom +581492,12/9/2019,21774,Decorative Cats Bathroom Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,21786,Polkadot Rain Hat,6.19,3,15492,United Kingdom +581492,12/9/2019,21787,Rain Poncho Retrospot,6.19,2,15492,United Kingdom +581492,12/9/2019,21790,Vintage Snap Cards,6.19,5,15492,United Kingdom +581492,12/9/2019,21791,Vintage Heads And Tails Card Game,6.19,1,15492,United Kingdo +581492,12/9/2019,21808,Christmas Garland Stars Trees,6.19,3,15492,United Kingdom +581492,12/9/2019,21810,Christmas Hanging Star With Bell,6.19,25,15492,United Kingdo +581492,12/9/2019,21812,Garland With Hearts And Bells,6.19,7,15492,United Kingdom +581492,12/9/2019,21813,Garland With Stars And Bells,6.19,3,15492,United Kingdom +581492,12/9/2019,21822,Glitter Christmas Tree With Bells,6.19,12,15492,United Kingd +581492,12/9/2019,21828,Eight Piece Snake Set,6.19,1,15492,United Kingdom +581492,12/9/2019,21832,Chocolate Calculator,6.19,1,15492,United Kingdom +581492,12/9/2019,21833,Camouflage Led Torch,6.04,2,15492,United Kingdom +581492,12/9/2019,21871,Save The Planet Mug,6.19,1,15492,United Kingdom +581492,12/9/2019,21874,Gin And Tonic Mug,6.19,2,15492,United Kingdom +581492,12/9/2019,21876,Pottering Mug,6.19,4,15492,United Kingdom +581492,12/9/2019,21879,Hearts Gift Tape,6.19,1,15492,United Kingdom +581492,12/9/2019,21889,Wooden Box Of Dominoes,6.19,3,15492,United Kingdom +581492,12/9/2019,21890,S/6 Wooden Skittles In Cotton Bag,6.19,1,15492,United Kingdo +581492,12/9/2019,21892,Traditional Wooden Catch Cup Game,6.19,1,15492,United Kingdo +581492,12/9/2019,21900,Key Fob Shed,6.19,4,15492,United Kingdom +581492,12/9/2019,21901,Key Fob Back Door,6.19,2,15492,United Kingdom +581492,12/9/2019,21902,Key Fob Front Door,6.19,1,15492,United Kingdom +581492,12/9/2019,21905,More Butter Metal Sign,6.19,1,15492,United Kingdom +581492,12/9/2019,21906,Pharmacie First Aid Tin,6.19,1,15492,United Kingdom +581492,12/9/2019,21914,Blue Harmonica In Box,6.19,2,15492,United Kingdom +581492,12/9/2019,21916,Set 12 Retro White Chalk Sticks,6.19,2,15492,United Kingdom +581492,12/9/2019,21930,Jumbo Storage Bag Skulls,6.19,1,15492,United Kingdom +581492,12/9/2019,21931,Jumbo Storage Bag Suki,6.19,1,15492,United Kingdom +581492,12/9/2019,21932,Scandinavian Paisley Picnic Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,21934,Skull Shoulder Bag,6.19,3,15492,United Kingdom +581492,12/9/2019,21935,Suki Shoulder Bag,6.19,9,15492,United Kingdom +581492,12/9/2019,21936,Red Retrospot Picnic Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,21942,Skulls Design Flannel,6.19,2,15492,United Kingdom +581492,12/9/2019,21945,Strawberries Design Flannel,6.19,2,15492,United Kingdom +581492,12/9/2019,21947,Set Of 6 Heart Chopsticks,6.19,1,15492,United Kingdom +581492,12/9/2019,21949,Set Of 6 Strawberry Chopsticks,6.19,2,15492,United Kingdom +581492,12/9/2019,21967,Pack Of 12 Skull Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,21976,Pack Of 60 Mushroom Cake Cases,6.19,3,15492,United Kingdom +581492,12/9/2019,21977,Pack Of 60 Pink Paisley Cake Cases,6.19,2,15492,United Kingd +581492,12/9/2019,21980,Pack Of 12 Red Retrospot Tissues,6.19,2,15492,United Kingdom +581492,12/9/2019,21981,Pack Of 12 Woodland Tissues,6.19,4,15492,United Kingdom +581492,12/9/2019,21982,Pack Of 12 Suki Tissues,6.19,2,15492,United Kingdom +581492,12/9/2019,21983,Pack Of 12 Blue Paisley Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,21984,Pack Of 12 Pink Paisley Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,21986,Pack Of 12 Pink Polkadot Tissues,6.19,3,15492,United Kingdom +581492,12/9/2019,21989,Pack Of 20 Skull Paper Napkins,6.19,2,15492,United Kingdom +581492,12/9/2019,21990,Modern Floral Stationery Set,6.19,8,15492,United Kingdom +581492,12/9/2019,21993,Floral Folk Stationery Set,6.19,8,15492,United Kingdom +581492,12/9/2019,22024,Rainy Ladies Birthday Card,6.19,3,15492,United Kingdom +581492,12/9/2019,22025,Ring Of Roses Birthday Card,6.19,3,15492,United Kingdom +581492,12/9/2019,22026,Banquet Birthday Card,6.19,4,15492,United Kingdom +581492,12/9/2019,22027,Tea Party Birthday Card,6.19,2,15492,United Kingdom +581492,12/9/2019,22028,Penny Farthing Birthday Card,6.19,1,15492,United Kingdom +581492,12/9/2019,22029,Spaceboy Birthday Card,6.19,4,15492,United Kingdom +581492,12/9/2019,22031,Botanical Lavender Birthday Card,6.19,1,15492,United Kingdom +581492,12/9/2019,22037,Robot Birthday Card,6.19,4,15492,United Kingdom +581492,12/9/2019,22064,Pink Doughnut Trinket Pot,6.19,1,15492,United Kingdom +581492,12/9/2019,22065,Christmas Pudding Trinket Pot,6.19,2,15492,United Kingdom +581492,12/9/2019,22068,Black Pirate Treasure Chest,6.19,1,15492,United Kingdom +581492,12/9/2019,22070,Small Red Retrospot Mug In Box,6.19,3,15492,United Kingdom +581492,12/9/2019,22071,Small White Retrospot Mug In Box,6.19,1,15492,United Kingdom +581492,12/9/2019,22074,6 Ribbons Shimmering Pinks,6.19,1,15492,United Kingdom +581492,12/9/2019,22075,6 Ribbons Elegant Christmas,6.19,8,15492,United Kingdom +581492,12/9/2019,22076,6 Ribbons Empire,6.19,4,15492,United Kingdom +581492,12/9/2019,22083,Paper Chain Kit Retrospot,6.19,1,15492,United Kingdom +581492,12/9/2019,22085,Paper Chain Kit Skulls,6.19,1,15492,United Kingdom +581492,12/9/2019,22086,Paper Chain Kit 50'S Christmas,6.19,38,15492,United Kingdom +581492,12/9/2019,22091,Empire Tissue Box,6.19,1,15492,United Kingdom +581492,12/9/2019,22099,Caravan Square Tissue Box,6.19,3,15492,United Kingdom +581492,12/9/2019,22104,Mirror Mosaic Candle Plate,6.19,4,15492,United Kingdom +581492,12/9/2019,22106,Mirror Mosaic Hurricane Lamp,6.19,1,15492,United Kingdom +581492,12/9/2019,22107,Pizza Plate In Box,6.19,10,15492,United Kingdom +581492,12/9/2019,22108,Ping! Microwave Plate,6.04,2,15492,United Kingdom +581492,12/9/2019,22109,Full English Breakfast Plate,6.04,2,15492,United Kingdom +581492,12/9/2019,22110,Bird House Hot Water Bottle,6.04,3,15492,United Kingdom +581492,12/9/2019,22111,Scottie Dog Hot Water Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,22112,Chocolate Hot Water Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,22114,Hot Water Bottle Tea And Sympathy,6.19,4,15492,United Kingdo +581492,12/9/2019,22116,Metal Sign His Dinner Is Served,6.19,2,15492,United Kingdom +581492,12/9/2019,22121,Noel Wooden Block Letters,6.19,1,15492,United Kingdom +581492,12/9/2019,22123,Ping Microwave Apron,6.19,1,15492,United Kingdom +581492,12/9/2019,22124,Set Of 2 Tea Towels Ping Microwave,6.19,1,15492,United Kingd +581492,12/9/2019,22129,Party Cones Candy Decoration,6.19,3,15492,United Kingdom +581492,12/9/2019,22134,Mini Ladle Love Heart Red,6.19,1,15492,United Kingdom +581492,12/9/2019,15036,Assorted Colours Silk Fan,6.19,1,15492,United Kingdom +581492,12/9/2019,15039,Sandalwood Fan,6.19,1,15492,United Kingdom +581492,12/9/2019,15058C,Ice Cream Design Garden Parasol,6.19,1,15492,United Kingdom +581492,12/9/2019,16218,Cartoon Pencil Sharpeners,6.19,5,15492,United Kingdom +581492,12/9/2019,16225,Rattle Snake Eggs,6.19,1,15492,United Kingdom +581492,12/9/2019,16235,Recycled Pencil With Rabbit Eraser,6.19,3,15492,United Kingd +581492,12/9/2019,16237,Sleeping Cat Erasers,6.19,1,15492,United Kingdom +581492,12/9/2019,17038,Porcelain Budah Incense Holder,6.19,1,15492,United Kingdom +581492,12/9/2019,17084N,Fairy Dreams Incense,6.19,1,15492,United Kingdom +581492,12/9/2019,20659,Economy Luggage Tag,6.19,7,15492,United Kingdom +581492,12/9/2019,20665,Red Retrospot Purse,6.19,2,15492,United Kingdom +581492,12/9/2019,20668,Disco Ball Christmas Decoration,6.19,1,15492,United Kingdom +581492,12/9/2019,20718,Red Retrospot Shopper Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,20719,Woodland Charlotte Bag,6.19,7,15492,United Kingdom +581492,12/9/2019,20723,Strawberry Charlotte Bag,6.19,2,15492,United Kingdom +581492,12/9/2019,20724,Red Retrospot Charlotte Bag,6.19,4,15492,United Kingdom +581492,12/9/2019,22135,Mini Ladle Love Heart Pink,6.19,6,15492,United Kingdom +581492,12/9/2019,22138,Baking Set 9 Piece Retrospot,6.19,1,15492,United Kingdom +581492,12/9/2019,22141,Christmas Craft Tree Top Angel,6.19,2,15492,United Kingdom +581492,12/9/2019,22150,3 Stripey Mice Feltcraft,7.24,2,15492,United Kingdom +581492,12/9/2019,22153,Angel Decoration Stars On Dress,7.24,2,15492,United Kingdom +581492,12/9/2019,22154,Angel Decoration 3 Buttons,7.24,3,15492,United Kingdom +581492,12/9/2019,22155,Star Decoration Rustic,7.24,7,15492,United Kingdom +581492,12/9/2019,22156,Heart Decoration With Pearls,7.24,4,15492,United Kingdom +581492,12/9/2019,22163,Heart String Memo Holder Hanging,7.24,9,15492,United Kingdom +581492,12/9/2019,22165,Diamante Heart Shaped Wall Mirror,7.24,1,15492,United Kingdo +581492,12/9/2019,22167,Oval Wall Mirror Diamante,7.24,1,15492,United Kingdom +581492,12/9/2019,22170,Picture Frame Wood Triple Portrait,7.24,1,15492,United Kingd +581492,12/9/2019,22173,Metal 4 Hook Hanger French Chateau,7.24,2,15492,United Kingd +581492,12/9/2019,22174,Photo Cube,6.19,7,15492,United Kingdom +581492,12/9/2019,22178,Victorian Glass Hanging T-Light,6.19,5,15492,United Kingdom +581492,12/9/2019,22186,Red Star Card Holder,7.24,2,15492,United Kingdom +581492,12/9/2019,22190,Local Cafe Mug,7.24,3,15492,United Kingdom +581492,12/9/2019,22193,Red Diner Wall Clock,7.24,1,15492,United Kingdom +581492,12/9/2019,22195,Large Heart Measuring Spoons,7.24,1,15492,United Kingdom +581492,12/9/2019,22196,Small Heart Measuring Spoons,7.24,11,15492,United Kingdom +581492,12/9/2019,22197,Popcorn Holder,7.24,34,15492,United Kingdom +581492,12/9/2019,22199,Frying Pan Red Retrospot,7.24,1,15492,United Kingdom +581492,12/9/2019,22209,Wood Stamp Set Happy Birthday,7.24,1,15492,United Kingdom +581492,12/9/2019,22212,Four Hook White Lovebirds,7.24,1,15492,United Kingdom +581492,12/9/2019,22219,Lovebird Hanging Decoration White,7.24,4,15492,United Kingdo +581492,12/9/2019,22224,White Lovebird Lantern,7.24,4,15492,United Kingdom +581492,12/9/2019,22227,Hanging Heart Mirror Decoration,7.24,1,15492,United Kingdom +581492,12/9/2019,22260,Felt Egg Cosy Blue Rabbit,6.39,2,15492,United Kingdom +581492,12/9/2019,22261,Felt Egg Cosy White Rabbit,7.24,1,15492,United Kingdom +581492,12/9/2019,22264,Felt Farm Animal White Bunny,7.24,1,15492,United Kingdom +581492,12/9/2019,22273,Feltcraft Doll Molly,7.24,2,15492,United Kingdom +581492,12/9/2019,22277,Cosmetic Bag Vintage Rose Paisley,7.24,1,15492,United Kingdo +581492,12/9/2019,22279,Pocket Bag Blue Paisley Red Spot,7.24,5,15492,United Kingdom +581492,12/9/2019,22280,Pocket Bag Pink Paisely Brown Spot,7.24,4,15492,United Kingd +581492,12/9/2019,22300,Coffee Mug Dog + Ball Design,7.24,1,15492,United Kingdom +581492,12/9/2019,22301,Coffee Mug Cat + Bird Design,7.24,1,15492,United Kingdom +581492,12/9/2019,22307,Gold Mug Bone China Tree Of Life,7.24,1,15492,United Kingdom +581492,12/9/2019,22308,Tea Cosy Blue Stripe,7.24,2,15492,United Kingdom +581492,12/9/2019,22309,Tea Cosy Red Stripe,7.24,2,15492,United Kingdom +581492,12/9/2019,22324,Blue Polkadot Kids Bag,7.24,2,15492,United Kingdom +581492,12/9/2019,22326,Round Snack Boxes Set Of4 Woodland,7.24,3,15492,United Kingd +581492,12/9/2019,22327,Round Snack Boxes Set Of 4 Skulls,7.24,2,15492,United Kingdo +581492,12/9/2019,22329,Round Container Set Of 5 Retrospot,6.19,2,15492,United Kingd +581492,12/9/2019,22338,Star Decoration Painted Zinc,6.19,4,15492,United Kingdom +581492,12/9/2019,22340,Noel Garland Painted Zinc,6.19,17,15492,United Kingdom +581492,12/9/2019,22342,Home Garland Painted Zinc,6.19,7,15492,United Kingdom +581492,12/9/2019,22348,Tea Bag Plate Red Retrospot,6.19,3,15492,United Kingdom +581492,12/9/2019,22355,Charlotte Bag Suki Design,6.19,3,15492,United Kingdom +581492,12/9/2019,22356,Charlotte Bag Pink Polkadot,6.19,1,15492,United Kingdom +581492,12/9/2019,22357,Kings Choice Biscuit Tin,6.19,2,15492,United Kingdom +581492,12/9/2019,22358,Kings Choice Tea Caddy,6.19,1,15492,United Kingdom +581492,12/9/2019,22361,Glass Jar Daisy Fresh Cotton Wool,6.19,2,15492,United Kingdo +581492,12/9/2019,22362,Glass Jar Peacock Bath Salts,6.19,2,15492,United Kingdom +581492,12/9/2019,22367,Childrens Apron Spaceboy Design,6.19,1,15492,United Kingdom +581492,12/9/2019,22372,Airline Bag Vintage World Champion,6.19,1,15492,United Kingd +581492,12/9/2019,22374,Airline Bag Vintage Jet Set Red,6.19,1,15492,United Kingdom +581492,12/9/2019,85014B,Red Retrospot Umbrella,6.19,1,15492,United Kingdom +581492,12/9/2019,85032C,Curious Images Gift Wrap Set,6.19,1,15492,United Kingdom +581492,12/9/2019,85038,6 Chocolate Love Heart T-Lights,6.19,1,15492,United Kingdom +581492,12/9/2019,85039A,Set/4 Red Mini Rose Candle In Bowl,6.19,5,15492,United King +581492,12/9/2019,85039B,S/4 Ivory Mini Rose Candle In Bowl,6.19,4,15492,United King +581492,12/9/2019,85040A,S/4 Pink Flower Candles In Bowl,6.19,1,15492,United Kingdom +581492,12/9/2019,85048,15cm Christmas Glass Ball 20 Lights,6.19,2,15492,United King +581492,12/9/2019,85049C,Romantic Pinks Ribbons,6.19,1,15492,United Kingdom +581492,12/9/2019,85049G,Chocolate Box Ribbons,6.19,1,15492,United Kingdom +581492,12/9/2019,85049H,Urban Black Ribbons,6.19,2,15492,United Kingdom +581492,12/9/2019,85053,French Enamel Candleholder,6.19,1,15492,United Kingdom +581492,12/9/2019,85059,French Enamel Water Basin,6.19,1,15492,United Kingdom +581492,12/9/2019,85066,Cream Sweetheart Mini Chest,6.19,1,15492,United Kingdom +581492,12/9/2019,85094,Candy Spot Egg Warmer Rabbit,6.19,2,15492,United Kingdom +581492,12/9/2019,85114C,Red Enchanted Forest Placemat,6.19,1,15492,United Kingdom +581492,12/9/2019,85123A,Cream Hanging Heart T-Light Holder,6.19,3,15492,United King +581492,12/9/2019,85131B,Beaded Crystal Heart Green On Stick,6.19,1,15492,United Kin +581492,12/9/2019,85131D,Beaded Crystal Heart Pink On Stick,6.19,2,15492,United King +581492,12/9/2019,85152,Hand Over The Chocolate Sign,6.19,1,15492,United Kingdom +581492,12/9/2019,85168B,Black Baroque Carriage Clock,6.19,3,15492,United Kingdom +581492,12/9/2019,85169C,Eau De Nil Love Bird Candle,6.19,1,15492,United Kingdom +581492,12/9/2019,85170C,Set/6 Eau De Nil Bird T-Lights,6.19,1,15492,United Kingdom +581492,12/9/2019,85173,Set/6 Frog Prince T-Light Candles,6.19,1,15492,United Kingdo +581492,12/9/2019,85177,Basket Of Flowers Sewing Kit,6.19,1,15492,United Kingdom +581492,12/9/2019,85178,Victorian Sewing Kit,6.19,1,15492,United Kingdom +581492,12/9/2019,85179A,Green Bitty Light Chain,6.19,4,15492,United Kingdom +581492,12/9/2019,85199S,Small Hanging Ivory/Red Wood Bird,6.19,9,15492,United Kingd +581492,12/9/2019,85227,Set Of 6 3d Kit Cards For Kids,6.19,3,15492,United Kingdom +581492,12/9/2019,90003C,Midnight Blue Pair Heart Hair Slide,6.19,1,15492,United Kin +581492,12/9/2019,90003E,Green Pair Heart Hair Slides,6.19,2,15492,United Kingdom +581492,12/9/2019,90010A,Midnight Blue Glass/Silver Bracelet,6.04,1,15492,United Kin +581492,12/9/2019,90013A,Midnight Blue Vintage Earrings,6.19,3,15492,United Kingdom +581492,12/9/2019,90013C,Green Vintage Earrings,6.19,2,15492,United Kingdom +581492,12/9/2019,90014A,Silver Mop Orbit Necklace,6.19,1,15492,United Kingdom +581492,12/9/2019,90016B,Gold/Mop Pendant Orbit Necklace,6.19,1,15492,United Kingdom +581492,12/9/2019,90018B,Gold Mop Orbit Drop Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90019B,Gold Mop Orbit Bracelet,6.19,1,15492,United Kingdom +581492,12/9/2019,90027D,Glass Bead Hoop Earrings Amethyst,6.19,1,15492,United Kingd +581492,12/9/2019,90030B,Red Kukui Coconut Seed Necklace,6.19,1,15492,United Kingdom +581492,12/9/2019,90055,Cracked Glaze Earrings Brown,6.19,1,15492,United Kingdom +581492,12/9/2019,90059A,Diamante Hair Grip Pack/2 Crystal,6.19,1,15492,United Kingd +581492,12/9/2019,90059D,Diamante Hair Grip Pack/2 Peridot,6.19,2,15492,United Kingd +581492,12/9/2019,90059E,Diamante Hair Grip Pack/2 Ruby,6.04,1,15492,United Kingdom +581492,12/9/2019,90059F,Diamante Hair Grip Pack/2 Lt Rose,6.19,1,15492,United Kingd +581492,12/9/2019,90072,Ruby Drop Chandelier Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90086,Crystal Frog Phone Charm,6.19,1,15492,United Kingdom +581492,12/9/2019,90120B,Blue Murano Twist Bracelet,6.19,2,15492,United Kingdom +581492,12/9/2019,90120C,Green Murano Twist Bracelet,6.19,1,15492,United Kingdom +581492,12/9/2019,90130B,Turq Stone/Crystal Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90130C,Green Stone/Crystal Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90134,Old Rose Combo Bead Necklace,6.19,1,15492,United Kingdom +581492,12/9/2019,90138,White/Pink Mini Crystals Necklace,6.19,1,15492,United Kingdo +581492,12/9/2019,90141B,Ivory Pendant Triple Shell Necklace,6.19,1,15492,United Kin +581492,12/9/2019,90145,Silver Hoop Earrings With Flower,6.19,1,15492,United Kingdom +581492,12/9/2019,90155,Resin Necklace W Pastel Beads,6.19,1,15492,United Kingdom +581492,12/9/2019,90161D,Ant Copper Pink Boudicca Bracelet,6.19,1,15492,United Kingd +581492,12/9/2019,90163A,Pink Rosebud & Pearl Necklace,6.19,2,15492,United Kingdom +581492,12/9/2019,90165B,White Rosebud Pearl Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90168,2 Daisies Hair Comb,6.19,1,15492,United Kingdom +581492,12/9/2019,90169,Daisy Hair Comb,6.19,1,15492,United Kingdom +581492,12/9/2019,90170,Daisy Hair Band,6.19,1,15492,United Kingdom +581492,12/9/2019,90174,Butterfly Hair Band,6.19,2,15492,United Kingdom +581492,12/9/2019,90175A,White Glass Chunky Charm Bracelet,6.19,2,15492,United Kingd +581492,12/9/2019,90175D,Tigris Eye Chunky Charm Bracelet,6.19,1,15492,United Kingdo +581492,12/9/2019,90177A,Classic Diamante Earrings Jet,6.19,1,15492,United Kingdom +581492,12/9/2019,90177C,Drop Diamante Earrings Crystal,6.19,1,15492,United Kingdom +581492,12/9/2019,90181B,Amethyst Glass/Shell/Pearl Necklace,6.04,1,15492,United Kin +581492,12/9/2019,90182C,Black 3 Bead Drop Earrings,6.19,1,15492,United Kingdom +581492,12/9/2019,90183A,Amber Drop Earrings W Long Beads,6.19,2,15492,United Kingdo +581492,12/9/2019,90183C,Black Drop Earrings W Long Beads,6.19,1,15492,United Kingdo +581492,12/9/2019,90184C,Black Chunky Bead Bracelet W Strap,6.19,1,15492,United King +581492,12/9/2019,90185B,Amethyst Diamante Expandable Ring,6.19,1,15492,United Kingd +581492,12/9/2019,90188,Drop Earrings W Flower & Leaf,6.19,2,15492,United Kingdom +581492,12/9/2019,90191,Silver Lariat 40cm,6.19,2,15492,United Kingdom +581492,12/9/2019,90192,Jade Drop Earrings W Filigree,6.19,1,15492,United Kingdom +581492,12/9/2019,90198A,Vintage Rose Bead Bracelet Raspberr,6.19,2,15492,United Kin +581492,12/9/2019,90200A,Purple Sweetheart Bracelet,6.19,1,15492,United Kingdom +581492,12/9/2019,90201A,Purple Enamel Flower Ring,6.19,2,15492,United Kingdom +581492,12/9/2019,90201B,Black Enamel Flower Ring,6.19,1,15492,United Kingdom +581492,12/9/2019,90201C,Red Enamel Flower Ring,6.19,1,15492,United Kingdom +581492,12/9/2019,90201D,Green Enamel Flower Ring,6.19,1,15492,United Kingdom +581492,12/9/2019,90202C,Green Enamel Flower Hair Tie,6.19,1,15492,United Kingdom +581492,12/9/2019,90202D,Pink Enamel Flower Hair Tie,6.19,1,15492,United Kingdom +581492,12/9/2019,90206C,Crystal Diamante Star Brooch,6.19,1,15492,United Kingdom +581492,12/9/2019,90208,Pair Of Pink Flower Cluster Slide,6.19,1,15492,United Kingdo +581492,12/9/2019,90210A,Grey Acrylic Faceted Bangle,6.19,1,15492,United Kingdom +581492,12/9/2019,22378,Wall Tidy Retrospot,6.19,2,15492,United Kingdom +581492,12/9/2019,22379,Recycling Bag Retrospot,6.19,1,15492,United Kingdom +581492,12/9/2019,22380,Toy Tidy Spaceboy,6.19,2,15492,United Kingdom +581492,12/9/2019,22396,Magnets Pack Of 4 Retro Photo,6.19,1,15492,United Kingdom +581492,12/9/2019,22411,Jumbo Shopper Vintage Red Paisley,6.19,1,15492,United Kingdo +581492,12/9/2019,22418,10 Colour Spaceboy Pen,6.19,3,15492,United Kingdom +581492,12/9/2019,22419,Lipstick Pen Red,6.19,3,15492,United Kingdom +581492,12/9/2019,22420,Lipstick Pen Baby Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,22421,Lipstick Pen Fuschia,6.19,2,15492,United Kingdom +581492,12/9/2019,22422,Toothpaste Tube Pen,6.19,4,15492,United Kingdom +581492,12/9/2019,22437,Set Of 9 Black Skull Balloons,7.24,1,15492,United Kingdom +581492,12/9/2019,22441,Grow Your Own Basil In Enamel Mug,7.24,1,15492,United Kingdo +581492,12/9/2019,22446,Pin Cushion Babushka Pink,7.24,7,15492,United Kingdom +581492,12/9/2019,22457,Natural Slate Heart Chalkboard,7.24,1,15492,United Kingdom +581492,12/9/2019,22464,Hanging Metal Heart Lantern,7.24,1,15492,United Kingdom +581492,12/9/2019,22466,Fairy Tale Cottage Night Light,7.24,1,15492,United Kingdom +581492,12/9/2019,22467,Gumball Coat Rack,7.24,1,15492,United Kingdom +581492,12/9/2019,22478,Birdhouse Garden Marker,7.24,1,15492,United Kingdom +581492,12/9/2019,22486,Plasmatronic Lamp,7.24,1,15492,United Kingdom +581492,12/9/2019,22488,Natural Slate Rectangle Chalkboard,7.24,1,15492,United Kingd +581492,12/9/2019,22489,Pack Of 12 Traditional Crayons,7.24,5,15492,United Kingdom +581492,12/9/2019,22495,Set Of 2 Round Tins Camembert,7.24,1,15492,United Kingdom +581492,12/9/2019,22540,Mini Jigsaw Circus Parade,7.24,1,15492,United Kingdom +581492,12/9/2019,22544,Mini Jigsaw Spaceboy,7.24,1,15492,United Kingdom +581492,12/9/2019,22549,Picture Dominoes,7.24,3,15492,United Kingdom +581492,12/9/2019,22551,Plasters In Tin Spaceboy,7.24,2,15492,United Kingdom +581492,12/9/2019,22553,Plasters In Tin Skulls,7.24,2,15492,United Kingdom +581492,12/9/2019,22554,Plasters In Tin Woodland Animals,7.24,3,15492,United Kingdom +581492,12/9/2019,22555,Plasters In Tin Strongman,7.24,3,15492,United Kingdom +581492,12/9/2019,22557,Plasters In Tin Vintage Paisley,7.24,2,15492,United Kingdom +581492,12/9/2019,22558,Clothes Pegs Retrospot Pack 24,7.24,3,15492,United Kingdom +581492,12/9/2019,22560,Traditional Modelling Clay,7.24,5,15492,United Kingdom +581492,12/9/2019,22565,Feltcraft Hairbands Pink And White,7.24,4,15492,United Kingd +581492,12/9/2019,22566,Feltcraft Hairband Pink And Purple,7.24,3,15492,United Kingd +581492,12/9/2019,22571,Rocking Horse Red Christmas,7.24,4,15492,United Kingdom +581492,12/9/2019,22573,Star Wooden Christmas Decoration,6.39,2,15492,United Kingdom +581492,12/9/2019,22574,Heart Wooden Christmas Decoration,7.24,5,15492,United Kingdo +581492,12/9/2019,22576,Swallow Wooden Christmas Decoration,7.24,3,15492,United King +581492,12/9/2019,22577,Wooden Heart Christmas Scandinavian,7.24,4,15492,United King +581492,12/9/2019,22578,Wooden Star Christmas Scandinavian,7.24,19,15492,United King +581492,12/9/2019,22580,Advent Calendar Gingham Sack,7.24,9,15492,United Kingdom +581492,12/9/2019,22581,Wood Stocking Christmas Scandispot,7.24,11,15492,United King +581492,12/9/2019,22585,Pack Of 6 Birdy Gift Tags,7.24,2,15492,United Kingdom +581492,12/9/2019,22586,Feltcraft Hairband Pink And Blue,7.24,2,15492,United Kingdom +581492,12/9/2019,22589,Cardholder Gingham Star,7.24,6,15492,United Kingdom +581492,12/9/2019,22591,Cardholder Gingham Christmas Tree,7.24,1,15492,United Kingdo +581492,12/9/2019,22592,Cardholder Holly Wreath Metal,7.24,3,15492,United Kingdom +581492,12/9/2019,22593,Christmas Gingham Star,6.39,2,15492,United Kingdom +581492,12/9/2019,22594,Christmas Gingham Tree,7.24,3,15492,United Kingdom +581492,12/9/2019,22597,Musical Zinc Heart Decoration,7.24,9,15492,United Kingdom +581492,12/9/2019,22598,Christmas Musical Zinc Tree,7.24,4,15492,United Kingdom +581492,12/9/2019,22599,Christmas Musical Zinc Star,6.19,5,15492,United Kingdom +581492,12/9/2019,22600,Christmas Retrospot Star Wood,6.19,2,15492,United Kingdom +581492,12/9/2019,22601,Christmas Retrospot Angel Wood,6.19,3,15492,United Kingdom +581492,12/9/2019,22602,Retrospot Wooden Heart Decoration,6.19,3,15492,United Kingdo +581492,12/9/2019,22608,Pens Assorted Funky Jeweled,6.19,3,15492,United Kingdom +581492,12/9/2019,22614,Pack Of 12 Spaceboy Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,22615,Pack Of 12 Circus Parade Tissues,6.19,4,15492,United Kingdom +581492,12/9/2019,22616,Pack Of 12 London Tissues,6.19,1,15492,United Kingdom +581492,12/9/2019,22619,Set Of 6 Soldier Skittles,6.19,4,15492,United Kingdom +581492,12/9/2019,22620,4 Traditional Spinning Tops,6.19,3,15492,United Kingdom +581492,12/9/2019,22621,Traditional Knitting Nancy,6.19,2,15492,United Kingdom +581492,12/9/2019,22629,Spaceboy Lunch Box,6.19,1,15492,United Kingdom +581492,12/9/2019,22630,Dolly Girl Lunch Box,6.19,1,15492,United Kingdom +581492,12/9/2019,22632,Hand Warmer Red Retrospot,6.19,1,15492,United Kingdom +581492,12/9/2019,22633,Hand Warmer Union Jack,6.19,1,15492,United Kingdom +581492,12/9/2019,22634,Childs Breakfast Set Spaceboy,6.19,1,15492,United Kingdom +581492,12/9/2019,22650,Ceramic Pirate Chest Money Bank,6.19,2,15492,United Kingdom +581492,12/9/2019,22651,Gentleman Shirt Repair Kit,6.19,1,15492,United Kingdom +581492,12/9/2019,22653,Button Box,6.19,16,15492,United Kingdom +581492,12/9/2019,22654,Deluxe Sewing Kit,6.19,2,15492,United Kingdom +581492,12/9/2019,22659,Lunch Box I Love London,6.19,1,15492,United Kingdom +581492,12/9/2019,22666,Recipe Box Pantry Yellow Design,6.19,5,15492,United Kingdom +581492,12/9/2019,22693,Grow A Flytrap Or Sunflower In Tin,6.19,3,15492,United Kingd +581492,12/9/2019,22694,Wicker Star,6.19,1,15492,United Kingdom +581492,12/9/2019,22697,Green Regency Teacup And Saucer,6.19,1,15492,United Kingdom +581492,12/9/2019,22699,Roses Regency Teacup And Saucer,6.19,2,15492,United Kingdom +581492,12/9/2019,22701,Pink Dog Bowl,6.19,5,15492,United Kingdom +581492,12/9/2019,22703,Pink Cat Bowl,6.19,6,15492,United Kingdom +581492,12/9/2019,22712,Card Dolly Girl,6.19,1,15492,United Kingdom +581492,12/9/2019,22713,Card I Love London,6.19,1,15492,United Kingdom +581492,12/9/2019,22714,Card Birthday Cowboy,6.19,2,15492,United Kingdom +581492,12/9/2019,22716,Card Circus Parade,6.19,3,15492,United Kingdom +581492,12/9/2019,22717,Card Dog And Ball,6.19,1,15492,United Kingdom +581492,12/9/2019,22720,Set Of 3 Cake Tins Pantry Design,6.19,2,15492,United Kingdom +581492,12/9/2019,22725,Alarm Clock Bakelike Chocolate,6.19,1,15492,United Kingdom +581492,12/9/2019,22726,Alarm Clock Bakelike Green,6.19,4,15492,United Kingdom +581492,12/9/2019,22727,Alarm Clock Bakelike Red,6.19,4,15492,United Kingdom +581492,12/9/2019,22730,Alarm Clock Bakelike Ivory,6.19,1,15492,United Kingdom +581492,12/9/2019,22741,Funky Diva Pen,6.19,4,15492,United Kingdom +581492,12/9/2019,22745,Poppy's Playhouse Bedroom,6.19,2,15492,United Kingdom +581492,12/9/2019,22748,Poppy's Playhouse Kitchen,6.19,1,15492,United Kingdom +581492,12/9/2019,22749,Feltcraft Princess Charlotte Doll,6.19,1,15492,United Kingdo +581492,12/9/2019,22751,Feltcraft Princess Olivia Doll,6.19,2,15492,United Kingdom +581492,12/9/2019,22753,Small Yellow Babushka Notebook,6.19,1,15492,United Kingdom +581492,12/9/2019,22754,Small Red Babushka Notebook,6.19,1,15492,United Kingdom +581492,12/9/2019,22757,Large Red Babushka Notebook,6.19,3,15492,United Kingdom +581492,12/9/2019,22758,Large Purple Babushka Notebook,6.19,2,15492,United Kingdom +581492,12/9/2019,22763,Key Cabinet Ma Campagne,6.19,1,15492,United Kingdom +581492,12/9/2019,22768,Family Photo Frame Cornice,6.19,2,15492,United Kingdom +581492,12/9/2019,22776,Sweetheart 3 Tier Cake Stand,6.19,1,15492,United Kingdom +581492,12/9/2019,22795,Sweetheart Recipe Book Stand,6.19,1,15492,United Kingdom +581492,12/9/2019,22798,Antique Glass Dressing Table Pot,6.19,3,15492,United Kingdom +581492,12/9/2019,22800,Antique Tall Swirlglass Trinket Pot,6.19,3,15492,United King +581492,12/9/2019,22809,Set Of 6 T-Lights Santa,6.19,1,15492,United Kingdom +581492,12/9/2019,22811,Set Of 6 T-Lights Cacti,6.19,1,15492,United Kingdom +581492,12/9/2019,22814,Card Party Games,6.19,9,15492,United Kingdom +581492,12/9/2019,22815,Card Psychedelic Apples,6.19,18,15492,United Kingdom +581492,12/9/2019,22816,Card Motorbike Santa,6.19,2,15492,United Kingdom +581492,12/9/2019,22817,Card Suki Birthday,6.19,5,15492,United Kingdom +581492,12/9/2019,22818,Card Christmas Village,7.24,6,15492,United Kingdom +581492,12/9/2019,22819,Birthday Card Retro Spot,7.24,3,15492,United Kingdom +581492,12/9/2019,22835,Hot Water Bottle I Am So Poorly,7.24,3,15492,United Kingdom +581492,12/9/2019,22865,Hand Warmer Owl Design,7.24,2,15492,United Kingdom +581492,12/9/2019,22866,Hand Warmer Scotty Dog Design,7.24,3,15492,United Kingdom +581492,12/9/2019,22867,Hand Warmer Bird Design,7.24,4,15492,United Kingdom +581492,12/9/2019,22881,Number Tile Vintage Font 2,7.24,1,15492,United Kingdom +581492,12/9/2019,22885,Number Tile Vintage Font 6,7.24,1,15492,United Kingdom +581492,12/9/2019,22888,Number Tile Vintage Font 9,7.24,1,15492,United Kingdom +581492,12/9/2019,22890,Novelty Biscuits Cake Stand 3 Tier,7.24,1,15492,United Kingd +581492,12/9/2019,22898,Childrens Apron Apples Design,7.24,1,15492,United Kingdom +581492,12/9/2019,22899,Children's Apron Dolly Girl,7.24,2,15492,United Kingdom +581492,12/9/2019,22900,Set 2 Tea Towels I Love London,7.24,3,15492,United Kingdom +581492,12/9/2019,22905,Calendar In Season Design,7.24,1,15492,United Kingdom +581492,12/9/2019,22907,Pack Of 20 Napkins Pantry Design,6.39,1,15492,United Kingdom +581492,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,7.24,5,15492,United King +581492,12/9/2019,22910,Paper Chain Kit Vintage Christmas,7.24,7,15492,United Kingdo +581492,12/9/2019,22914,Blue Coat Rack Paris Fashion,7.24,1,15492,United Kingdom +581492,12/9/2019,22922,Fridge Magnets Us Diner Assorted,7.24,6,15492,United Kingdom +581492,12/9/2019,22924,Fridge Magnets La Vie En Rose,7.24,6,15492,United Kingdom +581492,12/9/2019,22928,Yellow Giant Garden Thermometer,7.24,1,15492,United Kingdom +581492,12/9/2019,22940,Feltcraft Christmas Fairy,6.19,1,15492,United Kingdom +581492,12/9/2019,22941,Christmas Lights 10 Reindeer,6.19,2,15492,United Kingdom +581492,12/9/2019,22943,Christmas Lights 10 Vintage Baubles,6.19,1,15492,United King +581492,12/9/2019,22948,Metal Decoration Naughty Children,6.19,4,15492,United Kingdo +581492,12/9/2019,22951,60 Cake Cases Dolly Girl Design,6.19,2,15492,United Kingdom +581492,12/9/2019,22952,60 Cake Cases Vintage Christmas,6.19,2,15492,United Kingdom +581492,12/9/2019,22955,36 Foil Star Cake Cases,6.19,1,15492,United Kingdom +581492,12/9/2019,22960,Jam Making Set With Jars,6.19,2,15492,United Kingdom +581492,12/9/2019,22961,Jam Making Set Printed,6.19,9,15492,United Kingdom +581492,12/9/2019,22962,Jam Jar With Pink Lid,6.19,3,15492,United Kingdom +581492,12/9/2019,22963,Jam Jar With Green Lid,6.19,3,15492,United Kingdom +581492,12/9/2019,22964,3 Piece Spaceboy Cookie Cutter Set,6.19,1,15492,United Kingd +581492,12/9/2019,22965,3 Traditional Biscuit Cutters Set,6.19,1,15492,United Kingdo +581492,12/9/2019,22966,Gingerbread Man Cookie Cutter,6.19,4,15492,United Kingdom +581492,12/9/2019,22969,Homemade Jam Scented Candles,6.19,6,15492,United Kingdom +581492,12/9/2019,22975,Spaceboy Childrens Egg Cup,6.19,2,15492,United Kingdom +581492,12/9/2019,22976,Circus Parade Childrens Egg Cup,6.19,1,15492,United Kingdom +581492,12/9/2019,22977,Dolly Girl Childrens Egg Cup,6.19,1,15492,United Kingdom +581492,12/9/2019,22979,Pantry Washing Up Brush,6.19,2,15492,United Kingdom +581492,12/9/2019,22980,Pantry Scrubbing Brush,6.19,1,15492,United Kingdom +581492,12/9/2019,22982,Pantry Pastry Brush,6.19,3,15492,United Kingdom +581492,12/9/2019,22983,Card Billboard Font,6.19,1,15492,United Kingdom +581492,12/9/2019,22984,Card Gingham Rose,6.19,1,15492,United Kingdom +581492,12/9/2019,22988,Soldiers Egg Cup,6.19,1,15492,United Kingdom +581492,12/9/2019,22989,Set 2 Pantry Design Tea Towels,6.19,2,15492,United Kingdom +581492,12/9/2019,22992,Revolver Wooden Ruler,6.19,3,15492,United Kingdom +581492,12/9/2019,22993,Set Of 4 Pantry Jelly Moulds,6.19,3,15492,United Kingdom +581492,12/9/2019,22995,Travel Card Wallet Suki,6.19,4,15492,United Kingdom +581492,12/9/2019,22996,Travel Card Wallet Vintage Ticket,6.19,5,15492,United Kingdo +581492,12/9/2019,22997,Travel Card Wallet Union Jack,6.19,1,15492,United Kingdom +581492,12/9/2019,22998,Travel Card Wallet Keep Calm,6.19,4,15492,United Kingdom +581492,12/9/2019,22999,Travel Card Wallet Vintage Leaf,6.19,1,15492,United Kingdom +581492,12/9/2019,23005,Travel Card Wallet I Love London,6.19,4,15492,United Kingdom +581492,12/9/2019,23007,Spaceboy Baby Gift Set,6.19,1,15492,United Kingdom +581492,12/9/2019,23009,I Love London Baby Gift Set,6.19,2,15492,United Kingdom +581492,12/9/2019,23012,Glass Apothecary Bottle Perfume,6.19,1,15492,United Kingdom +581492,12/9/2019,23013,Glass Apothecary Bottle Tonic,6.19,2,15492,United Kingdom +581492,12/9/2019,23014,Glass Apothecary Bottle Elixir,6.19,1,15492,United Kingdom +581492,12/9/2019,23050,Recycled Acapulco Mat Green,6.19,1,15492,United Kingdom +581492,12/9/2019,23051,Recycled Acapulco Mat Blue,6.19,1,15492,United Kingdom +581492,12/9/2019,23052,Recycled Acapulco Mat Turquoise,6.19,5,15492,United Kingdom +581492,12/9/2019,23053,Recycled Acapulco Mat Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,23054,Recycled Acapulco Mat Lavender,6.19,1,15492,United Kingdom +581492,12/9/2019,23074,Embossed Heart Trinket Box,6.19,1,15492,United Kingdom +581492,12/9/2019,23076,Ice Cream Sundae Lip Gloss,6.19,3,15492,United Kingdom +581492,12/9/2019,23077,Doughnut Lip Gloss,6.19,3,15492,United Kingdom +581492,12/9/2019,23082,Set 6 Paper Table Lantern Hearts,6.19,1,15492,United Kingdom +581492,12/9/2019,23083,Set 6 Paper Table Lantern Stars,6.19,1,15492,United Kingdom +581492,12/9/2019,23084,Rabbit Night Light,6.19,57,15492,United Kingdom +581492,12/9/2019,23088,Zinc Heart Flower T-Light Holder,6.19,1,15492,United Kingdom +581492,12/9/2019,23089,Glass Bon Bon Jar,6.19,4,15492,United Kingdom +581492,12/9/2019,23093,Small Parisienne Heart Photo Frame,6.19,3,15492,United Kingd +581492,12/9/2019,23103,Jingle Bell Heart Decoration,6.19,2,15492,United Kingdom +581492,12/9/2019,23110,Parisienne Key Cabinet,6.19,1,15492,United Kingdom +581492,12/9/2019,23111,Parisienne Sewing Box,6.19,1,15492,United Kingdom +581492,12/9/2019,23112,Parisienne Curio Cabinet,6.19,1,15492,United Kingdom +581492,12/9/2019,23118,Parisienne Jewellery Drawer,6.19,1,15492,United Kingdom +581492,12/9/2019,23158,Set Of 5 Lucky Cat Magnets,6.19,1,15492,United Kingdom +581492,12/9/2019,23165,Large Ceramic Top Storage Jar,6.19,2,15492,United Kingdom +581492,12/9/2019,23166,Medium Ceramic Top Storage Jar,6.19,2,15492,United Kingdom +581492,12/9/2019,23168,Classic Cafe Sugar Dispenser,6.19,2,15492,United Kingdom +581492,12/9/2019,23171,Regency Tea Plate Green,6.19,1,15492,United Kingdom +581492,12/9/2019,23172,Regency Tea Plate Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,23173,Regency Teapot Roses,6.19,1,15492,United Kingdom +581492,12/9/2019,23175,Regency Milk Jug Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,23177,Treasure Island Book Box,6.19,1,15492,United Kingdom +581492,12/9/2019,23183,Mother's Kitchen Spoon Rest,6.19,3,15492,United Kingdom +581492,12/9/2019,23184,Bull Dog Bottle Opener,6.19,2,15492,United Kingdom +581492,12/9/2019,23188,Vintage 2 Metre Folding Ruler,6.19,1,15492,United Kingdom +581492,12/9/2019,23191,Bundle Of 3 Retro Note Books,6.19,1,15492,United Kingdom +581492,12/9/2019,23194,Gymkhana Treasure Book Box,6.19,1,15492,United Kingdom +581492,12/9/2019,23196,Vintage Leaf Magnetic Notepad,6.19,1,15492,United Kingdom +581492,12/9/2019,23197,Sketchbook Magnetic Shopping List,6.19,2,15492,United Kingdo +581492,12/9/2019,23198,Pantry Magnetic Shopping List,6.19,2,15492,United Kingdom +581492,12/9/2019,23204,Charlotte Bag Apples Design,6.19,6,15492,United Kingdom +581492,12/9/2019,23205,Charlotte Bag Vintage Alphabet,6.19,3,15492,United Kingdom +581492,12/9/2019,23212,Heart Wreath Decoration With Bell,6.19,7,15492,United Kingdo +581492,12/9/2019,23213,Star Wreath Decoration With Bell,6.19,7,15492,United Kingdom +581492,12/9/2019,23220,Reindeer Heart Decoration Gold,6.19,2,15492,United Kingdom +581492,12/9/2019,23224,Cherub Heart Decoration Gold,6.19,1,15492,United Kingdom +581492,12/9/2019,23229,Vintage Donkey Tail Game,6.19,2,15492,United Kingdom +581492,12/9/2019,23234,Biscuit Tin Vintage Christmas,6.19,4,15492,United Kingdom +581492,12/9/2019,23241,Treasure Tin Gymkhana Design,6.19,3,15492,United Kingdom +581492,12/9/2019,23243,Set Of Tea Coffee Sugar Tins Pantry,6.19,1,15492,United King +581492,12/9/2019,23245,Set Of 3 Regency Cake Tins,6.19,7,15492,United Kingdom +581492,12/9/2019,23247,Biscuit Tin 50'S Christmas,6.19,3,15492,United Kingdom +581492,12/9/2019,23264,Set Of 3 Wooden Sleigh Decorations,6.19,3,15492,United Kingd +581492,12/9/2019,23265,Set Of 3 Wooden Tree Decorations,6.19,3,15492,United Kingdom +581492,12/9/2019,23266,Set Of 3 Wooden Stocking Decoration,6.19,2,15492,United King +581492,12/9/2019,23274,Star T-Light Holder Willie Winkie,6.19,3,15492,United Kingdo +581492,12/9/2019,23275,Set Of 3 Hanging Owls Ollie Beak,6.19,2,15492,United Kingdom +581492,12/9/2019,23280,Folding Butterfly Mirror Hot Pink,6.19,2,15492,United Kingdo +581492,12/9/2019,23284,Doormat Keep Calm And Come In,6.19,1,15492,United Kingdom +581492,12/9/2019,23285,Pink Vintage Spot Beaker,6.19,1,15492,United Kingdom +581492,12/9/2019,23287,Red Vintage Spot Beaker,6.19,1,15492,United Kingdom +581492,12/9/2019,23290,Spaceboy Childrens Bowl,6.19,1,15492,United Kingdom +581492,12/9/2019,23292,Spaceboy Childrens Cup,6.19,1,15492,United Kingdom +581492,12/9/2019,23293,Set Of 12 Fairy Cake Baking Cases,6.19,3,15492,United Kingdo +581492,12/9/2019,23294,Set Of 6 Snack Loaf Baking Cases,6.19,1,15492,United Kingdom +581492,12/9/2019,23295,Set Of 12 Mini Loaf Baking Cases,6.19,4,15492,United Kingdom +581492,12/9/2019,23298,Spotty Bunting,6.19,2,15492,United Kingdom +581492,12/9/2019,23299,Food Cover With Beads Set 2,6.19,1,15492,United Kingdom +581492,12/9/2019,23300,Gardeners Kneeling Pad Cup Of Tea,6.19,3,15492,United Kingdo +581492,12/9/2019,23301,Gardeners Kneeling Pad Keep Calm,6.19,6,15492,United Kingdom +581492,12/9/2019,23307,Set Of 60 Pantry Design Cake Cases,6.19,7,15492,United Kingd +581492,12/9/2019,23308,Set Of 60 Vintage Leaf Cake Cases,6.19,1,15492,United Kingdo +581492,12/9/2019,23309,Set Of 60 I Love London Cake Cases,6.19,2,15492,United Kingd +581492,12/9/2019,23310,Bubblegum Ring Assorted,6.19,4,15492,United Kingdom +581492,12/9/2019,23311,Vintage Christmas Stocking,6.19,1,15492,United Kingdom +581492,12/9/2019,23312,Vintage Christmas Gift Sack,6.19,6,15492,United Kingdom +581492,12/9/2019,23313,Vintage Christmas Bunting,6.19,4,15492,United Kingdom +581492,12/9/2019,23314,Vintage Christmas Tablecloth,6.19,1,15492,United Kingdom +581492,12/9/2019,23319,Box Of 6 Mini 50'S Crackers,6.19,3,15492,United Kingdom +581492,12/9/2019,23322,Large White Heart Of Wicker,6.19,1,15492,United Kingdom +581492,12/9/2019,23323,White Wicker Star,6.19,6,15492,United Kingdom +581492,12/9/2019,23328,Set 6 School Milk Bottles In Crate,6.19,5,15492,United Kingd +581492,12/9/2019,23332,Ivory Wicker Heart Large,6.19,1,15492,United Kingdom +581492,12/9/2019,23334,Ivory Wicker Heart Small,6.19,1,15492,United Kingdom +581492,12/9/2019,23336,Egg Frying Pan Pink,6.19,1,15492,United Kingdom +581492,12/9/2019,23340,Vintage Christmas Cake Frill,6.19,3,15492,United Kingdom +581492,12/9/2019,23345,Dolly Girl Beaker,6.19,1,15492,United Kingdom +581492,12/9/2019,23347,I Love London Beaker,6.19,1,15492,United Kingdom +581492,12/9/2019,23349,Roll Wrap Vintage Christmas,6.19,2,15492,United Kingdom +581492,12/9/2019,23351,Roll Wrap 50'S Christmas,6.19,5,15492,United Kingdom +581492,12/9/2019,23352,Roll Wrap 50'S Red Christmas,6.19,1,15492,United Kingdom +581492,12/9/2019,23353,6 Gift Tags Vintage Christmas,6.19,3,15492,United Kingdom +581492,12/9/2019,23354,6 Gift Tags 50'S Christmas,6.19,4,15492,United Kingdom +581492,12/9/2019,23357,Hot Water Bottle Sex Bomb,6.19,1,15492,United Kingdom +581492,12/9/2019,23358,Hot Stuff Hot Water Bottle,6.19,1,15492,United Kingdom +581492,12/9/2019,23365,Set 12 Colour Pencils Love London,6.19,1,15492,United Kingdo +581492,12/9/2019,23366,Set 12 Colouring Pencils Doily,6.04,5,15492,United Kingdom +581492,12/9/2019,23367,Set 12 Colour Pencils Spaceboy,6.04,10,15492,United Kingdom +581492,12/9/2019,23368,Set 12 Colour Pencils Dolly Girl,6.19,2,15492,United Kingdom +581492,12/9/2019,23581,Jumbo Bag Paisley Park,6.19,3,15492,United Kingdom +581492,12/9/2019,21928,Jumbo Bag Scandinavian Blue Paisley,6.19,2,15492,United King +581492,12/9/2019,21929,Jumbo Bag Pink Vintage Paisley,6.19,1,15492,United Kingdom +581492,12/9/2019,85099C,Jumbo Bag Baroque Black White,6.19,7,15492,United Kingdom +581492,12/9/2019,23199,Jumbo Bag Apples,6.19,2,15492,United Kingdom +581492,12/9/2019,23200,Jumbo Bag Pears,6.19,1,15492,United Kingdom +581492,12/9/2019,23202,Jumbo Bag Vintage Leaf,6.19,2,15492,United Kingdom +581492,12/9/2019,23343,Jumbo Bag Vintage Christmas,6.19,4,15492,United Kingdom +581492,12/9/2019,23344,Jumbo Bag 50'S Christmas,6.19,5,15492,United Kingdom +581492,12/9/2019,23583,Lunch Bag Paisley Park,6.19,2,15492,United Kingdom +581492,12/9/2019,20727,Lunch Bag Black Skull,6.04,2,15492,United Kingdom +581492,12/9/2019,20728,Lunch Bag Cars Blue,6.04,1,15492,United Kingdom +581492,12/9/2019,20725,Lunch Bag Red Retrospot,6.19,1,15492,United Kingdom +581492,12/9/2019,20726,Lunch Bag Woodland,6.19,1,15492,United Kingdom +581492,12/9/2019,22662,Lunch Bag Dolly Girl Design,6.19,1,15492,United Kingdom +581492,12/9/2019,23206,Lunch Bag Apple Design,6.19,3,15492,United Kingdom +581492,12/9/2019,23208,Lunch Bag Vintage Leaf Design,6.19,3,15492,United Kingdom +581492,12/9/2019,23375,50'S Christmas Paper Gift Bag,6.19,1,15492,United Kingdom +581492,12/9/2019,23437,50'S Christmas Gift Bag Large,6.19,1,15492,United Kingdom +581492,12/9/2019,22821,Gift Bag Psychedelic Apples,7.24,3,15492,United Kingdom +581493,12/9/2019,79190B,Retro Plastic Polka Tray,7.24,15,12423,Belgium +581493,12/9/2019,79190A,Retro Plastic 70'S Tray,7.24,15,12423,Belgium +581493,12/9/2019,22915,Assorted Bottle Top Magnets,7.24,12,12423,Belgium +581493,12/9/2019,22151,Place Setting White Heart,7.24,24,12423,Belgium +581493,12/9/2019,22632,Hand Warmer Red Retrospot,7.24,12,12423,Belgium +581493,12/9/2019,22865,Hand Warmer Owl Design,7.24,12,12423,Belgium +581493,12/9/2019,20718,Red Retrospot Shopper Bag,7.24,10,12423,Belgium +581493,12/9/2019,79190B,Retro Plastic Polka Tray,7.24,12,12423,Belgium +581493,12/9/2019,71459,Hanging Jam Jar T-Light Holders,7.24,12,12423,Belgium +581493,12/9/2019,84945,Multi Colour Silver T-Light Holder,7.24,12,12423,Belgium +581493,12/9/2019,22356,Charlotte Bag Pink Polkadot,7.24,10,12423,Belgium +581493,12/9/2019,20724,Red Retrospot Charlotte Bag,7.24,10,12423,Belgium +581493,12/9/2019,23204,Charlotte Bag Apples Design,7.24,10,12423,Belgium +581493,12/9/2019,21108,Fairy Cake Flannel Assorted Colour,7.24,18,12423,Belgium +581493,12/9/2019,22252,Birdcage Decoration Tealight Holder,7.24,12,12423,Belgium +581493,12/9/2019,22807,Set Of 6 T-Lights Toadstools,6.19,6,12423,Belgium +581494,12/9/2019,23084,Rabbit Night Light,6.19,24,12518,Germany +581494,12/9/2019,21559,Strawberry Lunch Box With Cutlery,6.19,6,12518,Germany +581494,12/9/2019,21506,Fancy Font Birthday Card,6.19,12,12518,Germany +581494,12/9/2019,22716,Card Circus Parade,6.19,12,12518,Germany +581494,12/9/2019,22556,Plasters In Tin Circus Parade,6.19,12,12518,Germany +581494,12/9/2019,22328,Round Snack Boxes Set Of 4 Fruits,6.19,6,12518,Germany +581494,12/9/2019,22730,Alarm Clock Bakelike Ivory,6.19,4,12518,Germany +581494,12/9/2019,22633,Hand Warmer Union Jack,6.19,12,12518,Germany +581494,12/9/2019,22326,Round Snack Boxes Set Of4 Woodland,6.19,6,12518,Germany +581494,12/9/2019,10125,Mini Funky Design Tapes,6.19,20,12518,Germany +581494,12/9/2019,23367,Set 12 Colour Pencils Spaceboy,6.19,24,12518,Germany +581494,12/9/2019,22551,Plasters In Tin Spaceboy,6.04,12,12518,Germany +581494,12/9/2019,22554,Plasters In Tin Woodland Animals,6.04,12,12518,Germany +581494,12/9/2019,22549,Picture Dominoes,6.19,12,12518,Germany +581494,12/9/2019,23388,Woodland Mini Backpack,6.19,4,12518,Germany +581494,12/9/2019,23390,Dolly Girl Mini Backpack,6.19,4,12518,Germany +581494,12/9/2019,23389,Spaceboy Mini Backpack,6.19,4,12518,Germany +581495,12/9/2019,23535,Wall Art Bicycle Safety,6.19,12,14051,United Kingdom +581495,12/9/2019,22699,Roses Regency Teacup And Saucer,6.19,12,14051,United Kingdom +581495,12/9/2019,22698,Pink Regency Teacup And Saucer,6.19,12,14051,United Kingdom +581495,12/9/2019,22697,Green Regency Teacup And Saucer,6.19,12,14051,United Kingdom +581495,12/9/2019,22633,Hand Warmer Union Jack,6.04,18,14051,United Kingdom +581495,12/9/2019,15056N,Edwardian Parasol Natural,6.19,36,14051,United Kingdom +581495,12/9/2019,23439,Hand Warmer Red Love Heart,6.19,36,14051,United Kingdom +581495,12/9/2019,48138,Doormat Union Flag,6.19,10,14051,United Kingdom +581495,12/9/2019,21523,Doormat Fancy Font Home Sweet Home,6.19,10,14051,United King +581495,12/9/2019,21877,Home Sweet Home Mug,6.19,12,14051,United Kingdom +581495,12/9/2019,21871,Save The Planet Mug,6.19,18,14051,United Kingdom +581495,12/9/2019,22798,Antique Glass Dressing Table Pot,6.19,36,14051,United Kingdo +581495,12/9/2019,23173,Regency Teapot Roses,6.19,6,14051,United Kingdom +581495,12/9/2019,22423,Regency Cakestand 3 Tier,6.19,10,14051,United Kingdom +581496,12/9/2019,22664,Toy Tidy Dolly Girl Design,6.19,20,16558,United Kingdom +581496,12/9/2019,22721,Set Of 3 Cake Tins Sketchbook,6.19,12,16558,United Kingdom +581496,12/9/2019,72800E,4 Ivory Dinner Candles Silver Flock,6.19,12,16558,United Ki +581496,12/9/2019,23313,Vintage Christmas Bunting,6.19,10,16558,United Kingdom +581496,12/9/2019,22952,60 Cake Cases Vintage Christmas,6.19,24,16558,United Kingdom +581496,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,6.04,12,16558,United Kin +581496,12/9/2019,23298,Spotty Bunting,6.19,3,16558,United Kingdom +581496,12/9/2019,23598,Paper Bunting Vintage Party,6.19,6,16558,United Kingdom +581496,12/9/2019,16169E,Wrap 50'S Christmas,6.19,25,16558,United Kingdom +581496,12/9/2019,23351,Roll Wrap 50'S Christmas,6.19,12,16558,United Kingdom +581496,12/9/2019,23350,Roll Wrap Vintage Spot,6.19,24,16558,United Kingdom +581496,12/9/2019,22865,Hand Warmer Owl Design,6.19,24,16558,United Kingdom +581496,12/9/2019,22632,Hand Warmer Red Retrospot,6.19,12,16558,United Kingdom +581496,12/9/2019,22835,Hot Water Bottle I Am So Poorly,6.19,4,16558,United Kingdom +581496,12/9/2019,22112,Chocolate Hot Water Bottle,6.19,6,16558,United Kingdom +581496,12/9/2019,23355,Hot Water Bottle Keep Calm,6.19,4,16558,United Kingdom +581496,12/9/2019,22314,Office Mug Warmer Choc+Blue,6.19,24,16558,United Kingdom +581496,12/9/2019,22313,Office Mug Warmer Pink,6.19,12,16558,United Kingdom +581496,12/9/2019,23084,Rabbit Night Light,6.19,18,16558,United Kingdom +581496,12/9/2019,20831,Gold Photo Frame,6.19,12,16558,United Kingdom +581496,12/9/2019,21115,Rose Caravan Doorstop,6.19,8,16558,United Kingdom +581496,12/9/2019,21462,Nursery A B C Painted Letters,7.24,8,16558,United Kingdom +581496,12/9/2019,22076,6 Ribbons Empire,7.24,24,16558,United Kingdom +581496,12/9/2019,22190,Local Cafe Mug,7.24,24,16558,United Kingdom +581496,12/9/2019,22215,Cake Stand White Two Tier Lace,7.24,6,16558,United Kingdom +581496,12/9/2019,22220,Cake Stand Lovebird 2 Tier White,7.24,6,16558,United Kingdom +581496,12/9/2019,22464,Hanging Metal Heart Lantern,7.24,12,16558,United Kingdom +581496,12/9/2019,22465,Hanging Metal Star Lantern,7.24,12,16558,United Kingdom +581496,12/9/2019,22539,Mini Jigsaw Dolly Girl,7.24,48,16558,United Kingdom +581496,12/9/2019,22544,Mini Jigsaw Spaceboy,7.24,48,16558,United Kingdom +581496,12/9/2019,23438,Red Spot Gift Bag Large,6.19,12,16558,United Kingdom +581496,12/9/2019,23437,50'S Christmas Gift Bag Large,6.19,12,16558,United Kingdom +581497,12/9/2019,20719,Woodland Charlotte Bag,6.19,33,17497,United Kingdom +581497,12/9/2019,20723,Strawberry Charlotte Bag,6.19,42,17497,United Kingdom +581497,12/9/2019,20724,Red Retrospot Charlotte Bag,6.19,55,17497,United Kingdom +581497,12/9/2019,21212,Pack Of 72 Retrospot Cake Cases,7.24,7,17497,United Kingdom +581497,12/9/2019,21238,Red Retrospot Cup,7.24,8,17497,United Kingdom +581497,12/9/2019,21242,Red Retrospot Plate,7.24,2,17497,United Kingdom +581497,12/9/2019,21479,White Skull Hot Water Bottle,7.24,25,17497,United Kingdom +581497,12/9/2019,21481,Fawn Blue Hot Water Bottle,7.24,1,17497,United Kingdom +581497,12/9/2019,21481,Fawn Blue Hot Water Bottle,7.24,1,17497,United Kingdom +581497,12/9/2019,21484,Chick Grey Hot Water Bottle,7.24,1,17497,United Kingdom +581497,12/9/2019,21668,Red Stripe Ceramic Drawer Knob,7.24,1,17497,United Kingdom +581497,12/9/2019,21670,Blue Spot Ceramic Drawer Knob,7.24,1,17497,United Kingdom +581497,12/9/2019,21671,Red Spot Ceramic Drawer Knob,7.24,1,17497,United Kingdom +581497,12/9/2019,21672,White Spot Red Ceramic Drawer Knob,7.24,6,17497,United Kingd +581497,12/9/2019,21673,White Spot Blue Ceramic Drawer Knob,7.24,1,17497,United King +581497,12/9/2019,21714,Citronella Candle Garden Pot,7.24,2,17497,United Kingdom +581497,12/9/2019,22110,Bird House Hot Water Bottle,7.24,7,17497,United Kingdom +581497,12/9/2019,22111,Scottie Dog Hot Water Bottle,7.24,5,17497,United Kingdom +581497,12/9/2019,22112,Chocolate Hot Water Bottle,7.24,13,17497,United Kingdom +581497,12/9/2019,22114,Hot Water Bottle Tea And Sympathy,7.24,48,17497,United Kingd +581497,12/9/2019,22197,Popcorn Holder,7.24,68,17497,United Kingdom +581497,12/9/2019,22355,Charlotte Bag Suki Design,7.24,110,17497,United Kingdom +581497,12/9/2019,22356,Charlotte Bag Pink Polkadot,7.24,25,17497,United Kingdom +581497,12/9/2019,22356,Charlotte Bag Pink Polkadot,7.24,1,17497,United Kingdom +581497,12/9/2019,22423,Regency Cakestand 3 Tier,7.24,8,17497,United Kingdom +581497,12/9/2019,22725,Alarm Clock Bakelike Chocolate,7.24,3,17497,United Kingdom +581497,12/9/2019,22726,Alarm Clock Bakelike Green,7.24,1,17497,United Kingdom +581497,12/9/2019,22727,Alarm Clock Bakelike Red,7.24,10,17497,United Kingdom +581497,12/9/2019,22730,Alarm Clock Bakelike Ivory,7.24,5,17497,United Kingdom +581497,12/9/2019,22735,Ribbon Reel Socks And Mittens,7.24,2,17497,United Kingdom +581497,12/9/2019,22736,Ribbon Reel Making Snowmen,7.24,3,17497,United Kingdom +581497,12/9/2019,22738,Ribbon Reel Snowy Village,7.24,1,17497,United Kingdom +581497,12/9/2019,22805,Blue Drawer Knob Acrylic Edwardian,7.24,1,17497,United Kingd +581497,12/9/2019,22835,Hot Water Bottle I Am So Poorly,7.24,4,17497,United Kingdom +581497,12/9/2019,22895,Set Of 2 Tea Towels Apple And Pears,7.24,1,17497,United King +581497,12/9/2019,22896,Peg Bag Apples Design,7.24,2,17497,United Kingdom +581497,12/9/2019,22898,Childrens Apron Apples Design,7.24,2,17497,United Kingdom +581497,12/9/2019,22943,Christmas Lights 10 Vintage Baubles,7.24,1,17497,United King +581497,12/9/2019,23084,Rabbit Night Light,6.19,37,17497,United Kingdom +581497,12/9/2019,23168,Classic Cafe Sugar Dispenser,6.19,1,17497,United Kingdom +581497,12/9/2019,23204,Charlotte Bag Apples Design,6.04,13,17497,United Kingdom +581497,12/9/2019,23205,Charlotte Bag Vintage Alphabet,6.04,8,17497,United Kingdom +581497,12/9/2019,23301,Gardeners Kneeling Pad Keep Calm,6.19,1,17497,United Kingdom +581497,12/9/2019,23355,Hot Water Bottle Keep Calm,6.19,36,17497,United Kingdom +581497,12/9/2019,23356,Love Hot Water Bottle,6.19,1,17497,United Kingdom +581497,12/9/2019,23357,Hot Water Bottle Sex Bomb,6.19,2,17497,United Kingdom +581497,12/9/2019,23358,Hot Stuff Hot Water Bottle,6.19,2,17497,United Kingdom +581497,12/9/2019,35970,Zinc Folkart Sleigh Bells,6.19,2,17497,United Kingdom +581497,12/9/2019,47566,Party Bunting,6.19,5,17497,United Kingdom +581497,12/9/2019,82583,Hot Baths Metal Sign,6.19,4,17497,United Kingdom +581497,12/9/2019,84029G,Knitted Union Flag Hot Water Bottle,6.19,11,17497,United Ki +581497,12/9/2019,84997C,Childrens Cutlery Polkadot Blue,6.19,3,17497,United Kingdom +581497,12/9/2019,85049G,Chocolate Box Ribbons,6.19,2,17497,United Kingdom +581497,12/9/2019,20727,Lunch Bag Black Skull,6.19,8,17497,United Kingdom +581497,12/9/2019,22383,Lunch Bag Suki Design,7.24,2,17497,United Kingdom +581497,12/9/2019,23206,Lunch Bag Apple Design,6.04,3,17497,United Kingdom +581497,12/9/2019,23206,Lunch Bag Apple Design,6.04,1,17497,United Kingdom +581497,12/9/2019,23207,Lunch Bag Alphabet Design,6.19,1,17497,United Kingdom +581497,12/9/2019,23208,Lunch Bag Vintage Leaf Design,6.19,3,17497,United Kingdom +581498,12/9/2019,20669,Red Heart Luggage Tag,6.19,3,14498,United Kingdom +581498,12/9/2019,20679,Edwardian Parasol Red,6.19,5,14498,United Kingdom +581498,12/9/2019,20717,Strawberry Shopper Bag,6.19,1,14498,United Kingdom +581498,12/9/2019,20718,Red Retrospot Shopper Bag,6.19,1,14498,United Kingdom +581498,12/9/2019,20750,Red Retrospot Mini Cases,6.19,1,14498,United Kingdom +581498,12/9/2019,20961,Strawberry Bath Sponge,6.19,1,14498,United Kingdom +581498,12/9/2019,20963,Apple Bath Sponge,6.19,1,14498,United Kingdom +581498,12/9/2019,21115,Rose Caravan Doorstop,6.19,1,14498,United Kingdom +581498,12/9/2019,21125,Set 6 Football Celebration Candles,6.19,3,14498,United Kingd +581498,12/9/2019,21137,Black Record Cover Frame,6.19,4,14498,United Kingdom +581498,12/9/2019,21155,Red Retrospot Peg Bag,6.19,4,14498,United Kingdom +581498,12/9/2019,21166,Cook With Wine Metal Sign,6.19,3,14498,United Kingdom +581498,12/9/2019,21169,You're Confusing Me Metal Sign,6.19,2,14498,United Kingdom +581498,12/9/2019,21174,Pottering In The Shed Metal Sign,6.19,2,14498,United Kingdom +581498,12/9/2019,21181,Please One Person Metal Sign,6.19,6,14498,United Kingdom +581498,12/9/2019,21216,Set 3 Retrospot Tea/Coffee/Sugar,6.19,2,14498,United Kingdom +581498,12/9/2019,21217,Red Retrospot Round Cake Tins,6.19,3,14498,United Kingdom +581498,12/9/2019,21218,Red Spotty Biscuit Tin,6.19,4,14498,United Kingdom +581498,12/9/2019,21232,Strawberry Ceramic Trinket Pot,6.19,13,14498,United Kingdom +581498,12/9/2019,21239,Pink Polkadot Cup,6.19,1,14498,United Kingdom +581498,12/9/2019,21257,Victorian Sewing Box Medium,6.19,3,14498,United Kingdom +581498,12/9/2019,21327,Skulls Writing Set,6.19,1,14498,United Kingdom +581498,12/9/2019,21328,Balloons Writing Set,6.19,1,14498,United Kingdom +581498,12/9/2019,21329,Dinosaurs Writing Set,6.19,1,14498,United Kingdom +581498,12/9/2019,21411,Gingham Heart Doorstop Red,6.19,1,14498,United Kingdom +581498,12/9/2019,21430,Set/3 Red Gingham Rose Storage Box,6.19,3,14498,United Kingd +581498,12/9/2019,21494,Rotating Leaves T-Light Holder,6.19,7,14498,United Kingdom +581498,12/9/2019,21523,Doormat Fancy Font Home Sweet Home,6.19,1,14498,United Kingd +581498,12/9/2019,21557,Set Of 6 Funky Beakers,6.19,1,14498,United Kingdom +581498,12/9/2019,21558,Skull Lunch Box With Cutlery,6.19,1,14498,United Kingdom +581498,12/9/2019,21731,Red Toadstool Led Night Light,6.19,9,14498,United Kingdom +581498,12/9/2019,21754,Home Building Block Word,6.19,2,14498,United Kingdom +581498,12/9/2019,21790,Vintage Snap Cards,6.19,1,14498,United Kingdom +581498,12/9/2019,21843,Red Retrospot Cake Stand,6.19,5,14498,United Kingdom +581498,12/9/2019,21864,Union Jack Flag Passport Cover,6.19,2,14498,United Kingdom +581498,12/9/2019,21874,Gin And Tonic Mug,6.19,2,14498,United Kingdom +581498,12/9/2019,21876,Pottering Mug,6.19,4,14498,United Kingdom +581498,12/9/2019,21890,S/6 Wooden Skittles In Cotton Bag,6.19,1,14498,United Kingdo +581498,12/9/2019,21912,Vintage Snakes & Ladders,6.19,1,14498,United Kingdom +581498,12/9/2019,21916,Set 12 Retro White Chalk Sticks,6.19,7,14498,United Kingdom +581498,12/9/2019,21930,Jumbo Storage Bag Skulls,6.19,2,14498,United Kingdom +581498,12/9/2019,21931,Jumbo Storage Bag Suki,6.19,6,14498,United Kingdom +581498,12/9/2019,21934,Skull Shoulder Bag,6.19,1,14498,United Kingdom +581498,12/9/2019,21935,Suki Shoulder Bag,6.19,7,14498,United Kingdom +581498,12/9/2019,21942,Skulls Design Flannel,6.19,1,14498,United Kingdom +581498,12/9/2019,21955,Doormat Union Jack Guns And Roses,6.19,1,14498,United Kingdo +581498,12/9/2019,21977,Pack Of 60 Pink Paisley Cake Cases,6.19,1,14498,United Kingd +581498,12/9/2019,21983,Pack Of 12 Blue Paisley Tissues,6.19,1,14498,United Kingdom +581498,12/9/2019,21987,Pack Of 6 Skull Paper Cups,6.19,2,14498,United Kingdom +581498,12/9/2019,21989,Pack Of 20 Skull Paper Napkins,6.19,1,14498,United Kingdom +581498,12/9/2019,22041,"Record Frame 7"" Single Size",6.19,2,14498,United Kingdom +581498,12/9/2019,22059,Ceramic Strawberry Design Mug,6.19,1,14498,United Kingdom +581498,12/9/2019,22069,Brown Pirate Treasure Chest,6.19,3,14498,United Kingdom +581498,12/9/2019,22077,6 Ribbons Rustic Charm,6.19,2,14498,United Kingdom +581498,12/9/2019,22083,Paper Chain Kit Retrospot,6.19,2,14498,United Kingdom +581498,12/9/2019,22086,Paper Chain Kit 50'S Christmas,6.19,52,14498,United Kingdom +581498,12/9/2019,22099,Caravan Square Tissue Box,6.19,2,14498,United Kingdom +581498,12/9/2019,22114,Hot Water Bottle Tea And Sympathy,6.19,4,14498,United Kingdo +581498,12/9/2019,22139,Retrospot Tea Set Ceramic 11 Pc,6.19,2,14498,United Kingdom +581498,12/9/2019,22141,Christmas Craft Tree Top Angel,6.19,7,14498,United Kingdom +581498,12/9/2019,22142,Christmas Craft White Fairy,6.19,2,14498,United Kingdom +581498,12/9/2019,22144,Christmas Craft Little Friends,6.19,8,14498,United Kingdom +581498,12/9/2019,22161,Heart Decoration Rustic Hanging,6.19,2,14498,United Kingdom +581498,12/9/2019,22173,Metal 4 Hook Hanger French Chateau,6.19,3,14498,United Kingd +581498,12/9/2019,22174,Photo Cube,6.19,3,14498,United Kingdom +581498,12/9/2019,22175,Pink Owl Soft Toy,6.19,1,14498,United Kingdom +581498,12/9/2019,22178,Victorian Glass Hanging T-Light,6.19,1,14498,United Kingdom +581498,12/9/2019,22179,Set 10 Night Owl Lights,6.19,1,14498,United Kingdom +581498,12/9/2019,22186,Red Star Card Holder,6.19,1,14498,United Kingdom +581498,12/9/2019,22187,Green Christmas Tree Card Holder,6.19,6,14498,United Kingdom +581498,12/9/2019,22193,Red Diner Wall Clock,6.19,1,14498,United Kingdom +581498,12/9/2019,22195,Large Heart Measuring Spoons,6.19,3,14498,United Kingdom +581498,12/9/2019,22196,Small Heart Measuring Spoons,6.19,2,14498,United Kingdom +581498,12/9/2019,22207,Frying Pan Union Flag,6.19,1,14498,United Kingdom +581498,12/9/2019,22278,Overnight Bag Vintage Rose Paisley,6.19,2,14498,United Kingd +581498,12/9/2019,22301,Coffee Mug Cat + Bird Design,6.19,2,14498,United Kingdom +581498,12/9/2019,22302,Coffee Mug Pears Design,6.19,4,14498,United Kingdom +581498,12/9/2019,22303,Coffee Mug Apples Design,6.19,4,14498,United Kingdom +581498,12/9/2019,22304,Coffee Mug Blue Paisley Design,6.19,1,14498,United Kingdom +581498,12/9/2019,22308,Tea Cosy Blue Stripe,6.19,2,14498,United Kingdom +581498,12/9/2019,22327,Round Snack Boxes Set Of 4 Skulls,6.19,4,14498,United Kingdo +581498,12/9/2019,22328,Round Snack Boxes Set Of 4 Fruits,6.19,4,14498,United Kingdo +581498,12/9/2019,22352,Lunch Box With Cutlery Retrospot,6.19,6,14498,United Kingdom +581498,12/9/2019,22357,Kings Choice Biscuit Tin,6.19,1,14498,United Kingdom +581498,12/9/2019,22358,Kings Choice Tea Caddy,6.19,1,14498,United Kingdom +581498,12/9/2019,22367,Childrens Apron Spaceboy Design,6.19,7,14498,United Kingdom +581498,12/9/2019,22371,Airline Bag Vintage Tokyo 78,6.19,1,14498,United Kingdom +581498,12/9/2019,22374,Airline Bag Vintage Jet Set Red,6.19,1,14498,United Kingdom +581498,12/9/2019,22378,Wall Tidy Retrospot,7.24,2,14498,United Kingdom +581498,12/9/2019,22379,Recycling Bag Retrospot,7.24,4,14498,United Kingdom +581498,12/9/2019,22381,Toy Tidy Pink Polkadot,7.24,1,14498,United Kingdom +581498,12/9/2019,22411,Jumbo Shopper Vintage Red Paisley,7.24,2,14498,United Kingdo +581498,12/9/2019,22422,Toothpaste Tube Pen,7.24,1,14498,United Kingdom +581498,12/9/2019,22424,Enamel Bread Bin Cream,7.24,1,14498,United Kingdom +581498,12/9/2019,22429,Enamel Measuring Jug Cream,7.24,1,14498,United Kingdom +581498,12/9/2019,22456,Natural Slate Chalkboard Large,7.24,4,14498,United Kingdom +581498,12/9/2019,22457,Natural Slate Heart Chalkboard,7.24,2,14498,United Kingdom +581498,12/9/2019,22471,Tv Dinner Tray Air Hostess,7.24,1,14498,United Kingdom +581498,12/9/2019,22474,Spaceboy Tv Dinner Tray,7.24,1,14498,United Kingdom +581498,12/9/2019,22488,Natural Slate Rectangle Chalkboard,7.24,2,14498,United Kingd +581498,12/9/2019,22498,Wooden Regatta Bunting,7.24,1,14498,United Kingdom +581498,12/9/2019,22507,Memo Board Retrospot Design,7.24,1,14498,United Kingdom +581498,12/9/2019,22526,Wheelbarrow For Children,7.24,1,14498,United Kingdom +581498,12/9/2019,22553,Plasters In Tin Skulls,7.24,1,14498,United Kingdom +581498,12/9/2019,22557,Plasters In Tin Vintage Paisley,7.24,1,14498,United Kingdom +581498,12/9/2019,22619,Set Of 6 Soldier Skittles,7.24,1,14498,United Kingdom +581498,12/9/2019,22622,Box Of Vintage Alphabet Blocks,7.24,1,14498,United Kingdom +581498,12/9/2019,22624,Ivory Kitchen Scales,7.24,1,14498,United Kingdom +581498,12/9/2019,22629,Spaceboy Lunch Box,7.24,2,14498,United Kingdom +581498,12/9/2019,22632,Hand Warmer Red Retrospot,7.24,1,14498,United Kingdom +581498,12/9/2019,22645,Ceramic Heart Fairy Cake Money Bank,7.24,4,14498,United King +581498,12/9/2019,22654,Deluxe Sewing Kit,6.19,2,14498,United Kingdom +581498,12/9/2019,22659,Lunch Box I Love London,6.19,1,14498,United Kingdom +581498,12/9/2019,22666,Recipe Box Pantry Yellow Design,6.19,11,14498,United Kingdom +581498,12/9/2019,22676,French Blue Metal Door Sign 1,6.04,1,14498,United Kingdom +581498,12/9/2019,22684,French Blue Metal Door Sign 9,6.04,1,14498,United Kingdom +581498,12/9/2019,22694,Wicker Star,6.04,1,14498,United Kingdom +581498,12/9/2019,22697,Green Regency Teacup And Saucer,6.04,6,14498,United Kingdom +581498,12/9/2019,22698,Pink Regency Teacup And Saucer,6.04,9,14498,United Kingdom +581498,12/9/2019,22699,Roses Regency Teacup And Saucer,6.19,6,14498,United Kingdom +581498,12/9/2019,22722,Set Of 6 Spice Tins Pantry Design,6.19,3,14498,United Kingdo +581498,12/9/2019,22733,3d Traditional Christmas Stickers,6.19,1,14498,United Kingdo +581498,12/9/2019,22734,Set Of 6 Ribbons Vintage Christmas,6.19,5,14498,United Kingd +581498,12/9/2019,22776,Sweetheart 3 Tier Cake Stand,6.19,1,14498,United Kingdom +581498,12/9/2019,22795,Sweetheart Recipe Book Stand,6.19,1,14498,United Kingdom +581498,12/9/2019,22807,Set Of 6 T-Lights Toadstools,6.19,2,14498,United Kingdom +581498,12/9/2019,22813,Pack 3 Boxes Bird Panettone,6.19,4,14498,United Kingdom +581498,12/9/2019,22838,3 Tier Cake Tin Red And Cream,6.19,1,14498,United Kingdom +581498,12/9/2019,22844,Vintage Cream Dog Food Container,6.19,2,14498,United Kingdom +581498,12/9/2019,22845,Vintage Cream Cat Food Container,6.19,1,14498,United Kingdom +581498,12/9/2019,22865,Hand Warmer Owl Design,6.19,1,14498,United Kingdom +581498,12/9/2019,22866,Hand Warmer Scotty Dog Design,6.19,2,14498,United Kingdom +581498,12/9/2019,22891,Tea For One Polkadot,6.19,1,14498,United Kingdom +581498,12/9/2019,22900,Set 2 Tea Towels I Love London,6.19,2,14498,United Kingdom +581498,12/9/2019,22910,Paper Chain Kit Vintage Christmas,6.19,5,14498,United Kingdo +581498,12/9/2019,22952,60 Cake Cases Vintage Christmas,6.19,7,14498,United Kingdom +581498,12/9/2019,22960,Jam Making Set With Jars,6.19,5,14498,United Kingdom +581498,12/9/2019,22961,Jam Making Set Printed,6.19,4,14498,United Kingdom +581498,12/9/2019,22966,Gingerbread Man Cookie Cutter,6.19,2,14498,United Kingdom +581498,12/9/2019,22993,Set Of 4 Pantry Jelly Moulds,6.19,2,14498,United Kingdom +581498,12/9/2019,23012,Glass Apothecary Bottle Perfume,6.19,1,14498,United Kingdom +581498,12/9/2019,23013,Glass Apothecary Bottle Tonic,6.19,1,14498,United Kingdom +581498,12/9/2019,23014,Glass Apothecary Bottle Elixir,7.24,2,14498,United Kingdom +581498,12/9/2019,23080,Red Metal Box Top Secret,7.24,5,14498,United Kingdom +581498,12/9/2019,23170,Regency Tea Plate Roses,7.24,4,14498,United Kingdom +581498,12/9/2019,23171,Regency Tea Plate Green,7.24,5,14498,United Kingdom +581498,12/9/2019,23172,Regency Tea Plate Pink,6.19,4,14498,United Kingdom +581498,12/9/2019,23181,Bull Dog Bottle Top Wall Clock,6.19,1,14498,United Kingdom +581498,12/9/2019,23196,Vintage Leaf Magnetic Notepad,6.19,1,14498,United Kingdom +581498,12/9/2019,23198,Pantry Magnetic Shopping List,6.19,2,14498,United Kingdom +581498,12/9/2019,23245,Set Of 3 Regency Cake Tins,6.19,5,14498,United Kingdom +581498,12/9/2019,23295,Set Of 12 Mini Loaf Baking Cases,6.19,1,14498,United Kingdom +581498,12/9/2019,23298,Spotty Bunting,6.19,1,14498,United Kingdom +581498,12/9/2019,23300,Gardeners Kneeling Pad Cup Of Tea,6.19,9,14498,United Kingdo +581498,12/9/2019,23301,Gardeners Kneeling Pad Keep Calm,6.19,32,14498,United Kingdo +581498,12/9/2019,23311,Vintage Christmas Stocking,6.19,6,14498,United Kingdom +581498,12/9/2019,23312,Vintage Christmas Gift Sack,6.19,3,14498,United Kingdom +581498,12/9/2019,23328,Set 6 School Milk Bottles In Crate,6.19,6,14498,United Kingd +581498,12/9/2019,23349,Roll Wrap Vintage Christmas,6.19,8,14498,United Kingdom +581498,12/9/2019,23351,Roll Wrap 50'S Christmas,6.19,22,14498,United Kingdom +581498,12/9/2019,23352,Roll Wrap 50'S Red Christmas,6.19,8,14498,United Kingdom +581498,12/9/2019,23353,6 Gift Tags Vintage Christmas,6.19,10,14498,United Kingdom +581498,12/9/2019,23354,6 Gift Tags 50'S Christmas,6.19,9,14498,United Kingdom +581498,12/9/2019,23368,Set 12 Colour Pencils Dolly Girl,6.19,3,14498,United Kingdom +581498,12/9/2019,23369,Set 36 Colour Pencils Love London,6.19,1,14498,United Kingdo +581498,12/9/2019,23370,Set 36 Colouring Pencils Doily,6.19,3,14498,United Kingdom +581498,12/9/2019,23382,Box Of 6 Christmas Cake Decorations,6.19,10,14498,United Kin +581498,12/9/2019,23388,Woodland Mini Backpack,6.19,1,14498,United Kingdom +581498,12/9/2019,23480,Mini Lights Woodland Mushrooms,7.24,1,14498,United Kingdom +581498,12/9/2019,23493,Vintage Doily Travel Sewing Kit,7.24,1,14498,United Kingdom +581498,12/9/2019,23494,Vintage Doily Deluxe Sewing Kit,7.24,1,14498,United Kingdom +581498,12/9/2019,23497,Classic Chrome Bicycle Bell,7.24,1,14498,United Kingdom +581498,12/9/2019,23501,Key Ring Baseball Boot Union Jack,7.24,1,14498,United Kingdo +581498,12/9/2019,23564,Egg Cup Milkmaid Ingrid,7.24,1,14498,United Kingdom +581498,12/9/2019,35970,Zinc Folkart Sleigh Bells,7.24,6,14498,United Kingdom +581498,12/9/2019,48138,Doormat Union Flag,7.24,1,14498,United Kingdom +581498,12/9/2019,71053,White Moroccan Metal Lantern,7.24,1,14498,United Kingdom +581498,12/9/2019,72349B,Set/6 Purple Butterfly T-Lights,7.24,2,14498,United Kingdom +581498,12/9/2019,79321,Chilli Lights,7.24,10,14498,United Kingdom +581498,12/9/2019,82001S,Silver Record Cover Frame,6.19,2,14498,United Kingdom +581498,12/9/2019,82482,Wooden Picture Frame White Finish,6.04,4,14498,United Kingdo +581498,12/9/2019,82552,Washroom Metal Sign,6.04,1,14498,United Kingdom +581498,12/9/2019,21171,Bathroom Metal Sign,6.19,1,14498,United Kingdom +581498,12/9/2019,82581,Toilet Metal Sign,6.19,1,14498,United Kingdom +581498,12/9/2019,82600,N0 Singing Metal Sign,6.19,4,14498,United Kingdom +581498,12/9/2019,84029E,Red Woolly Hottie White Heart,6.19,4,14498,United Kingdom +581498,12/9/2019,84032A,Charlie+Lola Pink Hot Water Bottle,6.19,4,14498,United King +581498,12/9/2019,84032B,Charlie + Lola Red Hot Water Bottle,6.19,3,14498,United Kin +581498,12/9/2019,84375,Set Of 20 Kids Cookie Cutters,6.19,3,14498,United Kingdom +581498,12/9/2019,84509A,Set Of 4 English Rose Placemats,6.19,1,14498,United Kingdom +581498,12/9/2019,84558A,3d Dog Picture Playing Cards,6.19,1,14498,United Kingdom +581498,12/9/2019,84832,Zinc Willie Winkie Candle Stick,6.19,26,14498,United Kingdom +581498,12/9/2019,84968E,Set Of 16 Vintage Black Cutlery,6.19,1,14498,United Kingdom +581498,12/9/2019,84970S,Hanging Heart Zinc T-Light Holder,6.19,1,14498,United Kingd +581498,12/9/2019,84997A,Childrens Cutlery Polkadot Green,6.19,2,14498,United Kingdo +581498,12/9/2019,84997B,Childrens Cutlery Retrospot Red,6.19,3,14498,United Kingdom +581498,12/9/2019,84997D,Childrens Cutlery Polkadot Pink,6.19,1,14498,United Kingdom +581498,12/9/2019,85038,6 Chocolate Love Heart T-Lights,6.19,1,14498,United Kingdom +581498,12/9/2019,85048,15cm Christmas Glass Ball 20 Lights,6.19,1,14498,United King +581498,12/9/2019,85049A,Traditional Christmas Ribbons,6.17,5,14498,United Kingdom +581498,12/9/2019,85049E,Scandinavian Reds Ribbons,6.19,4,14498,United Kingdom +581498,12/9/2019,85150,Ladies & Gentlemen Metal Sign,6.19,1,14498,United Kingdom +581498,12/9/2019,85174,S/4 Cacti Candles,6.19,1,14498,United Kingdom +581498,12/9/2019,20712,Jumbo Bag Woodland Animals,6.19,3,14498,United Kingdom +581498,12/9/2019,20713,Jumbo Bag Owls,6.19,8,14498,United Kingdom +581498,12/9/2019,21928,Jumbo Bag Scandinavian Blue Paisley,6.19,2,14498,United King +581498,12/9/2019,22386,Jumbo Bag Pink Polkadot,7.24,1,14498,United Kingdom +581498,12/9/2019,22663,Jumbo Bag Dolly Girl Design,6.19,2,14498,United Kingdom +581498,12/9/2019,23199,Jumbo Bag Apples,6.19,6,14498,United Kingdom +581498,12/9/2019,23201,Jumbo Bag Alphabet,6.19,6,14498,United Kingdom +581498,12/9/2019,85099B,Jumbo Bag Red Retrospot,6.19,5,14498,United Kingdom +581498,12/9/2019,85099C,Jumbo Bag Baroque Black White,6.19,4,14498,United Kingdom +581498,12/9/2019,20726,Lunch Bag Woodland,6.19,3,14498,United Kingdom +581498,12/9/2019,20728,Lunch Bag Cars Blue,6.19,4,14498,United Kingdom +581498,12/9/2019,22384,Lunch Bag Pink Polkadot,7.24,1,14498,United Kingdom +581498,12/9/2019,23437,50'S Christmas Gift Bag Large,7.24,1,14498,United Kingdom +581500,12/9/2019,82486,3 Drawer Antique White Wood Cabinet,7.24,4,15344,United King +581500,12/9/2019,85066,Cream Sweetheart Mini Chest,7.24,4,15344,United Kingdom +581500,12/9/2019,48187,Doormat New England,7.24,2,15344,United Kingdom +581501,12/9/2019,22319,Hairclips Forties Fabric Assorted,7.24,180,12985,United King +581501,12/9/2019,20704,Mr Robot Soft Toy,7.24,8,12985,United Kingdom +581501,12/9/2019,21564,Pink Heart Shape Love Bucket,6.19,24,12985,United Kingdom +581501,12/9/2019,21563,Red Heart Shape Love Bucket,7.24,24,12985,United Kingdom +581501,12/9/2019,22165,Diamante Heart Shaped Wall Mirror,7.24,12,12985,United Kingd +581501,12/9/2019,22299,Pig Keyring With Light & Sound,7.24,48,12985,United Kingdom +581501,12/9/2019,22447,Pin Cushion Babushka Blue,7.24,12,12985,United Kingdom +581501,12/9/2019,22442,Grow Your Own Flowers Set Of 3,7.24,12,12985,United Kingdom +581501,12/9/2019,22495,Set Of 2 Round Tins Camembert,7.24,12,12985,United Kingdom +581501,12/9/2019,22544,Mini Jigsaw Spaceboy,7.24,96,12985,United Kingdom +581501,12/9/2019,22695,Wicker Wreath Small,7.24,24,12985,United Kingdom +581501,12/9/2019,22785,Squarecushion Cover Pink Union Jack,7.24,12,12985,United Kin +581501,12/9/2019,22811,Set Of 6 T-Lights Cacti,7.24,12,12985,United Kingdom +581501,12/9/2019,22807,Set Of 6 T-Lights Toadstools,7.24,12,12985,United Kingdom +581501,12/9/2019,22942,Christmas Lights 10 Santas,7.24,12,12985,United Kingdom +581501,12/9/2019,22808,Set Of 6 T-Lights Easter Chicks,6.19,12,12985,United Kingdom +581501,12/9/2019,23143,Zinc Wire Kitchen Organiser,7.24,4,12985,United Kingdom +581501,12/9/2019,23151,Zinc Sweetheart Soap Dish,7.24,12,12985,United Kingdom +581501,12/9/2019,23425,Storage Tin Home Sweet Home,7.24,12,12985,United Kingdom +581501,12/9/2019,84356,Pompom Curtain,7.24,12,12985,United Kingdom +581501,12/9/2019,85173,Set/6 Frog Prince T-Light Candles,7.24,12,12985,United Kingd +581501,12/9/2019,21731,Red Toadstool Led Night Light,7.24,24,12985,United Kingdom +581501,12/9/2019,23480,Mini Lights Woodland Mushrooms,7.24,8,12985,United Kingdom +581501,12/9/2019,22545,Mini Jigsaw Bunnies,7.24,96,12985,United Kingdom +581502,12/9/2019,22087,Paper Bunting White Lace,7.24,6,15910,United Kingdom +581502,12/9/2019,21209,Multicolour Honeycomb Fan,7.24,5,15910,United Kingdom +581502,12/9/2019,20668,Disco Ball Christmas Decoration,7.24,24,15910,United Kingdom +581502,12/9/2019,21790,Vintage Snap Cards,7.24,6,15910,United Kingdom +581502,12/9/2019,23270,Set Of 2 Ceramic Painted Hearts,7.24,4,15910,United Kingdom +581502,12/9/2019,23103,Jingle Bell Heart Decoration,7.24,8,15910,United Kingdom +581502,12/9/2019,22576,Swallow Wooden Christmas Decoration,7.24,2,15910,United King +581502,12/9/2019,22153,Angel Decoration Stars On Dress,7.24,13,15910,United Kingdom +581502,12/9/2019,21810,Christmas Hanging Star With Bell,7.24,6,15910,United Kingdom +581502,12/9/2019,22155,Star Decoration Rustic,7.24,6,15910,United Kingdom +581502,12/9/2019,23210,White Rocking Horse Hand Painted,7.24,12,15910,United Kingdo +581502,12/9/2019,22573,Star Wooden Christmas Decoration,7.24,8,15910,United Kingdom +581502,12/9/2019,22075,6 Ribbons Elegant Christmas,7.24,4,15910,United Kingdom +581502,12/9/2019,85049A,Traditional Christmas Ribbons,7.24,4,15910,United Kingdom +581502,12/9/2019,22734,Set Of 6 Ribbons Vintage Christmas,7.24,4,15910,United Kingd +581502,12/9/2019,23274,Star T-Light Holder Willie Winkie,7.24,8,15910,United Kingdo +581502,12/9/2019,22153,Angel Decoration Stars On Dress,7.24,1,15910,United Kingdom +581502,12/9/2019,22596,Christmas Star Wish List Chalkboard,7.24,24,15910,United Kin +581502,12/9/2019,22952,60 Cake Cases Vintage Christmas,7.24,10,15910,United Kingdom +581502,12/9/2019,22141,Christmas Craft Tree Top Angel,7.24,3,15910,United Kingdom +581514,12/9/2019,22753,Small Yellow Babushka Notebook,7.24,12,17754,United Kingdom +581514,12/9/2019,22755,Small Purple Babushka Notebook,7.24,12,17754,United Kingdom +581514,12/9/2019,22754,Small Red Babushka Notebook,6.19,12,17754,United Kingdom +581514,12/9/2019,22721,Set Of 3 Cake Tins Sketchbook,6.19,4,17754,United Kingdom +581514,12/9/2019,22059,Ceramic Strawberry Design Mug,6.19,12,17754,United Kingdom +581514,12/9/2019,22199,Frying Pan Red Retrospot,6.19,13,17754,United Kingdom +581514,12/9/2019,22200,Frying Pan Pink Polkadot,6.19,2,17754,United Kingdom +581514,12/9/2019,84032A,Charlie+Lola Pink Hot Water Bottle,6.19,9,17754,United King +581514,12/9/2019,84032B,Charlie + Lola Red Hot Water Bottle,6.19,9,17754,United Kin +581514,12/9/2019,84031A,Charlie+Lola Red Hot Water Bottle,6.19,10,17754,United King +581514,12/9/2019,84031B,Charlie Lola Blue Hot Water Bottle,6.19,14,17754,United Kin +581514,12/9/2019,22646,Ceramic Strawberry Cake Money Bank,6.19,4,17754,United Kingd +581514,12/9/2019,22644,Ceramic Cherry Cake Money Bank,6.19,4,17754,United Kingdom +581514,12/9/2019,22645,Ceramic Heart Fairy Cake Money Bank,6.19,4,17754,United King +581514,12/9/2019,22394,Paperweight Kings Choice,6.04,12,17754,United Kingdom +581514,12/9/2019,17091J,Vanilla Incense In Tin,6.04,66,17754,United Kingdom +581514,12/9/2019,35471D,Set Of 3 Bird Light Pink Feather,6.04,12,17754,United Kingd +581514,12/9/2019,22075,6 Ribbons Elegant Christmas,6.04,24,17754,United Kingdom +581514,12/9/2019,17091J,Vanilla Incense In Tin,6.19,24,17754,United Kingdom +581514,12/9/2019,22069,Brown Pirate Treasure Chest,6.19,20,17754,United Kingdom +581514,12/9/2019,22068,Black Pirate Treasure Chest,6.19,14,17754,United Kingdom +581514,12/9/2019,22500,Set Of 2 Tins Jardin De Provence,6.19,4,17754,United Kingdom +581514,12/9/2019,22075,6 Ribbons Elegant Christmas,6.19,24,17754,United Kingdom +581514,12/9/2019,21705,Bag 500g Swirly Marbles,6.19,84,17754,United Kingdom +581516,12/9/2019,21109,Large Cake Towel Chocolate Spots,6.19,12,14422,United Kingdo +581516,12/9/2019,21111,Swiss Roll Towel Chocolate Spots,6.19,24,14422,United Kingdo +581516,12/9/2019,21705,Bag 500g Swirly Marbles,6.19,24,14422,United Kingdom +581516,12/9/2019,22185,Slate Tile Natural Hanging,6.19,12,14422,United Kingdom +581516,12/9/2019,22442,Grow Your Own Flowers Set Of 3,6.19,12,14422,United Kingdom +581516,12/9/2019,21620,Set Of 4 Rose Botanical Candles,6.19,12,14422,United Kingdom +581516,12/9/2019,84029G,Knitted Union Flag Hot Water Bottle,6.19,8,14422,United Kin +581516,12/9/2019,21485,Retrospot Heart Hot Water Bottle,6.19,3,14422,United Kingdom +581516,12/9/2019,22111,Scottie Dog Hot Water Bottle,6.19,6,14422,United Kingdom +581516,12/9/2019,23355,Hot Water Bottle Keep Calm,6.19,8,14422,United Kingdom +581516,12/9/2019,22112,Chocolate Hot Water Bottle,6.19,6,14422,United Kingdom +581516,12/9/2019,23356,Love Hot Water Bottle,6.19,6,14422,United Kingdom +581516,12/9/2019,21108,Fairy Cake Flannel Assorted Colour,6.19,18,14422,United King +581516,12/9/2019,22171,3 Hook Photo Shelf Antique White,6.19,4,14422,United Kingdom +581516,12/9/2019,23301,Gardeners Kneeling Pad Keep Calm,6.19,24,14422,United Kingdo +581538,12/9/2019,23193,Buffalo Bill Treasure Book Box,6.19,6,14446,United Kingdom +581538,12/9/2019,23194,Gymkhana Treasure Book Box,6.19,1,14446,United Kingdom +581538,12/9/2019,23084,Rabbit Night Light,6.19,2,14446,United Kingdom +581538,12/9/2019,22068,Black Pirate Treasure Chest,6.19,1,14446,United Kingdom +581538,12/9/2019,22956,36 Foil Heart Cake Cases,6.19,1,14446,United Kingdom +581538,12/9/2019,20936,Forked Cactus Candle,6.19,1,14446,United Kingdom +581538,12/9/2019,23040,Paper Lantern 9 Point Snow Star,6.19,1,14446,United Kingdom +581538,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,6.19,1,14446,United King +581538,12/9/2019,21222,Set/4 Badges Beetles,6.19,1,14446,United Kingdom +581538,12/9/2019,21220,Set/4 Badges Dogs,6.19,1,14446,United Kingdom +581538,12/9/2019,21224,Set/4 Skull Badges,6.19,1,14446,United Kingdom +581538,12/9/2019,85123A,Cream Hanging Heart T-Light Holder,6.19,1,14446,United King +581538,12/9/2019,22992,Revolver Wooden Ruler,6.19,1,14446,United Kingdom +581538,12/9/2019,79066K,Retro Mod Tray,6.19,1,14446,United Kingdom +581538,12/9/2019,84380,Set Of 3 Butterfly Cookie Cutters,6.19,1,14446,United Kingdo +581538,12/9/2019,23371,Set 36 Colour Pencils Spaceboy,6.19,1,14446,United Kingdom +581538,12/9/2019,22694,Wicker Star,6.19,1,14446,United Kingdom +581538,12/9/2019,22095,Lads Only Tissue Box,6.19,1,14446,United Kingdom +581538,12/9/2019,23275,Set Of 3 Hanging Owls Ollie Beak,6.19,1,14446,United Kingdom +581538,12/9/2019,21673,White Spot Blue Ceramic Drawer Knob,6.19,1,14446,United King +581538,12/9/2019,21670,Blue Spot Ceramic Drawer Knob,6.19,1,14446,United Kingdom +581538,12/9/2019,85071C,"Charlie+Lola""Extremely Busy"" Sign",6.19,1,14446,United K +581538,12/9/2019,23349,Roll Wrap Vintage Christmas,6.19,3,14446,United Kingdom +581538,12/9/2019,23034,Drawer Knob Ceramic Black,6.19,1,14446,United Kingdom +581538,12/9/2019,21669,Blue Stripe Ceramic Drawer Knob,6.19,1,14446,United Kingdom +581538,12/9/2019,23033,Drawer Knob Ceramic Red,6.19,1,14446,United Kingdom +581538,12/9/2019,21668,Red Stripe Ceramic Drawer Knob,6.19,1,14446,United Kingdom +581538,12/9/2019,23275,Set Of 3 Hanging Owls Ollie Beak,6.19,1,14446,United Kingdom +581538,12/9/2019,23318,Box Of 6 Mini Vintage Crackers,6.19,1,14446,United Kingdom +581538,12/9/2019,23382,Box Of 6 Christmas Cake Decorations,6.19,1,14446,United King +581538,12/9/2019,22469,Heart Of Wicker Small,6.19,1,14446,United Kingdom +581538,12/9/2019,22899,Children's Apron Dolly Girl,6.19,2,14446,United Kingdom +581538,12/9/2019,22367,Childrens Apron Spaceboy Design,6.19,1,14446,United Kingdom +581538,12/9/2019,22899,Children's Apron Dolly Girl,6.19,3,14446,United Kingdom +581538,12/9/2019,23527,Wall Art Animals And Nature,6.19,1,14446,United Kingdom +581538,12/9/2019,23524,Wall Art Horse & Pony,6.19,1,14446,United Kingdom +581538,12/9/2019,23525,Wall Art Buffalo Bill,6.19,1,14446,United Kingdom +581538,12/9/2019,84380,Set Of 3 Butterfly Cookie Cutters,6.19,4,14446,United Kingdo +581538,12/9/2019,23122,Party Charms 50 Pieces,7.24,1,14446,United Kingdom +581538,12/9/2019,21990,Modern Floral Stationery Set,7.24,1,14446,United Kingdom +581538,12/9/2019,21329,Dinosaurs Writing Set,7.24,1,14446,United Kingdom +581538,12/9/2019,21328,Balloons Writing Set,7.24,1,14446,United Kingdom +581538,12/9/2019,22561,Wooden School Colouring Set,7.24,1,14446,United Kingdom +581538,12/9/2019,84519A,Tomato Charlie+Lola Coaster Set,7.24,1,14446,United Kingdom +581538,12/9/2019,84519B,Carrot Charlie+Lola Coaster Set,7.24,1,14446,United Kingdom +581538,12/9/2019,35004B,Set Of 3 Black Flying Ducks,7.24,2,14446,United Kingdom +581538,12/9/2019,22068,Black Pirate Treasure Chest,7.24,1,14446,United Kingdom +581538,12/9/2019,23353,6 Gift Tags Vintage Christmas,6.19,1,14446,United Kingdom +581538,12/9/2019,21591,Cosy Hour Cigar Box Matches,6.19,1,14446,United Kingdom +581538,12/9/2019,22197,Popcorn Holder,6.19,4,14446,United Kingdom +581538,12/9/2019,23320,Giant 50'S Christmas Cracker,6.19,1,14446,United Kingdom +581538,12/9/2019,23349,Roll Wrap Vintage Christmas,6.19,1,14446,United Kingdom +581538,12/9/2019,22985,Wrap Billboard Fonts Design,6.19,25,14446,United Kingdom +581538,12/9/2019,23040,Paper Lantern 9 Point Snow Star,6.19,2,14446,United Kingdom +581538,12/9/2019,23040,Paper Lantern 9 Point Snow Star,6.19,3,14446,United Kingdom +581538,12/9/2019,21194,Pink Honeycomb Paper Fan,6.19,2,14446,United Kingdom +581538,12/9/2019,21208,Pastel Colour Honeycomb Fan,6.19,1,14446,United Kingdom +581538,12/9/2019,79190D,Retro Plastic Daisy Tray,6.19,1,14446,United Kingdom +581538,12/9/2019,79190B,Retro Plastic Polka Tray,6.19,1,14446,United Kingdom +581538,12/9/2019,22909,Set Of 20 Vintage Christmas Napkins,6.02,2,14446,United King +581538,12/9/2019,23318,Box Of 6 Mini Vintage Crackers,6.02,1,14446,United Kingdom +581538,12/9/2019,23319,Box Of 6 Mini 50'S Crackers,6.02,1,14446,United Kingdom +581538,12/9/2019,23537,Wall Art I Love London,6.19,1,14446,United Kingdom +581538,12/9/2019,22992,Revolver Wooden Ruler,6.19,1,14446,United Kingdom +581538,12/9/2019,22991,Giraffe Wooden Ruler,6.19,1,14446,United Kingdom +581538,12/9/2019,23190,Bundle Of 3 School Exercise Books,6.19,1,14446,United Kingdo +581538,12/9/2019,21194,Pink Honeycomb Paper Fan,6.19,1,14446,United Kingdom +581538,12/9/2019,35004B,Set Of 3 Black Flying Ducks,6.19,1,14446,United Kingdom +581538,12/9/2019,22694,Wicker Star,6.19,1,14446,United Kingdom +581538,12/9/2019,21355,Toast Its - I Love You,6.19,1,14446,United Kingdom +581538,12/9/2019,23343,Jumbo Bag Vintage Christmas,6.19,1,14446,United Kingdom +581538,12/9/2019,23343,Jumbo Bag Vintage Christmas,6.19,1,14446,United Kingdom +581538,12/9/2019,20727,Lunch Bag Black Skull,6.19,1,14446,United Kingdom +581538,12/9/2019,20725,Lunch Bag Red Retrospot,6.19,1,14446,United Kingdom +581566,12/9/2019,23404,Home Sweet Home Blackboard,6.19,144,18102,United Kingdom +581567,12/9/2019,21417,Cockle Shell Dish,6.19,84,16626,United Kingdom +581567,12/9/2019,22464,Hanging Metal Heart Lantern,6.19,24,16626,United Kingdom +581567,12/9/2019,22465,Hanging Metal Star Lantern,6.19,24,16626,United Kingdom +581567,12/9/2019,84971S,Small Heart Flowers Hook,6.19,48,16626,United Kingdom +581567,12/9/2019,22624,Ivory Kitchen Scales,6.19,2,16626,United Kingdom +581567,12/9/2019,22627,Mint Kitchen Scales,6.19,2,16626,United Kingdom +581567,12/9/2019,22625,Red Kitchen Scales,6.19,2,16626,United Kingdom +581567,12/9/2019,23355,Hot Water Bottle Keep Calm,6.19,4,16626,United Kingdom +581567,12/9/2019,21326,Aged Glass Silver T-Light Holder,6.19,144,16626,United Kingd +581567,12/9/2019,21479,White Skull Hot Water Bottle,6.19,4,16626,United Kingdom +581567,12/9/2019,23356,Love Hot Water Bottle,6.19,3,16626,United Kingdom +581567,12/9/2019,21137,Black Record Cover Frame,6.19,24,16626,United Kingdom +581570,12/9/2019,22141,Christmas Craft Tree Top Angel,6.19,6,12662,Germany +581570,12/9/2019,22175,Pink Owl Soft Toy,6.19,6,12662,Germany +581570,12/9/2019,21481,Fawn Blue Hot Water Bottle,6.19,4,12662,Germany +581570,12/9/2019,23570,Traditional Pick Up Sticks Game,6.19,12,12662,Germany +581570,12/9/2019,22326,Round Snack Boxes Set Of4 Woodland,6.19,6,12662,Germany +581570,12/9/2019,22331,Woodland Party Bag + Sticker Set,6.19,8,12662,Germany +581570,12/9/2019,22834,Hand Warmer Babushka Design,6.19,12,12662,Germany +581570,12/9/2019,21914,Blue Harmonica In Box,6.19,12,12662,Germany +581570,12/9/2019,22139,Retrospot Tea Set Ceramic 11 Pc,6.19,3,12662,Germany +581570,12/9/2019,23077,Doughnut Lip Gloss,6.19,20,12662,Germany +581570,12/9/2019,20750,Red Retrospot Mini Cases,6.19,2,12662,Germany +581570,12/9/2019,22505,Memo Board Cottage Design,6.19,4,12662,Germany +581571,12/9/2019,23326,Hanging Mini Coloured Bottles,6.19,6,15311,United Kingdom +581571,12/9/2019,21313,Glass Heart T-Light Holder,6.19,1,15311,United Kingdom +581571,12/9/2019,48187,Doormat New England,6.19,1,15311,United Kingdom +581571,12/9/2019,23317,Blue Refectory Clock,6.19,1,15311,United Kingdom +581571,12/9/2019,23197,Sketchbook Magnetic Shopping List,6.19,4,15311,United Kingdo +581571,12/9/2019,21012,Antique All Glass Candlestick,6.19,2,15311,United Kingdom +581571,12/9/2019,22227,Hanging Heart Mirror Decoration,6.19,10,15311,United Kingdom +581571,12/9/2019,22794,Sweetheart Wire Magazine Rack,6.19,1,15311,United Kingdom +581571,12/9/2019,23182,Toilet Sign Occupied Or Vacant,6.19,1,15311,United Kingdom +581571,12/9/2019,21755,Love Building Block Word,6.19,1,15311,United Kingdom +581571,12/9/2019,85053,French Enamel Candleholder,6.19,2,15311,United Kingdom +581571,12/9/2019,23110,Parisienne Key Cabinet,6.19,2,15311,United Kingdom +581571,12/9/2019,21169,You're Confusing Me Metal Sign,6.19,1,15311,United Kingdom +581571,12/9/2019,21258,Victorian Sewing Box Large,6.19,8,15311,United Kingdom +581571,12/9/2019,23168,Classic Cafe Sugar Dispenser,6.19,36,15311,United Kingdom +581571,12/9/2019,23167,Small Ceramic Top Storage Jar,6.19,96,15311,United Kingdom +581571,12/9/2019,21314,Small Glass Heart Trinket Pot,6.19,48,15311,United Kingdom +581571,12/9/2019,21137,Black Record Cover Frame,6.19,24,15311,United Kingdom +581571,12/9/2019,44234,Assorted Circular Mobile,6.19,1,15311,United Kingdom +581571,12/9/2019,84347,Rotating Silver Angels T-Light Hldr,6.19,24,15311,United Kin +581572,12/9/2019,23328,Set 6 School Milk Bottles In Crate,6.19,48,16705,United King +581572,12/9/2019,22627,Mint Kitchen Scales,6.19,4,16705,United Kingdom +581572,12/9/2019,22624,Ivory Kitchen Scales,6.19,4,16705,United Kingdom +581572,12/9/2019,23245,Set Of 3 Regency Cake Tins,6.19,4,16705,United Kingdom +581574,12/9/2019,22326,Round Snack Boxes Set Of4 Woodland,6.19,6,12526,Germany +581574,12/9/2019,22328,Round Snack Boxes Set Of 4 Fruits,6.19,6,12526,Germany +581574,12/9/2019,23238,Set Of 4 Knick Knack Tins London,6.19,6,12526,Germany +581574,12/9/2019,23237,Set Of 4 Knick Knack Tins Leaf,6.19,6,12526,Germany +581574,12/9/2019,21257,Victorian Sewing Box Medium,6.19,2,12526,Germany +581574,12/9/2019,21258,Victorian Sewing Box Large,6.19,2,12526,Germany +581574,12/9/2019,23111,Parisienne Sewing Box,6.19,2,12526,Germany +581574,12/9/2019,22077,6 Ribbons Rustic Charm,6.19,12,12526,Germany +581574,12/9/2019,22074,6 Ribbons Shimmering Pinks,6.19,12,12526,Germany +581574,12/9/2019,22621,Traditional Knitting Nancy,6.19,12,12526,Germany +581574,12/9/2019,23199,Jumbo Bag Apples,6.19,10,12526,Germany +581574,12/9/2019,23581,Jumbo Bag Paisley Park,6.19,10,12526,Germany +581578,12/9/2019,21124,Set/10 Blue Polkadot Party Candles,6.19,24,12713,Germany +581578,12/9/2019,21122,Set/10 Pink Polkadot Party Candles,6.19,24,12713,Germany +581578,12/9/2019,21121,Set/10 Red Polkadot Party Candles,6.19,24,12713,Germany +581578,12/9/2019,23389,Spaceboy Mini Backpack,6.04,4,12713,Germany +581578,12/9/2019,22556,Plasters In Tin Circus Parade,6.19,12,12713,Germany +581578,12/9/2019,22976,Circus Parade Childrens Egg Cup,6.19,12,12713,Germany +581578,12/9/2019,23255,Childrens Cutlery Circus Parade,7.24,12,12713,Germany +581578,12/9/2019,84997D,Childrens Cutlery Polkadot Pink,7.24,8,12713,Germany +581578,12/9/2019,84997B,Childrens Cutlery Retrospot Red,7.24,8,12713,Germany +581578,12/9/2019,84997C,Childrens Cutlery Polkadot Blue,7.24,8,12713,Germany +581578,12/9/2019,22555,Plasters In Tin Strongman,7.24,12,12713,Germany +581578,12/9/2019,21914,Blue Harmonica In Box,7.24,12,12713,Germany +581578,12/9/2019,22549,Picture Dominoes,7.24,24,12713,Germany +581578,12/9/2019,21918,Set 12 Kids Colour Chalk Sticks,7.24,24,12713,Germany +581578,12/9/2019,22992,Revolver Wooden Ruler,7.24,12,12713,Germany +581578,12/9/2019,22991,Giraffe Wooden Ruler,7.24,12,12713,Germany +581578,12/9/2019,23229,Vintage Donkey Tail Game,7.24,6,12713,Germany +581578,12/9/2019,22622,Box Of Vintage Alphabet Blocks,6.19,6,12713,Germany +581578,12/9/2019,21506,Fancy Font Birthday Card,6.19,12,12713,Germany +581578,12/9/2019,21507,Elephant Birthday Card,6.19,12,12713,Germany +581578,12/9/2019,23037,Candle Holder Silver Madeline,6.19,12,12713,Germany +581578,12/9/2019,23550,Wrap Alphabet Poster,6.19,25,12713,Germany +581578,12/9/2019,22711,Wrap Circus Parade,6.19,25,12713,Germany +581578,12/9/2019,21497,Fancy Fonts Birthday Wrap,6.19,25,12713,Germany +581578,12/9/2019,22704,Wrap Red Apples,6.19,25,12713,Germany +581578,12/9/2019,22585,Pack Of 6 Birdy Gift Tags,6.19,12,12713,Germany diff --git a/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/python-solution/task.py b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/python-solution/task.py new file mode 100644 index 000000000000..59da926dc6a1 --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/python-solution/task.py @@ -0,0 +1,99 @@ +# 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. + +# beam-playground: +# name: FinalSolution1 +# description: Final challenge solution 1. +# multifile: true +# files: +# - name: input.csv +# context_line: 57 +# categories: +# - Quickstart +# complexity: ADVANCED +# tags: +# - hellobeam + + +import apache_beam as beam +import logging +import re +from apache_beam.transforms import window, trigger +from apache_beam.transforms.combiners import CountCombineFn + + +class Transaction: + def __init__(self, transaction_no, date, product_no, product_name, price, quantity, customer_no, country): + self.transaction_no = transaction_no + self.date = date + self.product_no = product_no + self.product_name = product_name + self.price = price + self.quantity = quantity + self.customer_no = customer_no + self.country = country + + def __str__(self): + return f"Transaction(transaction_no={self.transaction_no}, date='{self.date}', product_no='{self.product_no}', product_name='{self.product_name}', price={self.price}, quantity={self.quantity}, customer_no={self.customer_no}, country='{self.country}')" + + +class ExtractDataFn(beam.DoFn): + def process(self, element): + items = re.split(r',(?=(?:[^"]*"[^"]*")*[^"]*$)', element) + if items[0] != 'TransactionNo': + yield Transaction(items[0], items[1], items[2], items[3], items[4], items[5], items[6], items[7]) + + +def partitionTransactions(element, num_partitions): + if float(element.price) >= 10: + return 0 + else: + return 1 + + +def run(): + with beam.Pipeline() as pipeline: + transactions = (pipeline + | 'Read from text file' >> beam.io.ReadFromText('input.csv') + | 'Extract Data' >> beam.ParDo(ExtractDataFn()) + ) + + windowed_transactions = (transactions + | 'Window' >> beam.WindowInto(window.FixedWindows(30), trigger=trigger.AfterWatermark( + early=trigger.AfterProcessingTime(5).has_ontime_pane(), late=trigger.AfterAll()), + allowed_lateness=30, + accumulation_mode=trigger.AccumulationMode.DISCARDING)) + + partition = (windowed_transactions + | 'Filtering' >> beam.Filter(lambda t: int(t.quantity) >= 20) + | 'Partition transactions' >> beam.Partition(partitionTransactions, 2)) + + biggerThan10 = partition[0] + smallerThan10 = partition[1] + + (biggerThan10 + | 'Map product_no and price for bigger' >> beam.Map(lambda transaction: (transaction.product_no, float(transaction.price))) + | 'Calculate sum for price more than 10' >> beam.CombinePerKey(sum) + | 'Write price more than 10 results to text file' >> beam.io.WriteToText('price_more_than_10', '.txt', shard_name_template='')) + + (smallerThan10 + | 'Map product_no and price for smaller' >> beam.Map(lambda transaction: (transaction.product_no, float(transaction.price))) + | 'Calculate sum for price less than 10' >> beam.CombinePerKey(sum) + | 'Write price less than 10 results to text file' >> beam.io.WriteToText('price_less_than_10', '.txt', shard_name_template='')) + +if __name__ == '__main__': + logging.getLogger().setLevel(logging.INFO) + run() diff --git a/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/unit-info.yaml b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/unit-info.yaml new file mode 100644 index 000000000000..d6483f02d2db --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-1/unit-info.yaml @@ -0,0 +1,27 @@ +# +# 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. +# + +sdk: + - Java + - Python + - Go +id: final-challenge-1 +name: Final Challenge 1 +taskName: FinalChallenge1 +solutionName: FinalSolution1 diff --git a/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/description.md b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/description.md new file mode 100644 index 000000000000..cfef46df9cdc --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/description.md @@ -0,0 +1,22 @@ + +### Final challenge 2 + +You are given a file analyzed.csv which maps words to sentiments. Using this, analyze kinglear.txt. Output PCollections counting the number of **negative words** and **positive words** as well as PCollections counting the number of **positive words with strong modal** and **positive words with weak modal**. + +Example rows from input file: + +| Word | Negative | Positive | Uncertainty | Litigious | Strong_Modal | Weak_Modal | Constraining | +|--------------|----------|----------|-------------|-----------|--------------|------------|--------------| +| NONSEVERABLE | 0 | 0 | 0 | 2011 | 0 | 0 | 0 | +| DISFAVOR | 2009 | 0 | 0 | 0 | 0 | 0 | 0 | +| COMPLIMENT | 0 | 2009 | 0 | 0 | 0 | 0 | 0 | \ No newline at end of file diff --git a/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/go-challenge/analysis.csv b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/go-challenge/analysis.csv new file mode 100644 index 000000000000..5c4a1246021e --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/go-challenge/analysis.csv @@ -0,0 +1,3877 @@ +Word,Negative,Positive,Uncertainty,Litigious,Strong_Modal,Weak_Modal,Constraining +NONSEVERABLE,0,0,0,2011,0,0,0 +DISFAVOR,2009,0,0,0,0,0,0 +DISGORGE,2009,0,0,0,0,0,0 +COMPLICATES,2009,0,0,0,0,0,0 +COMPLIMENT,0,2009,0,0,0,0,0 +COMPLIMENTS,0,2009,0,0,0,0,0 +MISSTATE,2009,0,0,0,0,0,0 +MISSTATES,2009,0,0,0,0,0,0 +MISTAKE,2009,0,0,0,0,0,0 +MISTAKING,2009,0,0,0,0,0,0 +MISUNDERSTANDING,2009,0,0,0,0,0,0 +MISUSED,2009,0,0,0,0,0,0 +MONOPOLISTS,2009,0,0,0,0,0,0 +MONOPOLIZES,2009,0,0,0,0,0,0 +MORATORIUM,2009,0,0,0,0,0,0 +MOTHBALLING,2009,0,0,0,0,0,0 +SLOW,2009,0,0,0,0,0,0 +SLOWER,2009,0,0,0,0,0,0 +SLOWNESS,2009,0,0,0,0,0,0 +SMOOTH,0,2009,0,0,0,0,0 +DEPRECATION,2009,0,0,0,0,0,0 +DEPRESSING,2009,0,0,0,0,0,0 +DEPRIVES,2009,0,0,0,0,0,0 +DEROGATE,0,0,0,2009,0,0,0 +DEROGATION,0,0,0,2009,0,0,0 +DESIRABLE,0,2009,0,0,0,0,0 +DESTABILIZATION,2009,0,0,0,0,0,0 +DESTINED,0,2009,0,0,0,0,0 +DESTROYS,2009,0,0,0,0,0,0 +DETAINED,2009,0,0,0,0,0,0 +DETER,2009,0,0,0,0,0,0 +DETERIORATING,2009,0,0,0,0,0,0 +DETERRENCE,2009,0,0,0,0,0,0 +DETERRING,2009,0,0,0,0,0,0 +DETRACTING,2009,0,0,0,0,0,0 +DETRIMENTS,2009,0,0,0,0,0,0 +DEVALUING,2009,0,0,0,0,0,0 +DEVASTATION,2009,0,0,0,0,0,0 +DEVIATING,2009,0,2009,0,0,0,0 +DEVOLVE,2009,0,0,0,0,0,0 +DICTATE,0,0,0,0,0,0,2009 +DIFFER,0,0,2009,0,0,0,0 +DIFFICULT,2009,0,0,0,0,0,0 +ASSAULT,2009,0,0,0,0,0,0 +ASSERTABLE,0,0,0,2011,0,0,0 +ASSUMABLE,0,0,0,2009,0,0,0 +ASSUMING,0,0,2009,0,0,0,0 +ASSURED,0,2009,0,0,0,0,0 +ATTAINED,0,2009,0,0,0,0,0 +ATTAINS,0,2009,0,0,0,0,0 +ATTESTED,0,0,0,2009,0,0,0 +ATTORNEYS,0,0,0,2009,0,0,0 +ATTRACTIVENESS,0,2009,0,0,0,0,0 +BAD,2009,0,0,0,0,0,0 +BAILEES,0,0,0,2011,0,0,0 +BAILOUT,2009,0,0,0,0,0,0 +BANKRUPTCIES,2009,0,0,0,0,0,0 +BANKRUPTS,2009,0,0,0,0,0,0 +CLAIM,0,0,0,2009,0,0,0 +CLAIMHOLDER,0,0,0,2014,0,0,0 +CLARIFICATIONS,0,0,2009,0,0,0,0 +CLOSED,-2020,0,0,0,0,0,0 +CLOSINGS,2009,0,0,0,0,0,0 +CODEFENDANTS,0,0,0,2011,0,0,0 +CODIFICATIONS,0,0,0,2009,0,0,0 +CODIFYING,0,0,0,2009,0,0,0 +COERCING,2009,0,0,0,0,0,0 +COLLABORATES,0,2009,0,0,0,0,0 +COLLABORATIVE,0,2009,0,0,0,0,0 +COLLAPSED,2009,0,0,0,0,0,0 +COLLISIONS,2009,0,0,0,0,0,0 +COLLUDING,2009,0,0,0,0,0,0 +POSES,2009,0,0,0,0,0,0 +POSSESSORY,0,0,0,2009,0,0,0 +POSSIBLY,0,0,2009,0,0,2009,0 +POSTJUDGMENT,0,0,0,2011,0,0,0 +POSTPONEMENTS,2009,0,0,0,0,0,0 +WRITEDOWNS,2009,0,0,0,0,0,0 +WRONG,2009,0,0,0,0,0,0 +WRONGFULLY,2009,0,0,0,0,0,0 +HONORABLE,0,-2020,0,0,0,0,0 +HOSTILE,2009,0,0,0,0,0,0 +REASSESS,0,0,2009,0,0,0,0 +REASSESSMENT,2009,0,2009,0,0,0,0 +REASSIGNING,2009,0,0,0,0,0,0 +REBOUND,0,2009,0,0,0,0,0 +REBUTS,0,0,0,2009,0,0,0 +REBUTTALS,0,0,0,2009,0,0,0 +RECALCULATED,0,0,2009,0,0,0,0 +RECALCULATIONS,0,0,2009,0,0,0,0 +RECALLS,2009,0,0,0,0,0,0 +RECESSIONS,2009,0,0,0,0,0,0 +RECONSIDER,0,0,2009,0,0,0,0 +RECORDATION,0,0,0,2009,0,0,0 +RECOURSE,0,0,0,2009,0,0,0 +RECUSAL,0,0,0,2011,0,0,0 +RECUSING,0,0,0,2011,0,0,0 +REDACTION,2009,0,0,2009,0,0,0 +REDEFAULTS,2014,0,0,0,0,0,0 +REDRESSING,2009,0,0,0,0,0,0 +REFERENDA,0,0,0,2009,0,0,0 +REFILED,0,0,0,2009,0,0,0 +REFRAINING,0,0,0,0,0,0,2009 +REFUSE,2009,0,0,0,0,0,0 +REGAIN,0,2009,0,0,0,0,0 +REGULATED,0,0,0,2009,0,0,0 +REGULATIONS,0,0,0,2009,0,0,0 +REGULATORY,0,0,0,2009,0,0,0 +REHEARINGS,0,0,0,2009,0,0,0 +VARIABILITY,0,0,2009,0,0,0,0 +VARIANCE,0,0,2009,0,0,0,0 +VARIATION,0,0,2009,0,0,0,0 +VARY,0,0,2009,0,0,0,0 +VERDICT,2009,0,0,2009,0,0,0 +VETOED,2009,0,0,0,0,0,0 +VICTIMS,2009,0,0,0,0,0,0 +VIOLATING,2009,0,0,0,0,0,0 +VIOLATOR,2009,0,0,0,0,0,0 +VIOLENTLY,2009,0,0,0,0,0,0 +VITIATING,2009,0,0,0,0,0,0 +VOIDING,2009,0,0,2009,0,0,0 +VULNERABILITIES,2009,0,0,0,0,0,0 +WARN,2009,0,0,0,0,0,0 +WARNS,2009,0,0,0,0,0,0 +WASTEFUL,2009,0,0,0,0,0,0 +WEAKENED,2009,0,0,0,0,0,0 +WEAKEST,2009,0,0,0,0,0,0 +DISHONESTLY,2009,0,0,0,0,0,0 +DISHONORABLY,2009,0,0,0,0,0,0 +DISINTERESTEDNESS,2009,0,0,0,0,0,0 +DISMAL,2009,0,0,0,0,0,0 +DISMISSALS,2009,0,0,0,0,0,0 +DISORDERLY,2009,0,0,0,0,0,0 +DISPARAGEMENTS,2009,0,0,0,0,0,0 +DISPARITIES,2009,0,0,0,0,0,0 +DISPLACEMENT,2009,0,0,0,0,0,0 +DISPOSE,2009,0,0,0,0,0,0 +DISPOSSESSES,2009,0,0,0,0,0,0 +DISPROPORTION,2009,0,0,0,0,0,0 +DISPUTE,2009,0,0,0,0,0,0 +DISQUALIFICATION,2009,0,0,0,0,0,0 +DISQUALIFY,2009,0,0,0,0,0,0 +DISREGARDING,2009,0,0,0,0,0,0 +DISRUPT,2009,0,0,0,0,0,0 +DISRUPTIONS,2009,0,0,0,0,0,0 +DISSATISFIED,2009,0,0,0,0,0,0 +DISSENTERS,2009,0,0,0,0,0,0 +DISSIDENTS,2009,0,0,0,0,0,0 +DISTINCTIONS,0,2009,0,0,0,0,0 +DISTORT,2009,0,0,0,0,0,0 +DISTORTIONS,2009,0,0,0,0,0,0 +DISTRACTING,2009,0,0,0,0,0,0 +DISTRAINT,0,0,0,2009,0,0,0 +DISTRIBUTEES,0,0,0,2009,0,0,0 +DISTURBED,2009,0,0,0,0,0,0 +DIVERT,2009,0,0,0,0,0,0 +DIVEST,2009,0,0,0,0,0,0 +DIVESTITURES,2009,0,0,0,0,0,0 +DIVORCE,2009,0,0,0,0,0,0 +DIVULGES,2009,0,0,0,0,0,0 +DOCKETING,0,0,0,2009,0,0,0 +DOUBTED,2009,0,2009,0,0,0,0 +DOWNGRADED,2009,0,0,0,0,0,0 +DOWNSIZED,2009,0,0,0,0,0,0 +DOWNTIME,2009,0,0,0,0,0,0 +DOWNWARD,2009,0,0,0,0,0,0 +DRASTICALLY,2009,0,0,0,0,0,0 +DROPPED,2009,0,0,0,0,0,0 +DURESS,2009,0,0,0,0,0,0 +EARMARK,0,0,0,0,0,0,2009 +EASIER,0,2009,0,0,0,0,0 +EFFECTIVE,0,-2020,0,0,0,0,0 +EFFICIENTLY,0,2009,0,0,0,0,0 +EMBARGO,2009,0,0,0,0,0,0 +EMBARRASS,2009,0,0,0,0,0,0 +EMBARRASSMENT,2009,0,0,0,0,0,0 +EMBEZZLEMENT,2009,0,0,0,0,0,0 +EMBEZZLING,2009,0,0,0,0,0,0 +EMPOWERS,0,2009,0,0,0,0,0 +ENABLING,0,2009,0,0,0,0,0 +ENCOURAGING,0,2009,0,0,0,0,0 +ENCROACHING,2009,0,0,0,0,0,0 +ENCUMBERED,2009,0,0,2009,0,0,2009 +ENCUMBRANCER,0,0,0,2009,0,0,0 +ENDANGERED,2009,0,0,0,0,0,0 +ENDORSEE,0,0,0,2011,0,0,0 +ENHANCE,0,2009,0,0,0,0,0 +ENHANCES,0,2009,0,0,0,0,0 +ENJOINING,2009,0,0,0,0,0,0 +ENJOYABLY,0,2009,0,0,0,0,0 +ENJOYS,0,2009,0,0,0,0,0 +ENTAILS,0,0,0,0,0,0,2009 +PATENTEE,0,0,0,2014,0,0,0 +PENALIZES,2009,0,0,0,0,0,0 +PENDING,0,0,2009,0,0,0,0 +PERFECTS,0,2009,0,0,0,0,0 +PERJURY,2009,0,0,2009,0,0,0 +PERMITTED,0,0,0,0,0,0,2009 +PERPETRATE,2009,0,0,2009,0,0,0 +PERPETRATION,2009,0,0,2009,0,0,0 +PERSISTENT,2009,0,0,0,0,0,0 +PERSONAM,0,0,0,2011,0,0,0 +PETITION,0,0,0,2009,0,0,0 +PETITIONING,0,0,0,2009,0,0,0 +PICKETED,2009,0,0,0,0,0,0 +HENCEFORTH,0,0,0,2009,0,0,0 +HEREDITAMENTS,0,0,0,2009,0,0,0 +HEREIN,0,0,0,2009,0,0,0 +HEREINBELOW,0,0,0,2009,0,0,0 +HERETOFORE,0,0,0,2009,0,0,0 +HEREWITH,0,0,0,2009,0,0,0 +HINDER,2009,0,0,0,0,0,0 +HINDRANCE,2009,0,0,0,0,0,0 +WHATSOEVER,0,0,0,2009,0,0,0 +WHEREAT,0,0,0,2009,0,0,0 +WHEREOF,0,0,0,2009,0,0,0 +WHEREUPON,0,0,0,2009,0,0,0 +WHOMSOEVER,0,0,0,2009,0,0,0 +WILLFUL,0,0,0,2009,0,0,0 +WINNER,0,2009,0,0,0,0,0 +WITNESSES,0,0,0,2009,0,0,0 +FLUCTUATES,0,0,2009,0,0,0,0 +FORBADE,0,0,0,2009,0,0,2011 +FORBEARING,0,0,0,2009,0,0,0 +FORBIDDING,2009,0,0,0,0,0,2009 +FORCING,2009,0,0,0,0,0,0 +FORECLOSE,2009,0,0,0,0,0,0 +FORECLOSURE,2009,0,0,0,0,0,0 +FOREGONE,2009,0,0,0,0,0,0 +FORESTALLS,2009,0,0,0,0,0,0 +FORFEITED,2009,0,0,0,0,0,0 +FORFEITURES,2009,0,0,0,0,0,0 +FORWHICH,0,0,0,2012,0,0,0 +FRAUDULENT,2009,0,0,0,0,0,0 +FRIVOLOUSLY,2009,0,0,0,0,0,0 +FRUSTRATING,2009,0,0,0,0,0,0 +FUGITIVE,-2020,0,0,2009,0,0,0 +GAINED,0,2009,0,0,0,0,0 +GRANTOR,0,0,0,2009,0,0,0 +DISGORGING,2009,0,0,0,0,0,0 +DISHONEST,2009,0,0,0,0,0,0 +LITIGANT,2009,0,0,2009,0,0,0 +LITIGATES,2009,0,0,2009,0,0,0 +LITIGATOR,0,0,0,2009,0,0,0 +LACKLUSTER,2009,0,0,0,0,0,0 +LAGGING,2009,0,0,0,0,0,0 +LAPSES,2009,0,0,0,0,0,0 +LAW,0,0,0,2009,0,0,0 +LAWMAKERS,0,0,0,2009,0,0,0 +LAWSUITS,0,0,0,2009,0,0,0 +LAYOFFS,2009,0,0,0,0,0,0 +LEGALESE,0,0,0,2009,0,0,0 +LEGALIZE,0,0,0,2009,0,0,0 +LEGALLY,0,0,0,2009,0,0,0 +NONPRODUCING,2009,0,0,0,0,0,0 +LIQUIDATE,2009,0,0,0,0,0,0 +LIQUIDATION,2009,0,0,0,0,0,0 +BENEFICIALLY,0,2009,0,0,0,0,0 +BENEFITED,0,2009,0,0,0,0,0 +BEST,0,2012,0,0,2009,0,0 +POPULAR,0,2009,0,0,0,0,0 +REINTERPRETED,0,0,2009,0,0,0,0 +REJECTED,2009,0,0,0,0,0,0 +REJECTS,2009,0,0,0,0,0,0 +RELINQUISHES,2009,0,0,0,0,0,0 +RELUCTANCE,2009,0,0,0,0,0,0 +REMANDING,0,0,0,2009,0,0,0 +REMEDIATING,0,0,0,2009,0,0,0 +REMISED,0,0,0,2011,0,0,0 +RENEGOTIATING,2009,0,0,0,0,0,0 +RENOUNCED,2009,0,0,0,0,0,0 +RENOUNCING,2009,0,0,0,0,0,0 +REPLEVIN,0,0,0,2009,0,0,0 +REPOSSESSION,2009,0,0,0,0,0,0 +TURBULENCE,2009,0,2009,0,0,0,0 +UNACCEPTABLY,2009,0,0,0,0,0,0 +UNANTICIPATED,2009,0,0,0,0,0,0 +UNATTRACTIVE,2009,0,0,0,0,0,0 +UNAVOIDABLE,2009,0,0,0,0,0,0 +UNCERTAINLY,0,0,2009,0,0,2009,0 +UNCOLLECTABLE,2009,0,0,0,0,0,0 +UNCOLLECTIBLES,2009,0,0,0,0,0,0 +UNCONFIRMED,0,0,2009,0,0,0,0 +UNCONSTITUTIONALITY,0,0,0,2009,0,0,0 +UNCONTROLLABLY,2009,0,0,0,0,0,0 +UNCOVERED,2009,0,0,0,0,0,0 +UNDEFEASED,0,0,0,2012,0,0,0 +UNDERCAPITALIZED,2009,0,0,0,0,0,0 +UNDERESTIMATE,2009,0,0,0,0,0,0 +UNDERESTIMATION,2009,0,0,0,0,0,0 +UNDERMINED,2009,0,0,0,0,0,0 +UNDERPAYMENT,2009,0,0,0,0,0,0 +UNDERPERFORMANCE,2009,0,0,0,0,0,0 +UNDERPRODUCED,2009,0,0,0,0,0,0 +UNDERSTATED,2009,0,0,0,0,0,0 +UNDERSTATING,2009,0,0,0,0,0,0 +UNDESIRABLE,2009,0,0,0,0,0,0 +UNDETERMINABLE,0,0,2009,0,0,0,0 +UNDISPUTED,0,0,0,0,2009,0,0 +UNDULY,2009,0,0,0,0,0,0 +UNEMPLOYED,2009,0,0,0,0,0,0 +UNENFORCEABILITY,0,0,0,2009,0,0,0 +UNETHICAL,2009,0,0,0,0,0,0 +UNEXPECTEDLY,2009,0,2009,0,0,0,0 +UNFAMILIARITY,0,0,2009,0,0,0,0 +UNFAVOURABLE,2011,0,0,0,0,0,0 +UNFORECASTED,0,0,2011,0,0,0,0 +UNFORTUNATE,2009,0,0,0,0,0,0 +UNFULFILLED,2009,0,0,0,0,0,0 +UNIDENTIFIABLE,0,0,2009,0,0,0,0 +UNINTENTIONAL,2009,0,0,0,0,0,0 +UNJUSTIFIABLY,2009,0,0,0,0,0,0 +UNKNOWINGLY,2009,0,0,0,0,0,0 +UNLAWFULLY,2009,0,0,2009,0,0,0 +UNMARKETABLE,2009,0,0,0,0,0,0 +UNNECESSARILY,2009,0,0,0,0,0,0 +UNOBTAINABLE,2009,0,0,0,0,0,0 +UNPERFORMED,2009,0,0,0,0,0,0 +UNPREDICTABLE,2009,0,2009,0,0,0,0 +UNPROFITABILITY,2011,0,0,0,0,0,0 +UNQUALIFIED,2009,0,0,0,0,0,0 +UNREASONABLE,2009,0,0,0,0,0,0 +UNRECONCILED,0,0,2011,0,0,0,0 +UNRELIABLE,2009,0,0,0,0,0,0 +UNRESOLVED,2009,0,0,0,0,0,0 +UNSALEABLE,2009,0,0,0,0,0,0 +UNSCHEDULED,2009,0,0,0,0,0,0 +UNSETTLED,0,0,2009,0,0,0,0 +UNSPECIFIED,0,0,2009,0,0,0,0 +UNSUBSTANTIATED,2009,0,0,0,0,0,0 +UNSUITABLE,2009,0,0,0,0,0,0 +UNSURPASSED,0,2009,0,0,2009,0,0 +UNTENABLE,2009,0,0,0,0,0,0 +UNTRUSTED,2014,0,0,0,0,0,0 +UNTRUTHFULNESS,2009,0,0,0,0,0,0 +UNUSUALLY,0,0,2009,0,0,0,0 +UNWILLING,2009,0,0,0,0,0,0 +UPTURN,0,2009,0,0,0,0,0 +USURIOUS,2009,0,0,2009,0,0,0 +USURPING,2009,0,0,2009,0,0,0 +VAGUE,0,0,2012,0,0,0,0 +VAGUER,0,0,2012,0,0,0,0 +PLAINTIFFS,2009,0,0,2009,0,0,0 +PLEADING,2009,0,0,2009,0,0,0 +PLEASANT,0,2009,0,0,0,0,0 +PLED,2009,0,0,0,0,0,0 +PLEDGEES,0,0,0,2011,0,0,0 +PLEDGORS,0,0,0,2012,0,0,0 +COMPELLING,0,0,0,0,0,0,2011 +COMPLAINANT,0,0,0,2009,0,0,0 +COMPLAINS,2009,0,0,0,0,0,0 +COMMITS,0,0,0,0,0,0,2009 +LIKELIHOOD,0,0,2009,0,0,0,0 +LIMITING,0,0,0,0,0,0,2009 +RESTRAIN,0,0,0,0,0,0,2009 +RESTRAINT,0,0,0,0,0,0,2009 +RESTRICTING,0,0,0,0,0,0,2009 +RESTRICTIVELY,0,0,0,0,0,0,2009 +RESTRUCTURED,2009,0,0,0,0,0,0 +RETALIATE,2009,0,0,0,0,0,0 +RETALIATION,2009,0,0,0,0,0,0 +PRECAUTION,0,0,2009,0,0,0,0 +PRECIPITOUS,2009,0,0,0,0,0,0 +PRECLUDES,2009,0,0,0,0,0,2009 +PREDATORY,2009,0,0,0,0,0,0 +PREDECEASING,0,0,0,2009,0,0,0 +PREDICTING,0,0,2009,0,0,0,0 +PREDICTOR,0,0,2009,0,0,0,0 +PREEMINENT,0,2009,0,0,0,0,0 +PREJUDICES,2009,0,0,2009,0,0,0 +PRELIMINARY,0,0,2009,0,0,0,0 +PREMIERE,0,2009,0,0,0,0,0 +PRESTIGE,0,2009,0,0,0,0,0 +PRESUMED,0,0,2009,0,0,0,0 +PRESUMPTIONS,0,0,2009,0,0,0,0 +PREVENTED,0,0,0,0,0,0,2009 +PRIMA,0,0,0,2009,0,0,0 +PROBABILISTIC,0,0,2009,0,0,0,0 +PROBABLY,0,0,2009,0,0,0,0 +PROBATING,0,0,0,2009,0,0,0 +PROBATIONER,0,0,0,2009,0,0,0 +PROBLEMATIC,2009,0,0,0,0,0,0 +PROFICIENT,0,2009,0,0,0,0,0 +PROFITABLY,0,2009,0,0,0,0,0 +PROGRESSING,0,2009,0,0,0,0,0 +PROHIBITION,0,0,0,0,0,0,2009 +PROHIBITORY,0,0,0,0,0,0,2009 +PROLONGATIONS,2009,0,0,0,0,0,0 +PROMULGATE,0,0,0,2009,0,0,0 +PROMULGATION,0,0,0,2009,0,0,0 +PRONE,2009,0,0,0,0,0,0 +PROSECUTED,2009,0,0,2009,0,0,0 +PROSECUTIONS,2009,0,0,2009,0,0,0 +PROSPERED,0,2009,0,0,0,0,0 +PROSPERS,0,2009,0,0,0,0,0 +PROTESTERS,2009,0,0,0,0,0,0 +PROTESTS,2009,0,0,0,0,0,0 +PROVISOES,0,0,0,2009,0,0,0 +PROVOKES,2009,0,0,0,0,0,0 +PUNISHES,2009,0,0,0,0,0,0 +PUNITIVE,2009,0,0,0,0,0,0 +PURPORTING,2009,0,0,0,0,0,0 +QUESTIONABLY,2009,0,0,0,0,0,0 +QUIT,2009,0,0,0,0,0,0 +RACKETEER,2009,0,0,0,0,0,0 +RANDOMIZED,0,0,2009,0,0,0,0 +RANDOMNESS,0,0,2009,0,0,0,0 +RATIONALIZATION,2009,0,0,0,0,0,0 +RATIONALIZES,2009,0,0,0,0,0,0 +ABANDONMENT,2009,0,0,0,0,0,0 +ABDICATES,2009,0,0,0,0,0,0 +ABERRANT,2009,0,0,0,0,0,0 +ABETTING,2009,0,0,0,0,0,0 +ABIDING,0,0,0,0,0,0,2009 +ABNORMALITY,2009,0,0,0,0,0,0 +ABOLISHES,2009,0,0,0,0,0,0 +ABROGATED,2009,0,0,2009,0,0,0 +ABROGATIONS,2009,0,0,2009,0,0,0 +ABSENCE,2009,0,0,0,0,0,0 +ABSOLVED,0,0,0,2009,0,0,0 +ABUNDANT,0,2009,0,0,0,0,0 +ABUSING,2009,0,0,0,0,0,0 +ACCESSION,0,0,0,2009,0,0,0 +ACCIDENTALLY,2009,0,0,0,0,0,0 +ACCOMPLISHED,0,2009,0,0,0,0,0 +ACCOMPLISHMENTS,0,2009,0,0,0,0,0 +ACCUSED,2009,0,0,0,0,0,0 +ACHIEVED,0,2009,0,0,0,0,0 +ACHIEVING,0,2009,0,0,0,0,0 +ACQUIESCING,2009,0,0,0,0,0,0 +ACQUITS,2009,0,0,2009,0,0,0 +ACQUITTANCES,0,0,0,2011,0,0,0 +ADEQUATELY,0,2009,0,0,0,0,0 +ADJOURNMENT,0,0,0,2009,0,0,0 +ADJUDGED,0,0,0,2009,0,0,0 +ADJUDICATED,0,0,0,2009,0,0,0 +ADJUDICATIONS,0,0,0,2009,0,0,0 +ADJUDICATORY,0,0,0,2009,0,0,0 +ADMISSION,0,0,0,2009,0,0,0 +ADULTERATING,2009,0,0,0,0,0,0 +ADVANCEMENTS,0,2009,0,0,0,0,0 +ADVANTAGED,0,2009,0,0,0,0,0 +ADVERSARIAL,2009,0,0,0,0,0,0 +ADVERSELY,2009,0,0,0,0,0,0 +AFFIDAVITS,0,0,0,2009,0,0,0 +AFOREMENTIONED,0,0,0,2009,0,0,0 +AFTERMATHS,2009,0,0,0,0,0,0 +AGGRAVATES,2009,0,0,0,0,0,0 +AGGRIEVED,0,0,0,2009,0,0,0 +ALIENATED,2009,0,0,0,0,0,0 +ALIENATIONS,2009,0,0,0,0,0,0 +ALLEGED,2009,0,0,2009,0,0,0 +ALLIANCE,0,2009,0,0,0,0,0 +ALTERATIONS,0,0,2009,0,0,0,0 +AMBIGUOUS,0,0,2009,0,0,0,0 +AMENDED,0,0,0,2009,0,0,0 +AMENDS,0,0,0,2009,0,0,0 +ANNOYED,2009,0,0,0,0,0,0 +ANNULLED,2009,0,0,0,0,0,0 +ANNULS,2009,0,0,0,0,0,0 +ANOMALY,2009,0,2009,0,0,0,0 +ANTICIPATED,0,0,2009,0,0,0,0 +ANTICIPATIONS,0,0,2009,0,0,0,0 +ANYWISE,0,0,0,2009,0,0,0 +APPEALABLE,0,0,0,2009,0,0,0 +APPEAR,0,0,2009,0,0,0,0 +APPELLANT,0,0,0,2009,0,0,0 +APPOINTOR,0,0,0,2011,0,0,0 +APPROXIMATES,0,0,2009,0,0,0,0 +APPURTENANCE,0,0,0,2009,0,0,0 +ARBITRAL,0,0,0,2009,0,0,0 +ARBITRATE,0,0,0,2009,0,0,0 +ARBITRATION,0,0,0,2009,0,0,0 +ARBITRATOR,0,0,0,2009,0,0,0 +ARGUING,2009,0,0,0,0,0,0 +ARREARAGE,2009,0,0,2009,0,0,0 +ARRESTED,2009,0,0,0,0,0,0 +RETROCEDE,0,0,0,2011,0,0,0 +BOLSTERED,0,2009,0,0,0,0,0 +BONAFIDE,0,0,0,2009,0,0,0 +BOOSTED,0,2009,0,0,0,0,0 +BOUNDED,0,0,0,0,0,0,2009 +BOYCOTTS,2009,0,0,0,0,0,0 +BREACHING,2009,0,0,2009,0,0,0 +BREAKDOWN,2009,0,0,0,0,0,0 +BREAKTHROUGH,0,2009,0,0,0,0,0 +BRIBERIES,2009,0,0,0,0,0,0 +BRIDGE,-2020,0,0,0,0,0,0 +BURDENED,2009,0,0,0,0,0,0 +BURNED,2009,0,0,0,0,0,0 +CANCEL,2009,0,0,0,0,0,0 +CANCELLATIONS,2009,0,0,0,0,0,0 +CARELESS,2009,0,0,0,0,0,0 +CATASTROPHE,2009,0,0,0,0,0,0 +CAUTION,2009,0,0,0,0,0,0 +CAUTIONS,2009,0,0,0,0,0,0 +CEASE,2009,0,0,0,0,0,0 +CEDANT,0,0,0,2012,0,0,0 +CENSURES,2009,0,0,0,0,0,0 +CHALLENGE,2009,0,0,0,0,0,0 +CHARGEOFFS,2009,0,0,0,0,0,0 +CHOATE,0,0,0,2011,0,0,0 +CIRCUMVENTION,2009,0,0,0,0,0,0 +SHOCKED,2009,0,0,0,0,0,0 +SHORTFALLS,2009,0,0,0,0,0,0 +SHUTDOWN,2009,0,0,0,0,0,0 +SLANDER,2009,0,0,0,0,0,0 +REPUDIATED,2009,0,0,0,0,0,0 +REPUDIATIONS,2009,0,0,0,0,0,0 +REQUIRED,0,0,0,0,0,0,2009 +REQUIRING,0,0,0,0,0,0,2009 +RESCINDING,0,0,0,2009,0,0,0 +RESIGN,2009,0,0,0,0,0,0 +RESIGNING,2009,0,0,0,0,0,0 +RESTATED,2009,0,0,0,0,0,0 +RESTATING,2009,0,0,0,0,0,0 +NONUSURIOUS,0,0,0,2011,0,0,0 +NOTARIZATIONS,0,0,0,2009,0,0,0 +NOTARY,0,0,0,2009,0,0,0 +NUISANCES,2009,0,0,0,0,0,0 +NULLIFIES,2009,0,0,2009,0,0,0 +NULLITY,0,0,0,2009,0,0,0 +OBJECTIONABLE,2009,0,0,0,0,0,0 +OBLIGATED,0,0,0,0,0,0,2009 +OBLIGATIONS,0,0,0,0,0,0,2009 +OBLIGEE,0,0,0,2009,0,0,0 +OBLIGORS,0,0,0,2009,0,0,0 +OBSOLETE,2009,0,0,0,0,0,0 +OBSTRUCTED,2009,0,0,0,0,0,0 +OCCASIONALLY,0,0,2009,0,0,2009,0 +OFFENDED,2009,0,0,0,0,0,0 +OFFENDS,2009,0,0,0,0,0,0 +OFFEROR,0,0,0,2009,0,0,0 +OMIT,2009,0,0,0,0,0,0 +ONEROUS,2009,0,0,0,0,0,0 +OPPORTUNITY,0,2009,0,0,0,0,0 +OPPOSING,2009,0,0,0,0,0,0 +OPTIONEE,0,0,0,2009,0,0,0 +OUTAGES,2009,0,0,0,0,0,0 +OUTPERFORMED,0,2009,0,0,0,0,0 +OVERAGES,2009,0,0,0,0,0,0 +OVERBUILT,2009,0,0,0,0,0,0 +OVERCAPACITIES,2009,0,0,0,0,0,0 +OVERCHARGES,2009,0,0,0,0,0,0 +OVERCOMING,2009,0,0,0,0,0,0 +OVERESTIMATES,2009,0,0,0,0,0,0 +OVERLOAD,2009,0,0,0,0,0,0 +OVERLOOK,2009,0,0,0,0,0,0 +OVERPAID,2009,0,0,0,0,0,0 +OVERPRODUCES,2009,0,0,0,0,0,0 +OVERRULED,0,0,0,2009,0,0,0 +OVERRUNNING,2009,0,0,0,0,0,0 +OVERSHADOWING,2009,0,0,0,0,0,0 +OVERSTATEMENT,2009,0,0,0,0,0,0 +OVERSUPPLIED,2009,0,0,0,0,0,0 +OVERTLY,2009,0,0,0,0,0,0 +OVERTURNS,2009,0,0,0,0,0,0 +PANIC,2009,0,0,0,0,0,0 +NEARLY,0,0,2009,0,0,2009,0 +NECESSITATING,0,0,0,0,0,0,2009 +NEGLECT,2009,0,0,0,0,0,0 +NEGLECTS,2009,0,0,0,0,0,0 +NEGLIGENTLY,2009,0,0,0,0,0,0 +BARRIER,2009,0,0,0,0,0,0 +BELIEVE,0,0,2009,0,0,0,0 +IDLED,2009,0,0,0,0,0,0 +IGNORES,2009,0,0,0,0,0,0 +ILLEGALITIES,2009,0,0,0,0,0,0 +ILLICIT,2009,0,0,0,0,0,0 +IMBALANCE,2009,0,0,0,0,0,0 +IMMORAL,2009,0,0,0,0,0,0 +IMPAIRMENT,2009,0,0,0,0,0,2011 +IMPASSES,2009,0,0,0,0,0,0 +IMPEDIMENT,2009,0,0,0,0,0,0 +IMPERATIVE,2009,0,0,0,0,0,0 +IMPERMISSIBLE,2009,0,0,0,0,0,0 +IMPLICATES,2009,0,0,0,0,0,0 +IMPOSES,0,0,0,0,0,0,2009 +IMPOSSIBILITY,2009,0,0,0,0,0,0 +IMPOUNDING,2009,0,0,0,0,0,0 +IMPRACTICALITIES,2009,0,0,0,0,0,0 +IMPRECISIONS,0,0,2009,0,0,0,0 +IMPRESSING,0,2009,0,0,0,0,0 +IMPROBABILITY,0,0,2009,0,0,0,0 +IMPROPRIETIES,2009,0,0,0,0,0,0 +IMPROVEMENT,0,2009,0,0,0,0,0 +IMPRUDENT,2009,0,0,0,0,0,0 +INACCURACIES,2009,0,0,0,0,0,0 +INACTION,2009,0,0,0,0,0,0 +INACTIVATES,2009,0,0,0,0,0,0 +INACTIVITY,2009,0,0,0,0,0,0 +INADEQUATELY,2009,0,0,0,0,0,0 +INADVISABLE,2009,0,0,0,0,0,0 +INATTENTION,2009,0,0,0,0,0,0 +INCARCERATE,2009,0,0,2009,0,0,0 +INCARCERATION,2009,0,0,2009,0,0,0 +INCIDENCES,2009,0,0,0,0,0,0 +INCOMPATIBILITY,2009,0,0,0,0,0,0 +INCOMPETENT,2009,0,0,0,0,0,0 +INCOMPLETELY,2009,0,0,0,0,0,0 +INCONSISTENCY,2009,0,0,0,0,0,0 +INCONTESTABLE,0,0,0,2009,0,0,0 +INCORRECT,2009,0,0,0,0,0,0 +INCREDIBLY,0,2009,0,0,0,0,0 +INDEFEASIBLE,2009,0,0,0,0,0,0 +INDEFINITENESS,0,0,2009,0,0,0,0 +INDEMNIFIED,0,0,0,2009,0,0,0 +INDEMNITEE,0,0,0,2009,0,0,0 +INDEMNITORS,0,0,0,2009,0,0,0 +INDICT,2009,0,0,2009,0,0,0 +INDICTMENT,2009,0,0,2009,0,0,0 +INEFFECTIVELY,2009,0,0,0,0,0,0 +INEFFICIENT,2009,0,0,0,0,0,0 +INEQUITABLE,2009,0,0,0,0,0,0 +INEVITABLE,2009,0,0,0,0,0,0 +INEXPERIENCED,2009,0,0,0,0,0,0 +INFORCE,0,0,0,2009,0,0,0 +INFRINGE,2009,0,0,0,0,0,0 +INFRINGER,0,0,0,2009,0,0,0 +INHIBIT,0,0,0,0,0,0,2011 +INIMICAL,2009,0,0,0,0,0,0 +INJURE,2009,0,0,0,0,0,0 +INJURING,2009,0,0,0,0,0,0 +INNOVATED,0,2009,0,0,0,0,0 +INNOVATIONS,0,2009,0,0,0,0,0 +INNOVATORS,0,2009,0,0,0,0,0 +INSECURE,2009,0,0,0,0,0,0 +INSISTED,0,0,0,0,0,0,2009 +INSOFAR,0,0,0,2009,0,0,0 +INSPIRATION,0,2009,0,0,0,0,0 +INSUBORDINATION,2009,0,0,0,0,0,0 +INSURRECTION,2009,0,0,0,0,0,0 +INTEGRITY,0,2009,0,0,0,0,0 +INTERFERENCE,2009,0,0,0,0,0,0 +INTERLOCUTORY,0,0,0,2009,0,0,0 +INTERPOSE,0,0,0,2009,0,0,0 +INTERPOSITION,0,0,0,2009,0,0,0 +INTERROGATES,0,0,0,2009,0,0,0 +INTERROGATOR,0,0,0,2009,0,0,0 +INTERRUPT,2009,0,0,0,0,0,0 +INTERRUPTIONS,2009,0,0,0,0,0,0 +INTIMIDATION,2009,0,0,0,0,0,0 +SPORADICALLY,0,0,2009,0,0,0,0 +STABILIZE,0,2009,0,0,0,0,0 +STABLE,0,2009,0,0,0,0,0 +STAGNATED,2009,0,0,0,0,0,0 +STANDSTILL,2009,0,0,0,0,0,0 +STATUTORILY,0,0,0,2009,0,0,0 +STIPULATES,0,0,0,0,0,0,2009 +STOLEN,2009,0,0,0,0,0,0 +STOPPING,2009,0,0,0,0,0,0 +STRAINING,2009,0,0,0,0,0,0 +STRENGTHENED,0,2009,0,0,0,0,0 +STRESS,2009,0,0,0,0,0,0 +STRESSING,2009,0,0,0,0,0,0 +STRICTLY,0,0,0,0,0,0,2009 +STRONGEST,0,2009,0,0,0,0,0 +SUBDOCKET,0,0,0,2012,0,0,0 +SUBLEASEE,0,0,0,2011,0,0,0 +SUBLICENSOR,0,0,0,2011,0,0,0 +SUBPOENAED,2009,0,0,2009,0,0,0 +SUBSTANDARD,2009,0,0,0,0,0,0 +SUCCEEDED,0,2009,0,0,0,0,0 +SUCCESSES,0,2009,0,0,0,0,0 +SUDDENLY,0,0,2009,0,0,0,0 +SUFFER,2009,0,0,0,0,0,0 +SUGGEST,0,0,2009,0,0,2009,0 +SUING,2009,0,0,2009,0,0,0 +SUMMONSES,2009,0,0,2009,0,0,0 +SUPERSEDED,0,0,0,2009,0,0,0 +SURETY,0,0,0,2009,0,0,0 +SURPASSING,0,2009,0,0,0,0,0 +SUSPECTED,2009,0,0,0,0,0,0 +SUSPENDING,2009,0,0,0,0,0,0 +SUSPICION,2009,0,0,0,0,0,0 +REVISED,0,0,2009,0,0,0,0 +REVOKE,2009,0,0,0,0,0,0 +REVOLUTIONIZE,0,2009,0,0,0,0,0 +REWARD,0,2009,0,0,0,0,0 +RIDICULE,2009,0,0,0,0,0,0 +RISK,0,0,2009,0,0,0,0 +RISKINESS,0,0,2009,0,0,0,0 +ROUGHLY,0,0,2009,0,0,0,0 +SABOTAGE,2009,0,0,0,0,0,0 +SACRIFICIAL,2009,0,0,0,0,0,0 +SATISFACTORY,0,2009,0,0,0,0,0 +SATISFYING,0,2009,0,0,0,0,0 +SCRUTINIZED,2009,0,0,0,0,0,0 +SECRECY,-2020,0,0,0,0,0,0 +SEIZES,2009,0,0,0,0,0,0 +SENTENCED,2009,0,0,2009,0,0,0 +SERIOUSLY,2009,0,0,0,0,0,0 +SETTLEMENT,0,0,0,2009,0,0,0 +SEVERABLE,0,0,0,2009,0,0,0 +SEVERE,2009,0,0,0,0,0,0 +SEVERITY,2009,0,0,0,0,0,0 +ENTHUSIASTIC,0,2009,0,0,0,0,0 +ERODE,2009,0,0,0,0,0,0 +EROSION,2009,0,0,0,0,0,0 +ERRING,2009,0,0,0,0,0,0 +ERRORS,2009,0,0,0,0,0,0 +ESCALATES,2009,0,0,0,0,0,0 +ESCHEATMENT,0,0,0,2011,0,0,0 +ESCROWS,0,0,0,0,0,0,2009 +EVADES,2009,0,0,0,0,0,0 +EVASIVE,2009,0,0,0,0,0,0 +EVICTION,2009,0,0,0,0,0,0 +EVIDENTIARY,0,0,0,2009,0,0,0 +EXACERBATING,2009,0,0,0,0,0,0 +EXAGGERATED,2009,0,0,0,0,0,0 +EXCEEDANCE,0,0,0,2011,0,0,0 +EXCELLENT,0,2009,0,0,0,0,0 +EXCEPTIONALLY,0,2009,0,0,0,0,0 +EXCITED,0,2009,0,0,0,0,0 +EXCLUSIVELY,0,2009,0,0,0,0,0 +EXCULPATE,2009,0,0,2009,0,0,0 +EXCULPATION,2009,0,0,2009,0,0,0 +EXECUTORS,0,0,0,2009,0,0,0 +EXECUTRIXES,0,0,0,2009,0,0,0 +EXONERATES,2009,0,0,0,0,0,0 +EXPLOIT,2009,0,0,0,0,0,0 +EXPLOITED,2009,0,0,0,0,0,0 +EXPOSED,2009,0,0,0,0,0,0 +EXPOSURES,0,0,2009,0,0,0,0 +EXPROPRIATING,2009,0,0,0,0,0,0 +EXPULSIONS,2009,0,0,0,0,0,0 +EXTRAJUDICIAL,0,0,0,2014,0,0,0 +SOLVES,0,2009,0,0,0,0,0 +SOMEWHAT,0,0,2009,0,0,2009,0 +SPAMMING,2014,0,0,0,0,0,0 +TREMENDOUSLY,0,2009,0,0,0,0,0 +LOCKOUTS,2009,0,0,0,0,0,0 +LOSS,2009,0,0,0,0,0,0 +LOYAL,0,2009,0,0,0,0,0 +MALFEASANCE,2009,0,0,0,0,0,0 +MALFUNCTIONS,2009,0,0,0,0,0,0 +MALPRACTICE,2009,0,0,0,0,0,0 +MANDATES,0,0,0,0,0,0,2009 +MANIPULATE,2009,0,0,0,0,0,0 +MANIPULATION,2009,0,0,0,0,0,0 +MARKDOWNS,2009,0,0,0,0,0,0 +MEDIATED,0,0,0,2009,0,0,0 +MEDIATIONS,0,0,0,2009,0,0,0 +MIGHT,0,0,2009,0,0,2009,0 +MISAPPLIES,2009,0,0,0,0,0,0 +MISAPPROPRIATED,2009,0,0,0,0,0,0 +MISAPPROPRIATIONS,2009,0,0,0,0,0,0 +MISCALCULATES,2009,0,0,0,0,0,0 +MISCHARACTERIZATION,2014,0,0,0,0,0,0 +MISCLASSIFIED,2011,0,0,0,0,0,0 +MISDATED,2011,0,0,0,0,0,0 +MISFEASANCE,0,0,0,2009,0,0,0 +MISHANDLING,2009,0,0,0,0,0,0 +MISINFORMING,2009,0,0,0,0,0,0 +MISINTERPRETATIONS,2009,0,0,0,0,0,0 +MISJUDGE,2009,0,0,0,0,0,0 +MISJUDGMENT,2009,0,0,0,0,0,0 +MISLABELING,2009,0,0,0,0,0,0 +MISLEADING,2009,0,0,0,0,0,0 +MISMANAGE,2009,0,0,0,0,0,0 +MISMANAGING,2009,0,0,0,0,0,0 +MISMATCHING,2009,0,0,0,0,0,0 +MISPRICINGS,2014,0,0,0,0,0,0 +MISREPRESENTED,2009,0,0,0,0,0,0 +MISSED,2009,0,0,0,0,0,0 +WORRIES,2009,0,0,0,0,0,0 +WORSEN,2009,0,0,0,0,0,0 +WORST,2009,0,0,0,0,0,0 +TIGHTENING,2009,0,0,0,0,0,0 +TOLERATING,2009,0,0,0,0,0,0 +TORTIOUSLY,0,0,0,2009,0,0,0 +FINES,2009,0,0,0,0,0,0 +NONASSESSABLE,0,0,2009,0,0,0,0 +NONCANCELLABLE,0,0,0,0,0,0,2009 +NONCOMPLIANT,2009,0,0,0,0,0,0 +NONCONFORMITY,2009,0,0,0,0,0,0 +NONCONTRIBUTORY,0,0,0,2009,0,0,0 +NONFORFEITABILITY,0,0,0,2011,0,0,0 +NONGUARANTOR,0,0,0,2011,0,0,0 +DISCIPLINARY,2009,0,0,0,0,0,0 +DISCLAIMERS,2009,0,0,0,0,0,0 +DISCLOSED,2009,0,0,0,0,0,0 +DISCONTINUANCES,2009,0,0,0,0,0,0 +DISCONTINUED,2009,0,0,0,0,0,0 +DISCOURAGED,2009,0,0,0,0,0,0 +DISCREDITED,2009,0,0,0,0,0,0 +DISCREPANCY,2009,0,0,0,0,0,0 +SPECULATED,0,0,2009,0,0,0,0 +SPECULATIONS,0,0,2009,0,0,0,0 +TRAGICALLY,2009,0,0,0,0,0,0 +LEGISLATED,0,0,0,2009,0,0,0 +LEGISLATIONS,0,0,0,2009,0,0,0 +LEGISLATORS,0,0,0,2009,0,0,0 +LIBELED,0,0,0,2009,0,0,0 +LIE,2009,0,0,0,0,0,0 +COMPULSION,2009,0,0,0,0,0,2009 +CONCEDE,2009,0,0,0,0,0,0 +CONCEIVABLE,0,0,2009,0,0,2009,0 +CONCERNS,2009,0,0,0,0,0,0 +CONCLUSIVE,0,2009,0,0,0,0,0 +CONDEMNATIONS,2009,0,0,0,0,0,0 +CONDEMNS,2009,0,0,0,0,0,0 +CONDONED,2009,0,0,0,0,0,0 +CONFESSES,2009,0,0,0,0,0,0 +CONFINE,2009,0,0,0,0,0,2009 +CONFINES,2009,0,0,0,0,0,2009 +CONFISCATES,2009,0,0,0,0,0,0 +CONFISCATORY,0,0,0,2009,0,0,0 +CONFLICTS,2009,0,0,0,0,0,0 +CONFRONTATIONS,2009,0,0,0,0,0,0 +CONFUSE,2009,0,0,0,0,0,0 +CONFUSINGLY,2009,0,2009,0,0,0,0 +CONSENTING,0,0,0,2009,0,0,0 +CONSPIRACY,2009,0,0,0,0,0,0 +CONSPIRE,2009,0,0,0,0,0,0 +CONSTITUTION,0,0,0,2009,0,0,0 +CONSTITUTIONS,0,0,0,2009,0,0,0 +CONSTRAINING,0,0,0,0,0,0,2009 +CONSTRUCTIVE,0,2009,0,0,0,0,0 +CONSTRUES,0,0,0,2012,0,0,0 +CONTENDED,2009,0,0,0,0,0,0 +CONTENTIONS,2009,0,0,0,0,0,0 +CONTESTATION,0,0,0,2011,0,0,0 +CONTINGENCY,0,0,2009,0,0,0,0 +CONTRACT,0,0,0,2009,0,0,0 +CONTRACTIBLE,0,0,0,2009,0,0,0 +CONTRACTIONS,2009,0,0,0,0,0,0 +CONTRADICT,2009,0,0,0,0,0,0 +CONTRADICTIONS,2009,0,0,0,0,0,0 +CONTRAVENE,0,0,0,2009,0,0,0 +CONTRAVENTION,0,0,0,2009,0,0,0 +CONTROVERSY,2009,0,0,0,0,0,0 +CONVENIENS,0,0,0,2012,0,0,0 +CONVICTED,2009,0,0,2009,0,0,0 +CORRECTED,2009,0,0,0,0,0,0 +CORRECTS,2009,0,0,0,0,0,0 +CORRUPTION,2009,0,0,0,0,0,0 +COSTLY,2009,0,0,0,0,0,0 +COUNSELED,0,0,0,2009,0,0,0 +COUNTERCLAIMED,2009,0,0,0,0,0,0 +COUNTERFEITED,2009,0,0,0,0,0,0 +COUNTERFEITS,2009,0,0,0,0,0,0 +COUNTERSUED,0,0,0,2011,0,0,0 +COURTEOUS,0,2009,0,0,0,0,0 +COVENANTED,0,0,0,0,0,0,2011 +CREATIVELY,0,2009,0,0,0,0,0 +CRIMES,2009,0,0,2009,0,0,0 +CRIMINALIZING,0,0,0,2014,0,0,0 +CRISIS,2009,0,0,0,0,0,0 +CRITICISMS,2009,0,0,0,0,0,0 +CRITICIZING,2009,0,0,0,0,0,0 +CROSSROADS,0,0,2009,0,0,0,0 +CULPABLE,2009,0,0,0,0,0,0 +CURTAILED,2009,0,0,0,0,0,0 +CURTAILS,2009,0,0,0,0,0,0 +CYBERATTACK,2014,0,0,0,0,0,0 +CYBERCRIMES,2014,0,0,0,0,0,0 +TAINTS,2009,0,0,0,0,0,0 +TENSE,2009,0,0,0,0,0,0 +TERMINATE,2009,0,0,0,0,0,0 +TERMINATION,2009,0,0,0,0,0,0 +TESTIFY,2009,0,0,2009,0,0,0 +THENCEFORTH,0,0,0,2009,0,0,0 +THEREFROM,0,0,0,2009,0,0,0 +THEREON,0,0,0,2009,0,0,0 +THERETOFORE,0,0,0,2009,0,0,0 +THEREWITH,0,0,0,2009,0,0,0 +THREATENING,2009,0,0,0,0,0,0 +FACIE,0,0,0,2009,0,0,0 +FAILING,2009,0,0,0,0,0,0 +FAILURES,2009,0,0,0,0,0,0 +FALSIFICATION,2009,0,0,0,0,0,0 +FALSIFY,2009,0,0,0,0,0,0 +FATALITIES,2009,0,0,0,0,0,0 +FAULTED,2009,0,0,0,0,0,0 +FAVORABLY,0,2009,0,0,0,0,0 +FAVORITES,0,2009,0,0,0,0,0 +FELONIOUS,2009,0,0,2009,0,0,0 +DAMAGES,2009,0,0,0,0,0,0 +DANGER,2009,0,0,0,0,0,0 +DEADLOCK,2009,0,0,0,0,0,0 +DEADWEIGHT,2009,0,0,0,0,0,0 +DEBARRED,2009,0,0,0,0,0,0 +DECEIT,2009,0,0,0,0,0,0 +DECEIVED,2009,0,0,0,0,0,0 +DECEPTIONS,2009,0,0,0,0,0,0 +DECLINE,2009,0,0,0,0,0,0 +DECREE,0,0,0,2009,0,0,0 +DEFACE,2009,0,0,0,0,0,0 +DEFALCATIONS,0,0,0,2009,0,0,0 +DEFAME,2009,0,0,0,0,0,0 +DEFAULT,2009,0,0,0,0,0,0 +DEFEASANCE,0,0,0,2009,0,0,0 +DEFEASEMENT,0,0,0,2014,0,0,0 +DEFEATED,2009,0,0,0,0,0,0 +DEFECTIVE,2009,0,0,0,0,0,0 +DEFENDABLE,0,0,0,2014,0,0,0 +DEFENDING,2009,0,0,0,0,0,0 +DEFERENCE,0,0,0,2009,0,0,0 +DEFICIT,2009,0,0,0,0,0,0 +DEFRAUD,2009,0,0,0,0,0,0 +DEFUNCT,2009,0,0,0,0,0,0 +DEGRADED,2009,0,0,0,0,0,0 +DELAYED,2009,0,0,0,0,0,0 +DELEGATABLE,0,0,0,2011,0,0,0 +DELIBERATE,2009,0,0,0,0,0,0 +DELIGHTED,0,2009,0,0,0,0,0 +DELIGHTS,0,2009,0,0,0,0,0 +DELINQUENTLY,2009,0,0,0,0,0,0 +DELISTING,2009,0,0,0,0,0,0 +DEMISES,2009,0,0,0,0,0,0 +DEMOLISHES,2009,0,0,0,0,0,0 +DEMOTE,2009,0,0,0,0,0,0 +DEMOTION,2009,0,0,0,0,0,0 +DEMURRERS,0,0,0,2009,0,0,0 +DENIALS,2009,0,0,0,0,0,0 +DENIGRATED,2009,0,0,0,0,0,0 +DENY,2009,0,0,0,0,0,0 +DEPENDABLE,0,2009,0,0,0,0,0 +DEPENDED,0,0,2009,0,0,2009,0 +DEPENDENT,0,0,2009,0,0,0,2011 +DEPLETED,2009,0,0,0,0,0,0 +DEPLETIONS,2009,0,0,0,0,0,0 +DEPOSING,0,0,0,2009,0,0,0 +INVALID,2009,0,0,0,0,0,0 +INVALIDATING,2009,0,0,0,0,0,0 +INVENTED,0,2009,0,0,0,0,0 +INVENTIVE,0,2009,0,0,0,0,0 +INVESTIGATE,2009,0,0,0,0,0,0 +INVESTIGATION,2009,0,0,0,0,0,0 +IRRECONCILABLE,2009,0,0,0,0,0,0 +IRREGULAR,2009,0,0,0,0,0,0 +IRREPARABLE,2009,0,0,0,0,0,0 +IRREVOCABLE,0,0,0,2009,0,0,2009 +JOINDER,0,0,0,2009,0,0,0 +JUDICIARY,0,0,0,2009,0,0,0 +JURISDICTIONAL,0,0,0,2009,0,0,0 +JURIST,0,0,0,2009,0,0,0 +JURY,0,0,0,2009,0,0,0 +JUSTIFIABLE,2009,0,0,0,0,0,0 +DILIGENTLY,0,2009,0,0,0,0,0 +DIMINISHING,2009,0,0,0,0,0,0 +DISADVANTAGE,2009,0,0,0,0,0,0 +DISAFFILIATION,2009,0,0,2009,0,0,0 +DISAFFIRMS,0,0,0,2011,0,0,0 +DISAGREEING,2009,0,0,0,0,0,0 +DISALLOW,2009,0,0,0,0,0,0 +DISALLOWING,2009,0,0,0,0,0,0 +DISAPPEARANCES,2009,0,0,0,0,0,0 +DISAPPOINT,2009,0,0,0,0,0,0 +DISAPPOINTMENT,2009,0,0,0,0,0,0 +DISAPPROVALS,2009,0,0,0,0,0,0 +DISAPPROVING,2009,0,0,0,0,0,0 +DISASSOCIATIONS,2009,0,0,0,0,0,0 +DISASTROUSLY,2009,0,0,0,0,0,0 +DISAVOWING,2009,0,0,0,0,0,0 +GREATER,0,-2020,0,0,0,0,0 +GRIEVANCE,2009,0,0,0,0,0,0 +GUILTY,2009,0,0,0,0,0,0 +HAMPERED,2009,0,0,0,0,0,0 +HAPPILY,0,2009,0,0,0,0,0 +HARASSED,2009,0,0,0,0,0,0 +HARDSHIPS,2009,0,0,0,0,0,0 +HARMFULLY,2009,0,0,0,0,0,0 +HARSHER,2009,0,0,0,0,0,0 +HAZARD,2009,0,0,0,0,0,0 +NONJUDICIALLY,0,0,0,2011,0,0,0 +NONPERFORMANCE,2009,0,0,0,0,0,0 +HURT,2009,0,0,0,0,0,0 +DISFAVORED,2009,0,0,0,0,0,0 +DISGORGED,2009,0,0,0,0,0,0 +COMPLICATING,2009,0,0,0,0,0,0 +COMPLIMENTARY,0,2009,0,0,0,0,0 +COMPLY,0,0,0,0,0,0,2009 +MISSTATED,2009,0,0,0,0,0,0 +MISSTATING,2009,0,0,0,0,0,0 +MISTAKEN,2009,0,0,0,0,0,0 +MISTRIAL,2009,0,0,2009,0,0,0 +MISUNDERSTANDINGS,2009,0,0,0,0,0,0 +MISUSES,2009,0,0,0,0,0,0 +MONOPOLIZATION,2009,0,0,0,0,0,0 +MONOPOLIZING,2009,0,0,0,0,0,0 +MORATORIUMS,2009,0,0,0,0,0,0 +MOTIONS,0,0,0,2009,0,0,0 +SLOWDOWN,2009,0,0,0,0,0,0 +SLOWEST,2009,0,0,0,0,0,0 +SLUGGISH,2009,0,0,0,0,0,0 +SMOOTHING,0,2009,0,0,0,0,0 +DEPRESS,2009,0,0,0,0,0,0 +DEPRIVATION,2009,0,0,0,0,0,0 +DEPRIVING,2009,0,0,0,0,0,0 +DEROGATED,0,0,0,2009,0,0,0 +DEROGATIONS,0,0,0,2009,0,0,0 +DESIRED,0,2009,0,0,0,0,0 +DESTABILIZE,2009,0,0,0,0,0,0 +DESTROY,2009,0,0,0,0,0,0 +DESTRUCTION,2009,0,0,0,0,0,0 +DETAINER,0,0,0,2009,0,0,0 +DETERIORATE,2009,0,0,0,0,0,0 +DETERIORATION,2009,0,0,0,0,0,0 +DETERRENCES,2009,0,0,0,0,0,0 +DETERS,2009,0,0,0,0,0,0 +DETRIMENT,2009,0,0,0,0,0,0 +DEVALUE,2009,0,0,0,0,0,0 +DEVASTATE,2009,0,0,0,0,0,0 +DEVIATE,2009,0,2009,0,0,0,0 +DEVIATION,2009,0,2009,0,0,0,0 +DEVOLVED,2009,0,0,0,0,0,0 +DICTATED,0,0,0,0,0,0,2009 +DIFFERED,0,0,2009,0,0,0,0 +DIFFICULTIES,2009,0,0,0,0,0,0 +ASCENDANCY,0,0,0,2009,0,0,0 +ASSAULTED,2009,0,0,0,0,0,0 +ASSERTIONS,2009,0,0,0,0,0,0 +ASSUME,0,0,2009,0,0,0,0 +ASSUMPTION,0,0,2009,0,0,0,0 +ASSURES,0,2009,0,0,0,0,0 +ATTAINING,0,2009,0,0,0,0,0 +ATTEST,0,0,0,2009,0,0,0 +ATTESTING,0,0,0,2009,0,0,0 +ATTORNMENT,0,0,0,2009,0,0,0 +ATTRITION,2009,0,0,0,0,0,0 +BAIL,2009,0,0,2009,0,0,0 +BAILIFF,0,0,0,2009,0,0,0 +BALK,2009,0,0,0,0,0,0 +BANKRUPTCY,2009,0,0,0,0,0,0 +BANS,2009,0,0,0,0,0,0 +CLAIMABLE,0,0,0,2009,0,0,0 +CLAIMING,2009,0,0,0,0,0,0 +CLAWBACK,2009,0,0,0,0,0,0 +CLOSEOUT,2009,0,0,0,0,0,0 +CLOSURE,2009,0,0,0,0,0,0 +CODICIL,0,0,0,2009,0,0,0 +CODIFIED,0,0,0,2009,0,0,0 +COERCE,2009,0,0,0,0,0,0 +COERCION,2009,0,0,0,0,0,0 +COLLABORATING,0,2009,0,0,0,0,0 +COLLABORATOR,0,2009,0,0,0,0,0 +COLLAPSES,2009,0,0,0,0,0,0 +COLLUDE,2009,0,0,0,0,0,0 +COLLUSION,2009,0,0,2009,0,0,0 +POSING,2009,0,0,0,0,0,0 +POSSIBILITIES,0,0,2009,0,0,0,0 +POSTCLOSING,0,0,0,2011,0,0,0 +POSTPONE,2009,0,0,0,0,0,0 +POSTPONES,2009,0,0,0,0,0,0 +WRITEOFF,2009,0,0,0,0,0,0 +WRONGDOING,2009,0,0,0,0,0,0 +WRONGLY,2009,0,0,0,0,0,0 +HONORED,0,2009,0,0,0,0,0 +HOSTILITY,2009,0,0,0,0,0,0 +REASSESSED,0,0,2009,0,0,0,0 +REASSESSMENTS,2009,0,2009,0,0,0,0 +REASSIGNMENT,2009,0,0,0,0,0,0 +REBOUNDED,0,2009,0,0,0,0,0 +REBUTTABLE,0,0,0,2009,0,0,0 +REBUTTED,0,0,0,2009,0,0,0 +RECALCULATES,0,0,2009,0,0,0,0 +RECALL,2009,0,0,0,0,0,0 +RECEPTIVE,0,2009,0,0,0,0,0 +RECKLESS,2009,0,0,0,0,0,0 +RECONSIDERED,0,0,2009,0,0,0,0 +RECOUPABLE,0,0,0,2009,0,0,0 +RECOURSES,0,0,0,2009,0,0,0 +RECUSE,0,0,0,2011,0,0,0 +REDACT,2009,0,0,2009,0,0,0 +REDACTIONS,2009,0,0,2009,0,0,0 +REDRESS,2009,0,0,0,0,0,0 +REEXAMINATION,0,0,2009,0,0,0,0 +REFERENDUM,0,0,0,2009,0,0,0 +REFILES,0,0,0,2009,0,0,0 +REFRAINS,0,0,0,0,0,0,2009 +REFUSED,2009,0,0,0,0,0,0 +REGAINED,0,2009,0,0,0,0,0 +REGULATES,0,0,0,2009,0,0,0 +REGULATIVE,0,0,0,2009,0,0,0 +REHEAR,0,0,0,2009,0,0,0 +VARIABLE,0,0,2009,0,0,0,0 +VARIANCES,0,0,2009,0,0,0,0 +VARIATIONS,0,0,2009,0,0,0,0 +VARYING,0,0,2009,0,0,0,0 +VERDICTS,2009,0,0,2009,0,0,0 +VIATICAL,0,0,0,2011,0,0,0 +VIOLATE,2009,0,0,0,0,0,0 +VIOLATION,2009,0,0,0,0,0,0 +VIOLATORS,2009,0,0,0,0,0,0 +VITIATE,2009,0,0,0,0,0,0 +VITIATION,2009,0,0,0,0,0,0 +VOLATILE,2009,0,2009,0,0,0,0 +VULNERABILITY,2009,0,0,0,0,0,0 +WARNED,2009,0,0,0,0,0,0 +WARRANTEES,0,0,0,2011,0,0,0 +WASTING,2009,0,0,0,0,0,0 +WEAKENING,2009,0,0,0,0,0,0 +WEAKLY,2009,0,0,0,0,0,0 +DISHONESTY,2009,0,0,0,0,0,0 +DISHONORED,2009,0,0,0,0,0,0 +DISLOYAL,2009,0,0,0,0,0,0 +DISMALLY,2009,0,0,0,0,0,0 +DISMISSED,2009,0,0,0,0,0,0 +DISPARAGE,2009,0,0,0,0,0,0 +DISPARAGES,2009,0,0,0,0,0,0 +DISPARITY,2009,0,0,0,0,0,0 +DISPLACEMENTS,2009,0,0,0,0,0,0 +DISPOSITIVE,0,0,0,2009,0,0,0 +DISPOSSESSING,2009,0,0,0,0,0,0 +DISPROPORTIONAL,2009,0,0,0,0,0,0 +DISPUTED,2009,0,0,0,0,0,0 +DISQUALIFICATIONS,2009,0,0,0,0,0,0 +DISQUALIFYING,2009,0,0,0,0,0,0 +DISREGARDS,2009,0,0,0,0,0,0 +DISRUPTED,2009,0,0,0,0,0,0 +DISRUPTIVE,2009,0,0,0,0,0,0 +DISSENT,2009,0,0,0,0,0,0 +DISSENTING,2009,0,0,0,0,0,0 +DISSOLUTION,2009,0,0,0,0,0,0 +DISTINCTIVE,0,2009,0,0,0,0,0 +DISTORTED,2009,0,0,0,0,0,0 +DISTORTS,2009,0,0,0,0,0,0 +DISTRACTION,2009,0,0,0,0,0,0 +DISTRESS,2009,0,0,0,0,0,0 +DISTURB,2009,0,0,0,0,0,0 +DISTURBING,2009,0,0,0,0,0,0 +DIVERTED,2009,0,0,0,0,0,0 +DIVESTED,2009,0,0,0,0,0,0 +DIVESTMENT,2009,0,0,0,0,0,0 +DIVORCED,2009,0,0,0,0,0,0 +DIVULGING,2009,0,0,0,0,0,0 +DOCKETS,0,0,0,2009,0,0,0 +DOUBTFUL,2009,0,2009,0,0,0,0 +DOWNGRADES,2009,0,0,0,0,0,0 +DOWNSIZES,2009,0,0,0,0,0,0 +DOWNTIMES,2009,0,0,0,0,0,0 +DOWNWARDS,2009,0,0,0,0,0,0 +DRAWBACK,2009,0,0,0,0,0,0 +DROUGHT,2009,0,0,0,0,0,0 +DYSFUNCTION,2009,0,0,0,0,0,0 +EARMARKED,0,0,0,0,0,0,2009 +EASILY,0,2009,0,0,0,0,0 +EFFICIENCIES,0,2009,0,0,0,0,0 +EGREGIOUS,2009,0,0,0,0,0,0 +EMBARGOED,2009,0,0,0,0,0,0 +EMBARRASSED,2009,0,0,0,0,0,0 +EMBARRASSMENTS,2009,0,0,0,0,0,0 +EMBEZZLEMENTS,2009,0,0,0,0,0,0 +EMPOWER,0,2009,0,0,0,0,0 +ENABLE,0,2009,0,0,0,0,0 +ENCOURAGED,0,2009,0,0,0,0,0 +ENCROACH,2009,0,0,0,0,0,0 +ENCROACHMENT,2009,0,0,0,0,0,0 +ENCUMBERING,2009,0,0,2009,0,0,2009 +ENCUMBRANCERS,0,0,0,2011,0,0,0 +ENDANGERING,2009,0,0,0,0,0,0 +ENFORCEABILITY,0,0,0,2009,0,0,0 +ENHANCED,0,2009,0,0,0,0,0 +ENHANCING,0,2009,0,0,0,0,0 +ENJOINS,2009,0,0,0,0,0,0 +ENJOYED,0,2009,0,0,0,0,0 +ENTAIL,0,0,0,0,0,0,2009 +PECUNIARILY,0,0,0,2009,0,0,0 +PENALIZING,2009,0,0,0,0,0,0 +PERFECT,0,2009,0,0,0,0,0 +PERHAPS,0,0,2009,0,0,2009,0 +PERMISSIBLE,0,0,0,0,0,0,2009 +PERMITTEE,0,0,0,2011,0,0,0 +PERPETRATED,2009,0,0,2009,0,0,0 +PERSIST,2009,0,0,0,0,0,0 +PERSISTENTLY,2009,0,0,0,0,0,0 +PERVASIVE,2009,0,0,0,0,0,0 +PETITIONED,0,0,0,2009,0,0,0 +PETITIONS,0,0,0,2009,0,0,0 +PICKETING,2009,0,0,0,0,0,0 +HENCEFORWARD,0,0,0,2009,0,0,0 +HEREFOR,0,0,0,2009,0,0,0 +HEREINABOVE,0,0,0,2009,0,0,0 +HEREOF,0,0,0,2009,0,0,0 +HEREUNDER,0,0,0,2009,0,0,0 +HEREWITHIN,0,0,0,2014,0,0,0 +HINDERED,2009,0,0,0,0,0,0 +HINDRANCES,2009,0,0,0,0,0,0 +WHENSOEVER,0,0,0,2009,0,0,0 +WHEREBY,0,0,0,2009,0,0,0 +WHEREON,0,0,0,2009,0,0,0 +WHEREWITH,0,0,0,2009,0,0,0 +WHOSOEVER,0,0,0,2009,0,0,0 +WILLFULLY,2009,0,0,2009,0,0,0 +WINNERS,0,2009,0,0,0,0,0 +FLUCTUATING,0,0,2009,0,0,0,0 +FORBEAR,0,0,0,2009,0,0,0 +FORBEARS,0,0,0,2009,0,0,0 +FORBIDS,2009,0,0,0,0,0,2009 +FOREBEAR,0,0,0,2009,0,0,0 +FORECLOSED,2009,0,0,0,0,0,0 +FORECLOSURES,2009,0,0,0,0,0,0 +FORESTALL,2009,0,0,0,0,0,0 +FORFEIT,2009,0,0,0,0,0,0 +FORFEITING,2009,0,0,0,0,0,0 +FORGERS,2009,0,0,0,0,0,0 +FRAUD,2009,0,0,0,0,0,0 +FRAUDULENTLY,2009,0,0,0,0,0,0 +FRUSTRATE,2009,0,0,0,0,0,0 +FRUSTRATINGLY,2009,0,0,0,0,0,0 +FUGITIVES,2009,0,0,2009,0,0,0 +GAINING,0,2009,0,0,0,0,0 +GRANTORS,0,0,0,2009,0,0,0 +DISGRACE,2009,0,0,0,0,0,0 +LITIGANTS,2009,0,0,2009,0,0,0 +LITIGATING,2009,0,0,2009,0,0,0 +LITIGATORS,0,0,0,2009,0,0,0 +LACK,2009,0,0,0,0,0,0 +LACKS,2009,0,0,0,0,0,0 +LAGS,2009,0,0,0,0,0,0 +LAPSING,2009,0,0,0,0,0,0 +LAWFUL,0,0,0,2009,0,0,0 +LAWMAKING,0,0,0,2009,0,0,0 +LAWYER,0,0,0,2009,0,0,0 +LEADERSHIP,0,2009,0,0,0,0,0 +LEGALITY,0,0,0,2009,0,0,0 +LEGALIZED,0,0,0,2009,0,0,0 +LEGALS,0,0,0,2009,0,0,0 +FLAW,2009,0,0,0,0,0,0 +NONPRODUCTIVE,2009,0,0,0,0,0,0 +LIQUIDATED,2009,0,0,0,0,0,0 +LIQUIDATIONS,2009,0,0,0,0,0,0 +BENEFICIATED,0,0,0,2014,0,0,0 +BENEFITING,0,2009,0,0,0,0,0 +BETTER,0,2009,0,0,0,0,0 +POPULARITY,0,2009,0,0,0,0,0 +REINTERPRET,0,0,2009,0,0,0,0 +REINTERPRETING,0,0,2009,0,0,0,0 +REJECTING,2009,0,0,0,0,0,0 +RELEASEES,0,0,0,2011,0,0,0 +RELINQUISHING,2009,0,0,0,0,0,0 +RELUCTANT,2009,0,0,0,0,0,0 +REMANDS,0,0,0,2009,0,0,0 +REMEDIATION,0,0,0,2009,0,0,0 +RENEGOTIATE,2009,0,0,0,0,0,0 +RENEGOTIATION,2009,0,0,0,0,0,0 +RENOUNCEMENT,2009,0,0,0,0,0,0 +REPARATION,2009,0,0,0,0,0,0 +REPOSSESSED,2009,0,0,0,0,0,0 +REPOSSESSIONS,2009,0,0,0,0,0,0 +TROUBLE,2009,0,0,0,0,0,0 +TURMOIL,2009,0,0,0,0,0,0 +UNACCOUNTED,2009,0,0,0,0,0,0 +UNAPPEALABLE,0,0,0,2009,0,0,0 +UNAUTHORIZED,2009,0,0,0,0,0,0 +UNAVOIDABLY,2009,0,0,0,0,0,0 +UNCERTAINTIES,0,0,2009,0,0,0,0 +UNCOLLECTED,2009,0,0,0,0,0,0 +UNCOMPETITIVE,2009,0,0,0,0,0,0 +UNCONSCIONABLE,2009,0,0,0,0,0,0 +UNCONSTITUTIONALLY,0,0,0,2009,0,0,0 +UNCONTROLLED,2009,0,0,0,0,0,0 +UNCOVERING,2009,0,0,0,0,0,0 +UNDEFINED,0,0,2009,0,0,0,0 +UNDERCUT,2009,0,0,0,0,0,0 +UNDERESTIMATED,2009,0,0,0,0,0,0 +UNDERFUNDED,2009,0,0,0,0,0,0 +UNDERMINES,2009,0,0,0,0,0,0 +UNDERPAYMENTS,2009,0,0,0,0,0,0 +UNDERPERFORMED,2011,0,0,0,0,0,0 +UNDERPRODUCTION,2009,0,0,0,0,0,0 +UNDERSTATEMENT,2009,0,0,0,0,0,0 +UNDERUTILIZATION,2009,0,0,0,0,0,0 +UNDESIRED,2009,0,0,0,0,0,0 +UNDETERMINED,2009,0,2009,0,0,0,0 +UNDOCUMENTED,2009,0,2009,0,0,0,0 +UNECONOMIC,2009,0,0,0,0,0,0 +UNEMPLOYMENT,2009,0,0,0,0,0,0 +UNENFORCEABLE,0,0,0,2009,0,0,0 +UNETHICALLY,2009,0,0,0,0,0,0 +UNFAIR,2009,0,0,0,0,0,0 +UNFAVORABILITY,2014,0,0,0,0,0,0 +UNFEASIBLE,2009,0,0,0,0,0,0 +UNFORESEEABLE,2009,0,0,0,0,0,0 +UNFORTUNATELY,2009,0,0,0,0,0,0 +UNFUNDED,2009,0,0,0,0,0,0 +UNIDENTIFIED,0,0,2009,0,0,0,0 +UNINTENTIONALLY,2009,0,0,0,0,0,0 +UNJUSTIFIED,2009,0,0,0,0,0,0 +UNKNOWN,0,0,2009,0,0,0,0 +UNLAWFULNESS,0,0,0,2009,0,0,0 +UNMATCHED,0,2009,0,0,0,0,0 +UNNECESSARY,2009,0,0,0,0,0,0 +UNOCCUPIED,2009,0,0,0,0,0,0 +UNPLANNED,2009,0,2009,0,0,0,0 +UNPREDICTABLY,2009,0,2009,0,0,0,0 +UNPROFITABLE,2009,0,0,0,0,0,0 +UNQUANTIFIABLE,0,0,2011,0,0,0,0 +UNREASONABLENESS,2009,0,0,0,0,0,0 +UNRECOVERABLE,2009,0,0,0,0,0,0 +UNREMEDIATED,0,0,0,2011,0,0,0 +UNREST,2009,0,0,0,0,0,0 +UNSATISFACTORY,2009,0,0,0,0,0,0 +UNSEASONABLE,0,0,2009,0,0,0,0 +UNSOLD,2009,0,0,0,0,0,0 +UNSTABILIZED,2014,0,0,0,0,0,0 +UNSUCCESSFUL,2009,0,0,0,0,0,0 +UNSUITABLY,2009,0,0,0,0,0,0 +UNSUSPECTED,2009,0,0,0,0,0,0 +UNTESTED,0,0,2009,0,0,0,0 +UNTRUTH,2009,0,0,0,0,0,0 +UNTRUTHS,2009,0,0,0,0,0,0 +UNWANTED,2009,0,0,0,0,0,0 +UNWILLINGNESS,2009,0,0,0,0,0,0 +UPTURNS,0,2009,0,0,0,0,0 +USURP,2009,0,0,2009,0,0,0 +USURPS,2009,0,0,2009,0,0,0 +VAGUELY,0,0,2012,0,0,0,0 +VAGUEST,0,0,2012,0,0,0,0 +PLEA,2009,0,0,0,0,0,0 +PLEADINGS,2009,0,0,2009,0,0,0 +PLEASANTLY,0,2009,0,0,0,0,0 +PLEDGE,0,0,0,0,0,0,2009 +PLEDGES,0,0,0,0,0,0,2009 +PLENTIFUL,0,2009,0,0,0,0,0 +COMPELS,0,0,0,0,0,0,2009 +COMPLAINANTS,0,0,0,2009,0,0,0 +COMPLAINT,2009,0,0,0,0,0,0 +COMMIT,0,0,0,0,0,0,2009 +COMMITTED,0,0,0,0,0,0,2009 +LIMIT,0,0,0,0,0,0,2009 +LIMITS,0,0,0,0,0,0,2009 +RESTRAINED,0,0,0,0,0,0,2009 +RESTRAINTS,0,0,0,0,0,0,2009 +RESTRICTION,0,0,0,0,0,0,2009 +RESTRICTIVENESS,0,0,0,0,0,0,2009 +RESTRUCTURES,2009,0,0,0,0,0,0 +RETALIATED,2009,0,0,0,0,0,0 +RETALIATIONS,2009,0,0,0,0,0,0 +PRECAUTIONARY,0,0,2009,0,0,0,0 +PRECIPITOUSLY,2009,0,0,0,0,0,0 +PRECLUDING,2009,0,0,0,0,0,2009 +PREDECEASE,0,0,0,2009,0,0,0 +PREDICT,0,0,2009,0,0,0,0 +PREDICTION,0,0,2009,0,0,0,0 +PREDICTORS,0,0,2009,0,0,0,0 +PREHEARING,0,0,0,2011,0,0,0 +PREJUDICIAL,2009,0,0,2009,0,0,0 +PREMATURE,2009,0,0,0,0,0,0 +PREPETITION,0,0,0,2009,0,0,0 +PRESTIGIOUS,0,2009,0,0,0,0,0 +PRESUMES,0,0,2009,0,0,0,0 +PRESUMPTIVELY,0,0,0,2009,0,0,0 +PREVENTING,2009,0,0,0,0,0,2009 +PRIVITY,0,0,0,2011,0,0,0 +PROBABILITIES,0,0,2009,0,0,0,0 +PROBATE,0,0,0,2009,0,0,0 +PROBATION,0,0,0,2009,0,0,0 +PROBATIONERS,0,0,0,2009,0,0,0 +PROBLEMATICAL,2009,0,0,0,0,0,0 +PROFICIENTLY,0,2009,0,0,0,0,0 +PROGRESS,0,2009,0,0,0,0,0 +PROHIBIT,0,0,0,0,0,0,2009 +PROHIBITIONS,0,0,0,0,0,0,2009 +PROHIBITS,0,0,0,0,0,0,2009 +PROLONGED,2009,0,0,0,0,0,0 +PROMULGATED,0,0,0,2009,0,0,0 +PROMULGATIONS,0,0,0,2009,0,0,0 +PRORATA,0,0,0,2009,0,0,0 +PROSECUTES,2009,0,0,2009,0,0,0 +PROSECUTOR,0,0,0,2009,0,0,0 +PROSPERING,0,2009,0,0,0,0,0 +PROTEST,2009,0,0,0,0,0,0 +PROTESTING,2009,0,0,0,0,0,0 +PROTRACTED,2009,0,0,0,0,0,0 +PROVISOS,0,0,0,2009,0,0,0 +PROVOKING,2009,0,0,0,0,0,0 +PUNISHING,2009,0,0,0,0,0,0 +PURPORT,2009,0,0,0,0,0,0 +PURPORTS,2009,0,0,0,0,0,0 +QUESTIONED,2009,0,0,0,0,0,0 +QUITCLAIM,0,0,0,2009,0,0,0 +RACKETEERING,2009,0,0,0,0,0,0 +RANDOMIZES,0,0,2009,0,0,0,0 +RATA,0,0,0,2009,0,0,0 +RATIONALIZATIONS,2009,0,0,0,0,0,0 +RATIONALIZING,2009,0,0,0,0,0,0 +ABANDON,2009,0,0,0,0,0,0 +ABANDONMENTS,2009,0,0,0,0,0,0 +ABDICATING,2009,0,0,0,0,0,0 +ABERRATION,2009,0,0,0,0,0,0 +ABEYANCE,0,0,2009,0,0,0,0 +ABLE,0,2009,0,0,0,0,0 +ABNORMALLY,2009,0,0,0,0,0,0 +ABOLISHING,2009,0,0,0,0,0,0 +ABROGATES,2009,0,0,2009,0,0,0 +ABRUPT,2009,0,0,0,0,0,0 +ABSENCES,2009,0,0,0,0,0,0 +ABSOLVES,0,0,0,2009,0,0,0 +ABUSE,2009,0,0,0,0,0,0 +ABUSIVE,2009,0,0,0,0,0,0 +ACCESSIONS,0,0,0,2009,0,0,0 +ACCIDENTS,2009,0,0,0,0,0,0 +ACCOMPLISHES,0,2009,0,0,0,0,0 +ACCUSATION,2009,0,0,0,0,0,0 +ACCUSES,2009,0,0,0,0,0,0 +ACHIEVEMENT,0,2009,0,0,0,0,0 +ACQUIESCE,2009,0,0,0,0,0,0 +ACQUIREES,0,0,0,2011,0,0,0 +ACQUITTAL,2009,0,0,2009,0,0,0 +ACQUITTED,2009,0,0,2009,0,0,0 +ADJOURN,0,0,0,2009,0,0,0 +ADJOURNMENTS,0,0,0,2009,0,0,0 +ADJUDGES,0,0,0,2009,0,0,0 +ADJUDICATES,0,0,0,2009,0,0,0 +ADJUDICATIVE,0,0,0,2009,0,0,0 +ADMISSIBILITY,0,0,0,2009,0,0,0 +ADMISSIONS,0,0,0,2009,0,0,0 +ADULTERATION,2009,0,0,0,0,0,0 +ADVANCES,0,2009,0,0,0,0,0 +ADVANTAGEOUS,0,2009,0,0,0,0,0 +ADVERSARIES,2009,0,0,0,0,0,0 +ADVERSITIES,2009,0,0,0,0,0,0 +AFFIRMANCE,0,0,0,2011,0,0,0 +AFORESAID,0,0,0,2009,0,0,0 +AGAINST,2009,0,0,0,0,0,0 +AGGRAVATING,2009,0,0,0,0,0,0 +ALERTED,2009,0,0,0,0,0,0 +ALIENATES,2009,0,0,0,0,0,0 +ALLEGATION,2009,0,0,2009,0,0,0 +ALLEGEDLY,2009,0,0,2009,0,0,0 +ALLIANCES,0,2009,0,0,0,0,0 +ALWAYS,0,0,0,0,2009,0,0 +AMEND,0,0,0,2009,0,0,0 +AMENDING,0,0,0,2009,0,0,0 +ANNOY,2009,0,0,0,0,0,0 +ANNOYING,2009,0,0,0,0,0,0 +ANNULLING,2009,0,0,0,0,0,0 +ANOMALIES,2009,0,2009,0,0,0,0 +ANTECEDENT,0,0,0,2009,0,0,0 +ANTICIPATES,0,0,2009,0,0,0,0 +ANTICOMPETITIVE,2009,0,0,0,0,0,0 +APPARENT,0,0,2009,0,0,0,0 +APPEALED,0,0,0,2009,0,0,0 +APPEARED,0,0,2009,0,0,2009,0 +APPELLANTS,0,0,0,2009,0,0,0 +APPROXIMATE,0,0,2009,0,0,0,0 +APPROXIMATING,0,0,2009,0,0,0,0 +APPURTENANCES,0,0,0,2009,0,0,0 +ARBITRARILY,0,0,2009,0,0,0,0 +ARBITRATED,0,0,0,2009,0,0,0 +ARBITRATIONAL,0,0,0,2011,0,0,0 +ARBITRATORS,0,0,0,2009,0,0,0 +ARGUMENT,2009,0,0,0,0,0,0 +ARREARAGES,2009,0,0,2009,0,0,0 +ARRESTS,2009,0,0,0,0,0,0 +RETROCEDED,0,0,0,2011,0,0,0 +BOLSTERING,0,2009,0,0,0,0,0 +BOOM,0,2009,0,0,0,0,0 +BOTTLENECK,2009,0,0,0,0,0,0 +BOYCOTT,2009,0,0,0,0,0,0 +BREACH,2009,0,0,2009,0,0,0 +BREAK,2009,0,0,0,0,0,0 +BREAKDOWNS,2009,0,0,0,0,0,0 +BREAKTHROUGHS,0,2009,0,0,0,0,0 +BRIBERY,2009,0,0,0,0,0,0 +BRILLIANT,0,2009,0,0,0,0,0 +BURDENING,2009,0,0,0,0,0,0 +CALAMITIES,2009,0,0,0,0,0,0 +CANCELED,2009,0,0,0,0,0,0 +CANCELLED,2009,0,0,0,0,0,0 +CARELESSLY,2009,0,0,0,0,0,0 +CATASTROPHES,2009,0,0,0,0,0,0 +CAUTIONARY,2009,0,0,0,0,0,0 +CAUTIOUS,0,0,2009,0,0,0,0 +CEASED,2009,0,0,0,0,0,0 +CEDANTS,0,0,0,2012,0,0,0 +CENSURING,2009,0,0,0,0,0,0 +CHALLENGED,2009,0,0,0,0,0,0 +CHARITABLE,0,2009,0,0,0,0,0 +CIRCUMVENT,2009,0,0,0,0,0,0 +CIRCUMVENTIONS,2009,0,0,0,0,0,0 +SHORTAGE,2009,0,0,0,0,0,0 +SHRINKAGE,2009,0,0,0,0,0,0 +SHUTDOWNS,2009,0,0,0,0,0,0 +SLANDERED,2009,0,0,0,0,0,0 +REPUDIATES,2009,0,0,0,0,0,0 +REQUESTER,0,0,0,2011,0,0,0 +REQUIREMENT,0,0,0,0,0,0,2009 +REREGULATION,0,0,0,2011,0,0,0 +RESCINDS,0,0,0,2009,0,0,0 +RESIGNATION,2009,0,0,0,0,0,0 +RESIGNS,2009,0,0,0,0,0,0 +RESTATEMENT,2009,0,0,0,0,0,0 +RESTITUTIONARY,0,0,0,2011,0,0,0 +NOTARIAL,0,0,0,2009,0,0,0 +NOTARIZE,0,0,0,2009,0,0,0 +NOTWITHSTANDING,0,0,0,2009,0,0,0 +NULLIFICATION,2009,0,0,2009,0,0,0 +NULLIFY,2009,0,0,2009,0,0,0 +OBJECTED,2009,0,0,0,0,0,0 +OBJECTIONABLY,2009,0,0,0,0,0,0 +OBLIGATES,0,0,0,0,0,0,2009 +OBLIGATORY,0,0,0,0,0,0,2009 +OBLIGEES,0,0,0,2011,0,0,0 +OBSCENE,2009,0,0,0,0,0,0 +OBSTACLE,2009,0,0,0,0,0,0 +OBSTRUCTING,2009,0,0,0,0,0,0 +OFFENCE,2009,0,0,0,0,0,0 +OFFENDER,2009,0,0,0,0,0,0 +OFFENSE,0,0,0,2009,0,0,0 +OFFERORS,0,0,0,2011,0,0,0 +OMITS,2009,0,0,0,0,0,0 +OPPORTUNISTIC,2009,0,0,0,0,0,0 +OPPOSE,2009,0,0,0,0,0,0 +OPPOSITION,2009,0,0,0,0,0,0 +OPTIONEES,0,0,0,2009,0,0,0 +OUTDATED,2009,0,0,0,0,0,0 +OUTPERFORMING,0,2009,0,0,0,0,0 +OVERBUILD,2009,0,0,0,0,0,0 +OVERBURDEN,2009,0,0,0,0,0,0 +OVERCAPACITY,2009,0,0,0,0,0,0 +OVERCHARGING,2009,0,0,0,0,0,0 +OVERDUE,2009,0,0,0,0,0,0 +OVERESTIMATING,2009,0,0,0,0,0,0 +OVERLOADED,2009,0,0,0,0,0,0 +OVERLOOKED,2009,0,0,0,0,0,0 +OVERPAYMENT,2009,0,0,0,0,0,0 +OVERPRODUCING,2009,0,0,0,0,0,0 +OVERRULES,0,0,0,2009,0,0,0 +OVERRUNS,2009,0,0,0,0,0,0 +OVERSHADOWS,2009,0,0,0,0,0,0 +OVERSTATEMENTS,2009,0,0,0,0,0,0 +OVERSUPPLIES,2009,0,0,0,0,0,0 +OVERTURN,2009,0,0,0,0,0,0 +OVERVALUE,2009,0,0,0,0,0,0 +PANICS,2009,0,0,0,0,0,0 +NECESSITATE,0,0,0,0,0,0,2009 +NEGATIVE,2009,0,0,0,0,0,0 +NEGLECTED,2009,0,0,0,0,0,0 +NEGLIGENCE,2009,0,0,0,0,0,0 +NEVER,0,0,0,0,2009,0,0 +BARRIERS,2009,0,0,0,0,0,0 +BELIEVED,0,0,2009,0,0,0,0 +IDLING,2009,0,0,0,0,0,0 +IGNORING,2009,0,0,0,0,0,0 +ILLEGALITY,2009,0,0,0,0,0,0 +ILLICITLY,2009,0,0,0,0,0,0 +IMBALANCES,2009,0,0,0,0,0,0 +IMPAIR,2009,0,0,0,0,0,2011 +IMPAIRMENTS,2009,0,0,0,0,0,2011 +IMPEDE,2009,0,0,0,0,0,0 +IMPEDIMENTS,2009,0,0,0,0,0,0 +IMPERFECTION,2009,0,0,0,0,0,0 +IMPLEADED,0,0,0,2009,0,0,0 +IMPLICATING,2009,0,0,0,0,0,0 +IMPOSING,0,0,0,0,0,0,2009 +IMPOSSIBLE,2009,0,0,0,0,0,0 +IMPOUNDS,2009,0,0,0,0,0,0 +IMPRACTICALITY,2009,0,0,0,0,0,0 +IMPRESS,0,2009,0,0,0,0,0 +IMPRESSIVE,0,2009,0,0,0,0,0 +IMPROBABLE,0,0,2009,0,0,0,0 +IMPROPRIETY,2009,0,0,0,0,0,0 +IMPROVEMENTS,0,2009,0,0,0,0,0 +IMPRUDENTLY,2009,0,0,0,0,0,0 +INACCURACY,2009,0,0,0,0,0,0 +INACTIONS,2009,0,0,0,0,0,0 +INACTIVATING,2009,0,0,0,0,0,0 +INADEQUACIES,2009,0,0,0,0,0,0 +INADVERTENT,2009,0,0,0,0,0,0 +INAPPROPRIATE,2009,0,0,0,0,0,0 +INCAPABLE,2009,0,0,0,0,0,0 +INCARCERATED,2009,0,0,2009,0,0,0 +INCARCERATIONS,2009,0,0,2009,0,0,0 +INCIDENT,2009,0,0,0,0,0,0 +INCOMPATIBLE,2009,0,0,0,0,0,0 +INCOMPETENTLY,2009,0,0,0,0,0,0 +INCOMPLETENESS,2009,0,2009,0,0,0,0 +INCONSISTENT,2009,0,0,0,0,0,0 +INCONVENIENCE,2009,0,0,0,0,0,0 +INCORRECTLY,2009,0,0,0,0,0,0 +INDEBTED,0,0,0,0,0,0,2009 +INDEFEASIBLY,2009,0,0,0,0,0,0 +INDEMNIFIABLE,0,0,0,2009,0,0,0 +INDEMNIFIES,0,0,0,2009,0,0,0 +INDEMNITEES,0,0,0,2009,0,0,0 +INDEMNITY,0,0,0,2009,0,0,0 +INDICTABLE,2009,0,0,2009,0,0,0 +INDICTMENTS,2009,0,0,2009,0,0,0 +INEFFECTIVENESS,2009,0,0,0,0,0,0 +INEFFICIENTLY,2009,0,0,0,0,0,0 +INEQUITABLY,2009,0,0,0,0,0,0 +INEXACT,0,0,2009,0,0,0,0 +INFERIOR,2009,0,0,0,0,0,0 +INFORMATIVE,0,2009,0,0,0,0,0 +INFRINGED,2009,0,0,0,0,0,0 +INFRINGES,2009,0,0,0,0,0,0 +INHIBITED,2009,0,0,0,0,0,2009 +INJUNCTION,2009,0,0,2009,0,0,0 +INJURED,2009,0,0,0,0,0,0 +INJURIOUS,2009,0,0,0,0,0,0 +INNOVATES,0,2009,0,0,0,0,0 +INNOVATIVE,0,2009,0,0,0,0,0 +INORDINATE,2009,0,0,0,0,0,0 +INSENSITIVE,2009,0,0,0,0,0,0 +INSISTENCE,0,0,0,0,0,0,2009 +INSOLVENCIES,2009,0,0,0,0,0,0 +INSPIRATIONAL,0,2009,0,0,0,0,0 +INSUFFICIENCY,2009,0,0,0,0,0,0 +INSURRECTIONS,2009,0,0,0,0,0,0 +INTENTIONAL,2009,0,0,0,0,0,0 +INTERFERENCES,2009,0,0,0,0,0,0 +INTERMITTENT,2009,0,0,0,0,0,0 +INTERPOSED,0,0,0,2009,0,0,0 +INTERPOSITIONS,0,0,0,2009,0,0,0 +INTERROGATING,0,0,0,2009,0,0,0 +INTERROGATORIES,0,0,0,2009,0,0,0 +INTERRUPTED,2009,0,0,0,0,0,0 +INTERRUPTS,2009,0,0,0,0,0,0 +STABILITY,0,2009,0,0,0,0,0 +STABILIZED,0,2009,0,0,0,0,0 +STAGGERING,2009,0,0,0,0,0,0 +STAGNATES,2009,0,0,0,0,0,0 +STANDSTILLS,2009,0,0,0,0,0,0 +STATUTORY,0,0,0,2009,0,0,0 +STIPULATING,0,0,0,0,0,0,2009 +STOPPAGE,2009,0,0,0,0,0,0 +STOPS,2009,0,0,0,0,0,0 +STRAINS,2009,0,0,0,0,0,0 +STRENGTHENING,0,2009,0,0,0,0,0 +STRESSED,2009,0,0,0,0,0,0 +STRICT,0,0,0,0,0,0,2009 +STRINGENT,2009,0,0,0,0,0,0 +STRONGLY,0,0,0,0,2009,0,0 +SUBJECTED,2009,0,0,0,0,0,0 +SUBLEASEHOLD,0,0,0,2011,0,0,0 +SUBPARAGRAPH,0,0,0,2009,0,0,0 +SUBPOENAS,2009,0,0,2009,0,0,0 +SUBTRUST,0,0,0,2011,0,0,0 +SUCCEEDING,0,2009,0,0,0,0,0 +SUCCESSFUL,0,2009,0,0,0,0,0 +SUE,2009,0,0,2009,0,0,0 +SUFFERED,2009,0,0,0,0,0,0 +SUGGESTED,0,0,2009,0,0,0,0 +SUMMONED,2009,0,0,2009,0,0,0 +SUPERIOR,0,2009,0,0,0,0,0 +SUPERSEDES,0,0,0,2009,0,0,0 +SURPASS,0,2009,0,0,0,0,0 +SUSCEPTIBILITY,2009,0,2009,0,0,0,0 +SUSPECTS,2009,0,0,0,0,0,0 +SUSPENDS,2009,0,0,0,0,0,0 +SUSPICIONS,2009,0,0,0,0,0,0 +REVOCABILITY,0,0,0,2011,0,0,0 +REVOKED,2009,0,0,0,0,0,0 +REVOLUTIONIZED,0,2009,0,0,0,0,0 +REWARDED,0,2009,0,0,0,0,0 +RIDICULED,2009,0,0,0,0,0,0 +RISKED,0,0,2009,0,0,0,0 +RISKING,0,0,2009,0,0,0,0 +RULING,0,0,0,2009,0,0,0 +SACRIFICE,2009,0,0,0,0,0,0 +SACRIFICING,2009,0,0,0,0,0,0 +SATISFIED,0,2009,0,0,0,0,0 +SCANDALOUS,2009,0,0,0,0,0,0 +SCRUTINIZES,2009,0,0,0,0,0,0 +SEEMS,0,0,2009,0,0,0,0 +SEIZING,2009,0,0,0,0,0,0 +SENTENCING,2009,0,0,2009,0,0,0 +SERIOUSNESS,2009,0,0,0,0,0,0 +SETTLEMENTS,0,0,0,2009,0,0,0 +SEVERALLY,0,0,0,2009,0,0,0 +SEVERED,2009,0,0,0,0,0,0 +ENTHUSIASTICALLY,0,2009,0,0,0,0,0 +ERODED,2009,0,0,0,0,0,0 +ERRATIC,2009,0,0,0,0,0,0 +ERRONEOUS,2009,0,0,0,0,0,0 +ERRS,2009,0,0,0,0,0,0 +ESCALATING,2009,0,0,0,0,0,0 +ESCROW,0,0,0,0,0,0,2009 +ESTOPPEL,0,0,0,2011,0,0,0 +EVADING,2009,0,0,0,0,0,0 +EVICT,2009,0,0,0,0,0,0 +EVICTIONS,2009,0,0,0,0,0,0 +EXACERBATE,2009,0,0,0,0,0,0 +EXACERBATION,2009,0,0,0,0,0,0 +EXAGGERATES,2009,0,0,0,0,0,0 +EXCEEDANCES,0,0,0,2011,0,0,0 +EXCELLING,0,2009,0,0,0,0,0 +EXCESSIVE,2009,0,0,0,0,0,0 +EXCITEMENT,0,2009,0,0,0,0,0 +EXCLUSIVENESS,0,2009,0,0,0,0,0 +EXCULPATED,2009,0,0,2009,0,0,0 +EXCULPATIONS,2009,0,0,2009,0,0,0 +EXECUTORY,0,0,0,2009,0,0,0 +EXEMPLARY,0,2009,0,0,0,0,0 +EXONERATING,2009,0,0,0,0,0,0 +EXPLOITATION,2009,0,0,0,0,0,0 +EXPLOITING,2009,0,0,0,0,0,0 +EXPOSES,2009,0,0,0,0,0,0 +EXPROPRIATE,2009,0,0,0,0,0,0 +EXPROPRIATION,2009,0,0,0,0,0,0 +EXTENUATING,2009,0,0,0,0,0,0 +SOLVING,0,2009,0,0,0,0,0 +SOMEWHERE,0,0,2009,0,0,0,0 +LOSE,2009,0,0,0,0,0,0 +LOSSES,2009,0,0,0,0,0,0 +LUCRATIVE,0,2009,0,0,0,0,0 +MALFUNCTION,2009,0,0,0,0,0,0 +MALICE,2009,0,0,0,0,0,0 +MANDAMUS,0,0,0,2009,0,0,0 +MANDATING,0,0,0,0,0,0,2009 +MANIPULATED,2009,0,0,0,0,0,0 +MANIPULATIONS,2009,0,0,0,0,0,0 +MAY,0,0,2009,0,0,2009,0 +MEDIATES,0,0,0,2009,0,0,0 +MEDIATOR,0,0,0,2009,0,0,0 +MISAPPLICATION,2009,0,0,0,0,0,0 +MISAPPLY,2009,0,0,0,0,0,0 +MISAPPROPRIATES,2009,0,0,0,0,0,0 +MISBRANDED,2009,0,0,0,0,0,0 +MISCALCULATING,2009,0,0,0,0,0,0 +MISCHIEF,2009,0,0,0,0,0,0 +MISCLASSIFY,2014,0,0,0,0,0,0 +MISDEMEANOR,2009,0,0,2009,0,0,0 +MISHANDLE,2009,0,0,0,0,0,0 +MISINFORM,2009,0,0,0,0,0,0 +MISINFORMS,2009,0,0,0,0,0,0 +MISINTERPRETED,2009,0,0,0,0,0,0 +MISJUDGED,2009,0,0,0,0,0,0 +MISJUDGMENTS,2009,0,0,0,0,0,0 +MISLABELLED,2009,0,0,0,0,0,0 +MISLEADINGLY,2009,0,0,0,0,0,0 +MISMANAGED,2009,0,0,0,0,0,0 +MISMATCH,2009,0,0,0,0,0,0 +MISPLACED,2009,0,0,0,0,0,0 +MISREPRESENT,2009,0,0,0,0,0,0 +MISREPRESENTING,2009,0,0,0,0,0,0 +MISSES,2009,0,0,0,0,0,0 +WORRY,2009,0,0,0,0,0,0 +WORSENED,2009,0,0,0,0,0,0 +WORTHLESS,2009,0,0,0,0,0,0 +TOLERATE,2009,0,0,0,0,0,0 +TOLERATION,2009,0,0,0,0,0,0 +TORTS,0,0,0,2009,0,0,0 +FICTITIOUS,2009,0,0,0,0,0,0 +FIRED,2009,0,0,0,0,0,0 +NONATTAINMENT,2009,0,0,0,0,0,0 +NONCOMPETITIVE,2009,0,0,0,0,0,0 +NONCOMPLYING,2009,0,0,0,0,0,0 +NONCONTINGENT,0,0,0,2011,0,0,0 +NONDISCLOSURE,2009,0,0,0,0,0,0 +NONFORFEITABLE,0,0,0,2009,0,0,0 +DISCLAIM,2009,0,0,0,0,0,0 +DISCLAIMING,2009,0,0,0,0,0,0 +DISCLOSES,2009,0,0,0,0,0,0 +DISCONTINUATION,2009,0,0,0,0,0,0 +DISCONTINUES,2009,0,0,0,0,0,0 +DISCOURAGES,2009,0,0,0,0,0,0 +DISCREDITING,2009,0,0,0,0,0,0 +SPECTACULAR,0,2009,0,0,0,0,0 +SPECULATES,0,0,2009,0,0,0,0 +SPECULATIVE,0,0,2009,0,0,0,0 +TRAGEDIES,2009,0,0,0,0,0,0 +TRANSFEROR,0,0,0,2009,0,0,0 +LEGISLATES,0,0,0,2009,0,0,0 +LEGISLATIVE,0,0,0,2009,0,0,0 +LEGISLATURE,0,0,0,2009,0,0,0 +LIBELOUS,0,0,0,2009,0,0,0 +LIENHOLDERS,0,0,0,2011,0,0,0 +COMPULSORY,0,0,0,0,0,0,2009 +CONCEDED,2009,0,0,0,0,0,0 +CONCEIVABLY,0,0,2009,0,0,0,0 +CONCILIATING,2009,0,0,0,0,0,0 +CONCLUSIVELY,0,2009,0,0,0,0,0 +CONDEMNED,2009,0,0,0,0,0,0 +CONDITIONAL,0,0,2009,0,0,0,0 +CONDUCIVE,0,2009,0,0,0,0,0 +CONFESSING,2009,0,0,0,0,0,0 +CONFINED,2009,0,0,0,0,0,2009 +CONFINING,2009,0,0,0,0,0,2009 +CONFISCATING,2009,0,0,0,0,0,0 +CONFLICT,2009,0,0,0,0,0,0 +CONFRONT,2009,0,0,0,0,0,0 +CONFRONTED,2009,0,0,0,0,0,0 +CONFUSED,2009,0,0,0,0,0,0 +CONFUSION,2009,0,2009,0,0,0,0 +CONSENTS,0,0,0,2009,0,0,0 +CONSPIRATOR,2009,0,0,0,0,0,0 +CONSPIRED,2009,0,0,0,0,0,0 +CONSTITUTIONAL,0,0,0,2009,0,0,0 +CONSTITUTIVE,0,0,0,2009,0,0,0 +CONSTRAINS,0,0,0,0,0,0,2009 +CONSTRUCTIVELY,0,2009,0,0,0,0,0 +CONSTRUING,0,0,0,2012,0,0,0 +CONTENDING,2009,0,0,0,0,0,0 +CONTENTIOUS,2009,0,0,0,0,0,0 +CONTESTED,2009,0,0,0,0,0,0 +CONTINGENT,0,0,2009,0,0,0,0 +CONTRACTED,0,0,0,2009,0,0,0 +CONTRACTILE,0,0,0,2009,0,0,0 +CONTRACTS,0,0,0,2009,0,0,0 +CONTRADICTED,2009,0,0,0,0,0,0 +CONTRADICTORY,2009,0,0,0,0,0,0 +CONTRAVENED,0,0,0,2009,0,0,0 +CONTRAVENTIONS,0,0,0,2009,0,0,0 +CONTROVERT,0,0,0,2009,0,0,0 +CONVEYANCE,0,0,0,2009,0,0,0 +CONVICTING,2009,0,0,2009,0,0,0 +CORRECTING,2009,0,0,0,0,0,0 +CORRUPT,2009,0,0,0,0,0,0 +CORRUPTIONS,2009,0,0,0,0,0,0 +COTERMINOUS,0,0,0,2009,0,0,0 +COUNSELLED,0,0,0,2009,0,0,0 +COUNTERCLAIMING,2009,0,0,0,0,0,0 +COUNTERFEITER,2009,0,0,0,0,0,0 +COUNTERMEASURE,2009,0,0,0,0,0,0 +COUNTERSUIT,0,0,0,2011,0,0,0 +COURTROOM,0,0,0,2009,0,0,0 +COVENANTING,0,0,0,0,0,0,2011 +CREATIVENESS,0,2009,0,0,0,0,0 +CRIMINAL,2009,0,0,2009,0,0,0 +CRIMINALLY,2009,0,0,2009,0,0,0 +CRITICAL,-2020,0,0,0,0,0,0 +CRITICIZE,2009,0,0,0,0,0,0 +CROSSCLAIM,0,0,0,2011,0,0,0 +CRUCIAL,2009,0,0,0,0,0,0 +CULPABLY,2009,0,0,0,0,0,0 +CURTAILING,2009,0,0,0,0,0,0 +CUT,2009,0,0,0,0,0,0 +CYBERATTACKS,2014,0,0,0,0,0,0 +CYBERCRIMINAL,2014,0,0,0,0,0,0 +TAINT,2009,0,0,0,0,0,0 +TAMPERED,2009,0,0,0,0,0,0 +TENTATIVE,0,0,2009,0,0,0,0 +TERMINATED,2009,0,0,0,0,0,0 +TERMINATIONS,2009,0,0,0,0,0,0 +TESTIFYING,2009,0,0,2009,0,0,0 +THENCEFORWARD,0,0,0,2009,0,0,0 +THEREIN,0,0,0,2009,0,0,0 +THEREOVER,0,0,0,2011,0,0,0 +THEREUNDER,0,0,0,2009,0,0,0 +THREAT,2009,0,0,0,0,0,0 +THREATENS,2009,0,0,0,0,0,0 +FACTO,0,0,0,2011,0,0,0 +FAILINGS,2009,0,0,0,0,0,0 +FALLOUT,2009,0,0,0,0,0,0 +FALSIFICATIONS,2009,0,0,0,0,0,0 +FALSIFYING,2009,0,0,0,0,0,0 +FATALITY,2009,0,0,0,0,0,0 +FAULTS,2009,0,0,0,0,0,0 +FAVORED,0,2009,0,0,0,0,0 +FEAR,2009,0,0,0,0,0,0 +FELONY,2009,0,0,2009,0,0,0 +DAMAGING,2009,0,0,0,0,0,0 +DANGEROUS,2009,0,0,0,0,0,0 +DEADLOCKED,2009,0,0,0,0,0,0 +DEADWEIGHTS,2009,0,0,0,0,0,0 +DECEASED,2009,0,0,0,0,0,0 +DECEITFUL,2009,0,0,0,0,0,0 +DECEIVES,2009,0,0,0,0,0,0 +DECEPTIVE,2009,0,0,0,0,0,0 +DECLINED,2009,0,0,0,0,0,0 +DECREED,0,0,0,2009,0,0,0 +DEFACED,2009,0,0,0,0,0,0 +DEFAMATION,2009,0,0,0,0,0,0 +DEFAMED,2009,0,0,0,0,0,0 +DEFAULTED,2009,0,0,0,0,0,0 +DEFEASANCES,0,0,0,2011,0,0,0 +DEFEASES,0,0,0,2014,0,0,0 +DEFEATING,2009,0,0,0,0,0,0 +DEFECTIVELY,0,0,0,2009,0,0,0 +DEFENDANT,2009,0,0,2009,0,0,0 +DEFENDS,2009,0,0,0,0,0,0 +DEFICIENCIES,2009,0,0,0,0,0,0 +DEFICITS,2009,0,0,0,0,0,0 +DEFRAUDED,2009,0,0,0,0,0,0 +DEGRADATION,2009,0,0,0,0,0,0 +DEGRADES,2009,0,0,0,0,0,0 +DELAYING,2009,0,0,0,0,0,0 +DELEGATEE,0,0,0,2011,0,0,0 +DELIBERATED,2009,0,0,0,0,0,0 +DELIGHTFUL,0,2009,0,0,0,0,0 +DELINQUENCIES,2009,0,0,0,0,0,0 +DELINQUENTS,2009,0,0,0,0,0,0 +DELISTS,2011,0,0,0,0,0,0 +DEMISING,2009,0,0,0,0,0,0 +DEMOLISHING,2009,0,0,0,0,0,0 +DEMOTED,2009,0,0,0,0,0,0 +DEMOTIONS,2009,0,0,0,0,0,0 +DEMURRING,0,0,0,2009,0,0,0 +DENIED,2009,0,0,0,0,0,0 +DENIGRATES,2009,0,0,0,0,0,0 +DENYING,2009,0,0,0,0,0,0 +DEPENDANCE,0,0,0,0,0,0,2011 +DEPENDENCE,0,0,2009,0,0,0,0 +DEPENDING,0,0,2009,0,0,2009,2011 +DEPLETES,2009,0,0,0,0,0,0 +DEPOSE,0,0,0,2009,0,0,0 +DEPOSITION,0,0,0,2009,0,0,0 +INVALIDATE,2009,0,0,0,0,0,0 +INVALIDATION,2009,0,0,0,0,0,0 +INVENTING,0,2009,0,0,0,0,0 +INVENTIVENESS,0,2009,0,0,0,0,0 +INVESTIGATED,2009,0,0,0,0,0,0 +INVESTIGATIONS,2009,0,0,0,0,0,0 +IRRECONCILABLY,2009,0,0,0,0,0,0 +IRREGULARITIES,2009,0,0,0,0,0,0 +IRREPARABLY,2009,0,0,0,0,0,0 +IRREVOCABLY,0,0,0,2009,0,0,2009 +JUDICIAL,0,0,0,2009,0,0,0 +JURIES,0,0,0,2009,0,0,0 +JURISDICTIONALLY,0,0,0,2011,0,0,0 +JURISTS,0,0,0,2009,0,0,0 +JURYMAN,0,0,0,2009,0,0,0 +KICKBACK,2009,0,0,0,0,0,0 +DIMINISH,2009,0,0,0,0,0,0 +DIMINUTION,2009,0,0,0,0,0,0 +DISADVANTAGED,2009,0,0,0,0,0,0 +DISAFFIRM,0,0,0,2009,0,0,0 +DISAGREE,2009,0,0,0,0,0,0 +DISAGREEMENT,2009,0,0,0,0,0,0 +DISALLOWANCE,2009,0,0,0,0,0,0 +DISALLOWS,2009,0,0,0,0,0,0 +DISAPPEARED,2009,0,0,0,0,0,0 +DISAPPOINTED,2009,0,0,0,0,0,0 +DISAPPOINTMENTS,2009,0,0,0,0,0,0 +DISAPPROVE,2009,0,0,0,0,0,0 +DISASSOCIATES,2009,0,0,0,0,0,0 +DISASTER,2009,0,0,0,0,0,0 +DISAVOW,2009,0,0,0,0,0,0 +DISAVOWS,2009,0,0,0,0,0,0 +GRATUITOUS,2009,0,0,0,0,0,0 +GREATEST,0,2009,0,0,0,0,0 +GRIEVANCES,2009,0,0,0,0,0,0 +HALT,2009,0,0,0,0,0,0 +HAMPERING,2009,0,0,0,0,0,0 +HAPPINESS,0,2009,0,0,0,0,0 +HARASSING,2009,0,0,0,0,0,0 +HARM,2009,0,0,0,0,0,0 +HARMING,2009,0,0,0,0,0,0 +HARSHEST,2009,0,0,0,0,0,0 +HAZARDOUS,2009,0,0,0,0,0,0 +NONINFRINGEMENT,0,0,0,2011,0,0,0 +NONJURISDICTIONAL,0,0,0,2011,0,0,0 +NONPERFORMANCES,2009,0,0,0,0,0,0 +HURTING,2009,0,0,0,0,0,0 +DISFAVORING,2009,0,0,0,0,0,0 +DISGORGEMENT,2009,0,0,0,0,0,0 +COMPLICATE,2009,0,0,0,0,0,0 +COMPLICATION,2009,0,0,0,0,0,0 +COMPLIMENTED,0,2009,0,0,0,0,0 +MISSTATEMENT,2009,0,0,0,0,0,0 +MISSTEP,2009,0,0,0,0,0,0 +MISTAKENLY,2009,0,0,0,0,0,0 +MISTRIALS,2009,0,0,2009,0,0,0 +MISUNDERSTOOD,2009,0,0,0,0,0,0 +MISUSING,2009,0,0,0,0,0,0 +MONOPOLIZE,2009,0,0,0,0,0,0 +MONOPOLY,2009,0,0,0,0,0,0 +MOREOVER,0,0,0,2009,0,0,0 +MUST,0,0,0,0,2009,0,0 +SLIPPAGE,2009,0,0,0,0,0,0 +SLOWDOWNS,2009,0,0,0,0,0,0 +SLOWING,2009,0,0,0,0,0,0 +SLUGGISHLY,2009,0,0,0,0,0,0 +SMOOTHLY,0,2009,0,0,0,0,0 +DEPRESSED,2009,0,0,0,0,0,0 +DEPRIVE,2009,0,0,0,0,0,0 +DERELICT,2009,0,0,0,0,0,0 +DEROGATES,0,0,0,2009,0,0,0 +DEROGATORY,2009,0,0,0,0,0,0 +DESIST,0,0,0,2009,0,0,0 +DESTABILIZED,2009,0,0,0,0,0,0 +DESTROYED,2009,0,0,0,0,0,0 +DESTRUCTIVE,2009,0,0,0,0,0,0 +DETENTION,2009,0,0,0,0,0,0 +DETERIORATED,2009,0,0,0,0,0,0 +DETERIORATIONS,2009,0,0,0,0,0,0 +DETERRENT,2009,0,0,0,0,0,0 +DETRACT,2009,0,0,0,0,0,0 +DETRIMENTAL,2009,0,0,0,0,0,0 +DEVALUED,2009,0,0,0,0,0,0 +DEVASTATED,2009,0,0,0,0,0,0 +DEVIATED,2009,0,2009,0,0,0,0 +DEVIATIONS,2009,0,2009,0,0,0,0 +DEVOLVES,2009,0,0,0,0,0,0 +DICTATES,0,0,0,0,0,0,2009 +DIFFERING,0,0,2009,0,0,0,0 +DIFFICULTLY,2009,0,0,0,0,0,0 +ASCENDANT,0,0,0,2009,0,0,0 +ASSAULTING,2009,0,0,0,0,0,0 +ASSIGNATION,0,0,0,2009,0,0,0 +ASSUMED,0,0,2009,0,0,0,0 +ASSUMPTIONS,0,0,2009,0,0,0,0 +ASSURING,0,2009,0,0,0,0,0 +ATTAINMENT,0,2009,0,0,0,0,0 +ATTESTATION,0,0,0,2009,0,0,0 +ATTORN,0,0,0,2011,0,0,0 +ATTORNS,0,0,0,2011,0,0,0 +AVERSELY,2011,0,0,0,0,0,0 +BAILED,0,0,0,2009,0,0,0 +BAILIFFS,0,0,0,2009,0,0,0 +BALKED,2009,0,0,0,0,0,0 +BANKRUPTED,2009,0,0,0,0,0,0 +CLAIMANT,0,0,0,2009,0,0,0 +CLAIMS,2009,0,0,2009,0,0,0 +CLAWBACKS,0,0,0,2014,0,0,0 +CLOSEOUTS,2009,0,0,0,0,0,0 +CLOSURES,2009,0,0,0,0,0,0 +CODICILS,0,0,0,2009,0,0,0 +CODIFIES,0,0,0,2009,0,0,0 +COERCED,2009,0,0,0,0,0,0 +COERCIVE,2009,0,0,0,0,0,0 +DISINCENTIVES,2009,0,0,0,0,0,0 +COLLABORATE,0,2009,0,0,0,0,0 +COLLABORATION,0,2009,0,0,0,0,0 +COLLABORATORS,0,2009,0,0,0,0,0 +COLLAPSING,2009,0,0,0,0,0,0 +COLLUDED,2009,0,0,0,0,0,0 +COLLUSIONS,2009,0,0,0,0,0,0 +POSITIVE,0,2009,0,0,0,0,0 +POSSIBILITY,0,0,2009,0,0,0,0 +POSTCLOSURE,0,0,0,2011,0,0,0 +POSTPONED,2009,0,0,0,0,0,0 +POSTPONING,2009,0,0,0,0,0,0 +WRIT,0,0,0,2009,0,0,0 +WRITEOFFS,2009,0,0,0,0,0,0 +WRONGDOINGS,2009,0,0,0,0,0,0 +HONORING,0,2009,0,0,0,0,0 +REASSESSES,0,0,2009,0,0,0,0 +REASSIGN,2009,0,0,0,0,0,0 +REASSIGNMENTS,2009,0,0,0,0,0,0 +REBOUNDING,0,2009,0,0,0,0,0 +REBUTTABLY,0,0,0,2011,0,0,0 +REBUTTING,0,0,0,2009,0,0,0 +RECALCULATING,0,0,2009,0,0,0,0 +RECALLED,2009,0,0,0,0,0,0 +RECESSION,2009,0,0,0,0,0,0 +RECKLESSLY,2009,0,0,0,0,0,0 +RECONSIDERING,0,0,2009,0,0,0,0 +RECOUPMENT,0,0,0,2009,0,0,0 +RECTIFICATION,0,0,0,2009,0,0,0 +RECUSED,0,0,0,2011,0,0,0 +REDACTED,2009,0,0,2009,0,0,0 +REDEFAULT,2014,0,0,0,0,0,0 +REDRESSED,2009,0,0,0,0,0,0 +REEXAMINE,0,0,2009,0,0,0,0 +REFERENDUMS,0,0,0,2009,0,0,0 +REFILING,0,0,0,2009,0,0,0 +REFUSAL,2009,0,0,0,0,0,0 +REFUSES,2009,0,0,0,0,0,0 +REGAINING,0,2009,0,0,0,0,0 +REGULATING,0,0,0,2009,0,0,0 +REGULATOR,0,0,0,2009,0,0,0 +REHEARD,0,0,0,2009,0,0,0 +VARIABLES,0,0,2009,0,0,0,0 +VARIANT,0,0,2009,0,0,0,0 +VARIED,0,0,2009,0,0,0,0 +VENDEE,0,0,0,2011,0,0,0 +VERSATILE,0,2009,0,0,0,0,0 +VIBRANCY,0,2009,0,0,0,0,0 +VIOLATED,2009,0,0,0,0,0,0 +VIOLATIONS,2009,0,0,0,0,0,0 +VIOLENCE,2009,0,0,0,0,0,0 +VITIATED,2009,0,0,0,0,0,0 +VOIDABLE,0,0,0,2009,0,0,0 +VOLATILITIES,0,0,2009,0,0,0,0 +VULNERABLE,2009,0,0,0,0,0,0 +WARNING,2009,0,0,0,0,0,0 +WARRANTOR,0,0,0,2011,0,0,0 +WEAK,2009,0,0,0,0,0,0 +WEAKENS,2009,0,0,0,0,0,0 +WEAKNESS,2009,0,0,0,0,0,0 +DISHONOR,2009,0,0,0,0,0,0 +DISHONORING,2009,0,0,0,0,0,0 +DISINTERESTED,2009,0,0,0,0,0,0 +DISLOYALLY,2009,0,0,0,0,0,0 +DISMISS,2009,0,0,0,0,0,0 +DISMISSES,2009,0,0,0,0,0,0 +DISPARAGED,2009,0,0,0,0,0,0 +DISPARAGING,2009,0,0,0,0,0,0 +DISPLACE,2009,0,0,0,0,0,0 +DISPLACES,2009,0,0,0,0,0,0 +DISPOSSESS,2009,0,0,0,0,0,0 +DISPOSSESSION,0,0,0,2009,0,0,0 +DISPROPORTIONATE,2009,0,0,0,0,0,0 +DISPUTES,2009,0,0,0,0,0,0 +DISQUALIFIED,2009,0,0,0,0,0,0 +DISREGARD,2009,0,0,0,0,0,0 +DISREPUTABLE,2009,0,0,0,0,0,0 +DISRUPTING,2009,0,0,0,0,0,0 +DISRUPTS,2009,0,0,0,0,0,0 +DISSENTED,2009,0,0,0,0,0,0 +DISSENTS,2009,0,0,0,0,0,0 +DISSOLUTIONS,2009,0,0,0,0,0,0 +DISTINCTIVELY,0,2009,0,0,0,0,0 +DISTORTING,2009,0,0,0,0,0,0 +DISTRACT,2009,0,0,0,0,0,0 +DISTRACTIONS,2009,0,0,0,0,0,0 +DISTRESSED,2009,0,0,0,0,0,0 +DISTURBANCE,2009,0,0,0,0,0,0 +DISTURBS,2009,0,0,0,0,0,0 +DIVERTING,2009,0,0,0,0,0,0 +DIVESTING,2009,0,0,0,0,0,0 +DIVESTMENTS,2009,0,0,0,0,0,0 +DIVULGE,2009,0,0,0,0,0,0 +DOCKET,0,0,0,2009,0,0,0 +DONEES,0,0,0,2011,0,0,0 +DOUBTS,2009,0,2009,0,0,0,0 +DOWNGRADING,2009,0,0,0,0,0,0 +DOWNSIZING,2009,0,0,0,0,0,0 +DOWNTURN,2009,0,0,0,0,0,0 +DRAG,2009,0,0,0,0,0,0 +DRAWBACKS,2009,0,0,0,0,0,0 +DROUGHTS,2009,0,0,0,0,0,0 +DYSFUNCTIONAL,2009,0,0,0,0,0,0 +EARMARKING,0,0,0,0,0,0,2009 +EASING,2009,0,0,0,0,0,0 +EFFICIENCY,0,2009,0,0,0,0,0 +EGREGIOUSLY,2009,0,0,0,0,0,0 +EMBARGOES,2009,0,0,0,0,0,0 +EMBARRASSES,2009,0,0,0,0,0,0 +EMBEZZLE,2009,0,0,0,0,0,0 +EMBEZZLER,2009,0,0,0,0,0,0 +EMPOWERED,0,2009,0,0,0,0,0 +ENABLED,0,2009,0,0,0,0,0 +ENCOURAGEMENT,0,2009,0,0,0,0,0 +ENCROACHED,2009,0,0,0,0,0,0 +ENCROACHMENTS,2009,0,0,0,0,0,0 +ENCUMBERS,2009,0,0,2009,0,0,2009 +ENCUMBRANCES,2009,0,0,2009,0,0,2009 +ENDANGERMENT,2009,0,0,0,0,0,0 +ENFORCEABLE,0,0,0,2009,0,0,0 +ENHANCEMENT,0,2009,0,0,0,0,0 +ENJOIN,2009,0,0,0,0,0,0 +ENJOY,0,2009,0,0,0,0,0 +ENJOYING,0,2009,0,0,0,0,0 +ENTAILED,0,0,0,0,0,0,2009 +PENALIZE,2009,0,0,0,0,0,0 +PENALTIES,2009,0,0,0,0,0,0 +PERFECTED,0,2009,0,0,0,0,0 +PERIL,2009,0,0,0,0,0,0 +PERMISSION,0,0,0,0,0,0,2009 +PERMITTEES,0,0,0,2011,0,0,0 +PERPETRATES,2009,0,0,2009,0,0,0 +PERSISTED,2009,0,0,0,0,0,0 +PERSISTING,2009,0,0,0,0,0,0 +PERVASIVELY,2009,0,0,0,0,0,0 +PETITIONER,0,0,0,2009,0,0,0 +PETTY,2009,0,0,0,0,0,0 +HEREAFTER,0,0,0,2009,0,0,0 +HEREFORE,0,0,0,2014,0,0,0 +HEREINAFTER,0,0,0,2009,0,0,0 +HEREON,0,0,0,2009,0,0,0 +HEREUNTO,0,0,0,2009,0,0,0 +HIDDEN,0,0,2009,0,0,0,0 +HINDERING,2009,0,0,0,0,0,0 +HINGES,0,0,2009,0,0,0,0 +WHEREABOUTS,0,0,0,2009,0,0,0 +WHEREFORE,0,0,0,2009,0,0,0 +WHERETO,0,0,0,2009,0,0,0 +WHISTLEBLOWERS,0,0,0,2011,0,0,0 +WILFUL,0,0,0,2009,0,0,0 +WILLFULNESS,0,0,0,2009,0,0,0 +WINNING,0,2009,0,0,0,0,0 +FLUCTUATE,0,0,2009,0,0,0,0 +FLUCTUATION,0,0,2009,0,0,0,0 +FORBEARANCE,0,0,0,2009,0,0,0 +FORBID,2009,0,0,0,0,0,2009 +FORCE,-2020,0,0,0,0,0,0 +FOREBEARANCE,0,0,0,2011,0,0,0 +FORECLOSES,2009,0,0,0,0,0,0 +FOREGO,2009,0,0,0,0,0,0 +FORESTALLED,2009,0,0,0,0,0,0 +FORFEITABILITY,0,0,0,2011,0,0,0 +FORFEITS,2009,0,0,0,0,0,0 +FORGERY,2009,0,0,0,0,0,0 +FRAUDS,2009,0,0,0,0,0,0 +FRIENDLY,0,2009,0,0,0,0,0 +FRUSTRATED,2009,0,0,0,0,0,0 +FRUSTRATION,2009,0,0,0,0,0,0 +FURTHERANCE,0,0,0,2009,0,0,0 +GAINS,0,2009,0,0,0,0,0 +DISGORGEMENTS,2009,0,0,0,0,0,0 +DISGRACEFUL,2009,0,0,0,0,0,0 +LITIGATE,2009,0,0,2009,0,0,0 +LITIGATION,2009,0,0,2009,0,0,0 +LITIGIOUS,0,0,0,2009,0,0,0 +LACKED,2009,0,0,0,0,0,0 +LAG,2009,0,0,0,0,0,0 +LAPSE,2009,0,0,0,0,0,0 +LATE,-2020,0,0,0,0,0,0 +LAWFULLY,0,0,0,2009,0,0,0 +LAWS,0,0,0,2009,0,0,0 +LAWYERS,0,0,0,2009,0,0,0 +LEADING,0,2009,0,0,0,0,0 +LEGALIZATION,0,0,0,2009,0,0,0 +LEGALIZES,0,0,0,2009,0,0,0 +LEGATEE,0,0,0,2009,0,0,0 +FLAWED,2009,0,0,0,0,0,0 +NONRECOVERABLE,2009,0,0,0,0,0,0 +LIQUIDATES,2009,0,0,0,0,0,0 +LIQUIDATOR,2009,0,0,0,0,0,0 +BENEFICIATION,0,0,0,2011,0,0,0 +BENEFITTED,0,2009,0,0,0,0,0 +POOR,2009,0,0,0,0,0,0 +REINTERPRETATION,0,0,2009,0,0,0,0 +REINTERPRETS,0,0,2009,0,0,0,0 +REJECTION,2009,0,0,0,0,0,0 +RELINQUISH,2009,0,0,0,0,0,0 +RELINQUISHMENT,2009,0,0,0,0,0,0 +REMAND,0,0,0,2009,0,0,0 +REMEDIATE,0,0,0,2009,0,0,0 +REMEDIATIONS,0,0,0,2009,0,0,0 +RENEGOTIATED,2009,0,0,0,0,0,0 +RENEGOTIATIONS,2009,0,0,0,0,0,0 +RENOUNCEMENTS,2009,0,0,0,0,0,0 +REPARATIONS,2009,0,0,0,0,0,0 +REPOSSESSES,2009,0,0,0,0,0,0 +REPRORATED,0,0,0,2018,0,0,0 +TROUBLED,2009,0,0,0,0,0,0 +UNABLE,2009,0,0,0,0,0,0 +UNAMBIGUOUSLY,0,0,0,0,2009,0,0 +UNAPPEALED,0,0,0,2011,0,0,0 +UNAVAILABILITY,2009,0,0,0,0,0,2011 +UNAWARE,2009,0,0,0,0,0,0 +UNCERTAINTY,0,0,2009,0,0,0,0 +UNCOLLECTIBILITY,2009,0,0,0,0,0,0 +UNCOMPLETED,2009,0,0,0,0,0,0 +UNCONSCIONABLY,2009,0,0,0,0,0,0 +UNCONTRACTED,0,0,0,2011,0,0,0 +UNCORRECTED,2009,0,0,0,0,0,0 +UNCOVERS,2009,0,0,0,0,0,0 +UNDELIVERABLE,2009,0,0,0,0,0,0 +UNDERCUTS,2009,0,0,0,0,0,0 +UNDERESTIMATES,2009,0,0,0,0,0,0 +UNDERINSURED,2009,0,0,0,0,0,0 +UNDERMINING,2009,0,0,0,0,0,0 +UNDERPAYS,2009,0,0,0,0,0,0 +UNDERPERFORMING,2009,0,0,0,0,0,0 +UNDERREPORTING,2011,0,0,0,0,0,0 +UNDERSTATEMENTS,2009,0,0,0,0,0,0 +UNDERUTILIZED,2009,0,0,0,0,0,0 +UNDETECTABLE,0,0,2009,0,0,0,0 +UNDISCHARGED,0,0,0,2009,0,0,0 +UNDOUBTEDLY,0,0,0,0,2009,0,0 +UNECONOMICAL,2009,0,0,0,0,0,0 +UNENCUMBER,0,0,0,2014,0,0,0 +UNEQUIVOCAL,0,0,0,0,2009,0,0 +UNEXCUSED,2009,0,0,0,0,0,0 +UNFAIRLY,2009,0,0,0,0,0,0 +UNFAVORABLE,2009,0,0,0,0,0,0 +UNFIT,2009,0,0,0,0,0,0 +UNFORESEEN,2009,0,0,0,0,0,0 +UNFOUNDED,2009,0,0,0,0,0,0 +UNGUARANTEED,0,0,2009,0,0,0,0 +UNINSURED,2009,0,0,0,0,0,0 +UNJUST,2009,0,0,0,0,0,0 +UNJUSTLY,2009,0,0,0,0,0,0 +UNKNOWNS,0,0,2009,0,0,0,0 +UNLICENSED,2009,0,0,0,0,0,0 +UNMERCHANTABLE,2011,0,0,0,0,0,0 +UNNEEDED,2009,0,0,0,0,0,0 +UNPAID,2009,0,0,0,0,0,0 +UNPOPULAR,2009,0,0,0,0,0,0 +UNPREDICTED,2011,0,2011,0,0,0,0 +UNPROVED,0,0,2009,0,0,0,0 +UNQUANTIFIED,0,0,2011,0,0,0,0 +UNREASONABLY,2009,0,0,0,0,0,0 +UNRECOVERED,2009,0,0,0,0,0,0 +UNREMEDIED,2009,0,0,0,0,0,0 +UNSAFE,2009,0,0,0,0,0,0 +UNSATISFIED,2009,0,0,0,0,0,0 +UNSEASONABLY,0,0,2009,0,0,0,0 +UNSOUND,2009,0,0,0,0,0,0 +UNSTABLE,2009,0,0,0,0,0,0 +UNSUCCESSFULLY,2009,0,0,0,0,0,0 +UNSUITED,2009,0,0,0,0,0,0 +UNSUSPECTING,2009,0,0,0,0,0,0 +UNTIMELY,2009,0,0,0,0,0,0 +UNTRUTHFUL,2009,0,0,0,0,0,0 +UNUSABLE,2009,0,0,0,0,0,0 +UNWARRANTED,2009,0,0,0,0,0,0 +UNWRITTEN,0,0,2009,0,0,0,0 +URGENCY,2009,0,0,0,0,0,0 +USURPATION,0,0,0,2009,0,0,0 +USURY,2009,0,0,2009,0,0,0 +VAGUENESS,0,0,2012,0,0,0,0 +VALUABLE,0,2009,0,0,0,0,0 +PLEAD,2009,0,0,0,0,0,0 +PLEADS,2009,0,0,2009,0,0,0 +PLEASED,0,2009,0,0,0,0,0 +PLEDGED,0,0,0,0,0,0,2009 +PLEDGING,0,0,0,0,0,0,2009 +COMPEL,0,0,0,0,0,0,2011 +COMPENSATORY,0,0,0,2009,0,0,0 +COMPLAINED,2009,0,0,0,0,0,0 +COMPLAINTS,2009,0,0,0,0,0,0 +COMMITMENT,0,0,0,0,0,0,2009 +COMMITTING,0,0,0,0,0,0,2009 +LIMITATION,2009,0,0,0,0,0,0 +LINGERING,2009,0,0,0,0,0,0 +RESTRAINING,0,0,0,0,0,0,2009 +RESTRICT,0,0,0,0,0,0,2009 +RESTRICTIONS,0,0,0,0,0,0,2009 +RESTRICTS,0,0,0,0,0,0,2009 +RESTRUCTURING,2009,0,0,0,0,0,0 +RETALIATES,2009,0,0,0,0,0,0 +RETALIATORY,2009,0,0,0,0,0,0 +PRECAUTIONS,0,0,2009,0,0,0,0 +PRECLUDE,2009,0,0,0,0,0,2009 +PRECONDITION,0,0,0,0,0,0,2009 +PREDECEASED,0,0,0,2009,0,0,0 +PREDICTABILITY,0,0,2009,0,0,0,0 +PREDICTIONS,0,0,2009,0,0,0,0 +PREDICTS,0,0,2009,0,0,0,0 +PREJUDICE,2009,0,0,2009,0,0,0 +PREJUDICING,2009,0,0,2009,0,0,0 +PREMATURELY,2009,0,0,0,0,0,0 +PRESET,0,0,0,0,0,0,2009 +PRESUMABLY,0,0,2009,0,0,0,0 +PRESUMING,0,0,2009,0,0,0,0 +PRETRIAL,2009,0,0,2009,0,0,0 +PREVENTION,2009,0,0,0,0,0,0 +PROACTIVE,0,2009,0,0,0,0,0 +PROBABILITY,0,0,2009,0,0,0,0 +PROBATED,0,0,0,2009,0,0,0 +PROBATIONAL,0,0,0,2009,0,0,0 +PROBATIONS,0,0,0,2009,0,0,0 +PROBLEMS,2009,0,0,0,0,0,0 +PROFITABILITY,0,2009,0,0,0,0,0 +PROGRESSED,0,2009,0,0,0,0,0 +PROHIBITED,0,0,0,0,0,0,2009 +PROHIBITIVE,0,0,0,0,0,0,2009 +PROLONG,2009,0,0,0,0,0,0 +PROLONGING,2009,0,0,0,0,0,0 +PROMULGATES,0,0,0,2009,0,0,0 +PROMULGATOR,0,0,0,2009,0,0,0 +PRORATION,0,0,0,2009,0,0,0 +PROSECUTING,2009,0,0,2009,0,0,0 +PROSECUTORIAL,0,0,0,2011,0,0,0 +PROSPERITY,0,2009,0,0,0,0,0 +PROTESTED,2009,0,0,0,0,0,0 +PROTESTOR,2009,0,0,0,0,0,0 +PROTRACTION,2009,0,0,0,0,0,0 +PROVOKE,2009,0,0,0,0,0,0 +PUNISHABLE,0,0,0,2009,0,0,0 +PUNISHMENT,2009,0,0,0,0,0,0 +PURPORTED,2009,0,0,0,0,0,0 +QUESTION,2009,0,0,0,0,0,0 +QUESTIONING,2009,0,0,0,0,0,0 +QUITCLAIMS,0,0,0,2009,0,0,0 +RANDOM,0,0,2009,0,0,0,0 +RANDOMIZING,0,0,2009,0,0,0,0 +RATABLE,0,0,0,2009,0,0,0 +RATIONALIZE,2009,0,0,0,0,0,0 +ABANDONED,2009,0,0,0,0,0,0 +ABANDONS,2009,0,0,0,0,0,0 +ABDICATION,2009,0,0,0,0,0,0 +ABERRATIONAL,2009,0,0,0,0,0,0 +ABEYANCES,0,0,2009,0,0,0,0 +ABNORMAL,2009,0,0,0,0,0,0 +ABOLISH,2009,0,0,0,0,0,0 +ABOVEMENTIONED,0,0,0,2011,0,0,0 +ABROGATING,2009,0,0,2009,0,0,0 +ABRUPTLY,2009,0,0,0,0,0,0 +ABSENTEEISM,2009,0,0,0,0,0,0 +ABSOLVING,0,0,0,2009,0,0,0 +ABUSED,2009,0,0,0,0,0,0 +ABUSIVELY,2009,0,0,0,0,0,0 +ACCIDENT,2009,0,0,0,0,0,0 +ACCLAIMED,0,2009,0,0,0,0,0 +ACCOMPLISHING,0,2009,0,0,0,0,0 +ACCUSATIONS,2009,0,0,0,0,0,0 +ACCUSING,2009,0,0,0,0,0,0 +ACHIEVEMENTS,0,2009,0,0,0,0,0 +ACQUIESCED,2009,0,0,0,0,0,0 +ACQUIRORS,0,0,0,2011,0,0,0 +ACQUITTALS,2009,0,0,2009,0,0,0 +ACQUITTING,2009,0,0,2009,0,0,0 +ADJOURNED,0,0,0,2009,0,0,0 +ADJOURNS,0,0,0,2009,0,0,0 +ADJUDGING,0,0,0,2009,0,0,0 +ADJUDICATING,0,0,0,2009,0,0,0 +ADJUDICATOR,0,0,0,2009,0,0,0 +ADMISSIBLE,0,0,0,2009,0,0,0 +ADULTERATE,2009,0,0,0,0,0,0 +ADULTERATIONS,2009,0,0,0,0,0,0 +ADVANCING,0,2009,0,0,0,0,0 +ADVANTAGEOUSLY,0,2009,0,0,0,0,0 +ADVERSARY,2009,0,0,0,0,0,0 +ADVERSITY,2009,0,0,0,0,0,0 +AFFREIGHTMENT,0,0,0,2012,0,0,0 +AFORESTATED,0,0,0,2011,0,0,0 +AGGRAVATE,2009,0,0,0,0,0,0 +AGGRAVATION,2009,0,0,0,0,0,0 +ALERTING,2009,0,0,0,0,0,0 +ALIENATING,2009,0,0,0,0,0,0 +ALLEGATIONS,2009,0,0,2009,0,0,0 +ALLEGES,2009,0,0,2009,0,0,0 +ALMOST,0,0,2009,0,0,2009,0 +AMBIGUITIES,0,0,2009,0,0,0,0 +AMENDABLE,0,0,0,2009,0,0,0 +AMENDMENT,0,0,0,2009,0,0,0 +ANNOYANCE,2009,0,0,0,0,0,0 +ANNOYS,2009,0,0,0,0,0,0 +ANNULMENT,2009,0,0,0,0,0,0 +ANOMALOUS,2009,0,2009,0,0,0,0 +ANTECEDENTS,0,0,0,2009,0,0,0 +ANTICIPATING,0,0,2009,0,0,0,0 +ANTICORRUPTION,0,0,0,2014,0,0,0 +APPARENTLY,0,0,2009,0,0,2009,0 +APPEALING,0,0,0,2009,0,0,0 +APPEARING,0,0,2009,0,0,2009,0 +APPELLATE,0,0,0,2009,0,0,0 +APPROXIMATED,0,0,2009,0,0,0,0 +APPROXIMATION,0,0,2009,0,0,0,0 +APPURTENANT,0,0,0,2009,0,0,0 +ARBITRARINESS,0,0,2009,0,0,0,0 +ARBITRATES,0,0,0,2009,0,0,0 +ARBITRATIONS,0,0,0,2009,0,0,0 +ARGUE,2009,0,0,0,0,0,0 +ARGUMENTATIVE,2009,0,0,0,0,0,0 +ARREARS,2009,0,0,0,0,0,0 +ARTIFICIALLY,2009,0,0,0,0,0,0 +RETRIBUTION,2009,0,0,0,0,0,0 +RETROCESSIONAIRES,0,0,0,2011,0,0,0 +BOLSTERS,0,2009,0,0,0,0,0 +BOOMING,0,2009,0,0,0,0,0 +BOTTLENECKS,2009,0,0,0,0,0,0 +BOYCOTTED,2009,0,0,0,0,0,0 +BREACHED,2009,0,0,2009,0,0,0 +BREAKAGE,2009,0,0,0,0,0,0 +BREAKING,-2020,0,0,0,0,0,0 +BRIBE,2009,0,0,0,0,0,0 +BRIBES,2009,0,0,0,0,0,0 +BROKEN,-2020,0,0,0,0,0,0 +BURDENS,2009,0,0,0,0,0,0 +CALAMITOUS,2009,0,0,0,0,0,0 +CANCELING,2009,0,0,0,0,0,0 +CANCELLING,2009,0,0,0,0,0,0 +CARELESSNESS,2009,0,0,0,0,0,0 +CATASTROPHIC,2009,0,0,0,0,0,0 +CAUTIONED,2009,0,0,0,0,0,0 +CAUTIOUSLY,0,0,2009,0,0,0,0 +CEASES,2009,0,0,0,0,0,0 +CENSURE,2009,0,0,0,0,0,0 +CERTIORARI,0,0,0,2011,0,0,0 +CHALLENGES,2009,0,0,0,0,0,0 +CHATTEL,0,0,0,2009,0,0,0 +CIRCUMVENTED,2009,0,0,0,0,0,0 +CIRCUMVENTS,2009,0,0,0,0,0,0 +SHALL,0,0,0,2009,0,0,0 +SHORTAGES,2009,0,0,0,0,0,0 +SHRINKAGES,2009,0,0,0,0,0,0 +SHUTS,2009,0,0,0,0,0,0 +SLANDEROUS,2009,0,0,0,0,0,0 +REPUDIATING,2009,0,0,0,0,0,0 +REQUESTOR,0,0,0,2011,0,0,0 +REQUIREMENTS,0,0,0,0,0,0,2009 +RESCIND,0,0,0,2009,0,0,0 +RESCISSION,0,0,0,2009,0,0,0 +RESIGNATIONS,2009,0,0,0,0,0,0 +RESOLVE,0,2009,0,0,0,0,0 +RESTATEMENTS,2009,0,0,0,0,0,0 +NOTARIES,0,0,0,2009,0,0,0 +NOTARIZED,0,0,0,2009,0,0,0 +NOVO,0,0,0,2011,0,0,0 +NULLIFICATIONS,2009,0,0,2009,0,0,0 +NULLIFYING,2009,0,0,2009,0,0,0 +OBJECTING,2009,0,0,0,0,0,0 +OBJECTIONS,2009,0,0,0,0,0,0 +OBLIGATING,0,0,0,0,0,0,2009 +OBLIGE,0,0,0,0,0,0,2009 +OBLIGES,0,0,0,0,0,0,2009 +OBSCENITY,2009,0,0,0,0,0,0 +OBSTACLES,2009,0,0,0,0,0,0 +OBSTRUCTION,2009,0,0,0,0,0,0 +OFFENCES,2009,0,0,0,0,0,0 +OFFENDERS,2009,0,0,0,0,0,0 +OFFEREE,0,0,0,2009,0,0,0 +OMISSION,2009,0,0,0,0,0,0 +OMITTED,2009,0,0,0,0,0,0 +OPPORTUNISTICALLY,2009,0,0,0,0,0,0 +OPPOSED,2009,0,0,0,0,0,0 +OPPOSITIONS,2009,0,0,0,0,0,0 +ORDINARILY,0,0,2009,0,0,0,0 +OUTMODED,2009,0,0,0,0,0,0 +OUTPERFORMS,0,2009,0,0,0,0,0 +OVERBUILDING,2009,0,0,0,0,0,0 +OVERBURDENED,2009,0,0,0,0,0,0 +OVERCHARGE,2009,0,0,0,0,0,0 +OVERCOME,2009,0,0,0,0,0,0 +OVERESTIMATE,2009,0,0,0,0,0,0 +OVERESTIMATION,2009,0,0,0,0,0,0 +OVERLOADING,2009,0,0,0,0,0,0 +OVERLOOKING,2009,0,0,0,0,0,0 +OVERPAYMENTS,2009,0,0,0,0,0,0 +OVERPRODUCTION,2009,0,0,0,0,0,0 +OVERRULING,0,0,0,2009,0,0,0 +OVERSHADOW,2009,0,0,0,0,0,0 +OVERSTATE,2009,0,0,0,0,0,0 +OVERSTATES,2009,0,0,0,0,0,0 +OVERSUPPLY,2009,0,0,0,0,0,0 +OVERTURNED,2009,0,0,0,0,0,0 +OVERVALUED,2009,0,0,0,0,0,0 +PARA,0,0,0,-2020,0,0,0 +NECESSITATED,0,0,0,0,0,0,2009 +NEGATIVELY,2009,0,0,0,0,0,0 +NEGLECTFUL,2009,0,0,0,0,0,0 +NEGLIGENCES,2009,0,0,0,0,0,0 +NOLO,0,0,0,2011,0,0,0 +BEAUTIFUL,0,2009,0,0,0,0,0 +BELIEVES,0,0,2009,0,0,0,0 +IDEAL,0,2009,0,0,0,0,0 +IGNORE,2009,0,0,0,0,0,0 +ILL,2009,0,0,0,0,0,0 +ILLEGALLY,2009,0,0,0,0,0,0 +ILLIQUID,2009,0,0,0,0,0,0 +IMMATERIALITY,0,0,0,2009,0,0,0 +IMPAIRED,2009,0,0,0,0,0,2011 +IMPAIRS,2009,0,0,0,0,0,2011 +IMPEDED,2009,0,0,0,0,0,0 +IMPEDING,2009,0,0,0,0,0,0 +IMPERFECTIONS,2009,0,0,0,0,0,0 +IMPLICATE,2009,0,0,0,0,0,0 +IMPOSE,0,0,0,0,0,0,2009 +IMPOSITION,0,0,0,0,0,0,2009 +IMPOUND,2009,0,0,0,0,0,0 +IMPRACTICABLE,2009,0,0,0,0,0,0 +IMPRECISE,0,0,2009,0,0,0,0 +IMPRESSED,0,2009,0,0,0,0,0 +IMPRESSIVELY,0,2009,0,0,0,0,0 +IMPROPER,2009,0,0,0,0,0,0 +IMPROVE,0,2009,0,0,0,0,0 +IMPROVES,0,2009,0,0,0,0,0 +INABILITY,2009,0,0,0,0,0,0 +INACCURATE,2009,0,0,0,0,0,0 +INACTIVATE,2009,0,0,0,0,0,0 +INACTIVATION,2009,0,0,0,0,0,0 +INADEQUACY,2009,0,0,0,0,0,0 +INADVERTENTLY,2009,0,0,0,0,0,0 +INAPPROPRIATELY,2009,0,0,0,0,0,0 +INCAPACITATED,2009,0,0,0,0,0,0 +INCARCERATES,2009,0,0,2009,0,0,0 +INCHOATE,0,0,0,2009,0,0,0 +INCIDENTS,2009,0,0,0,0,0,0 +INCOMPETENCE,2009,0,0,0,0,0,0 +INCOMPETENTS,2009,0,0,0,0,0,0 +INCONCLUSIVE,2009,0,0,0,0,0,0 +INCONSISTENTLY,2009,0,0,0,0,0,0 +INCONVENIENCES,2009,0,0,0,0,0,0 +INCORRECTNESS,2009,0,0,0,0,0,0 +INDECENCY,2009,0,0,0,0,0,0 +INDEFINITE,0,0,2009,0,0,0,0 +INDEMNIFICATION,0,0,0,2009,0,0,0 +INDEMNIFY,0,0,0,2009,0,0,0 +INDEMNITIES,0,0,0,2009,0,0,0 +INDETERMINABLE,0,0,2009,0,0,0,0 +INDICTED,2009,0,0,2009,0,0,0 +INDORSEES,0,0,0,2011,0,0,0 +INEFFICIENCIES,2009,0,0,0,0,0,0 +INELIGIBILITY,2009,0,0,0,0,0,0 +INEQUITIES,2009,0,0,0,0,0,0 +INEXACTNESS,0,0,2009,0,0,0,0 +INFLICTED,2009,0,0,0,0,0,0 +INFRACTION,2009,0,0,2009,0,0,0 +INFRINGEMENT,2009,0,0,0,0,0,0 +INFRINGING,2009,0,0,0,0,0,0 +INHIBITING,0,0,0,0,0,0,2011 +INJUNCTIONS,2009,0,0,2009,0,0,0 +INJURES,2009,0,0,0,0,0,0 +INJURY,2009,0,0,0,0,0,0 +INNOVATING,0,2009,0,0,0,0,0 +INNOVATIVENESS,0,2011,0,0,0,0,0 +INORDINATELY,2009,0,0,0,0,0,0 +INSIGHTFUL,0,2009,0,0,0,0,0 +INSISTING,0,0,0,0,0,0,2009 +INSOLVENCY,2009,0,0,0,0,0,0 +INSTABILITIES,0,0,2009,0,0,0,0 +INSUFFICIENT,2009,0,0,0,0,0,0 +INTANGIBLE,0,0,2009,0,0,0,0 +INTERFERE,2009,0,0,0,0,0,0 +INTERFERES,2009,0,0,0,0,0,0 +INTERMITTENTLY,2009,0,0,0,0,0,0 +INTERPOSES,0,0,0,2009,0,0,0 +INTERROGATE,0,0,0,2009,0,0,0 +INTERROGATION,0,0,0,2009,0,0,0 +INTERROGATORS,0,0,0,2009,0,0,0 +INTERRUPTING,2009,0,0,0,0,0,0 +INTESTACY,0,0,0,2009,0,0,0 +STABILIZATION,0,2009,0,0,0,0,0 +STABILIZES,0,2009,0,0,0,0,0 +STAGNANT,2009,0,0,0,0,0,0 +STAGNATING,2009,0,0,0,0,0,0 +STATUTE,0,0,0,2009,0,0,0 +STIPULATE,0,0,0,0,0,0,2009 +STIPULATION,0,0,0,0,0,0,2009 +STOPPAGES,2009,0,0,0,0,0,0 +STRAIN,2009,0,0,0,0,0,0 +STRENGTH,0,2009,0,0,0,0,0 +STRENGTHENS,0,2009,0,0,0,0,0 +STRESSES,2009,0,0,0,0,0,0 +STRICTER,0,0,0,0,0,0,2009 +STRONG,0,2009,0,0,0,0,0 +SUBCLAUSE,0,0,0,2009,0,0,0 +SUBJECTING,2009,0,0,0,0,0,0 +SUBLESSORS,0,0,0,2011,0,0,0 +SUBPARAGRAPHS,0,0,0,2009,0,0,0 +SUBROGATED,0,0,0,2009,0,0,0 +SUBTRUSTS,0,0,0,2011,0,0,0 +SUCCEEDS,0,2009,0,0,0,0,0 +SUCCESSFULLY,0,2009,0,0,0,0,0 +SUED,2009,0,0,2009,0,0,0 +SUFFERING,2009,0,0,0,0,0,0 +SUGGESTING,0,0,2009,0,0,0,0 +SUMMONING,2009,0,0,2009,0,0,0 +SUPERSEDE,0,0,0,2009,0,0,0 +SUPERSEDING,0,0,0,2009,0,0,0 +SURPASSED,0,2009,0,0,0,0,0 +SUSCEPTIBLE,2009,0,0,0,0,0,0 +SUSPEND,2009,0,0,0,0,0,0 +SUSPENSION,2009,0,0,0,0,0,0 +SUSPICIOUS,2009,0,0,0,0,0,0 +REVOCATION,2009,0,0,2009,0,0,0 +REVOKES,2009,0,0,0,0,0,0 +REVOLUTIONIZES,0,2009,0,0,0,0,0 +REWARDING,0,2009,0,0,0,0,0 +RIDICULES,2009,0,0,0,0,0,0 +RISKIER,2009,0,2009,0,0,0,0 +RISKS,0,0,2009,0,0,0,0 +RULINGS,0,0,0,2009,0,0,0 +SACRIFICED,2009,0,0,0,0,0,0 +SATISFACTION,0,2009,0,0,0,0,0 +SATISFIES,0,2009,0,0,0,0,0 +SCANDALS,2009,0,0,0,0,0,0 +SCRUTINIZING,2009,0,0,0,0,0,0 +SEIZE,2009,0,0,0,0,0,0 +SELDOM,0,0,2009,0,0,2009,0 +SEQUESTRATOR,0,0,0,2009,0,0,0 +SETBACK,2009,0,0,0,0,0,0 +SEVER,2009,0,0,0,0,0,0 +SEVERANCE,0,0,0,2009,0,0,0 +SEVERELY,2009,0,0,0,0,0,0 +ENTRENCH,0,0,0,0,0,0,2009 +ERODES,2009,0,0,0,0,0,0 +ERRATICALLY,2009,0,0,0,0,0,0 +ERRONEOUSLY,2009,0,0,0,0,0,0 +ESCALATE,2009,0,0,0,0,0,0 +ESCHEAT,0,0,0,2011,0,0,0 +ESCROWED,0,0,0,0,0,0,2009 +EVADE,2009,0,0,0,0,0,0 +EVASION,2009,0,0,0,0,0,0 +EVICTED,2009,0,0,0,0,0,0 +EVICTS,2009,0,0,0,0,0,0 +EXACERBATED,2009,0,0,0,0,0,0 +EXACERBATIONS,2009,0,0,0,0,0,0 +EXAGGERATING,2009,0,0,0,0,0,0 +EXCEEDENCES,0,0,0,2011,0,0,0 +EXCELS,0,2009,0,0,0,0,0 +EXCESSIVELY,2009,0,0,0,0,0,0 +EXCITING,0,2009,0,0,0,0,0 +EXCLUSIVES,0,2009,0,0,0,0,0 +EXCULPATES,2009,0,0,2009,0,0,0 +EXCULPATORY,2009,0,0,2009,0,0,0 +EXECUTRICES,0,0,0,2009,0,0,0 +EXONERATE,2009,0,0,0,0,0,0 +EXONERATION,2009,0,0,0,0,0,0 +EXPLOITATIONS,2009,0,0,0,0,0,0 +EXPLOITS,2009,0,0,0,0,0,0 +EXPOSING,2009,0,0,0,0,0,0 +EXPROPRIATED,2009,0,0,0,0,0,0 +EXPROPRIATIONS,2009,0,0,0,0,0,0 +EXTRACONTRACTUAL,0,0,0,2011,0,0,0 +SOLVENCIES,2009,0,0,0,0,0,0 +SOMETIME,0,0,2009,0,0,0,0 +SPAM,2014,0,0,0,0,0,0 +TRAUMATIC,2009,0,0,0,0,0,0 +LOSES,2009,0,0,0,0,0,0 +LOST,2009,0,0,0,0,0,0 +LYING,2009,0,0,0,0,0,0 +MALFUNCTIONED,2009,0,0,0,0,0,0 +MALICIOUS,2009,0,0,0,0,0,0 +MANDATE,0,0,0,0,0,0,2009 +MANDATORY,0,0,0,0,0,0,2009 +MANIPULATES,2009,0,0,0,0,0,0 +MANIPULATIVE,2009,0,0,0,0,0,0 +MAYBE,0,0,2009,0,0,2009,0 +MEDIATING,0,0,0,2009,0,0,0 +MEDIATORS,0,0,0,2009,0,0,0 +MISAPPLICATIONS,2009,0,0,0,0,0,0 +MISAPPLYING,2009,0,0,0,0,0,0 +MISAPPROPRIATING,2009,0,0,0,0,0,0 +MISCALCULATE,2009,0,0,0,0,0,0 +MISCALCULATION,2009,0,0,0,0,0,0 +MISCLASSIFICATION,2011,0,0,0,0,0,0 +MISCOMMUNICATION,2014,0,0,0,0,0,0 +MISDEMEANORS,2009,0,0,0,0,0,0 +MISHANDLED,2009,0,0,0,0,0,0 +MISINFORMATION,2009,0,0,0,0,0,0 +MISINTERPRET,2009,0,0,0,0,0,0 +MISINTERPRETING,2009,0,0,0,0,0,0 +MISJUDGES,2009,0,0,0,0,0,0 +MISLABEL,2009,0,0,0,0,0,0 +MISLABELS,2009,0,0,0,0,0,0 +MISLEADS,2009,0,0,0,0,0,0 +MISMANAGEMENT,2009,0,0,0,0,0,0 +MISMATCHED,2009,0,0,0,0,0,0 +MISPRICE,2014,0,0,0,0,0,0 +MISREPRESENTATION,2009,0,0,0,0,0,0 +MISREPRESENTS,2009,0,0,0,0,0,0 +WORRYING,2009,0,0,0,0,0,0 +WORSENING,2009,0,0,0,0,0,0 +WORTHY,0,2009,0,0,0,0,0 +TOLERATED,2009,0,0,0,0,0,0 +TORT,0,0,0,2009,0,0,0 +TORTUOUS,2009,0,0,0,0,0,0 +FIDE,0,0,0,2009,0,0,0 +FIRING,2009,0,0,0,0,0,0 +NONBREACHING,0,0,0,2011,0,0,0 +NONCOMPLIANCE,2009,0,0,0,0,0,0 +NONCONFORMING,2009,0,0,0,0,0,0 +NONCONTRACT,0,0,0,2012,0,0,0 +NONFEASANCE,0,0,0,2011,0,0,0 +NONFORFEITURE,0,0,0,2011,0,0,0 +DISCLAIMED,2009,0,0,0,0,0,0 +DISCLAIMS,2009,0,0,0,0,0,0 +DISCLOSING,2009,0,0,0,0,0,0 +DISCONTINUATIONS,2009,0,0,0,0,0,0 +DISCONTINUING,2009,0,0,0,0,0,0 +DISCOURAGING,2009,0,0,0,0,0,0 +DISCREDITS,2009,0,0,0,0,0,0 +SPECTACULARLY,0,2009,0,0,0,0,0 +SPECULATING,0,0,2009,0,0,0,0 +SPECULATIVELY,0,0,2009,0,0,0,0 +TRAGEDY,2009,0,0,0,0,0,0 +TRANSFERORS,0,0,0,2012,0,0,0 +LEGISLATING,0,0,0,2009,0,0,0 +LEGISLATIVELY,0,0,0,2009,0,0,0 +LEGISLATURES,0,0,0,2009,0,0,0 +LIBELS,0,0,0,2009,0,0,0 +CONCEALED,2009,0,0,0,0,0,0 +CONCEDES,2009,0,0,0,0,0,0 +CONCERN,2009,0,0,0,0,0,0 +CONCILIATION,2009,0,0,0,0,0,0 +CONDEMN,2009,0,0,0,0,0,0 +CONDEMNING,2009,0,0,0,0,0,0 +CONDITIONALLY,0,0,2009,0,0,0,0 +CONFESS,2009,0,0,0,0,0,0 +CONFESSION,2009,0,0,0,0,0,0 +CONFINEMENT,2009,0,0,0,0,0,2009 +CONFISCATE,2009,0,0,0,0,0,0 +CONFISCATION,2009,0,0,0,0,0,0 +CONFLICTED,2009,0,0,0,0,0,0 +CONFRONTATION,2009,0,0,0,0,0,0 +CONFRONTING,2009,0,0,0,0,0,0 +CONFUSES,2009,0,2009,0,0,0,0 +CONSENT,0,0,0,2009,0,0,0 +CONSERVATORSHIPS,0,0,0,2011,0,0,0 +CONSPIRATORIAL,2009,0,0,0,0,0,0 +CONSPIRES,2009,0,0,0,0,0,0 +CONSTITUTIONALITY,0,0,0,2009,0,0,0 +CONSTRAIN,0,0,0,0,0,0,2009 +CONSTRAINT,0,0,0,0,0,0,2009 +CONSTRUE,0,0,0,2012,0,0,0 +CONTEMPT,2009,0,0,0,0,0,0 +CONTENDS,2009,0,0,0,0,0,0 +CONTENTIOUSLY,2009,0,0,0,0,0,0 +CONTESTING,2009,0,0,0,0,0,0 +CONTINGENTLY,0,0,2009,0,0,0,0 +CONTRACTHOLDER,0,0,0,2009,0,0,0 +CONTRACTING,0,0,0,2009,0,0,0 +CONTRACTUAL,0,0,0,2009,0,0,0 +CONTRADICTING,2009,0,0,0,0,0,0 +CONTRADICTS,2009,0,0,0,0,0,0 +CONTRAVENES,0,0,0,2009,0,0,0 +CONTROVERSIAL,2009,0,0,0,0,0,0 +CONTROVERTED,0,0,0,2009,0,0,0 +CONVEYANCES,0,0,0,2009,0,0,0 +CONVICTION,2009,0,0,2009,0,0,0 +CORRECTION,2009,0,0,0,0,0,0 +CORRUPTED,2009,0,0,0,0,0,0 +CORRUPTLY,2009,0,0,0,0,0,0 +COULD,0,0,2009,0,0,2009,0 +COUNSELS,0,0,0,2009,0,0,0 +COUNTERCLAIMS,2009,0,0,0,0,0,0 +COUNTERFEITERS,2009,0,0,0,0,0,0 +COUNTERMEASURES,2009,0,0,0,0,0,0 +COUNTERSUITS,0,0,0,2014,0,0,0 +COURTS,0,0,0,2009,0,0,0 +COVENANTS,0,0,0,0,0,0,2011 +CREATIVITY,0,2009,0,0,0,0,0 +CRIMINALITY,0,0,0,2009,0,0,0 +CRIMINALS,2009,0,0,2009,0,0,0 +CRITICALLY,2009,0,0,0,0,0,0 +CRITICIZED,2009,0,0,0,0,0,0 +CROSSCLAIMS,0,0,0,2011,0,0,0 +CRUCIALLY,2009,0,0,0,0,0,0 +CUMBERSOME,2009,0,0,0,0,0,0 +CURTAILMENT,2009,0,0,0,0,0,0 +CUTBACK,2009,0,0,0,0,0,0 +CYBERBULLYING,2014,0,0,0,0,0,0 +CYBERCRIMINALS,2014,0,0,0,0,0,0 +TAINTED,2009,0,0,0,0,0,0 +TENANTABILITY,0,0,0,2011,0,0,0 +TENTATIVELY,0,0,2009,0,0,0,0 +TERMINATES,2009,0,0,0,0,0,0 +TERMINUS,0,0,0,-2020,0,0,0 +TESTIMONY,0,0,0,2009,0,0,0 +THEREAFTER,0,0,0,2009,0,0,0 +THEREINAFTER,0,0,0,2011,0,0,0 +THERETO,0,0,0,2009,0,0,0 +THEREUNTO,0,0,0,2009,0,0,0 +THREATEN,2009,0,0,0,0,0,0 +THREATS,2009,0,0,0,0,0,0 +FAIL,2009,0,0,0,0,0,0 +FAILS,2009,0,0,0,0,0,0 +FALSE,2009,0,0,0,0,0,0 +FALSIFIED,2009,0,0,0,0,0,0 +FALSITY,2009,0,0,0,0,0,0 +FATALLY,2009,0,0,0,0,0,0 +FAULTY,2009,0,0,0,0,0,0 +FAVORING,0,2009,0,0,0,0,0 +FEARS,2009,0,0,0,0,0,0 +DAMAGE,2009,0,0,0,0,0,0 +DAMPEN,2009,0,0,0,0,0,0 +DANGEROUSLY,2009,0,0,0,0,0,0 +DEADLOCKING,2009,0,0,0,0,0,0 +DEBARMENT,2009,0,0,0,0,0,0 +DECEDENT,0,0,0,2009,0,0,0 +DECEITFULNESS,2009,0,0,0,0,0,0 +DECEIVING,2009,0,0,0,0,0,0 +DECEPTIVELY,2009,0,0,0,0,0,0 +DECLINES,2009,0,0,0,0,0,0 +DECREEING,0,0,0,2009,0,0,0 +DEFACEMENT,2009,0,0,0,0,0,0 +DEFAMATIONS,2009,0,0,0,0,0,0 +DEFAMES,2009,0,0,0,0,0,0 +DEFAULTING,2009,0,0,0,0,0,0 +DEFEASE,0,0,0,2009,0,0,0 +DEFEASING,0,0,0,2011,0,0,0 +DEFEATS,2009,0,0,0,0,0,0 +DEFECTS,2009,0,0,0,0,0,0 +DEFENDANTS,2009,0,0,2009,0,0,0 +DEFENSIVE,2009,0,0,0,0,0,0 +DEFICIENCY,2009,0,0,0,0,0,0 +DEFINITELY,0,0,0,0,2009,0,0 +DEFRAUDING,2009,0,0,0,0,0,0 +DEGRADATIONS,2009,0,0,0,0,0,0 +DEGRADING,2009,0,0,0,0,0,0 +DELAYS,2009,0,0,0,0,0,0 +DELEGEES,0,0,0,2011,0,0,0 +DELIBERATELY,2009,0,0,0,0,0,0 +DELIGHTFULLY,0,2009,0,0,0,0,0 +DELINQUENCY,2009,0,0,0,0,0,0 +DELIST,2009,0,0,0,0,0,0 +DEMISE,2009,0,0,0,0,0,0 +DEMOLISH,2009,0,0,0,0,0,0 +DEMOLITION,2009,0,0,0,0,0,0 +DEMOTES,2009,0,0,0,0,0,0 +DEMURRED,0,0,0,2009,0,0,0 +DEMURS,0,0,0,2009,0,0,0 +DENIES,2009,0,0,0,0,0,0 +DENIGRATING,2009,0,0,0,0,0,0 +DEPEND,0,0,2009,0,0,2009,2011 +DEPENDANCES,0,0,0,0,0,0,2011 +DEPENDENCIES,0,0,2009,0,0,0,2011 +DEPENDS,0,0,2009,0,0,2009,2011 +DEPLETING,2009,0,0,0,0,0,0 +DEPOSED,0,0,0,2009,0,0,0 +DEPOSITIONAL,0,0,0,2011,0,0,0 +INVALIDATED,2009,0,0,0,0,0,0 +INVALIDITY,2009,0,0,0,0,0,0 +INVENTION,0,2009,0,0,0,0,0 +INVENTOR,0,2009,0,0,0,0,0 +INVESTIGATES,2009,0,0,0,0,0,0 +INVOLUNTARILY,2009,0,0,0,0,0,0 +IRRECOVERABLE,2009,0,0,0,0,0,0 +IRREGULARITY,2009,0,0,0,0,0,0 +IRREVERSIBLE,2009,0,0,0,0,0,0 +JEOPARDIZE,2009,0,0,0,0,0,0 +JUDICIALLY,0,0,0,2009,0,0,0 +JURIS,0,0,0,2011,0,0,0 +JURISDICTIONS,0,0,0,2009,0,0,0 +JUROR,0,0,0,2009,0,0,0 +JUSTICE,0,0,0,2009,0,0,0 +KICKBACKS,2009,0,0,0,0,0,0 +DIMINISHED,2009,0,0,0,0,0,0 +DIRECTIVE,0,0,0,0,0,0,2009 +DISADVANTAGEOUS,2009,0,0,0,0,0,0 +DISAFFIRMANCE,0,0,0,2009,0,0,0 +DISAGREEABLE,2009,0,0,0,0,0,0 +DISAGREEMENTS,2009,0,0,0,0,0,0 +DISALLOWANCES,2009,0,0,0,0,0,0 +DISAPPEAR,2009,0,0,0,0,0,0 +DISAPPEARING,2009,0,0,0,0,0,0 +DISAPPOINTING,2009,0,0,0,0,0,0 +DISAPPOINTS,2009,0,0,0,0,0,0 +DISAPPROVED,2009,0,0,0,0,0,0 +DISASSOCIATING,2009,0,0,0,0,0,0 +DISASTERS,2009,0,0,0,0,0,0 +DISAVOWAL,2009,0,0,0,0,0,0 +GRATUITOUSLY,2009,0,0,0,0,0,0 +GREATLY,0,2009,0,0,0,0,0 +GROSSLY,2009,0,0,0,0,0,0 +HALTED,2009,0,0,0,0,0,0 +HAMPERS,2009,0,0,0,0,0,0 +HAPPY,0,2009,0,0,0,0,0 +HARASSMENT,2009,0,0,0,0,0,0 +HARMED,2009,0,0,0,0,0,0 +HARMS,2009,0,0,0,0,0,0 +HARSHLY,2009,0,0,0,0,0,0 +HAZARDS,2009,0,0,0,0,0,0 +NONINFRINGING,0,0,0,2011,0,0,0 +NONPAYMENT,2009,0,0,0,0,0,0 +NONPERFORMING,2009,0,0,0,0,0,0 +DISFAVORS,2009,0,0,0,0,0,0 +PREAMENDMENT,0,0,0,2011,0,0,0 +COMPLICATED,2009,0,0,0,0,0,0 +COMPLICATIONS,2009,0,0,0,0,0,0 +COMPLIMENTING,0,2009,0,0,0,0,0 +MISSTATEMENTS,2009,0,0,0,0,0,0 +MISSTEPS,2009,0,0,0,0,0,0 +MISTAKES,2009,0,0,0,0,0,0 +MISUNDERSTAND,2009,0,0,0,0,0,0 +MISUSE,2009,0,0,0,0,0,0 +MONOPOLISTIC,2009,0,0,0,0,0,0 +MONOPOLIZED,2009,0,0,0,0,0,0 +MORATORIA,2009,0,0,0,0,0,0 +MOTHBALLED,2009,0,0,0,0,0,0 +MUTANDIS,0,0,0,2011,0,0,0 +SLIPPAGES,2009,0,0,0,0,0,0 +SLOWED,2009,0,0,0,0,0,0 +SLOWLY,2009,0,0,0,0,0,0 +SLUGGISHNESS,2009,0,0,0,0,0,0 +SMOOTHS,0,2009,0,0,0,0,0 +DEPRESSES,2009,0,0,0,0,0,0 +DEPRIVED,2009,0,0,0,0,0,0 +DERELICTION,2009,0,0,0,0,0,0 +DEROGATING,0,0,0,2009,0,0,0 +DESIGNATOR,0,0,0,2011,0,0,0 +DESPITE,0,2009,0,0,0,0,0 +DESTABILIZING,2009,0,2009,0,0,0,0 +DESTROYING,2009,0,0,0,0,0,0 +DETAIN,2009,0,0,0,0,0,0 +DETENTIONS,2009,0,0,0,0,0,0 +DETERIORATES,2009,0,0,0,0,0,0 +DETERRED,2009,0,0,0,0,0,0 +DETERRENTS,2009,0,0,0,0,0,0 +DETRACTED,2009,0,0,0,0,0,0 +DETRIMENTALLY,2009,0,0,0,0,0,0 +DEVALUES,2009,0,0,0,0,0,0 +DEVASTATING,2009,0,0,0,0,0,0 +DEVIATES,2009,0,2009,0,0,0,0 +DEVISEES,0,0,0,2011,0,0,0 +DEVOLVING,2009,0,0,0,0,0,0 +DICTATING,0,0,0,0,0,0,2009 +DIFFERS,0,0,2009,0,0,0,0 +DIFFICULTY,2009,0,0,0,0,0,0 +ASCENDANTS,0,0,0,2009,0,0,0 +ASSAULTS,2009,0,0,0,0,0,0 +ASSIGNATIONS,0,0,0,2009,0,0,0 +ASSUMES,0,0,2009,0,0,0,0 +ASSURE,0,2009,0,0,0,0,0 +ATTAIN,0,2009,0,0,0,0,0 +ATTAINMENTS,0,2009,0,0,0,0,0 +ATTESTATIONS,0,0,0,2009,0,0,0 +ATTORNEY,0,0,0,2009,0,0,0 +ATTRACTIVE,0,2009,0,0,0,0,0 +BACKDATING,2009,0,0,0,0,0,0 +BAILEE,0,0,0,2009,0,0,0 +BAILMENT,0,0,0,2011,0,0,0 +BANKRUPT,2009,0,0,0,0,0,0 +BANKRUPTING,2009,0,0,0,0,0,0 +CLAIMANTS,0,0,0,2009,0,0,0 +CLARIFICATION,0,0,2009,0,0,0,0 +CLEARLY,0,0,0,0,2009,0,0 +CLOSING,-2020,0,0,0,0,0,0 +CODEFENDANT,0,0,0,2011,0,0,0 +CODIFICATION,0,0,0,2009,0,0,0 +CODIFY,0,0,0,2009,0,0,0 +COERCES,2009,0,0,0,0,0,0 +COLLABORATED,0,2009,0,0,0,0,0 +COLLABORATIONS,0,2009,0,0,0,0,0 +COLLAPSE,2009,0,0,0,0,0,0 +COLLISION,2009,0,0,0,0,0,0 +COLLUDES,2009,0,0,0,0,0,0 +COLLUSIVE,2009,0,0,0,0,0,0 +POSITIVELY,0,2009,0,0,0,0,0 +POSSIBLE,0,0,2009,0,0,2009,0 +POSTCONTRACT,0,0,0,2011,0,0,0 +POSTPONEMENT,2009,0,0,0,0,0,0 +WRITEDOWN,2009,0,0,0,0,0,0 +WRITS,0,0,0,2009,0,0,0 +WRONGFUL,2009,0,0,0,0,0,0 +HONOR,0,2009,0,0,0,0,0 +HONORS,0,2009,0,0,0,0,0 +REARGUMENT,0,0,0,2011,0,0,0 +REASSESSING,0,0,2009,0,0,0,0 +REASSIGNED,2009,0,0,0,0,0,0 +REASSIGNS,2009,0,0,0,0,0,0 +REBUT,0,0,0,2009,0,0,0 +REBUTTAL,0,0,0,2009,0,0,0 +RECALCULATE,0,0,2009,0,0,0,0 +RECALCULATION,0,0,2009,0,0,0,0 +RECALLING,2009,0,0,0,0,0,0 +RECESSIONARY,2009,0,0,0,0,0,0 +RECKLESSNESS,2009,0,0,0,0,0,0 +RECONSIDERS,0,0,2009,0,0,0,0 +RECOUPMENTS,0,0,0,2009,0,0,0 +RECTIFICATIONS,0,0,0,2009,0,0,0 +RECUSES,0,0,0,2014,0,0,0 +REDACTING,2009,0,0,2009,0,0,0 +REDEFAULTED,2012,0,0,0,0,0,0 +REDRESSES,2009,0,0,0,0,0,0 +REEXAMINING,0,0,2009,0,0,0,0 +REFILE,0,0,0,2009,0,0,0 +REFRAIN,0,0,0,0,0,0,2009 +REFUSALS,2009,0,0,0,0,0,0 +REFUSING,2009,0,0,0,0,0,0 +REGULATE,0,0,0,2009,0,0,0 +REGULATION,0,0,0,2009,0,0,0 +REGULATORS,0,0,0,2009,0,0,0 +REHEARING,0,0,0,2009,0,0,0 +VARIABLY,0,0,2009,0,0,0,0 +VARIANTS,0,0,2009,0,0,0,0 +VARIES,0,0,2009,0,0,0,0 +VENDEES,0,0,0,2011,0,0,0 +VERSATILITY,0,2009,0,0,0,0,0 +VIBRANT,0,2009,0,0,0,0,0 +VIOLATES,2009,0,0,0,0,0,0 +VIOLATIVE,2009,0,0,2009,0,0,0 +VIOLENT,2009,0,0,0,0,0,0 +VITIATES,2009,0,0,0,0,0,0 +VOIDED,2009,0,0,2009,0,0,0 +VOLATILITY,2009,0,2009,0,0,0,0 +VULNERABLY,2009,0,0,0,0,0,0 +WARNINGS,2009,0,0,0,0,0,0 +WASTED,2009,0,0,0,0,0,0 +WEAKEN,2009,0,0,0,0,0,0 +WEAKER,2009,0,0,0,0,0,0 +WEAKNESSES,2009,0,0,0,0,0,0 +DISHONORABLE,2009,0,0,0,0,0,0 +DISHONORS,2009,0,0,0,0,0,0 +DISINTERESTEDLY,2009,0,0,0,0,0,0 +DISLOYALTY,2009,0,0,0,0,0,0 +DISMISSAL,2009,0,0,0,0,0,0 +DISMISSING,2009,0,0,0,0,0,0 +DISPARAGEMENT,2009,0,0,0,0,0,0 +DISPARAGINGLY,2009,0,0,0,0,0,0 +DISPLACED,2009,0,0,0,0,0,0 +DISPLACING,2009,0,0,0,0,0,0 +DISPOSSESSED,2009,0,0,0,0,0,0 +DISPOSSESSORY,0,0,0,2011,0,0,0 +DISPROPORTIONATELY,2009,0,0,0,0,0,0 +DISPUTING,2009,0,0,0,0,0,0 +DISQUALIFIES,2009,0,0,0,0,0,0 +DISREGARDED,2009,0,0,0,0,0,0 +DISREPUTE,2009,0,0,0,0,0,0 +DISRUPTION,2009,0,0,0,0,0,0 +DISSATISFACTION,2009,0,0,0,0,0,0 +DISSENTER,2009,0,0,0,0,0,0 +DISSIDENT,2009,0,0,0,0,0,0 +DISTINCTION,0,2009,0,0,0,0,0 +DISTINCTIVENESS,0,2009,0,0,0,0,0 +DISTORTION,2009,0,0,0,0,0,0 +DISTRACTED,2009,0,0,0,0,0,0 +DISTRACTS,2009,0,0,0,0,0,0 +DISTRIBUTEE,0,0,0,2009,0,0,0 +DISTURBANCES,2009,0,0,0,0,0,0 +DIVERSION,2009,0,0,0,0,0,0 +DIVERTS,2009,0,0,0,0,0,0 +DIVESTITURE,2009,0,0,0,0,0,0 +DIVESTS,2009,0,0,0,0,0,0 +DIVULGED,2009,0,0,0,0,0,0 +DOCKETED,0,0,0,2009,0,0,0 +DOUBT,2009,0,2009,0,0,0,0 +DOWNGRADE,2009,0,0,0,0,0,0 +DOWNSIZE,2009,0,0,0,0,0,0 +DOWNSIZINGS,2009,0,0,0,0,0,0 +DOWNTURNS,2009,0,0,0,0,0,0 +DRASTIC,2009,0,0,0,0,0,0 +DREAM,0,2009,0,0,0,0,0 +DULY,0,0,0,2009,0,0,0 +DYSFUNCTIONS,2009,0,0,0,0,0,0 +EARMARKS,0,0,0,0,0,0,2009 +EASY,0,2009,0,0,0,0,0 +EFFICIENT,0,2009,0,0,0,0,0 +EJECTMENT,0,0,0,2011,0,0,0 +EMBARGOING,2009,0,0,0,0,0,0 +EMBARRASSING,2009,0,0,0,0,0,0 +EMBEZZLED,2009,0,0,0,0,0,0 +EMBEZZLES,2009,0,0,0,0,0,0 +EMPOWERING,0,2009,0,0,0,0,0 +ENABLES,0,2009,0,0,0,0,0 +ENCOURAGES,0,2009,0,0,0,0,0 +ENCROACHES,2009,0,0,0,0,0,0 +ENCUMBER,2009,0,0,2009,0,0,2009 +ENCUMBRANCE,2009,0,0,2009,0,0,2009 +ENDANGER,2009,0,0,0,0,0,0 +ENDANGERS,2009,0,0,0,0,0,0 +ENFORCEABLY,0,0,0,2011,0,0,0 +ENHANCEMENTS,0,2009,0,0,0,0,0 +ENJOINED,2009,0,0,0,0,0,0 +ENJOYABLE,0,2009,0,0,0,0,0 +ENJOYMENT,0,2009,0,0,0,0,0 +ENTAILING,0,0,0,0,0,0,2009 +PASSU,0,0,0,2009,0,0,0 +PENALIZED,2009,0,0,0,0,0,0 +PENALTY,2009,0,0,0,0,0,0 +PERFECTLY,0,2009,0,0,0,0,0 +PERILS,2009,0,0,0,0,0,0 +PERMISSIONS,0,0,0,0,0,0,2009 +PERMITTING,0,0,0,0,0,0,2009 +PERPETRATING,2009,0,0,2009,0,0,0 +PERSISTENCE,2009,0,0,0,0,0,0 +PERSISTS,2009,0,0,0,0,0,0 +PERVASIVENESS,2009,0,0,0,0,0,0 +PETITIONERS,0,0,0,2009,0,0,0 +PICKET,2009,0,0,0,0,0,0 +HEREBY,0,0,0,2009,0,0,0 +HEREFROM,0,0,0,2009,0,0,0 +HEREINBEFORE,0,0,0,2009,0,0,0 +HERETO,0,0,0,2009,0,0,0 +HEREUPON,0,0,0,2009,0,0,0 +HIGHEST,0,2009,0,0,2009,0,0 +HINDERS,2009,0,0,0,0,0,0 +WHATEVER,0,0,0,2009,0,0,0 +WHEREAS,0,0,0,2009,0,0,0 +WHEREIN,0,0,0,2009,0,0,0 +WHEREUNDER,0,0,0,2011,0,0,0 +WHOMEVER,0,0,0,2009,0,0,0 +WILL,0,0,0,0,2009,0,0 +WIN,0,2009,0,0,0,0,0 +WITNESS,0,0,0,2009,0,0,0 +FLUCTUATED,0,0,2009,0,0,0,0 +FLUCTUATIONS,0,0,2009,0,0,0,0 +FORBEARANCES,0,0,0,2009,0,0,0 +FORBIDDEN,2009,0,0,0,0,0,2009 +FORCED,2009,0,0,0,0,0,0 +FOREBEARS,0,0,0,2009,0,0,0 +FORECLOSING,2009,0,0,0,0,0,0 +FOREGOES,2009,0,0,0,0,0,0 +FORESTALLING,2009,0,0,0,0,0,0 +FORFEITABLE,0,0,0,2009,0,0,0 +FORFEITURE,2009,0,0,0,0,0,0 +FORTHWITH,0,0,0,2009,0,0,0 +FRAUDULENCE,2009,0,0,0,0,0,0 +FRIVOLOUS,2009,0,0,0,0,0,0 +FRUSTRATES,2009,0,0,0,0,0,0 +FRUSTRATIONS,2009,0,0,0,0,0,0 +GAIN,0,2009,0,0,0,0,0 +GOOD,0,2009,0,0,0,0,0 +DISGORGES,2009,0,0,0,0,0,0 +DISGRACEFULLY,2009,0,0,0,0,0,0 +LITIGATED,2009,0,0,2009,0,0,0 +LITIGATIONS,2009,0,0,2009,0,0,0 +LITIGIOUSNESS,0,0,0,2009,0,0,0 +LACKING,2009,0,0,0,0,0,0 +LAGGED,2009,0,0,0,0,0,0 +LAPSED,2009,0,0,0,0,0,0 +LAUNDERING,2009,0,0,0,0,0,0 +LAWFULNESS,0,0,0,2009,0,0,0 +LAWSUIT,0,0,0,2009,0,0,0 +LAYOFF,2009,0,0,0,0,0,0 +LEGAL,0,0,0,2009,0,0,0 +LEGALIZATIONS,0,0,0,2009,0,0,0 +LEGALIZING,0,0,0,2009,0,0,0 +LEGATEES,0,0,0,2009,0,0,0 +FLAWS,2009,0,0,0,0,0,0 +NONRENEWAL,2009,0,0,0,0,0,0 +LIQUIDATING,2009,0,0,0,0,0,0 +LIQUIDATORS,2009,0,0,0,0,0,0 +BENEFICIAL,0,-2020,0,2020,0,0,0 +BENEFIT,0,-2020,0,0,0,0,0 +BENEFITTING,0,2009,0,0,0,0,0 +POORLY,2009,0,0,0,0,0,0 +REINTERPRETATIONS,0,0,2009,0,0,0,0 +REJECT,2009,0,0,0,0,0,0 +REJECTIONS,2009,0,0,0,0,0,0 +RELINQUISHED,2009,0,0,0,0,0,0 +RELINQUISHMENTS,2009,0,0,0,0,0,0 +REMANDED,0,0,0,2009,0,0,0 +REMEDIATED,0,0,0,2009,0,0,0 +REMEDIED,0,0,0,2009,0,0,0 +RENEGOTIATES,2009,0,0,0,0,0,0 +RENOUNCE,2009,0,0,0,0,0,0 +RENOUNCES,2009,0,0,0,0,0,0 +REPLEDGED,0,0,0,2012,0,0,0 +REPOSSESSING,2009,0,0,0,0,0,0 +TROUBLES,2009,0,0,0,0,0,0 +UNACCEPTABLE,2009,0,0,0,0,0,0 +UNANNOUNCED,2009,0,0,0,0,0,0 +UNAPPROVED,2009,0,0,0,0,0,0 +UNAVAILABLE,2009,0,0,0,0,0,2011 +UNCERTAIN,0,0,2009,0,0,2009,0 +UNCLEAR,0,0,2009,0,0,0,0 +UNCOLLECTIBLE,2009,0,0,0,0,0,0 +UNCOMPROMISING,0,0,0,0,2009,0,0 +UNCONSTITUTIONAL,0,0,0,2009,0,0,0 +UNCONTROLLABLE,2009,0,0,0,0,0,0 +UNCOVER,2009,0,0,0,0,0,0 +UNDECIDED,0,0,2009,0,0,0,0 +UNDELIVERED,2009,0,0,0,0,0,0 +UNDERCUTTING,2009,0,0,0,0,0,0 +UNDERESTIMATING,2009,0,0,0,0,0,0 +UNDERMINE,2009,0,0,0,0,0,0 +UNDERPAID,2009,0,0,0,0,0,0 +UNDERPERFORM,2011,0,0,0,0,0,0 +UNDERPERFORMS,2014,0,0,0,0,0,0 +UNDERSTATE,2009,0,0,0,0,0,0 +UNDERSTATES,2009,0,0,0,0,0,0 +UNDESIGNATED,0,0,2009,0,0,0,0 +UNDETECTED,2009,0,0,0,0,0,0 +UNDISCLOSED,2009,0,0,0,0,0,0 +UNDUE,2009,0,0,0,0,0,0 +UNECONOMICALLY,2009,0,0,0,0,0,0 +UNENCUMBERED,0,0,0,2009,0,0,0 +UNEQUIVOCALLY,0,0,0,0,2009,0,0 +UNEXPECTED,2009,0,2009,0,0,0,0 +UNFAMILIAR,0,0,2009,0,0,0,0 +UNFAVORABLY,2009,0,0,0,0,0,0 +UNFITNESS,2009,0,0,0,0,0,0 +UNFORSEEN,2011,0,2011,0,0,0,0 +UNFRIENDLY,2009,0,0,0,0,0,0 +UNHEDGED,0,0,2009,0,0,0,0 +UNINTENDED,2009,0,0,0,0,0,0 +UNJUSTIFIABLE,2009,0,0,0,0,0,0 +UNKNOWING,2009,0,0,0,0,0,0 +UNLAWFUL,2009,0,0,2009,0,0,0 +UNLIQUIDATED,2009,0,0,0,0,0,0 +UNMERITORIOUS,2014,0,0,0,0,0,0 +UNOBSERVABLE,0,0,2009,0,0,0,0 +UNPARALLELED,0,2009,0,0,2009,0,0 +UNPREDICTABILITY,2009,0,2009,0,0,0,0 +UNPRODUCTIVE,2009,0,0,0,0,0,0 +UNPROVEN,0,0,2009,0,0,0,0 +UNREALISTIC,2009,0,0,0,0,0,0 +UNRECEPTIVE,2014,0,0,0,0,0,0 +UNREIMBURSED,2009,0,0,0,0,0,0 +UNREPORTED,2009,0,0,0,0,0,0 +UNSALABLE,2009,0,0,0,0,0,0 +UNSAVORY,2009,0,0,0,0,0,0 +UNSELLABLE,2014,0,0,0,0,0,0 +UNSPECIFIC,0,0,2009,0,0,0,0 +UNSTAYED,0,0,0,2009,0,0,0 +UNSUITABILITY,2009,0,0,0,0,0,0 +UNSURE,2009,0,0,0,0,0,0 +UNSUSTAINABLE,2009,0,0,0,0,0,0 +UNTO,0,0,0,2009,0,0,0 +UNTRUTHFULLY,2009,0,0,0,0,0,0 +UNUSUAL,0,0,2009,0,0,0,0 +UNWELCOME,2009,0,0,0,0,0,0 +UPSET,2009,0,0,0,0,0,0 +URGENT,2009,0,0,0,0,0,0 +USURPED,2009,0,0,2009,0,0,0 +VAGARIES,0,0,2009,0,0,0,0 +VAGUENESSES,0,0,2012,0,0,0,0 +VANDALISM,2009,0,0,0,0,0,0 +PLAINTIFF,2009,0,0,2009,0,0,0 +PLEADED,2009,0,0,0,0,0,0 +PLEAS,2009,0,0,2009,0,0,0 +PLEASURE,0,2009,0,0,0,0,0 +PLEDGEE,0,0,0,2009,0,0,0 +PLEDGOR,0,0,0,2009,0,0,0 +COMPELLED,0,0,0,0,0,0,2009 +COMPLAIN,2009,0,0,0,0,0,0 +COMPLAINING,2009,0,0,0,0,0,0 +COMMITMENTS,0,0,0,0,0,0,2009 +LIMITATIONS,2009,0,0,0,0,0,0 +RESTRAINS,0,0,0,0,0,0,2009 +RESTRICTED,0,0,0,0,0,0,2009 +RESTRICTIVE,0,0,0,0,0,0,2009 +RESTRUCTURE,2009,0,0,0,0,0,0 +RESTRUCTURINGS,2009,0,0,0,0,0,0 +RETALIATING,2009,0,0,0,0,0,0 +RETENDERING,0,0,0,2011,0,0,0 +PRECIPITATED,2009,0,0,0,0,0,0 +PRECLUDED,2009,0,0,0,0,0,2009 +PRECONDITIONS,0,0,0,0,0,0,2009 +PREDECEASES,0,0,0,2009,0,0,0 +PREDICTED,0,0,2009,0,0,0,0 +PREDICTIVE,0,0,2009,0,0,0,0 +PREEMINENCE,0,2009,0,0,0,0,0 +PREJUDICED,2009,0,0,2009,0,0,0 +PRELIMINARILY,0,0,2009,0,0,0,0 +PREMIER,0,2009,0,0,0,0,0 +PRESSING,2009,0,0,0,0,0,0 +PRESUME,0,0,2009,0,0,0,0 +PRESUMPTION,0,0,2009,0,0,0,0 +PREVENT,0,0,0,0,0,0,2009 +PREVENTS,2009,0,0,0,0,0,2009 +PROACTIVELY,0,2009,0,0,0,0,0 +PROBABLE,0,0,2009,0,0,0,0 +PROBATES,0,0,0,2009,0,0,0 +PROBATIONARY,0,0,0,2009,0,0,0 +PROBLEM,2009,0,0,0,0,0,0 +PROFICIENCY,0,2009,0,0,0,0,0 +PROFITABLE,0,2009,0,0,0,0,0 +PROGRESSES,0,2009,0,0,0,0,0 +PROHIBITING,0,0,0,0,0,0,2009 +PROHIBITIVELY,0,0,0,0,0,0,2009 +PROLONGATION,2009,0,0,0,0,0,0 +PROLONGS,2009,0,0,0,0,0,0 +PROMULGATING,0,0,0,2009,0,0,0 +PROMULGATORS,0,0,0,2009,0,0,0 +PROSECUTE,2009,0,0,2009,0,0,0 +PROSECUTION,2009,0,0,2009,0,0,0 +PROSECUTORS,0,0,0,2009,0,0,0 +PROSPEROUS,0,2009,0,0,0,0,0 +PROTESTER,2009,0,0,0,0,0,0 +PROTESTORS,2009,0,0,0,0,0,0 +PROVISO,0,0,0,2009,0,0,0 +PROVOKED,2009,0,0,0,0,0,0 +PUNISHED,2009,0,0,0,0,0,0 +PUNISHMENTS,2009,0,0,0,0,0,0 +PURPORTEDLY,2009,0,0,0,0,0,0 +QUESTIONABLE,2009,0,0,0,0,0,0 +QUESTIONS,2009,0,0,0,0,0,0 +QUITTING,2009,0,0,0,0,0,0 +RANDOMIZE,0,0,2009,0,0,0,0 +RANDOMLY,0,0,2009,0,0,0,0 +RATABLY,0,0,0,2009,0,0,0 +RATIONALIZED,2009,0,0,0,0,0,0 +ABANDONING,2009,0,0,0,0,0,0 +ABDICATED,2009,0,0,0,0,0,0 +ABDICATIONS,2009,0,0,0,0,0,0 +ABERRATIONS,2009,0,0,0,0,0,0 +ABIDE,0,0,0,0,0,0,2009 +ABNORMALITIES,2009,0,0,0,0,0,0 +ABOLISHED,2009,0,0,0,0,0,0 +ABROGATE,2009,0,0,2009,0,0,0 +ABROGATION,2009,0,0,2009,0,0,0 +ABRUPTNESS,2009,0,0,0,0,0,0 +ABSOLVE,0,0,0,2009,0,0,0 +ABUNDANCE,0,2009,0,0,0,0,0 +ABUSES,2009,0,0,0,0,0,0 +ABUSIVENESS,2009,0,0,0,0,0,0 +ACCIDENTAL,2009,0,0,0,0,0,0 +ACCOMPLISH,0,2009,0,0,0,0,0 +ACCOMPLISHMENT,0,2009,0,0,0,0,0 +ACCUSE,2009,0,0,0,0,0,0 +ACHIEVE,0,2009,0,0,0,0,0 +ACHIEVES,0,2009,0,0,0,0,0 +ACQUIESCES,2009,0,0,0,0,0,0 +ACQUIT,2009,0,0,2009,0,0,0 +ACQUITTANCE,0,0,0,2009,0,0,0 +ADDENDUMS,0,0,0,2011,0,0,0 +ADJOURNING,0,0,0,2009,0,0,0 +ADJUDGE,0,0,0,2009,0,0,0 +ADJUDICATE,0,0,0,2009,0,0,0 +ADJUDICATION,0,0,0,2009,0,0,0 +ADJUDICATORS,0,0,0,2009,0,0,0 +ADMISSIBLY,0,0,0,2009,0,0,0 +ADULTERATED,2009,0,0,0,0,0,0 +ADVANCEMENT,0,2009,0,0,0,0,0 +ADVANTAGE,0,2009,0,0,0,0,0 +ADVANTAGES,0,2009,0,0,0,0,0 +ADVERSE,2009,0,0,0,0,0,0 +AFFIDAVIT,0,0,0,2009,0,0,0 +AFOREDESCRIBED,0,0,0,2011,0,0,0 +AFTERMATH,2009,0,0,0,0,0,0 +AGGRAVATED,2009,0,0,0,0,0,0 +AGGRAVATIONS,2009,0,0,0,0,0,0 +ALIENATE,2009,0,0,0,0,0,0 +ALIENATION,2009,0,0,0,0,0,0 +ALLEGE,2009,0,0,2009,0,0,0 +ALLEGING,2009,0,0,2009,0,0,0 +ALTERATION,0,0,2009,0,0,0,0 +AMBIGUITY,0,0,2009,0,0,0,0 +AMENDATORY,0,0,0,2009,0,0,0 +AMENDMENTS,0,0,0,2009,0,0,0 +ANNOYANCES,2009,0,0,0,0,0,0 +ANNUL,2009,0,0,0,0,0,0 +ANNULMENTS,2009,0,0,0,0,0,0 +ANOMALOUSLY,2009,0,2009,0,0,0,0 +ANTICIPATE,0,0,2009,0,0,0,0 +ANTICIPATION,0,0,2009,0,0,0,0 +ANTITRUST,2009,0,0,2009,0,0,0 +APPEAL,0,0,0,2009,0,0,0 +APPEALS,0,0,0,2009,0,0,0 +APPEARS,0,0,2009,0,0,2009,0 +APPELLEES,0,0,0,2011,0,0,0 +APPROXIMATELY,0,0,2009,0,0,0,0 +APPROXIMATIONS,0,0,2009,0,0,0,0 +ARBITRABILITY,0,0,0,2011,0,0,0 +ARBITRARY,0,0,2009,0,0,0,0 +ARBITRATING,0,0,0,2009,0,0,0 +ARBITRATIVE,0,0,0,2011,0,0,0 +ARGUED,2009,0,0,0,0,0,0 +ARGUMENTS,2009,0,0,0,0,0,0 +ARREST,2009,0,0,0,0,0,0 +RETRIBUTIONS,2009,0,0,0,0,0,0 +BONA,0,0,0,2009,0,0,0 +BOOST,0,2009,0,0,0,0,0 +BOUND,0,0,0,0,0,0,2011 +BOYCOTTING,2009,0,0,0,0,0,0 +BREACHES,2009,0,0,2009,0,0,0 +BREAKAGES,2009,0,0,0,0,0,0 +BREAKS,2009,0,0,0,0,0,0 +BRIBED,2009,0,0,0,0,0,0 +BRIBING,2009,0,0,0,0,0,0 +BURDEN,2009,0,0,0,0,0,0 +BURDENSOME,2009,0,0,0,0,0,0 +CALAMITY,2009,0,0,0,0,0,0 +CANCELLATION,2009,0,0,0,0,0,0 +CANCELS,2009,0,0,0,0,0,0 +CATASTROPHICALLY,2009,0,0,0,0,0,0 +CAUTIONING,2009,0,0,0,0,0,0 +CAUTIOUSNESS,0,0,2009,0,0,0,0 +CEASING,2009,0,0,0,0,0,0 +CENSURED,2009,0,0,0,0,0,0 +CESSION,0,0,0,2009,0,0,0 +CHALLENGING,2009,0,0,0,0,0,0 +CHATTELS,0,0,0,2009,0,0,0 +CIRCUMVENTING,2009,0,0,0,0,0,0 +SHARPLY,2009,0,0,0,0,0,0 +SHORTFALL,2009,0,0,0,0,0,0 +SHUT,2009,0,0,0,0,0,0 +SHUTTING,2009,0,0,0,0,0,0 +SLANDERS,2009,0,0,0,0,0,0 +REPUDIATE,2009,0,0,0,0,0,0 +REPUDIATION,2009,0,0,0,0,0,0 +REQUIRE,0,0,0,0,0,0,2009 +REQUIRES,0,0,0,0,0,0,2009 +RESCINDED,0,0,0,2009,0,0,0 +RESCISSIONS,0,0,0,2009,0,0,0 +RESIGNED,2009,0,0,0,0,0,0 +RESTATE,2009,0,0,0,0,0,0 +RESTATES,2009,0,0,0,0,0,0 +NONTERMINABLE,0,0,0,2011,0,0,0 +NOTARIZATION,0,0,0,2009,0,0,0 +NOTARIZING,0,0,0,2009,0,0,0 +NUISANCE,2009,0,0,0,0,0,0 +NULLIFIED,2009,0,0,2009,0,0,0 +NULLITIES,0,0,0,2009,0,0,0 +OBJECTION,2009,0,0,0,0,0,0 +OBLIGATE,0,0,0,0,0,0,2009 +OBLIGATION,0,0,0,0,0,0,2009 +OBLIGED,0,0,0,0,0,0,2009 +OBLIGOR,0,0,0,2009,0,0,0 +OBSOLESCENCE,2009,0,0,0,0,0,0 +OBSTRUCT,2009,0,0,0,0,0,0 +OBSTRUCTIONS,2009,0,0,0,0,0,0 +OFFEND,2009,0,0,0,0,0,0 +OFFENDING,2009,0,0,0,0,0,0 +OFFEREES,0,0,0,2011,0,0,0 +OMISSIONS,2009,0,0,0,0,0,0 +OMITTING,2009,0,0,0,0,0,0 +OPPORTUNITIES,0,2009,0,0,0,0,0 +OPPOSES,2009,0,0,0,0,0,0 +OPTIMISTIC,0,2009,0,0,0,0,0 +OUTAGE,2009,0,0,0,0,0,0 +OUTPERFORM,0,2009,0,0,0,0,0 +OVERAGE,2009,0,0,0,0,0,0 +OVERBUILDS,2009,0,0,0,0,0,0 +OVERBURDENING,2009,0,0,0,0,0,0 +OVERCHARGED,2009,0,0,0,0,0,0 +OVERCOMES,2009,0,0,0,0,0,0 +OVERESTIMATED,2009,0,0,0,0,0,0 +OVERESTIMATIONS,2009,0,0,0,0,0,0 +OVERLOADS,2009,0,0,0,0,0,0 +OVERLOOKS,2009,0,0,0,0,0,0 +OVERPRODUCED,2009,0,0,0,0,0,0 +OVERRULE,0,0,0,2009,0,0,0 +OVERRUN,2009,0,0,0,0,0,0 +OVERSHADOWED,2009,0,0,0,0,0,0 +OVERSTATED,2009,0,0,0,0,0,0 +OVERSTATING,2009,0,0,0,0,0,0 +OVERSUPPLYING,2009,0,0,0,0,0,0 +OVERTURNING,2009,0,0,0,0,0,0 +OVERVALUING,2009,0,0,0,0,0,0 +PARI,0,0,0,2009,0,0,0 +NECESSITATES,0,0,0,0,0,0,2009 +NEGATIVES,2009,0,0,0,0,0,0 +NEGLECTING,2009,0,0,0,0,0,0 +NEGLIGENT,2009,0,0,0,0,0,0 +BARRED,2009,0,0,0,0,0,0 +BEAUTIFULLY,0,2009,0,0,0,0,0 +BELIEVING,0,0,2009,0,0,0,0 +IDLE,2009,0,0,0,0,0,0 +IGNORED,2009,0,0,0,0,0,0 +ILLEGAL,2009,0,0,0,0,0,0 +ILLEGIBLE,2009,0,0,0,0,0,0 +ILLIQUIDITY,2009,0,0,0,0,0,0 +IMMATURE,2009,0,0,0,0,0,0 +IMPAIRING,2009,0,0,0,0,0,2011 +IMPASSE,2009,0,0,0,0,0,0 +IMPEDES,2009,0,0,0,0,0,0 +IMPENDING,2009,0,0,0,0,0,0 +IMPERIL,2009,0,0,0,0,0,0 +IMPLICATED,2009,0,0,0,0,0,0 +IMPOSED,0,0,0,0,0,0,2009 +IMPOSITIONS,0,0,0,0,0,0,2009 +IMPOUNDED,2009,0,0,0,0,0,0 +IMPRACTICAL,2009,0,0,0,0,0,0 +IMPRECISION,0,0,2009,0,0,0,0 +IMPRESSES,0,2009,0,0,0,0,0 +IMPRISONMENT,2009,0,0,0,0,0,0 +IMPROPERLY,2009,0,0,0,0,0,0 +IMPROVED,0,2009,0,0,0,0,0 +IMPROVING,0,2009,0,0,0,0,0 +INACCESSIBLE,2009,0,0,0,0,0,0 +INACCURATELY,2009,0,0,0,0,0,0 +INACTIVATED,2009,0,0,0,0,0,0 +INACTIVATIONS,2009,0,0,0,0,0,0 +INADEQUATE,2009,0,0,0,0,0,0 +INADVISABILITY,2009,0,0,0,0,0,0 +INASMUCH,0,0,0,2009,0,0,0 +INCAPACITY,2009,0,0,2009,0,0,0 +INCARCERATING,2009,0,0,2009,0,0,0 +INCIDENCE,2009,0,0,0,0,0,0 +INCOMPATIBILITIES,2009,0,0,0,0,0,0 +INCOMPETENCY,2009,0,0,0,0,0,0 +INCOMPLETE,2009,0,0,0,0,0,0 +INCONSISTENCIES,2009,0,0,0,0,0,0 +INCONTESTABILITY,0,0,0,2009,0,0,0 +INCONVENIENT,2009,0,0,0,0,0,0 +INCREDIBLE,0,2009,0,0,0,0,0 +INDECENT,2009,0,0,0,0,0,0 +INDEFINITELY,0,0,2009,0,0,0,0 +INDEMNIFICATIONS,0,0,0,2009,0,0,0 +INDEMNIFYING,0,0,0,2009,0,0,0 +INDEMNITOR,0,0,0,2009,0,0,0 +INDETERMINATE,0,0,2009,0,0,0,0 +INDICTING,2009,0,0,2009,0,0,0 +INEFFECTIVE,2009,0,0,0,0,0,0 +INEFFICIENCY,2009,0,0,0,0,0,0 +INELIGIBLE,2009,0,0,0,0,0,0 +INEQUITY,2009,0,0,0,0,0,0 +INEXPERIENCE,2009,0,0,0,0,0,0 +INFLUENTIAL,0,2009,0,0,0,0,0 +INFRACTIONS,2009,0,0,2009,0,0,0 +INFRINGEMENTS,2009,0,0,0,0,0,0 +INGENUITY,0,2009,0,0,0,0,0 +INHIBITS,0,0,0,0,0,0,2011 +INJUNCTIVE,0,0,0,2009,0,0,0 +INJURIES,2009,0,0,0,0,0,0 +INNOVATE,0,2009,0,0,0,0,0 +INNOVATION,0,2009,0,0,0,0,0 +INNOVATOR,0,2009,0,0,0,0,0 +INQUIRY,2009,0,0,0,0,0,0 +INSIST,0,0,0,0,0,0,2009 +INSISTS,0,0,0,0,0,0,2009 +INSOLVENT,2009,0,0,0,0,0,0 +INSTABILITY,2009,0,2009,0,0,0,0 +INSUFFICIENTLY,2009,0,0,0,0,0,0 +INTANGIBLES,0,0,2009,0,0,0,0 +INTERFERED,2009,0,0,0,0,0,0 +INTERFERING,2009,0,0,0,0,0,0 +INTERPLEADER,0,0,0,2009,0,0,0 +INTERPOSING,0,0,0,2009,0,0,0 +INTERROGATED,0,0,0,2009,0,0,0 +INTERROGATIONS,0,0,0,2009,0,0,0 +INTERROGATORY,0,0,0,2009,0,0,0 +INTERRUPTION,2009,0,0,0,0,0,0 +INTESTATE,0,0,0,2009,0,0,0 +SPORADIC,0,0,2009,0,0,0,0 +STABILIZATIONS,0,2009,0,0,0,0,0 +STABILIZING,0,2009,0,0,0,0,0 +STAGNATE,2009,0,0,0,0,0,0 +STAGNATION,2009,0,0,0,0,0,0 +STATUTES,0,0,0,2009,0,0,0 +STIPULATED,0,0,0,0,0,0,2009 +STIPULATIONS,0,0,0,0,0,0,2009 +STOPPED,2009,0,0,0,0,0,0 +STRAINED,2009,0,0,0,0,0,0 +STRENGTHEN,0,2009,0,0,0,0,0 +STRENGTHS,0,2009,0,0,0,0,0 +STRESSFUL,2009,0,0,0,0,0,0 +STRICTEST,0,0,0,0,0,0,2009 +STRONGER,0,2009,0,0,0,0,0 +SUBCLAUSES,0,0,0,2009,0,0,0 +SUBJECTION,2009,0,0,0,0,0,0 +SUBLICENSEE,0,0,0,2009,0,0,0 +SUBPOENA,2009,0,0,2009,0,0,0 +SUBROGATION,0,0,0,2009,0,0,0 +SUCCEED,0,2009,0,0,0,0,0 +SUCCESS,0,2009,0,0,0,0,0 +SUDDEN,0,0,2009,0,0,0,0 +SUES,2009,0,0,2009,0,0,0 +SUFFERS,2009,0,0,0,0,0,0 +SUGGESTS,0,0,2009,0,0,2009,0 +SUMMONS,2009,0,0,2009,0,0,0 +SUPERSEDEAS,0,0,0,2011,0,0,0 +SURETIES,0,0,0,2009,0,0,0 +SURPASSES,0,2009,0,0,0,0,0 +SUSPECT,2009,0,0,0,0,0,0 +SUSPENDED,2009,0,0,0,0,0,0 +SUSPENSIONS,2009,0,0,0,0,0,0 +SUSPICIOUSLY,2009,0,0,0,0,0,0 +REVISE,0,0,2009,0,0,0,0 +REVOCATIONS,2009,0,0,2009,0,0,0 +REVOKING,2009,0,0,0,0,0,0 +REVOLUTIONIZING,0,2009,0,0,0,0,0 +REWARDS,0,-2020,0,0,0,0,0 +RIDICULING,2009,0,0,0,0,0,0 +RISKIEST,2009,0,2009,0,0,0,0 +RISKY,2009,0,2009,0,0,0,0 +RUMORS,0,0,2009,0,0,0,0 +SACRIFICES,2009,0,0,0,0,0,0 +SATISFACTORILY,0,2009,0,0,0,0,0 +SATISFY,0,2009,0,0,0,0,0 +SCRUTINIZE,2009,0,0,0,0,0,0 +SCRUTINY,2009,0,0,0,0,0,0 +SEIZED,2009,0,0,0,0,0,0 +SELDOMLY,0,0,2009,0,0,2009,0 +SERIOUS,2009,0,0,0,0,0,0 +SETBACKS,2009,0,0,0,0,0,0 +SEVERABILITY,0,0,0,2009,0,0,0 +SEVERANCES,0,0,0,2009,0,0,0 +SEVERITIES,2009,0,0,0,0,0,0 +ENTHUSIASM,0,2009,0,0,0,0,0 +ENTRENCHED,0,0,0,0,0,0,2009 +ERODING,2009,0,0,0,0,0,0 +ERRED,2009,0,0,0,0,0,0 +ERROR,2009,0,0,0,0,0,0 +ESCALATED,2009,0,0,0,0,0,0 +ESCHEATED,0,0,0,2011,0,0,0 +ESCROWING,0,0,0,2011,0,0,0 +EVADED,2009,0,0,0,0,0,0 +EVASIONS,2009,0,0,0,0,0,0 +EVICTING,2009,0,0,0,0,0,0 +EVIDENTIAL,0,0,0,2011,0,0,0 +EXACERBATES,2009,0,0,0,0,0,0 +EXAGGERATE,2009,0,0,0,0,0,0 +EXAGGERATION,2009,0,0,0,0,0,0 +EXCELLENCE,0,2009,0,0,0,0,0 +EXCEPTIONAL,0,2009,0,0,0,0,0 +EXCISED,0,0,0,2009,0,0,0 +EXCLUSIVE,0,2009,0,0,0,0,0 +EXCLUSIVITY,0,2009,0,0,0,0,0 +EXCULPATING,2009,0,0,2009,0,0,0 +EXECUTOR,0,0,0,2009,0,0,0 +EXECUTRIX,0,0,0,2009,0,0,0 +EXONERATED,2009,0,0,0,0,0,0 +EXONERATIONS,2009,0,0,0,0,0,0 +EXPLOITATIVE,2009,0,0,0,0,0,0 +EXPOSE,2009,0,0,0,0,0,0 +EXPOSURE,0,0,2009,0,0,0,0 +EXPROPRIATES,2009,0,0,0,0,0,0 +EXPULSION,2009,0,0,0,0,0,0 +EXTRACORPOREAL,0,0,0,2011,0,0,0 +SOLVENCY,2009,0,0,0,0,0,0 +SOMETIMES,0,0,2009,0,0,2009,0 +SPAMMERS,2014,0,0,0,0,0,0 +TREMENDOUS,0,2009,0,0,0,0,0 +LOCKOUT,2009,0,0,0,0,0,0 +LOSING,2009,0,0,0,0,0,0 +LOWEST,0,0,0,0,2009,0,0 +MAJEURE,0,0,0,2011,0,0,0 +MALFUNCTIONING,2009,0,0,0,0,0,0 +MALICIOUSLY,2009,0,0,0,0,0,0 +MANDATED,0,0,0,0,0,0,2009 +MANDITORILY,0,0,0,0,0,0,2011 +MANIPULATING,2009,0,0,0,0,0,0 +MARKDOWN,2009,0,0,0,0,0,0 +MEDIATE,0,0,0,2009,0,0,0 +MEDIATION,0,0,0,2009,0,0,0 +MERITORIOUS,0,2009,0,0,0,0,0 +MISAPPLIED,2009,0,0,0,0,0,0 +MISAPPROPRIATE,2009,0,0,0,0,0,0 +MISAPPROPRIATION,2009,0,0,0,0,0,0 +MISCALCULATED,2009,0,0,0,0,0,0 +MISCALCULATIONS,2009,0,0,0,0,0,0 +MISCLASSIFICATIONS,2014,0,0,0,0,0,0 +MISCONDUCT,2009,0,0,0,0,0,0 +MISDIRECTED,2009,0,0,0,0,0,0 +MISHANDLES,2009,0,0,0,0,0,0 +MISINFORMED,2009,0,0,0,0,0,0 +MISINTERPRETATION,2009,0,0,0,0,0,0 +MISINTERPRETS,2009,0,0,0,0,0,0 +MISJUDGING,2009,0,0,0,0,0,0 +MISLABELED,2009,0,0,0,0,0,0 +MISLEAD,2009,0,0,0,0,0,0 +MISLED,2009,0,0,0,0,0,0 +MISMANAGES,2009,0,0,0,0,0,0 +MISMATCHES,2009,0,0,0,0,0,0 +MISPRICING,2014,0,0,0,0,0,0 +MISREPRESENTATIONS,2009,0,0,0,0,0,0 +MISS,2009,0,0,0,0,0,0 +WORSE,2009,0,0,0,0,0,0 +WORSENS,2009,0,0,0,0,0,0 +TOLERATES,2009,0,0,0,0,0,0 +TORTIOUS,0,0,0,2009,0,0,0 +TORTUOUSLY,2009,0,0,0,0,0,0 +FINED,2009,0,0,0,0,0,0 +NONAPPEALABLE,0,0,0,2009,0,0,0 +NONCANCELABLE,0,0,0,0,0,0,2009 +NONCOMPLIANCES,2009,0,0,0,0,0,0 +NONCONFORMITIES,2009,0,0,0,0,0,0 +NONCONTRACTUAL,0,0,0,2011,0,0,0 +NONFIDUCIARY,0,0,0,2011,0,0,0 +NONFUNCTIONAL,2009,0,0,0,0,0,0 +DISCLAIMER,2009,0,0,0,0,0,0 +DISCLOSE,2009,0,0,0,0,0,0 +DISCONTINUANCE,2009,0,0,0,0,0,0 +DISCONTINUE,2009,0,0,0,0,0,0 +DISCOURAGE,2009,0,0,0,0,0,0 +DISCREDIT,2009,0,0,0,0,0,0 +DISCREPANCIES,2009,0,0,0,0,0,0 +SPECULATE,0,0,2009,0,0,0,0 +SPECULATION,0,0,2009,0,0,0,0 +TRAGIC,2009,0,0,0,0,0,0 +TRANSPARENCY,0,2009,0,0,0,0,0 +LEGISLATE,0,0,0,2009,0,0,0 +LEGISLATION,0,0,0,2009,0,0,0 +LEGISLATOR,0,0,0,2009,0,0,0 +LIBEL,0,0,0,2009,0,0,0 +LICENSABLE,0,0,0,2011,0,0,0 +CONCEALING,2009,0,0,0,0,0,0 +CONCEDING,2009,0,0,0,0,0,0 +CONCERNED,2009,0,0,0,0,0,0 +CONCILIATIONS,2009,0,0,0,0,0,0 +CONDEMNATION,2009,0,0,0,0,0,0 +CONDEMNOR,0,0,0,2011,0,0,0 +CONDONE,2009,0,0,0,0,0,0 +CONFESSED,2009,0,0,0,0,0,0 +CONFIDENT,0,2009,0,0,0,0,0 +CONFINEMENTS,2009,0,0,0,0,0,0 +CONFISCATED,2009,0,0,0,0,0,0 +CONFISCATIONS,2009,0,0,0,0,0,0 +CONFLICTING,2009,0,0,0,0,0,0 +CONFRONTATIONAL,2009,0,0,0,0,0,0 +CONFRONTS,2009,0,0,0,0,0,0 +CONFUSING,2009,0,2009,0,0,0,0 +CONSENTED,0,0,0,2009,0,0,0 +CONSPIRACIES,2009,0,0,0,0,0,0 +CONSPIRATORS,2009,0,0,0,0,0,0 +CONSPIRING,2009,0,0,0,0,0,0 +CONSTITUTIONALLY,0,0,0,2009,0,0,0 +CONSTRAINED,0,0,0,0,0,0,2009 +CONSTRAINTS,0,0,0,0,0,0,2009 +CONSTRUED,0,0,0,2012,0,0,0 +CONTEND,2009,0,0,0,0,0,0 +CONTENTION,2009,0,0,0,0,0,0 +CONTESTABILITY,0,0,0,2014,0,0,0 +CONTINGENCIES,0,0,2009,0,0,0,0 +CONTINGENTS,0,0,2009,0,0,0,0 +CONTRACTHOLDERS,0,0,0,2009,0,0,0 +CONTRACTION,2009,0,0,0,0,0,0 +CONTRACTUALLY,0,0,0,2009,0,0,0 +CONTRADICTION,2009,0,0,0,0,0,0 +CONTRARY,2009,0,0,0,0,0,0 +CONTRAVENING,0,0,0,2009,0,0,0 +CONTROVERSIES,2009,0,0,0,0,0,0 +CONTROVERTING,0,0,0,2009,0,0,0 +CONVICT,2009,0,0,2009,0,0,0 +CONVICTIONS,2009,0,0,2009,0,0,0 +CORRECTIONS,2009,0,0,0,0,0,0 +CORRUPTING,2009,0,0,0,0,0,0 +CORRUPTNESS,2009,0,0,0,0,0,0 +COUNSEL,0,0,0,2009,0,0,0 +COUNTERCLAIM,2009,0,0,0,0,0,0 +COUNTERFEIT,2009,0,0,0,0,0,0 +COUNTERFEITING,2009,0,0,0,0,0,0 +COUNTERSIGNOR,0,0,0,2011,0,0,0 +COURT,0,0,0,2009,0,0,0 +COVENANT,0,0,0,0,0,0,2011 +CREATIVE,0,2009,0,0,0,0,0 +CRIME,2009,0,0,2009,0,0,0 +CRIMINALIZE,0,0,0,2014,0,0,0 +CRISES,2009,0,0,0,0,0,0 +CRITICISM,2009,0,0,0,0,0,0 +CRITICIZES,2009,0,0,0,0,0,0 +CROSSROAD,0,0,2009,0,0,0,0 +CULPABILITY,2009,0,0,0,0,0,0 +CURTAIL,2009,0,0,0,0,0,0 +CURTAILMENTS,2009,0,0,0,0,0,0 +CUTBACKS,2009,0,0,0,0,0,0 +CYBERCRIME,2014,0,0,0,0,0,0 +TAINTING,2009,0,0,0,0,0,0 +TENDING,0,0,2009,0,0,0,0 +TERMINABLE,0,0,0,2009,0,0,0 +TERMINATING,2009,0,0,0,0,0,0 +TESTAMENTARY,0,0,0,2009,0,0,0 +THENCE,0,0,0,2009,0,0,0 +THEREAT,0,0,0,2009,0,0,0 +THEREOF,0,0,0,2009,0,0,0 +THERETOFOR,0,0,0,2011,0,0,0 +THEREUPON,0,0,0,2009,0,0,0 +THREATENED,2009,0,0,0,0,0,0 +FAILED,2009,0,0,0,0,0,0 +FAILURE,2009,0,0,0,0,0,0 +FALSELY,2009,0,0,0,0,0,0 +FALSIFIES,2009,0,0,0,0,0,0 +FANTASTIC,0,2009,0,0,0,0,0 +FAULT,2009,0,0,0,0,0,0 +FAVORABLE,0,2009,0,0,0,0,0 +FAVORITE,0,2009,0,0,0,0,0 +FELONIES,2009,0,0,2009,0,0,0 +DAMAGED,2009,0,0,0,0,0,0 +DAMPENED,2009,0,0,0,0,0,0 +DANGERS,2009,0,0,0,0,0,0 +DEADLOCKS,2009,0,0,0,0,0,0 +DEBARMENTS,2009,0,0,0,0,0,0 +DECEDENTS,0,0,0,2009,0,0,0 +DECEIVE,2009,0,0,0,0,0,0 +DECEPTION,2009,0,0,0,0,0,0 +DECLARANT,0,0,0,2011,0,0,0 +DECLINING,2009,0,0,0,0,0,0 +DECREES,0,0,0,2009,0,0,0 +DEFALCATION,0,0,0,2009,0,0,0 +DEFAMATORY,2009,0,0,0,0,0,0 +DEFAMING,2009,0,0,0,0,0,0 +DEFAULTS,2009,0,0,0,0,0,0 +DEFEASED,0,0,0,2009,0,0,0 +DEFEAT,2009,0,0,0,0,0,0 +DEFECT,2009,0,0,0,0,0,0 +DEFEND,2009,0,0,0,0,0,0 +DEFENDED,2009,0,0,0,0,0,0 +DEFER,2009,0,0,0,0,0,0 +DEFICIENT,2009,0,0,0,0,0,0 +DEFINITIVELY,0,0,0,0,2009,0,0 +DEFRAUDS,2009,0,0,0,0,0,0 +DEGRADE,2009,0,0,0,0,0,0 +DELAY,2009,0,0,0,0,0,0 +DELEGABLE,0,0,0,2009,0,0,0 +DELETERIOUS,2009,0,0,0,0,0,0 +DELIGHT,0,2009,0,0,0,0,0 +DELIGHTING,0,2009,0,0,0,0,0 +DELINQUENT,2009,0,0,0,0,0,0 +DELISTED,2009,0,0,0,0,0,0 +DEMISED,2009,0,0,0,0,0,0 +DEMOLISHED,2009,0,0,0,0,0,0 +DEMOLITIONS,2009,0,0,0,0,0,0 +DEMOTING,2009,0,0,0,0,0,0 +DEMURRER,0,0,0,2009,0,0,0 +DENIAL,2009,0,0,0,0,0,0 +DENIGRATE,2009,0,0,0,0,0,0 +DENIGRATION,2009,0,0,0,0,0,0 +DEPENDABILITY,0,2009,0,0,0,0,0 +DEPENDANT,0,0,0,0,0,0,2011 +DEPENDENCY,0,0,2009,0,0,0,0 +DEPLETE,2009,0,0,0,0,0,0 +DEPLETION,2009,0,0,0,0,0,0 +DEPOSES,0,0,0,2009,0,0,0 +DEPOSITIONS,0,0,0,2009,0,0,0 +INTRUSION,2009,0,0,0,0,0,0 +INVALIDATES,2009,0,0,0,0,0,0 +INVENT,0,2009,0,0,0,0,0 +INVENTIONS,0,2009,0,0,0,0,0 +INVENTORS,0,2009,0,0,0,0,0 +INVESTIGATING,2009,0,0,0,0,0,0 +INVOLUNTARY,2009,0,0,0,0,0,0 +IRRECOVERABLY,2009,0,0,0,0,0,0 +IRREGULARLY,2009,0,0,0,0,0,0 +IRREVOCABILITY,0,0,0,2011,0,0,0 +JEOPARDIZED,2009,0,0,0,0,0,0 +JUDICIARIES,0,0,0,2009,0,0,0 +JURISDICTION,0,0,0,2009,0,0,0 +JURISPRUDENCE,0,0,0,2009,0,0,0 +JURORS,0,0,0,2009,0,0,0 +JUSTICES,0,0,0,2009,0,0,0 +KNOWINGLY,2009,0,0,0,0,0,0 +DILIGENT,0,2009,0,0,0,0,0 +DIMINISHES,2009,0,0,0,0,0,0 +DIRECTIVES,0,0,0,0,0,0,2009 +DISADVANTAGES,2009,0,0,0,0,0,0 +DISAFFIRMED,0,0,0,2011,0,0,0 +DISAGREED,2009,0,0,0,0,0,0 +DISAGREES,2009,0,0,0,0,0,0 +DISALLOWED,2009,0,0,0,0,0,0 +DISAPPEARANCE,2009,0,0,0,0,0,0 +DISAPPEARS,2009,0,0,0,0,0,0 +DISAPPOINTINGLY,2009,0,0,0,0,0,0 +DISAPPROVAL,2009,0,0,0,0,0,0 +DISAPPROVES,2009,0,0,0,0,0,0 +DISASSOCIATION,2009,0,0,0,0,0,0 +DISASTROUS,2009,0,0,0,0,0,0 +DISAVOWED,2009,0,0,0,0,0,0 +GREAT,0,-2020,0,0,0,0,0 +GREATNESS,0,2009,0,0,0,0,0 +GROUNDLESS,2009,0,0,0,0,0,0 +HAMPER,2009,0,0,0,0,0,0 +HAPPIEST,0,2009,0,0,0,0,0 +HARASS,2009,0,0,0,0,0,0 +HARDSHIP,2009,0,0,0,0,0,0 +HARMFUL,2009,0,0,0,0,0,0 +HARSH,2009,0,0,0,0,0,0 +HARSHNESS,2009,0,0,0,0,0,0 +NONJUDICIAL,0,0,0,2009,0,0,0 +NONPAYMENTS,2009,0,0,0,0,0,0 \ No newline at end of file diff --git a/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/go-challenge/main.go b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/go-challenge/main.go new file mode 100644 index 000000000000..29e6db175a93 --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/go-challenge/main.go @@ -0,0 +1,69 @@ +/* + * 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. + */ + +// beam-playground: +// name: FinalChallenge2 +// description: Final challenge 2. +// multifile: true +// files: +// - name: analysis.csv +// context_line: 54 +// categories: +// - Quickstart +// complexity: ADVANCED +// tags: +// - hellobeam + +package main + +import ( + "context" + "log" + "strings" + + "github.com/apache/beam/sdks/v2/go/pkg/beam" + "github.com/apache/beam/sdks/v2/go/pkg/beam/io/textio" + "github.com/apache/beam/sdks/v2/go/pkg/beam/x/beamx" + "github.com/apache/beam/sdks/v2/go/pkg/beam/x/debug" +) + +func main() { + + beam.Init() + + p := beam.NewPipeline() + s := p.Root() + + shakespeare := textio.Read(s, "gs://apache-beam-samples/shakespeare/kinglear.txt") + + debug.Print(s, getWords(s, shakespeare)) + + err := beamx.Run(context.Background(), p) + if err != nil { + log.Fatalf("Failed to execute job: %v", err) + } +} + +func getWords(s beam.Scope, input beam.PCollection) beam.PCollection { + return beam.ParDo(s, func(line string, emit func(string)) { + c := strings.Split(strings.ToLower(line), " ") + for _, word := range c { + emit(word) + } + }, input) +} diff --git a/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/go-solution/analysis.csv b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/go-solution/analysis.csv new file mode 100644 index 000000000000..5c4a1246021e --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/go-solution/analysis.csv @@ -0,0 +1,3877 @@ +Word,Negative,Positive,Uncertainty,Litigious,Strong_Modal,Weak_Modal,Constraining +NONSEVERABLE,0,0,0,2011,0,0,0 +DISFAVOR,2009,0,0,0,0,0,0 +DISGORGE,2009,0,0,0,0,0,0 +COMPLICATES,2009,0,0,0,0,0,0 +COMPLIMENT,0,2009,0,0,0,0,0 +COMPLIMENTS,0,2009,0,0,0,0,0 +MISSTATE,2009,0,0,0,0,0,0 +MISSTATES,2009,0,0,0,0,0,0 +MISTAKE,2009,0,0,0,0,0,0 +MISTAKING,2009,0,0,0,0,0,0 +MISUNDERSTANDING,2009,0,0,0,0,0,0 +MISUSED,2009,0,0,0,0,0,0 +MONOPOLISTS,2009,0,0,0,0,0,0 +MONOPOLIZES,2009,0,0,0,0,0,0 +MORATORIUM,2009,0,0,0,0,0,0 +MOTHBALLING,2009,0,0,0,0,0,0 +SLOW,2009,0,0,0,0,0,0 +SLOWER,2009,0,0,0,0,0,0 +SLOWNESS,2009,0,0,0,0,0,0 +SMOOTH,0,2009,0,0,0,0,0 +DEPRECATION,2009,0,0,0,0,0,0 +DEPRESSING,2009,0,0,0,0,0,0 +DEPRIVES,2009,0,0,0,0,0,0 +DEROGATE,0,0,0,2009,0,0,0 +DEROGATION,0,0,0,2009,0,0,0 +DESIRABLE,0,2009,0,0,0,0,0 +DESTABILIZATION,2009,0,0,0,0,0,0 +DESTINED,0,2009,0,0,0,0,0 +DESTROYS,2009,0,0,0,0,0,0 +DETAINED,2009,0,0,0,0,0,0 +DETER,2009,0,0,0,0,0,0 +DETERIORATING,2009,0,0,0,0,0,0 +DETERRENCE,2009,0,0,0,0,0,0 +DETERRING,2009,0,0,0,0,0,0 +DETRACTING,2009,0,0,0,0,0,0 +DETRIMENTS,2009,0,0,0,0,0,0 +DEVALUING,2009,0,0,0,0,0,0 +DEVASTATION,2009,0,0,0,0,0,0 +DEVIATING,2009,0,2009,0,0,0,0 +DEVOLVE,2009,0,0,0,0,0,0 +DICTATE,0,0,0,0,0,0,2009 +DIFFER,0,0,2009,0,0,0,0 +DIFFICULT,2009,0,0,0,0,0,0 +ASSAULT,2009,0,0,0,0,0,0 +ASSERTABLE,0,0,0,2011,0,0,0 +ASSUMABLE,0,0,0,2009,0,0,0 +ASSUMING,0,0,2009,0,0,0,0 +ASSURED,0,2009,0,0,0,0,0 +ATTAINED,0,2009,0,0,0,0,0 +ATTAINS,0,2009,0,0,0,0,0 +ATTESTED,0,0,0,2009,0,0,0 +ATTORNEYS,0,0,0,2009,0,0,0 +ATTRACTIVENESS,0,2009,0,0,0,0,0 +BAD,2009,0,0,0,0,0,0 +BAILEES,0,0,0,2011,0,0,0 +BAILOUT,2009,0,0,0,0,0,0 +BANKRUPTCIES,2009,0,0,0,0,0,0 +BANKRUPTS,2009,0,0,0,0,0,0 +CLAIM,0,0,0,2009,0,0,0 +CLAIMHOLDER,0,0,0,2014,0,0,0 +CLARIFICATIONS,0,0,2009,0,0,0,0 +CLOSED,-2020,0,0,0,0,0,0 +CLOSINGS,2009,0,0,0,0,0,0 +CODEFENDANTS,0,0,0,2011,0,0,0 +CODIFICATIONS,0,0,0,2009,0,0,0 +CODIFYING,0,0,0,2009,0,0,0 +COERCING,2009,0,0,0,0,0,0 +COLLABORATES,0,2009,0,0,0,0,0 +COLLABORATIVE,0,2009,0,0,0,0,0 +COLLAPSED,2009,0,0,0,0,0,0 +COLLISIONS,2009,0,0,0,0,0,0 +COLLUDING,2009,0,0,0,0,0,0 +POSES,2009,0,0,0,0,0,0 +POSSESSORY,0,0,0,2009,0,0,0 +POSSIBLY,0,0,2009,0,0,2009,0 +POSTJUDGMENT,0,0,0,2011,0,0,0 +POSTPONEMENTS,2009,0,0,0,0,0,0 +WRITEDOWNS,2009,0,0,0,0,0,0 +WRONG,2009,0,0,0,0,0,0 +WRONGFULLY,2009,0,0,0,0,0,0 +HONORABLE,0,-2020,0,0,0,0,0 +HOSTILE,2009,0,0,0,0,0,0 +REASSESS,0,0,2009,0,0,0,0 +REASSESSMENT,2009,0,2009,0,0,0,0 +REASSIGNING,2009,0,0,0,0,0,0 +REBOUND,0,2009,0,0,0,0,0 +REBUTS,0,0,0,2009,0,0,0 +REBUTTALS,0,0,0,2009,0,0,0 +RECALCULATED,0,0,2009,0,0,0,0 +RECALCULATIONS,0,0,2009,0,0,0,0 +RECALLS,2009,0,0,0,0,0,0 +RECESSIONS,2009,0,0,0,0,0,0 +RECONSIDER,0,0,2009,0,0,0,0 +RECORDATION,0,0,0,2009,0,0,0 +RECOURSE,0,0,0,2009,0,0,0 +RECUSAL,0,0,0,2011,0,0,0 +RECUSING,0,0,0,2011,0,0,0 +REDACTION,2009,0,0,2009,0,0,0 +REDEFAULTS,2014,0,0,0,0,0,0 +REDRESSING,2009,0,0,0,0,0,0 +REFERENDA,0,0,0,2009,0,0,0 +REFILED,0,0,0,2009,0,0,0 +REFRAINING,0,0,0,0,0,0,2009 +REFUSE,2009,0,0,0,0,0,0 +REGAIN,0,2009,0,0,0,0,0 +REGULATED,0,0,0,2009,0,0,0 +REGULATIONS,0,0,0,2009,0,0,0 +REGULATORY,0,0,0,2009,0,0,0 +REHEARINGS,0,0,0,2009,0,0,0 +VARIABILITY,0,0,2009,0,0,0,0 +VARIANCE,0,0,2009,0,0,0,0 +VARIATION,0,0,2009,0,0,0,0 +VARY,0,0,2009,0,0,0,0 +VERDICT,2009,0,0,2009,0,0,0 +VETOED,2009,0,0,0,0,0,0 +VICTIMS,2009,0,0,0,0,0,0 +VIOLATING,2009,0,0,0,0,0,0 +VIOLATOR,2009,0,0,0,0,0,0 +VIOLENTLY,2009,0,0,0,0,0,0 +VITIATING,2009,0,0,0,0,0,0 +VOIDING,2009,0,0,2009,0,0,0 +VULNERABILITIES,2009,0,0,0,0,0,0 +WARN,2009,0,0,0,0,0,0 +WARNS,2009,0,0,0,0,0,0 +WASTEFUL,2009,0,0,0,0,0,0 +WEAKENED,2009,0,0,0,0,0,0 +WEAKEST,2009,0,0,0,0,0,0 +DISHONESTLY,2009,0,0,0,0,0,0 +DISHONORABLY,2009,0,0,0,0,0,0 +DISINTERESTEDNESS,2009,0,0,0,0,0,0 +DISMAL,2009,0,0,0,0,0,0 +DISMISSALS,2009,0,0,0,0,0,0 +DISORDERLY,2009,0,0,0,0,0,0 +DISPARAGEMENTS,2009,0,0,0,0,0,0 +DISPARITIES,2009,0,0,0,0,0,0 +DISPLACEMENT,2009,0,0,0,0,0,0 +DISPOSE,2009,0,0,0,0,0,0 +DISPOSSESSES,2009,0,0,0,0,0,0 +DISPROPORTION,2009,0,0,0,0,0,0 +DISPUTE,2009,0,0,0,0,0,0 +DISQUALIFICATION,2009,0,0,0,0,0,0 +DISQUALIFY,2009,0,0,0,0,0,0 +DISREGARDING,2009,0,0,0,0,0,0 +DISRUPT,2009,0,0,0,0,0,0 +DISRUPTIONS,2009,0,0,0,0,0,0 +DISSATISFIED,2009,0,0,0,0,0,0 +DISSENTERS,2009,0,0,0,0,0,0 +DISSIDENTS,2009,0,0,0,0,0,0 +DISTINCTIONS,0,2009,0,0,0,0,0 +DISTORT,2009,0,0,0,0,0,0 +DISTORTIONS,2009,0,0,0,0,0,0 +DISTRACTING,2009,0,0,0,0,0,0 +DISTRAINT,0,0,0,2009,0,0,0 +DISTRIBUTEES,0,0,0,2009,0,0,0 +DISTURBED,2009,0,0,0,0,0,0 +DIVERT,2009,0,0,0,0,0,0 +DIVEST,2009,0,0,0,0,0,0 +DIVESTITURES,2009,0,0,0,0,0,0 +DIVORCE,2009,0,0,0,0,0,0 +DIVULGES,2009,0,0,0,0,0,0 +DOCKETING,0,0,0,2009,0,0,0 +DOUBTED,2009,0,2009,0,0,0,0 +DOWNGRADED,2009,0,0,0,0,0,0 +DOWNSIZED,2009,0,0,0,0,0,0 +DOWNTIME,2009,0,0,0,0,0,0 +DOWNWARD,2009,0,0,0,0,0,0 +DRASTICALLY,2009,0,0,0,0,0,0 +DROPPED,2009,0,0,0,0,0,0 +DURESS,2009,0,0,0,0,0,0 +EARMARK,0,0,0,0,0,0,2009 +EASIER,0,2009,0,0,0,0,0 +EFFECTIVE,0,-2020,0,0,0,0,0 +EFFICIENTLY,0,2009,0,0,0,0,0 +EMBARGO,2009,0,0,0,0,0,0 +EMBARRASS,2009,0,0,0,0,0,0 +EMBARRASSMENT,2009,0,0,0,0,0,0 +EMBEZZLEMENT,2009,0,0,0,0,0,0 +EMBEZZLING,2009,0,0,0,0,0,0 +EMPOWERS,0,2009,0,0,0,0,0 +ENABLING,0,2009,0,0,0,0,0 +ENCOURAGING,0,2009,0,0,0,0,0 +ENCROACHING,2009,0,0,0,0,0,0 +ENCUMBERED,2009,0,0,2009,0,0,2009 +ENCUMBRANCER,0,0,0,2009,0,0,0 +ENDANGERED,2009,0,0,0,0,0,0 +ENDORSEE,0,0,0,2011,0,0,0 +ENHANCE,0,2009,0,0,0,0,0 +ENHANCES,0,2009,0,0,0,0,0 +ENJOINING,2009,0,0,0,0,0,0 +ENJOYABLY,0,2009,0,0,0,0,0 +ENJOYS,0,2009,0,0,0,0,0 +ENTAILS,0,0,0,0,0,0,2009 +PATENTEE,0,0,0,2014,0,0,0 +PENALIZES,2009,0,0,0,0,0,0 +PENDING,0,0,2009,0,0,0,0 +PERFECTS,0,2009,0,0,0,0,0 +PERJURY,2009,0,0,2009,0,0,0 +PERMITTED,0,0,0,0,0,0,2009 +PERPETRATE,2009,0,0,2009,0,0,0 +PERPETRATION,2009,0,0,2009,0,0,0 +PERSISTENT,2009,0,0,0,0,0,0 +PERSONAM,0,0,0,2011,0,0,0 +PETITION,0,0,0,2009,0,0,0 +PETITIONING,0,0,0,2009,0,0,0 +PICKETED,2009,0,0,0,0,0,0 +HENCEFORTH,0,0,0,2009,0,0,0 +HEREDITAMENTS,0,0,0,2009,0,0,0 +HEREIN,0,0,0,2009,0,0,0 +HEREINBELOW,0,0,0,2009,0,0,0 +HERETOFORE,0,0,0,2009,0,0,0 +HEREWITH,0,0,0,2009,0,0,0 +HINDER,2009,0,0,0,0,0,0 +HINDRANCE,2009,0,0,0,0,0,0 +WHATSOEVER,0,0,0,2009,0,0,0 +WHEREAT,0,0,0,2009,0,0,0 +WHEREOF,0,0,0,2009,0,0,0 +WHEREUPON,0,0,0,2009,0,0,0 +WHOMSOEVER,0,0,0,2009,0,0,0 +WILLFUL,0,0,0,2009,0,0,0 +WINNER,0,2009,0,0,0,0,0 +WITNESSES,0,0,0,2009,0,0,0 +FLUCTUATES,0,0,2009,0,0,0,0 +FORBADE,0,0,0,2009,0,0,2011 +FORBEARING,0,0,0,2009,0,0,0 +FORBIDDING,2009,0,0,0,0,0,2009 +FORCING,2009,0,0,0,0,0,0 +FORECLOSE,2009,0,0,0,0,0,0 +FORECLOSURE,2009,0,0,0,0,0,0 +FOREGONE,2009,0,0,0,0,0,0 +FORESTALLS,2009,0,0,0,0,0,0 +FORFEITED,2009,0,0,0,0,0,0 +FORFEITURES,2009,0,0,0,0,0,0 +FORWHICH,0,0,0,2012,0,0,0 +FRAUDULENT,2009,0,0,0,0,0,0 +FRIVOLOUSLY,2009,0,0,0,0,0,0 +FRUSTRATING,2009,0,0,0,0,0,0 +FUGITIVE,-2020,0,0,2009,0,0,0 +GAINED,0,2009,0,0,0,0,0 +GRANTOR,0,0,0,2009,0,0,0 +DISGORGING,2009,0,0,0,0,0,0 +DISHONEST,2009,0,0,0,0,0,0 +LITIGANT,2009,0,0,2009,0,0,0 +LITIGATES,2009,0,0,2009,0,0,0 +LITIGATOR,0,0,0,2009,0,0,0 +LACKLUSTER,2009,0,0,0,0,0,0 +LAGGING,2009,0,0,0,0,0,0 +LAPSES,2009,0,0,0,0,0,0 +LAW,0,0,0,2009,0,0,0 +LAWMAKERS,0,0,0,2009,0,0,0 +LAWSUITS,0,0,0,2009,0,0,0 +LAYOFFS,2009,0,0,0,0,0,0 +LEGALESE,0,0,0,2009,0,0,0 +LEGALIZE,0,0,0,2009,0,0,0 +LEGALLY,0,0,0,2009,0,0,0 +NONPRODUCING,2009,0,0,0,0,0,0 +LIQUIDATE,2009,0,0,0,0,0,0 +LIQUIDATION,2009,0,0,0,0,0,0 +BENEFICIALLY,0,2009,0,0,0,0,0 +BENEFITED,0,2009,0,0,0,0,0 +BEST,0,2012,0,0,2009,0,0 +POPULAR,0,2009,0,0,0,0,0 +REINTERPRETED,0,0,2009,0,0,0,0 +REJECTED,2009,0,0,0,0,0,0 +REJECTS,2009,0,0,0,0,0,0 +RELINQUISHES,2009,0,0,0,0,0,0 +RELUCTANCE,2009,0,0,0,0,0,0 +REMANDING,0,0,0,2009,0,0,0 +REMEDIATING,0,0,0,2009,0,0,0 +REMISED,0,0,0,2011,0,0,0 +RENEGOTIATING,2009,0,0,0,0,0,0 +RENOUNCED,2009,0,0,0,0,0,0 +RENOUNCING,2009,0,0,0,0,0,0 +REPLEVIN,0,0,0,2009,0,0,0 +REPOSSESSION,2009,0,0,0,0,0,0 +TURBULENCE,2009,0,2009,0,0,0,0 +UNACCEPTABLY,2009,0,0,0,0,0,0 +UNANTICIPATED,2009,0,0,0,0,0,0 +UNATTRACTIVE,2009,0,0,0,0,0,0 +UNAVOIDABLE,2009,0,0,0,0,0,0 +UNCERTAINLY,0,0,2009,0,0,2009,0 +UNCOLLECTABLE,2009,0,0,0,0,0,0 +UNCOLLECTIBLES,2009,0,0,0,0,0,0 +UNCONFIRMED,0,0,2009,0,0,0,0 +UNCONSTITUTIONALITY,0,0,0,2009,0,0,0 +UNCONTROLLABLY,2009,0,0,0,0,0,0 +UNCOVERED,2009,0,0,0,0,0,0 +UNDEFEASED,0,0,0,2012,0,0,0 +UNDERCAPITALIZED,2009,0,0,0,0,0,0 +UNDERESTIMATE,2009,0,0,0,0,0,0 +UNDERESTIMATION,2009,0,0,0,0,0,0 +UNDERMINED,2009,0,0,0,0,0,0 +UNDERPAYMENT,2009,0,0,0,0,0,0 +UNDERPERFORMANCE,2009,0,0,0,0,0,0 +UNDERPRODUCED,2009,0,0,0,0,0,0 +UNDERSTATED,2009,0,0,0,0,0,0 +UNDERSTATING,2009,0,0,0,0,0,0 +UNDESIRABLE,2009,0,0,0,0,0,0 +UNDETERMINABLE,0,0,2009,0,0,0,0 +UNDISPUTED,0,0,0,0,2009,0,0 +UNDULY,2009,0,0,0,0,0,0 +UNEMPLOYED,2009,0,0,0,0,0,0 +UNENFORCEABILITY,0,0,0,2009,0,0,0 +UNETHICAL,2009,0,0,0,0,0,0 +UNEXPECTEDLY,2009,0,2009,0,0,0,0 +UNFAMILIARITY,0,0,2009,0,0,0,0 +UNFAVOURABLE,2011,0,0,0,0,0,0 +UNFORECASTED,0,0,2011,0,0,0,0 +UNFORTUNATE,2009,0,0,0,0,0,0 +UNFULFILLED,2009,0,0,0,0,0,0 +UNIDENTIFIABLE,0,0,2009,0,0,0,0 +UNINTENTIONAL,2009,0,0,0,0,0,0 +UNJUSTIFIABLY,2009,0,0,0,0,0,0 +UNKNOWINGLY,2009,0,0,0,0,0,0 +UNLAWFULLY,2009,0,0,2009,0,0,0 +UNMARKETABLE,2009,0,0,0,0,0,0 +UNNECESSARILY,2009,0,0,0,0,0,0 +UNOBTAINABLE,2009,0,0,0,0,0,0 +UNPERFORMED,2009,0,0,0,0,0,0 +UNPREDICTABLE,2009,0,2009,0,0,0,0 +UNPROFITABILITY,2011,0,0,0,0,0,0 +UNQUALIFIED,2009,0,0,0,0,0,0 +UNREASONABLE,2009,0,0,0,0,0,0 +UNRECONCILED,0,0,2011,0,0,0,0 +UNRELIABLE,2009,0,0,0,0,0,0 +UNRESOLVED,2009,0,0,0,0,0,0 +UNSALEABLE,2009,0,0,0,0,0,0 +UNSCHEDULED,2009,0,0,0,0,0,0 +UNSETTLED,0,0,2009,0,0,0,0 +UNSPECIFIED,0,0,2009,0,0,0,0 +UNSUBSTANTIATED,2009,0,0,0,0,0,0 +UNSUITABLE,2009,0,0,0,0,0,0 +UNSURPASSED,0,2009,0,0,2009,0,0 +UNTENABLE,2009,0,0,0,0,0,0 +UNTRUSTED,2014,0,0,0,0,0,0 +UNTRUTHFULNESS,2009,0,0,0,0,0,0 +UNUSUALLY,0,0,2009,0,0,0,0 +UNWILLING,2009,0,0,0,0,0,0 +UPTURN,0,2009,0,0,0,0,0 +USURIOUS,2009,0,0,2009,0,0,0 +USURPING,2009,0,0,2009,0,0,0 +VAGUE,0,0,2012,0,0,0,0 +VAGUER,0,0,2012,0,0,0,0 +PLAINTIFFS,2009,0,0,2009,0,0,0 +PLEADING,2009,0,0,2009,0,0,0 +PLEASANT,0,2009,0,0,0,0,0 +PLED,2009,0,0,0,0,0,0 +PLEDGEES,0,0,0,2011,0,0,0 +PLEDGORS,0,0,0,2012,0,0,0 +COMPELLING,0,0,0,0,0,0,2011 +COMPLAINANT,0,0,0,2009,0,0,0 +COMPLAINS,2009,0,0,0,0,0,0 +COMMITS,0,0,0,0,0,0,2009 +LIKELIHOOD,0,0,2009,0,0,0,0 +LIMITING,0,0,0,0,0,0,2009 +RESTRAIN,0,0,0,0,0,0,2009 +RESTRAINT,0,0,0,0,0,0,2009 +RESTRICTING,0,0,0,0,0,0,2009 +RESTRICTIVELY,0,0,0,0,0,0,2009 +RESTRUCTURED,2009,0,0,0,0,0,0 +RETALIATE,2009,0,0,0,0,0,0 +RETALIATION,2009,0,0,0,0,0,0 +PRECAUTION,0,0,2009,0,0,0,0 +PRECIPITOUS,2009,0,0,0,0,0,0 +PRECLUDES,2009,0,0,0,0,0,2009 +PREDATORY,2009,0,0,0,0,0,0 +PREDECEASING,0,0,0,2009,0,0,0 +PREDICTING,0,0,2009,0,0,0,0 +PREDICTOR,0,0,2009,0,0,0,0 +PREEMINENT,0,2009,0,0,0,0,0 +PREJUDICES,2009,0,0,2009,0,0,0 +PRELIMINARY,0,0,2009,0,0,0,0 +PREMIERE,0,2009,0,0,0,0,0 +PRESTIGE,0,2009,0,0,0,0,0 +PRESUMED,0,0,2009,0,0,0,0 +PRESUMPTIONS,0,0,2009,0,0,0,0 +PREVENTED,0,0,0,0,0,0,2009 +PRIMA,0,0,0,2009,0,0,0 +PROBABILISTIC,0,0,2009,0,0,0,0 +PROBABLY,0,0,2009,0,0,0,0 +PROBATING,0,0,0,2009,0,0,0 +PROBATIONER,0,0,0,2009,0,0,0 +PROBLEMATIC,2009,0,0,0,0,0,0 +PROFICIENT,0,2009,0,0,0,0,0 +PROFITABLY,0,2009,0,0,0,0,0 +PROGRESSING,0,2009,0,0,0,0,0 +PROHIBITION,0,0,0,0,0,0,2009 +PROHIBITORY,0,0,0,0,0,0,2009 +PROLONGATIONS,2009,0,0,0,0,0,0 +PROMULGATE,0,0,0,2009,0,0,0 +PROMULGATION,0,0,0,2009,0,0,0 +PRONE,2009,0,0,0,0,0,0 +PROSECUTED,2009,0,0,2009,0,0,0 +PROSECUTIONS,2009,0,0,2009,0,0,0 +PROSPERED,0,2009,0,0,0,0,0 +PROSPERS,0,2009,0,0,0,0,0 +PROTESTERS,2009,0,0,0,0,0,0 +PROTESTS,2009,0,0,0,0,0,0 +PROVISOES,0,0,0,2009,0,0,0 +PROVOKES,2009,0,0,0,0,0,0 +PUNISHES,2009,0,0,0,0,0,0 +PUNITIVE,2009,0,0,0,0,0,0 +PURPORTING,2009,0,0,0,0,0,0 +QUESTIONABLY,2009,0,0,0,0,0,0 +QUIT,2009,0,0,0,0,0,0 +RACKETEER,2009,0,0,0,0,0,0 +RANDOMIZED,0,0,2009,0,0,0,0 +RANDOMNESS,0,0,2009,0,0,0,0 +RATIONALIZATION,2009,0,0,0,0,0,0 +RATIONALIZES,2009,0,0,0,0,0,0 +ABANDONMENT,2009,0,0,0,0,0,0 +ABDICATES,2009,0,0,0,0,0,0 +ABERRANT,2009,0,0,0,0,0,0 +ABETTING,2009,0,0,0,0,0,0 +ABIDING,0,0,0,0,0,0,2009 +ABNORMALITY,2009,0,0,0,0,0,0 +ABOLISHES,2009,0,0,0,0,0,0 +ABROGATED,2009,0,0,2009,0,0,0 +ABROGATIONS,2009,0,0,2009,0,0,0 +ABSENCE,2009,0,0,0,0,0,0 +ABSOLVED,0,0,0,2009,0,0,0 +ABUNDANT,0,2009,0,0,0,0,0 +ABUSING,2009,0,0,0,0,0,0 +ACCESSION,0,0,0,2009,0,0,0 +ACCIDENTALLY,2009,0,0,0,0,0,0 +ACCOMPLISHED,0,2009,0,0,0,0,0 +ACCOMPLISHMENTS,0,2009,0,0,0,0,0 +ACCUSED,2009,0,0,0,0,0,0 +ACHIEVED,0,2009,0,0,0,0,0 +ACHIEVING,0,2009,0,0,0,0,0 +ACQUIESCING,2009,0,0,0,0,0,0 +ACQUITS,2009,0,0,2009,0,0,0 +ACQUITTANCES,0,0,0,2011,0,0,0 +ADEQUATELY,0,2009,0,0,0,0,0 +ADJOURNMENT,0,0,0,2009,0,0,0 +ADJUDGED,0,0,0,2009,0,0,0 +ADJUDICATED,0,0,0,2009,0,0,0 +ADJUDICATIONS,0,0,0,2009,0,0,0 +ADJUDICATORY,0,0,0,2009,0,0,0 +ADMISSION,0,0,0,2009,0,0,0 +ADULTERATING,2009,0,0,0,0,0,0 +ADVANCEMENTS,0,2009,0,0,0,0,0 +ADVANTAGED,0,2009,0,0,0,0,0 +ADVERSARIAL,2009,0,0,0,0,0,0 +ADVERSELY,2009,0,0,0,0,0,0 +AFFIDAVITS,0,0,0,2009,0,0,0 +AFOREMENTIONED,0,0,0,2009,0,0,0 +AFTERMATHS,2009,0,0,0,0,0,0 +AGGRAVATES,2009,0,0,0,0,0,0 +AGGRIEVED,0,0,0,2009,0,0,0 +ALIENATED,2009,0,0,0,0,0,0 +ALIENATIONS,2009,0,0,0,0,0,0 +ALLEGED,2009,0,0,2009,0,0,0 +ALLIANCE,0,2009,0,0,0,0,0 +ALTERATIONS,0,0,2009,0,0,0,0 +AMBIGUOUS,0,0,2009,0,0,0,0 +AMENDED,0,0,0,2009,0,0,0 +AMENDS,0,0,0,2009,0,0,0 +ANNOYED,2009,0,0,0,0,0,0 +ANNULLED,2009,0,0,0,0,0,0 +ANNULS,2009,0,0,0,0,0,0 +ANOMALY,2009,0,2009,0,0,0,0 +ANTICIPATED,0,0,2009,0,0,0,0 +ANTICIPATIONS,0,0,2009,0,0,0,0 +ANYWISE,0,0,0,2009,0,0,0 +APPEALABLE,0,0,0,2009,0,0,0 +APPEAR,0,0,2009,0,0,0,0 +APPELLANT,0,0,0,2009,0,0,0 +APPOINTOR,0,0,0,2011,0,0,0 +APPROXIMATES,0,0,2009,0,0,0,0 +APPURTENANCE,0,0,0,2009,0,0,0 +ARBITRAL,0,0,0,2009,0,0,0 +ARBITRATE,0,0,0,2009,0,0,0 +ARBITRATION,0,0,0,2009,0,0,0 +ARBITRATOR,0,0,0,2009,0,0,0 +ARGUING,2009,0,0,0,0,0,0 +ARREARAGE,2009,0,0,2009,0,0,0 +ARRESTED,2009,0,0,0,0,0,0 +RETROCEDE,0,0,0,2011,0,0,0 +BOLSTERED,0,2009,0,0,0,0,0 +BONAFIDE,0,0,0,2009,0,0,0 +BOOSTED,0,2009,0,0,0,0,0 +BOUNDED,0,0,0,0,0,0,2009 +BOYCOTTS,2009,0,0,0,0,0,0 +BREACHING,2009,0,0,2009,0,0,0 +BREAKDOWN,2009,0,0,0,0,0,0 +BREAKTHROUGH,0,2009,0,0,0,0,0 +BRIBERIES,2009,0,0,0,0,0,0 +BRIDGE,-2020,0,0,0,0,0,0 +BURDENED,2009,0,0,0,0,0,0 +BURNED,2009,0,0,0,0,0,0 +CANCEL,2009,0,0,0,0,0,0 +CANCELLATIONS,2009,0,0,0,0,0,0 +CARELESS,2009,0,0,0,0,0,0 +CATASTROPHE,2009,0,0,0,0,0,0 +CAUTION,2009,0,0,0,0,0,0 +CAUTIONS,2009,0,0,0,0,0,0 +CEASE,2009,0,0,0,0,0,0 +CEDANT,0,0,0,2012,0,0,0 +CENSURES,2009,0,0,0,0,0,0 +CHALLENGE,2009,0,0,0,0,0,0 +CHARGEOFFS,2009,0,0,0,0,0,0 +CHOATE,0,0,0,2011,0,0,0 +CIRCUMVENTION,2009,0,0,0,0,0,0 +SHOCKED,2009,0,0,0,0,0,0 +SHORTFALLS,2009,0,0,0,0,0,0 +SHUTDOWN,2009,0,0,0,0,0,0 +SLANDER,2009,0,0,0,0,0,0 +REPUDIATED,2009,0,0,0,0,0,0 +REPUDIATIONS,2009,0,0,0,0,0,0 +REQUIRED,0,0,0,0,0,0,2009 +REQUIRING,0,0,0,0,0,0,2009 +RESCINDING,0,0,0,2009,0,0,0 +RESIGN,2009,0,0,0,0,0,0 +RESIGNING,2009,0,0,0,0,0,0 +RESTATED,2009,0,0,0,0,0,0 +RESTATING,2009,0,0,0,0,0,0 +NONUSURIOUS,0,0,0,2011,0,0,0 +NOTARIZATIONS,0,0,0,2009,0,0,0 +NOTARY,0,0,0,2009,0,0,0 +NUISANCES,2009,0,0,0,0,0,0 +NULLIFIES,2009,0,0,2009,0,0,0 +NULLITY,0,0,0,2009,0,0,0 +OBJECTIONABLE,2009,0,0,0,0,0,0 +OBLIGATED,0,0,0,0,0,0,2009 +OBLIGATIONS,0,0,0,0,0,0,2009 +OBLIGEE,0,0,0,2009,0,0,0 +OBLIGORS,0,0,0,2009,0,0,0 +OBSOLETE,2009,0,0,0,0,0,0 +OBSTRUCTED,2009,0,0,0,0,0,0 +OCCASIONALLY,0,0,2009,0,0,2009,0 +OFFENDED,2009,0,0,0,0,0,0 +OFFENDS,2009,0,0,0,0,0,0 +OFFEROR,0,0,0,2009,0,0,0 +OMIT,2009,0,0,0,0,0,0 +ONEROUS,2009,0,0,0,0,0,0 +OPPORTUNITY,0,2009,0,0,0,0,0 +OPPOSING,2009,0,0,0,0,0,0 +OPTIONEE,0,0,0,2009,0,0,0 +OUTAGES,2009,0,0,0,0,0,0 +OUTPERFORMED,0,2009,0,0,0,0,0 +OVERAGES,2009,0,0,0,0,0,0 +OVERBUILT,2009,0,0,0,0,0,0 +OVERCAPACITIES,2009,0,0,0,0,0,0 +OVERCHARGES,2009,0,0,0,0,0,0 +OVERCOMING,2009,0,0,0,0,0,0 +OVERESTIMATES,2009,0,0,0,0,0,0 +OVERLOAD,2009,0,0,0,0,0,0 +OVERLOOK,2009,0,0,0,0,0,0 +OVERPAID,2009,0,0,0,0,0,0 +OVERPRODUCES,2009,0,0,0,0,0,0 +OVERRULED,0,0,0,2009,0,0,0 +OVERRUNNING,2009,0,0,0,0,0,0 +OVERSHADOWING,2009,0,0,0,0,0,0 +OVERSTATEMENT,2009,0,0,0,0,0,0 +OVERSUPPLIED,2009,0,0,0,0,0,0 +OVERTLY,2009,0,0,0,0,0,0 +OVERTURNS,2009,0,0,0,0,0,0 +PANIC,2009,0,0,0,0,0,0 +NEARLY,0,0,2009,0,0,2009,0 +NECESSITATING,0,0,0,0,0,0,2009 +NEGLECT,2009,0,0,0,0,0,0 +NEGLECTS,2009,0,0,0,0,0,0 +NEGLIGENTLY,2009,0,0,0,0,0,0 +BARRIER,2009,0,0,0,0,0,0 +BELIEVE,0,0,2009,0,0,0,0 +IDLED,2009,0,0,0,0,0,0 +IGNORES,2009,0,0,0,0,0,0 +ILLEGALITIES,2009,0,0,0,0,0,0 +ILLICIT,2009,0,0,0,0,0,0 +IMBALANCE,2009,0,0,0,0,0,0 +IMMORAL,2009,0,0,0,0,0,0 +IMPAIRMENT,2009,0,0,0,0,0,2011 +IMPASSES,2009,0,0,0,0,0,0 +IMPEDIMENT,2009,0,0,0,0,0,0 +IMPERATIVE,2009,0,0,0,0,0,0 +IMPERMISSIBLE,2009,0,0,0,0,0,0 +IMPLICATES,2009,0,0,0,0,0,0 +IMPOSES,0,0,0,0,0,0,2009 +IMPOSSIBILITY,2009,0,0,0,0,0,0 +IMPOUNDING,2009,0,0,0,0,0,0 +IMPRACTICALITIES,2009,0,0,0,0,0,0 +IMPRECISIONS,0,0,2009,0,0,0,0 +IMPRESSING,0,2009,0,0,0,0,0 +IMPROBABILITY,0,0,2009,0,0,0,0 +IMPROPRIETIES,2009,0,0,0,0,0,0 +IMPROVEMENT,0,2009,0,0,0,0,0 +IMPRUDENT,2009,0,0,0,0,0,0 +INACCURACIES,2009,0,0,0,0,0,0 +INACTION,2009,0,0,0,0,0,0 +INACTIVATES,2009,0,0,0,0,0,0 +INACTIVITY,2009,0,0,0,0,0,0 +INADEQUATELY,2009,0,0,0,0,0,0 +INADVISABLE,2009,0,0,0,0,0,0 +INATTENTION,2009,0,0,0,0,0,0 +INCARCERATE,2009,0,0,2009,0,0,0 +INCARCERATION,2009,0,0,2009,0,0,0 +INCIDENCES,2009,0,0,0,0,0,0 +INCOMPATIBILITY,2009,0,0,0,0,0,0 +INCOMPETENT,2009,0,0,0,0,0,0 +INCOMPLETELY,2009,0,0,0,0,0,0 +INCONSISTENCY,2009,0,0,0,0,0,0 +INCONTESTABLE,0,0,0,2009,0,0,0 +INCORRECT,2009,0,0,0,0,0,0 +INCREDIBLY,0,2009,0,0,0,0,0 +INDEFEASIBLE,2009,0,0,0,0,0,0 +INDEFINITENESS,0,0,2009,0,0,0,0 +INDEMNIFIED,0,0,0,2009,0,0,0 +INDEMNITEE,0,0,0,2009,0,0,0 +INDEMNITORS,0,0,0,2009,0,0,0 +INDICT,2009,0,0,2009,0,0,0 +INDICTMENT,2009,0,0,2009,0,0,0 +INEFFECTIVELY,2009,0,0,0,0,0,0 +INEFFICIENT,2009,0,0,0,0,0,0 +INEQUITABLE,2009,0,0,0,0,0,0 +INEVITABLE,2009,0,0,0,0,0,0 +INEXPERIENCED,2009,0,0,0,0,0,0 +INFORCE,0,0,0,2009,0,0,0 +INFRINGE,2009,0,0,0,0,0,0 +INFRINGER,0,0,0,2009,0,0,0 +INHIBIT,0,0,0,0,0,0,2011 +INIMICAL,2009,0,0,0,0,0,0 +INJURE,2009,0,0,0,0,0,0 +INJURING,2009,0,0,0,0,0,0 +INNOVATED,0,2009,0,0,0,0,0 +INNOVATIONS,0,2009,0,0,0,0,0 +INNOVATORS,0,2009,0,0,0,0,0 +INSECURE,2009,0,0,0,0,0,0 +INSISTED,0,0,0,0,0,0,2009 +INSOFAR,0,0,0,2009,0,0,0 +INSPIRATION,0,2009,0,0,0,0,0 +INSUBORDINATION,2009,0,0,0,0,0,0 +INSURRECTION,2009,0,0,0,0,0,0 +INTEGRITY,0,2009,0,0,0,0,0 +INTERFERENCE,2009,0,0,0,0,0,0 +INTERLOCUTORY,0,0,0,2009,0,0,0 +INTERPOSE,0,0,0,2009,0,0,0 +INTERPOSITION,0,0,0,2009,0,0,0 +INTERROGATES,0,0,0,2009,0,0,0 +INTERROGATOR,0,0,0,2009,0,0,0 +INTERRUPT,2009,0,0,0,0,0,0 +INTERRUPTIONS,2009,0,0,0,0,0,0 +INTIMIDATION,2009,0,0,0,0,0,0 +SPORADICALLY,0,0,2009,0,0,0,0 +STABILIZE,0,2009,0,0,0,0,0 +STABLE,0,2009,0,0,0,0,0 +STAGNATED,2009,0,0,0,0,0,0 +STANDSTILL,2009,0,0,0,0,0,0 +STATUTORILY,0,0,0,2009,0,0,0 +STIPULATES,0,0,0,0,0,0,2009 +STOLEN,2009,0,0,0,0,0,0 +STOPPING,2009,0,0,0,0,0,0 +STRAINING,2009,0,0,0,0,0,0 +STRENGTHENED,0,2009,0,0,0,0,0 +STRESS,2009,0,0,0,0,0,0 +STRESSING,2009,0,0,0,0,0,0 +STRICTLY,0,0,0,0,0,0,2009 +STRONGEST,0,2009,0,0,0,0,0 +SUBDOCKET,0,0,0,2012,0,0,0 +SUBLEASEE,0,0,0,2011,0,0,0 +SUBLICENSOR,0,0,0,2011,0,0,0 +SUBPOENAED,2009,0,0,2009,0,0,0 +SUBSTANDARD,2009,0,0,0,0,0,0 +SUCCEEDED,0,2009,0,0,0,0,0 +SUCCESSES,0,2009,0,0,0,0,0 +SUDDENLY,0,0,2009,0,0,0,0 +SUFFER,2009,0,0,0,0,0,0 +SUGGEST,0,0,2009,0,0,2009,0 +SUING,2009,0,0,2009,0,0,0 +SUMMONSES,2009,0,0,2009,0,0,0 +SUPERSEDED,0,0,0,2009,0,0,0 +SURETY,0,0,0,2009,0,0,0 +SURPASSING,0,2009,0,0,0,0,0 +SUSPECTED,2009,0,0,0,0,0,0 +SUSPENDING,2009,0,0,0,0,0,0 +SUSPICION,2009,0,0,0,0,0,0 +REVISED,0,0,2009,0,0,0,0 +REVOKE,2009,0,0,0,0,0,0 +REVOLUTIONIZE,0,2009,0,0,0,0,0 +REWARD,0,2009,0,0,0,0,0 +RIDICULE,2009,0,0,0,0,0,0 +RISK,0,0,2009,0,0,0,0 +RISKINESS,0,0,2009,0,0,0,0 +ROUGHLY,0,0,2009,0,0,0,0 +SABOTAGE,2009,0,0,0,0,0,0 +SACRIFICIAL,2009,0,0,0,0,0,0 +SATISFACTORY,0,2009,0,0,0,0,0 +SATISFYING,0,2009,0,0,0,0,0 +SCRUTINIZED,2009,0,0,0,0,0,0 +SECRECY,-2020,0,0,0,0,0,0 +SEIZES,2009,0,0,0,0,0,0 +SENTENCED,2009,0,0,2009,0,0,0 +SERIOUSLY,2009,0,0,0,0,0,0 +SETTLEMENT,0,0,0,2009,0,0,0 +SEVERABLE,0,0,0,2009,0,0,0 +SEVERE,2009,0,0,0,0,0,0 +SEVERITY,2009,0,0,0,0,0,0 +ENTHUSIASTIC,0,2009,0,0,0,0,0 +ERODE,2009,0,0,0,0,0,0 +EROSION,2009,0,0,0,0,0,0 +ERRING,2009,0,0,0,0,0,0 +ERRORS,2009,0,0,0,0,0,0 +ESCALATES,2009,0,0,0,0,0,0 +ESCHEATMENT,0,0,0,2011,0,0,0 +ESCROWS,0,0,0,0,0,0,2009 +EVADES,2009,0,0,0,0,0,0 +EVASIVE,2009,0,0,0,0,0,0 +EVICTION,2009,0,0,0,0,0,0 +EVIDENTIARY,0,0,0,2009,0,0,0 +EXACERBATING,2009,0,0,0,0,0,0 +EXAGGERATED,2009,0,0,0,0,0,0 +EXCEEDANCE,0,0,0,2011,0,0,0 +EXCELLENT,0,2009,0,0,0,0,0 +EXCEPTIONALLY,0,2009,0,0,0,0,0 +EXCITED,0,2009,0,0,0,0,0 +EXCLUSIVELY,0,2009,0,0,0,0,0 +EXCULPATE,2009,0,0,2009,0,0,0 +EXCULPATION,2009,0,0,2009,0,0,0 +EXECUTORS,0,0,0,2009,0,0,0 +EXECUTRIXES,0,0,0,2009,0,0,0 +EXONERATES,2009,0,0,0,0,0,0 +EXPLOIT,2009,0,0,0,0,0,0 +EXPLOITED,2009,0,0,0,0,0,0 +EXPOSED,2009,0,0,0,0,0,0 +EXPOSURES,0,0,2009,0,0,0,0 +EXPROPRIATING,2009,0,0,0,0,0,0 +EXPULSIONS,2009,0,0,0,0,0,0 +EXTRAJUDICIAL,0,0,0,2014,0,0,0 +SOLVES,0,2009,0,0,0,0,0 +SOMEWHAT,0,0,2009,0,0,2009,0 +SPAMMING,2014,0,0,0,0,0,0 +TREMENDOUSLY,0,2009,0,0,0,0,0 +LOCKOUTS,2009,0,0,0,0,0,0 +LOSS,2009,0,0,0,0,0,0 +LOYAL,0,2009,0,0,0,0,0 +MALFEASANCE,2009,0,0,0,0,0,0 +MALFUNCTIONS,2009,0,0,0,0,0,0 +MALPRACTICE,2009,0,0,0,0,0,0 +MANDATES,0,0,0,0,0,0,2009 +MANIPULATE,2009,0,0,0,0,0,0 +MANIPULATION,2009,0,0,0,0,0,0 +MARKDOWNS,2009,0,0,0,0,0,0 +MEDIATED,0,0,0,2009,0,0,0 +MEDIATIONS,0,0,0,2009,0,0,0 +MIGHT,0,0,2009,0,0,2009,0 +MISAPPLIES,2009,0,0,0,0,0,0 +MISAPPROPRIATED,2009,0,0,0,0,0,0 +MISAPPROPRIATIONS,2009,0,0,0,0,0,0 +MISCALCULATES,2009,0,0,0,0,0,0 +MISCHARACTERIZATION,2014,0,0,0,0,0,0 +MISCLASSIFIED,2011,0,0,0,0,0,0 +MISDATED,2011,0,0,0,0,0,0 +MISFEASANCE,0,0,0,2009,0,0,0 +MISHANDLING,2009,0,0,0,0,0,0 +MISINFORMING,2009,0,0,0,0,0,0 +MISINTERPRETATIONS,2009,0,0,0,0,0,0 +MISJUDGE,2009,0,0,0,0,0,0 +MISJUDGMENT,2009,0,0,0,0,0,0 +MISLABELING,2009,0,0,0,0,0,0 +MISLEADING,2009,0,0,0,0,0,0 +MISMANAGE,2009,0,0,0,0,0,0 +MISMANAGING,2009,0,0,0,0,0,0 +MISMATCHING,2009,0,0,0,0,0,0 +MISPRICINGS,2014,0,0,0,0,0,0 +MISREPRESENTED,2009,0,0,0,0,0,0 +MISSED,2009,0,0,0,0,0,0 +WORRIES,2009,0,0,0,0,0,0 +WORSEN,2009,0,0,0,0,0,0 +WORST,2009,0,0,0,0,0,0 +TIGHTENING,2009,0,0,0,0,0,0 +TOLERATING,2009,0,0,0,0,0,0 +TORTIOUSLY,0,0,0,2009,0,0,0 +FINES,2009,0,0,0,0,0,0 +NONASSESSABLE,0,0,2009,0,0,0,0 +NONCANCELLABLE,0,0,0,0,0,0,2009 +NONCOMPLIANT,2009,0,0,0,0,0,0 +NONCONFORMITY,2009,0,0,0,0,0,0 +NONCONTRIBUTORY,0,0,0,2009,0,0,0 +NONFORFEITABILITY,0,0,0,2011,0,0,0 +NONGUARANTOR,0,0,0,2011,0,0,0 +DISCIPLINARY,2009,0,0,0,0,0,0 +DISCLAIMERS,2009,0,0,0,0,0,0 +DISCLOSED,2009,0,0,0,0,0,0 +DISCONTINUANCES,2009,0,0,0,0,0,0 +DISCONTINUED,2009,0,0,0,0,0,0 +DISCOURAGED,2009,0,0,0,0,0,0 +DISCREDITED,2009,0,0,0,0,0,0 +DISCREPANCY,2009,0,0,0,0,0,0 +SPECULATED,0,0,2009,0,0,0,0 +SPECULATIONS,0,0,2009,0,0,0,0 +TRAGICALLY,2009,0,0,0,0,0,0 +LEGISLATED,0,0,0,2009,0,0,0 +LEGISLATIONS,0,0,0,2009,0,0,0 +LEGISLATORS,0,0,0,2009,0,0,0 +LIBELED,0,0,0,2009,0,0,0 +LIE,2009,0,0,0,0,0,0 +COMPULSION,2009,0,0,0,0,0,2009 +CONCEDE,2009,0,0,0,0,0,0 +CONCEIVABLE,0,0,2009,0,0,2009,0 +CONCERNS,2009,0,0,0,0,0,0 +CONCLUSIVE,0,2009,0,0,0,0,0 +CONDEMNATIONS,2009,0,0,0,0,0,0 +CONDEMNS,2009,0,0,0,0,0,0 +CONDONED,2009,0,0,0,0,0,0 +CONFESSES,2009,0,0,0,0,0,0 +CONFINE,2009,0,0,0,0,0,2009 +CONFINES,2009,0,0,0,0,0,2009 +CONFISCATES,2009,0,0,0,0,0,0 +CONFISCATORY,0,0,0,2009,0,0,0 +CONFLICTS,2009,0,0,0,0,0,0 +CONFRONTATIONS,2009,0,0,0,0,0,0 +CONFUSE,2009,0,0,0,0,0,0 +CONFUSINGLY,2009,0,2009,0,0,0,0 +CONSENTING,0,0,0,2009,0,0,0 +CONSPIRACY,2009,0,0,0,0,0,0 +CONSPIRE,2009,0,0,0,0,0,0 +CONSTITUTION,0,0,0,2009,0,0,0 +CONSTITUTIONS,0,0,0,2009,0,0,0 +CONSTRAINING,0,0,0,0,0,0,2009 +CONSTRUCTIVE,0,2009,0,0,0,0,0 +CONSTRUES,0,0,0,2012,0,0,0 +CONTENDED,2009,0,0,0,0,0,0 +CONTENTIONS,2009,0,0,0,0,0,0 +CONTESTATION,0,0,0,2011,0,0,0 +CONTINGENCY,0,0,2009,0,0,0,0 +CONTRACT,0,0,0,2009,0,0,0 +CONTRACTIBLE,0,0,0,2009,0,0,0 +CONTRACTIONS,2009,0,0,0,0,0,0 +CONTRADICT,2009,0,0,0,0,0,0 +CONTRADICTIONS,2009,0,0,0,0,0,0 +CONTRAVENE,0,0,0,2009,0,0,0 +CONTRAVENTION,0,0,0,2009,0,0,0 +CONTROVERSY,2009,0,0,0,0,0,0 +CONVENIENS,0,0,0,2012,0,0,0 +CONVICTED,2009,0,0,2009,0,0,0 +CORRECTED,2009,0,0,0,0,0,0 +CORRECTS,2009,0,0,0,0,0,0 +CORRUPTION,2009,0,0,0,0,0,0 +COSTLY,2009,0,0,0,0,0,0 +COUNSELED,0,0,0,2009,0,0,0 +COUNTERCLAIMED,2009,0,0,0,0,0,0 +COUNTERFEITED,2009,0,0,0,0,0,0 +COUNTERFEITS,2009,0,0,0,0,0,0 +COUNTERSUED,0,0,0,2011,0,0,0 +COURTEOUS,0,2009,0,0,0,0,0 +COVENANTED,0,0,0,0,0,0,2011 +CREATIVELY,0,2009,0,0,0,0,0 +CRIMES,2009,0,0,2009,0,0,0 +CRIMINALIZING,0,0,0,2014,0,0,0 +CRISIS,2009,0,0,0,0,0,0 +CRITICISMS,2009,0,0,0,0,0,0 +CRITICIZING,2009,0,0,0,0,0,0 +CROSSROADS,0,0,2009,0,0,0,0 +CULPABLE,2009,0,0,0,0,0,0 +CURTAILED,2009,0,0,0,0,0,0 +CURTAILS,2009,0,0,0,0,0,0 +CYBERATTACK,2014,0,0,0,0,0,0 +CYBERCRIMES,2014,0,0,0,0,0,0 +TAINTS,2009,0,0,0,0,0,0 +TENSE,2009,0,0,0,0,0,0 +TERMINATE,2009,0,0,0,0,0,0 +TERMINATION,2009,0,0,0,0,0,0 +TESTIFY,2009,0,0,2009,0,0,0 +THENCEFORTH,0,0,0,2009,0,0,0 +THEREFROM,0,0,0,2009,0,0,0 +THEREON,0,0,0,2009,0,0,0 +THERETOFORE,0,0,0,2009,0,0,0 +THEREWITH,0,0,0,2009,0,0,0 +THREATENING,2009,0,0,0,0,0,0 +FACIE,0,0,0,2009,0,0,0 +FAILING,2009,0,0,0,0,0,0 +FAILURES,2009,0,0,0,0,0,0 +FALSIFICATION,2009,0,0,0,0,0,0 +FALSIFY,2009,0,0,0,0,0,0 +FATALITIES,2009,0,0,0,0,0,0 +FAULTED,2009,0,0,0,0,0,0 +FAVORABLY,0,2009,0,0,0,0,0 +FAVORITES,0,2009,0,0,0,0,0 +FELONIOUS,2009,0,0,2009,0,0,0 +DAMAGES,2009,0,0,0,0,0,0 +DANGER,2009,0,0,0,0,0,0 +DEADLOCK,2009,0,0,0,0,0,0 +DEADWEIGHT,2009,0,0,0,0,0,0 +DEBARRED,2009,0,0,0,0,0,0 +DECEIT,2009,0,0,0,0,0,0 +DECEIVED,2009,0,0,0,0,0,0 +DECEPTIONS,2009,0,0,0,0,0,0 +DECLINE,2009,0,0,0,0,0,0 +DECREE,0,0,0,2009,0,0,0 +DEFACE,2009,0,0,0,0,0,0 +DEFALCATIONS,0,0,0,2009,0,0,0 +DEFAME,2009,0,0,0,0,0,0 +DEFAULT,2009,0,0,0,0,0,0 +DEFEASANCE,0,0,0,2009,0,0,0 +DEFEASEMENT,0,0,0,2014,0,0,0 +DEFEATED,2009,0,0,0,0,0,0 +DEFECTIVE,2009,0,0,0,0,0,0 +DEFENDABLE,0,0,0,2014,0,0,0 +DEFENDING,2009,0,0,0,0,0,0 +DEFERENCE,0,0,0,2009,0,0,0 +DEFICIT,2009,0,0,0,0,0,0 +DEFRAUD,2009,0,0,0,0,0,0 +DEFUNCT,2009,0,0,0,0,0,0 +DEGRADED,2009,0,0,0,0,0,0 +DELAYED,2009,0,0,0,0,0,0 +DELEGATABLE,0,0,0,2011,0,0,0 +DELIBERATE,2009,0,0,0,0,0,0 +DELIGHTED,0,2009,0,0,0,0,0 +DELIGHTS,0,2009,0,0,0,0,0 +DELINQUENTLY,2009,0,0,0,0,0,0 +DELISTING,2009,0,0,0,0,0,0 +DEMISES,2009,0,0,0,0,0,0 +DEMOLISHES,2009,0,0,0,0,0,0 +DEMOTE,2009,0,0,0,0,0,0 +DEMOTION,2009,0,0,0,0,0,0 +DEMURRERS,0,0,0,2009,0,0,0 +DENIALS,2009,0,0,0,0,0,0 +DENIGRATED,2009,0,0,0,0,0,0 +DENY,2009,0,0,0,0,0,0 +DEPENDABLE,0,2009,0,0,0,0,0 +DEPENDED,0,0,2009,0,0,2009,0 +DEPENDENT,0,0,2009,0,0,0,2011 +DEPLETED,2009,0,0,0,0,0,0 +DEPLETIONS,2009,0,0,0,0,0,0 +DEPOSING,0,0,0,2009,0,0,0 +INVALID,2009,0,0,0,0,0,0 +INVALIDATING,2009,0,0,0,0,0,0 +INVENTED,0,2009,0,0,0,0,0 +INVENTIVE,0,2009,0,0,0,0,0 +INVESTIGATE,2009,0,0,0,0,0,0 +INVESTIGATION,2009,0,0,0,0,0,0 +IRRECONCILABLE,2009,0,0,0,0,0,0 +IRREGULAR,2009,0,0,0,0,0,0 +IRREPARABLE,2009,0,0,0,0,0,0 +IRREVOCABLE,0,0,0,2009,0,0,2009 +JOINDER,0,0,0,2009,0,0,0 +JUDICIARY,0,0,0,2009,0,0,0 +JURISDICTIONAL,0,0,0,2009,0,0,0 +JURIST,0,0,0,2009,0,0,0 +JURY,0,0,0,2009,0,0,0 +JUSTIFIABLE,2009,0,0,0,0,0,0 +DILIGENTLY,0,2009,0,0,0,0,0 +DIMINISHING,2009,0,0,0,0,0,0 +DISADVANTAGE,2009,0,0,0,0,0,0 +DISAFFILIATION,2009,0,0,2009,0,0,0 +DISAFFIRMS,0,0,0,2011,0,0,0 +DISAGREEING,2009,0,0,0,0,0,0 +DISALLOW,2009,0,0,0,0,0,0 +DISALLOWING,2009,0,0,0,0,0,0 +DISAPPEARANCES,2009,0,0,0,0,0,0 +DISAPPOINT,2009,0,0,0,0,0,0 +DISAPPOINTMENT,2009,0,0,0,0,0,0 +DISAPPROVALS,2009,0,0,0,0,0,0 +DISAPPROVING,2009,0,0,0,0,0,0 +DISASSOCIATIONS,2009,0,0,0,0,0,0 +DISASTROUSLY,2009,0,0,0,0,0,0 +DISAVOWING,2009,0,0,0,0,0,0 +GREATER,0,-2020,0,0,0,0,0 +GRIEVANCE,2009,0,0,0,0,0,0 +GUILTY,2009,0,0,0,0,0,0 +HAMPERED,2009,0,0,0,0,0,0 +HAPPILY,0,2009,0,0,0,0,0 +HARASSED,2009,0,0,0,0,0,0 +HARDSHIPS,2009,0,0,0,0,0,0 +HARMFULLY,2009,0,0,0,0,0,0 +HARSHER,2009,0,0,0,0,0,0 +HAZARD,2009,0,0,0,0,0,0 +NONJUDICIALLY,0,0,0,2011,0,0,0 +NONPERFORMANCE,2009,0,0,0,0,0,0 +HURT,2009,0,0,0,0,0,0 +DISFAVORED,2009,0,0,0,0,0,0 +DISGORGED,2009,0,0,0,0,0,0 +COMPLICATING,2009,0,0,0,0,0,0 +COMPLIMENTARY,0,2009,0,0,0,0,0 +COMPLY,0,0,0,0,0,0,2009 +MISSTATED,2009,0,0,0,0,0,0 +MISSTATING,2009,0,0,0,0,0,0 +MISTAKEN,2009,0,0,0,0,0,0 +MISTRIAL,2009,0,0,2009,0,0,0 +MISUNDERSTANDINGS,2009,0,0,0,0,0,0 +MISUSES,2009,0,0,0,0,0,0 +MONOPOLIZATION,2009,0,0,0,0,0,0 +MONOPOLIZING,2009,0,0,0,0,0,0 +MORATORIUMS,2009,0,0,0,0,0,0 +MOTIONS,0,0,0,2009,0,0,0 +SLOWDOWN,2009,0,0,0,0,0,0 +SLOWEST,2009,0,0,0,0,0,0 +SLUGGISH,2009,0,0,0,0,0,0 +SMOOTHING,0,2009,0,0,0,0,0 +DEPRESS,2009,0,0,0,0,0,0 +DEPRIVATION,2009,0,0,0,0,0,0 +DEPRIVING,2009,0,0,0,0,0,0 +DEROGATED,0,0,0,2009,0,0,0 +DEROGATIONS,0,0,0,2009,0,0,0 +DESIRED,0,2009,0,0,0,0,0 +DESTABILIZE,2009,0,0,0,0,0,0 +DESTROY,2009,0,0,0,0,0,0 +DESTRUCTION,2009,0,0,0,0,0,0 +DETAINER,0,0,0,2009,0,0,0 +DETERIORATE,2009,0,0,0,0,0,0 +DETERIORATION,2009,0,0,0,0,0,0 +DETERRENCES,2009,0,0,0,0,0,0 +DETERS,2009,0,0,0,0,0,0 +DETRIMENT,2009,0,0,0,0,0,0 +DEVALUE,2009,0,0,0,0,0,0 +DEVASTATE,2009,0,0,0,0,0,0 +DEVIATE,2009,0,2009,0,0,0,0 +DEVIATION,2009,0,2009,0,0,0,0 +DEVOLVED,2009,0,0,0,0,0,0 +DICTATED,0,0,0,0,0,0,2009 +DIFFERED,0,0,2009,0,0,0,0 +DIFFICULTIES,2009,0,0,0,0,0,0 +ASCENDANCY,0,0,0,2009,0,0,0 +ASSAULTED,2009,0,0,0,0,0,0 +ASSERTIONS,2009,0,0,0,0,0,0 +ASSUME,0,0,2009,0,0,0,0 +ASSUMPTION,0,0,2009,0,0,0,0 +ASSURES,0,2009,0,0,0,0,0 +ATTAINING,0,2009,0,0,0,0,0 +ATTEST,0,0,0,2009,0,0,0 +ATTESTING,0,0,0,2009,0,0,0 +ATTORNMENT,0,0,0,2009,0,0,0 +ATTRITION,2009,0,0,0,0,0,0 +BAIL,2009,0,0,2009,0,0,0 +BAILIFF,0,0,0,2009,0,0,0 +BALK,2009,0,0,0,0,0,0 +BANKRUPTCY,2009,0,0,0,0,0,0 +BANS,2009,0,0,0,0,0,0 +CLAIMABLE,0,0,0,2009,0,0,0 +CLAIMING,2009,0,0,0,0,0,0 +CLAWBACK,2009,0,0,0,0,0,0 +CLOSEOUT,2009,0,0,0,0,0,0 +CLOSURE,2009,0,0,0,0,0,0 +CODICIL,0,0,0,2009,0,0,0 +CODIFIED,0,0,0,2009,0,0,0 +COERCE,2009,0,0,0,0,0,0 +COERCION,2009,0,0,0,0,0,0 +COLLABORATING,0,2009,0,0,0,0,0 +COLLABORATOR,0,2009,0,0,0,0,0 +COLLAPSES,2009,0,0,0,0,0,0 +COLLUDE,2009,0,0,0,0,0,0 +COLLUSION,2009,0,0,2009,0,0,0 +POSING,2009,0,0,0,0,0,0 +POSSIBILITIES,0,0,2009,0,0,0,0 +POSTCLOSING,0,0,0,2011,0,0,0 +POSTPONE,2009,0,0,0,0,0,0 +POSTPONES,2009,0,0,0,0,0,0 +WRITEOFF,2009,0,0,0,0,0,0 +WRONGDOING,2009,0,0,0,0,0,0 +WRONGLY,2009,0,0,0,0,0,0 +HONORED,0,2009,0,0,0,0,0 +HOSTILITY,2009,0,0,0,0,0,0 +REASSESSED,0,0,2009,0,0,0,0 +REASSESSMENTS,2009,0,2009,0,0,0,0 +REASSIGNMENT,2009,0,0,0,0,0,0 +REBOUNDED,0,2009,0,0,0,0,0 +REBUTTABLE,0,0,0,2009,0,0,0 +REBUTTED,0,0,0,2009,0,0,0 +RECALCULATES,0,0,2009,0,0,0,0 +RECALL,2009,0,0,0,0,0,0 +RECEPTIVE,0,2009,0,0,0,0,0 +RECKLESS,2009,0,0,0,0,0,0 +RECONSIDERED,0,0,2009,0,0,0,0 +RECOUPABLE,0,0,0,2009,0,0,0 +RECOURSES,0,0,0,2009,0,0,0 +RECUSE,0,0,0,2011,0,0,0 +REDACT,2009,0,0,2009,0,0,0 +REDACTIONS,2009,0,0,2009,0,0,0 +REDRESS,2009,0,0,0,0,0,0 +REEXAMINATION,0,0,2009,0,0,0,0 +REFERENDUM,0,0,0,2009,0,0,0 +REFILES,0,0,0,2009,0,0,0 +REFRAINS,0,0,0,0,0,0,2009 +REFUSED,2009,0,0,0,0,0,0 +REGAINED,0,2009,0,0,0,0,0 +REGULATES,0,0,0,2009,0,0,0 +REGULATIVE,0,0,0,2009,0,0,0 +REHEAR,0,0,0,2009,0,0,0 +VARIABLE,0,0,2009,0,0,0,0 +VARIANCES,0,0,2009,0,0,0,0 +VARIATIONS,0,0,2009,0,0,0,0 +VARYING,0,0,2009,0,0,0,0 +VERDICTS,2009,0,0,2009,0,0,0 +VIATICAL,0,0,0,2011,0,0,0 +VIOLATE,2009,0,0,0,0,0,0 +VIOLATION,2009,0,0,0,0,0,0 +VIOLATORS,2009,0,0,0,0,0,0 +VITIATE,2009,0,0,0,0,0,0 +VITIATION,2009,0,0,0,0,0,0 +VOLATILE,2009,0,2009,0,0,0,0 +VULNERABILITY,2009,0,0,0,0,0,0 +WARNED,2009,0,0,0,0,0,0 +WARRANTEES,0,0,0,2011,0,0,0 +WASTING,2009,0,0,0,0,0,0 +WEAKENING,2009,0,0,0,0,0,0 +WEAKLY,2009,0,0,0,0,0,0 +DISHONESTY,2009,0,0,0,0,0,0 +DISHONORED,2009,0,0,0,0,0,0 +DISLOYAL,2009,0,0,0,0,0,0 +DISMALLY,2009,0,0,0,0,0,0 +DISMISSED,2009,0,0,0,0,0,0 +DISPARAGE,2009,0,0,0,0,0,0 +DISPARAGES,2009,0,0,0,0,0,0 +DISPARITY,2009,0,0,0,0,0,0 +DISPLACEMENTS,2009,0,0,0,0,0,0 +DISPOSITIVE,0,0,0,2009,0,0,0 +DISPOSSESSING,2009,0,0,0,0,0,0 +DISPROPORTIONAL,2009,0,0,0,0,0,0 +DISPUTED,2009,0,0,0,0,0,0 +DISQUALIFICATIONS,2009,0,0,0,0,0,0 +DISQUALIFYING,2009,0,0,0,0,0,0 +DISREGARDS,2009,0,0,0,0,0,0 +DISRUPTED,2009,0,0,0,0,0,0 +DISRUPTIVE,2009,0,0,0,0,0,0 +DISSENT,2009,0,0,0,0,0,0 +DISSENTING,2009,0,0,0,0,0,0 +DISSOLUTION,2009,0,0,0,0,0,0 +DISTINCTIVE,0,2009,0,0,0,0,0 +DISTORTED,2009,0,0,0,0,0,0 +DISTORTS,2009,0,0,0,0,0,0 +DISTRACTION,2009,0,0,0,0,0,0 +DISTRESS,2009,0,0,0,0,0,0 +DISTURB,2009,0,0,0,0,0,0 +DISTURBING,2009,0,0,0,0,0,0 +DIVERTED,2009,0,0,0,0,0,0 +DIVESTED,2009,0,0,0,0,0,0 +DIVESTMENT,2009,0,0,0,0,0,0 +DIVORCED,2009,0,0,0,0,0,0 +DIVULGING,2009,0,0,0,0,0,0 +DOCKETS,0,0,0,2009,0,0,0 +DOUBTFUL,2009,0,2009,0,0,0,0 +DOWNGRADES,2009,0,0,0,0,0,0 +DOWNSIZES,2009,0,0,0,0,0,0 +DOWNTIMES,2009,0,0,0,0,0,0 +DOWNWARDS,2009,0,0,0,0,0,0 +DRAWBACK,2009,0,0,0,0,0,0 +DROUGHT,2009,0,0,0,0,0,0 +DYSFUNCTION,2009,0,0,0,0,0,0 +EARMARKED,0,0,0,0,0,0,2009 +EASILY,0,2009,0,0,0,0,0 +EFFICIENCIES,0,2009,0,0,0,0,0 +EGREGIOUS,2009,0,0,0,0,0,0 +EMBARGOED,2009,0,0,0,0,0,0 +EMBARRASSED,2009,0,0,0,0,0,0 +EMBARRASSMENTS,2009,0,0,0,0,0,0 +EMBEZZLEMENTS,2009,0,0,0,0,0,0 +EMPOWER,0,2009,0,0,0,0,0 +ENABLE,0,2009,0,0,0,0,0 +ENCOURAGED,0,2009,0,0,0,0,0 +ENCROACH,2009,0,0,0,0,0,0 +ENCROACHMENT,2009,0,0,0,0,0,0 +ENCUMBERING,2009,0,0,2009,0,0,2009 +ENCUMBRANCERS,0,0,0,2011,0,0,0 +ENDANGERING,2009,0,0,0,0,0,0 +ENFORCEABILITY,0,0,0,2009,0,0,0 +ENHANCED,0,2009,0,0,0,0,0 +ENHANCING,0,2009,0,0,0,0,0 +ENJOINS,2009,0,0,0,0,0,0 +ENJOYED,0,2009,0,0,0,0,0 +ENTAIL,0,0,0,0,0,0,2009 +PECUNIARILY,0,0,0,2009,0,0,0 +PENALIZING,2009,0,0,0,0,0,0 +PERFECT,0,2009,0,0,0,0,0 +PERHAPS,0,0,2009,0,0,2009,0 +PERMISSIBLE,0,0,0,0,0,0,2009 +PERMITTEE,0,0,0,2011,0,0,0 +PERPETRATED,2009,0,0,2009,0,0,0 +PERSIST,2009,0,0,0,0,0,0 +PERSISTENTLY,2009,0,0,0,0,0,0 +PERVASIVE,2009,0,0,0,0,0,0 +PETITIONED,0,0,0,2009,0,0,0 +PETITIONS,0,0,0,2009,0,0,0 +PICKETING,2009,0,0,0,0,0,0 +HENCEFORWARD,0,0,0,2009,0,0,0 +HEREFOR,0,0,0,2009,0,0,0 +HEREINABOVE,0,0,0,2009,0,0,0 +HEREOF,0,0,0,2009,0,0,0 +HEREUNDER,0,0,0,2009,0,0,0 +HEREWITHIN,0,0,0,2014,0,0,0 +HINDERED,2009,0,0,0,0,0,0 +HINDRANCES,2009,0,0,0,0,0,0 +WHENSOEVER,0,0,0,2009,0,0,0 +WHEREBY,0,0,0,2009,0,0,0 +WHEREON,0,0,0,2009,0,0,0 +WHEREWITH,0,0,0,2009,0,0,0 +WHOSOEVER,0,0,0,2009,0,0,0 +WILLFULLY,2009,0,0,2009,0,0,0 +WINNERS,0,2009,0,0,0,0,0 +FLUCTUATING,0,0,2009,0,0,0,0 +FORBEAR,0,0,0,2009,0,0,0 +FORBEARS,0,0,0,2009,0,0,0 +FORBIDS,2009,0,0,0,0,0,2009 +FOREBEAR,0,0,0,2009,0,0,0 +FORECLOSED,2009,0,0,0,0,0,0 +FORECLOSURES,2009,0,0,0,0,0,0 +FORESTALL,2009,0,0,0,0,0,0 +FORFEIT,2009,0,0,0,0,0,0 +FORFEITING,2009,0,0,0,0,0,0 +FORGERS,2009,0,0,0,0,0,0 +FRAUD,2009,0,0,0,0,0,0 +FRAUDULENTLY,2009,0,0,0,0,0,0 +FRUSTRATE,2009,0,0,0,0,0,0 +FRUSTRATINGLY,2009,0,0,0,0,0,0 +FUGITIVES,2009,0,0,2009,0,0,0 +GAINING,0,2009,0,0,0,0,0 +GRANTORS,0,0,0,2009,0,0,0 +DISGRACE,2009,0,0,0,0,0,0 +LITIGANTS,2009,0,0,2009,0,0,0 +LITIGATING,2009,0,0,2009,0,0,0 +LITIGATORS,0,0,0,2009,0,0,0 +LACK,2009,0,0,0,0,0,0 +LACKS,2009,0,0,0,0,0,0 +LAGS,2009,0,0,0,0,0,0 +LAPSING,2009,0,0,0,0,0,0 +LAWFUL,0,0,0,2009,0,0,0 +LAWMAKING,0,0,0,2009,0,0,0 +LAWYER,0,0,0,2009,0,0,0 +LEADERSHIP,0,2009,0,0,0,0,0 +LEGALITY,0,0,0,2009,0,0,0 +LEGALIZED,0,0,0,2009,0,0,0 +LEGALS,0,0,0,2009,0,0,0 +FLAW,2009,0,0,0,0,0,0 +NONPRODUCTIVE,2009,0,0,0,0,0,0 +LIQUIDATED,2009,0,0,0,0,0,0 +LIQUIDATIONS,2009,0,0,0,0,0,0 +BENEFICIATED,0,0,0,2014,0,0,0 +BENEFITING,0,2009,0,0,0,0,0 +BETTER,0,2009,0,0,0,0,0 +POPULARITY,0,2009,0,0,0,0,0 +REINTERPRET,0,0,2009,0,0,0,0 +REINTERPRETING,0,0,2009,0,0,0,0 +REJECTING,2009,0,0,0,0,0,0 +RELEASEES,0,0,0,2011,0,0,0 +RELINQUISHING,2009,0,0,0,0,0,0 +RELUCTANT,2009,0,0,0,0,0,0 +REMANDS,0,0,0,2009,0,0,0 +REMEDIATION,0,0,0,2009,0,0,0 +RENEGOTIATE,2009,0,0,0,0,0,0 +RENEGOTIATION,2009,0,0,0,0,0,0 +RENOUNCEMENT,2009,0,0,0,0,0,0 +REPARATION,2009,0,0,0,0,0,0 +REPOSSESSED,2009,0,0,0,0,0,0 +REPOSSESSIONS,2009,0,0,0,0,0,0 +TROUBLE,2009,0,0,0,0,0,0 +TURMOIL,2009,0,0,0,0,0,0 +UNACCOUNTED,2009,0,0,0,0,0,0 +UNAPPEALABLE,0,0,0,2009,0,0,0 +UNAUTHORIZED,2009,0,0,0,0,0,0 +UNAVOIDABLY,2009,0,0,0,0,0,0 +UNCERTAINTIES,0,0,2009,0,0,0,0 +UNCOLLECTED,2009,0,0,0,0,0,0 +UNCOMPETITIVE,2009,0,0,0,0,0,0 +UNCONSCIONABLE,2009,0,0,0,0,0,0 +UNCONSTITUTIONALLY,0,0,0,2009,0,0,0 +UNCONTROLLED,2009,0,0,0,0,0,0 +UNCOVERING,2009,0,0,0,0,0,0 +UNDEFINED,0,0,2009,0,0,0,0 +UNDERCUT,2009,0,0,0,0,0,0 +UNDERESTIMATED,2009,0,0,0,0,0,0 +UNDERFUNDED,2009,0,0,0,0,0,0 +UNDERMINES,2009,0,0,0,0,0,0 +UNDERPAYMENTS,2009,0,0,0,0,0,0 +UNDERPERFORMED,2011,0,0,0,0,0,0 +UNDERPRODUCTION,2009,0,0,0,0,0,0 +UNDERSTATEMENT,2009,0,0,0,0,0,0 +UNDERUTILIZATION,2009,0,0,0,0,0,0 +UNDESIRED,2009,0,0,0,0,0,0 +UNDETERMINED,2009,0,2009,0,0,0,0 +UNDOCUMENTED,2009,0,2009,0,0,0,0 +UNECONOMIC,2009,0,0,0,0,0,0 +UNEMPLOYMENT,2009,0,0,0,0,0,0 +UNENFORCEABLE,0,0,0,2009,0,0,0 +UNETHICALLY,2009,0,0,0,0,0,0 +UNFAIR,2009,0,0,0,0,0,0 +UNFAVORABILITY,2014,0,0,0,0,0,0 +UNFEASIBLE,2009,0,0,0,0,0,0 +UNFORESEEABLE,2009,0,0,0,0,0,0 +UNFORTUNATELY,2009,0,0,0,0,0,0 +UNFUNDED,2009,0,0,0,0,0,0 +UNIDENTIFIED,0,0,2009,0,0,0,0 +UNINTENTIONALLY,2009,0,0,0,0,0,0 +UNJUSTIFIED,2009,0,0,0,0,0,0 +UNKNOWN,0,0,2009,0,0,0,0 +UNLAWFULNESS,0,0,0,2009,0,0,0 +UNMATCHED,0,2009,0,0,0,0,0 +UNNECESSARY,2009,0,0,0,0,0,0 +UNOCCUPIED,2009,0,0,0,0,0,0 +UNPLANNED,2009,0,2009,0,0,0,0 +UNPREDICTABLY,2009,0,2009,0,0,0,0 +UNPROFITABLE,2009,0,0,0,0,0,0 +UNQUANTIFIABLE,0,0,2011,0,0,0,0 +UNREASONABLENESS,2009,0,0,0,0,0,0 +UNRECOVERABLE,2009,0,0,0,0,0,0 +UNREMEDIATED,0,0,0,2011,0,0,0 +UNREST,2009,0,0,0,0,0,0 +UNSATISFACTORY,2009,0,0,0,0,0,0 +UNSEASONABLE,0,0,2009,0,0,0,0 +UNSOLD,2009,0,0,0,0,0,0 +UNSTABILIZED,2014,0,0,0,0,0,0 +UNSUCCESSFUL,2009,0,0,0,0,0,0 +UNSUITABLY,2009,0,0,0,0,0,0 +UNSUSPECTED,2009,0,0,0,0,0,0 +UNTESTED,0,0,2009,0,0,0,0 +UNTRUTH,2009,0,0,0,0,0,0 +UNTRUTHS,2009,0,0,0,0,0,0 +UNWANTED,2009,0,0,0,0,0,0 +UNWILLINGNESS,2009,0,0,0,0,0,0 +UPTURNS,0,2009,0,0,0,0,0 +USURP,2009,0,0,2009,0,0,0 +USURPS,2009,0,0,2009,0,0,0 +VAGUELY,0,0,2012,0,0,0,0 +VAGUEST,0,0,2012,0,0,0,0 +PLEA,2009,0,0,0,0,0,0 +PLEADINGS,2009,0,0,2009,0,0,0 +PLEASANTLY,0,2009,0,0,0,0,0 +PLEDGE,0,0,0,0,0,0,2009 +PLEDGES,0,0,0,0,0,0,2009 +PLENTIFUL,0,2009,0,0,0,0,0 +COMPELS,0,0,0,0,0,0,2009 +COMPLAINANTS,0,0,0,2009,0,0,0 +COMPLAINT,2009,0,0,0,0,0,0 +COMMIT,0,0,0,0,0,0,2009 +COMMITTED,0,0,0,0,0,0,2009 +LIMIT,0,0,0,0,0,0,2009 +LIMITS,0,0,0,0,0,0,2009 +RESTRAINED,0,0,0,0,0,0,2009 +RESTRAINTS,0,0,0,0,0,0,2009 +RESTRICTION,0,0,0,0,0,0,2009 +RESTRICTIVENESS,0,0,0,0,0,0,2009 +RESTRUCTURES,2009,0,0,0,0,0,0 +RETALIATED,2009,0,0,0,0,0,0 +RETALIATIONS,2009,0,0,0,0,0,0 +PRECAUTIONARY,0,0,2009,0,0,0,0 +PRECIPITOUSLY,2009,0,0,0,0,0,0 +PRECLUDING,2009,0,0,0,0,0,2009 +PREDECEASE,0,0,0,2009,0,0,0 +PREDICT,0,0,2009,0,0,0,0 +PREDICTION,0,0,2009,0,0,0,0 +PREDICTORS,0,0,2009,0,0,0,0 +PREHEARING,0,0,0,2011,0,0,0 +PREJUDICIAL,2009,0,0,2009,0,0,0 +PREMATURE,2009,0,0,0,0,0,0 +PREPETITION,0,0,0,2009,0,0,0 +PRESTIGIOUS,0,2009,0,0,0,0,0 +PRESUMES,0,0,2009,0,0,0,0 +PRESUMPTIVELY,0,0,0,2009,0,0,0 +PREVENTING,2009,0,0,0,0,0,2009 +PRIVITY,0,0,0,2011,0,0,0 +PROBABILITIES,0,0,2009,0,0,0,0 +PROBATE,0,0,0,2009,0,0,0 +PROBATION,0,0,0,2009,0,0,0 +PROBATIONERS,0,0,0,2009,0,0,0 +PROBLEMATICAL,2009,0,0,0,0,0,0 +PROFICIENTLY,0,2009,0,0,0,0,0 +PROGRESS,0,2009,0,0,0,0,0 +PROHIBIT,0,0,0,0,0,0,2009 +PROHIBITIONS,0,0,0,0,0,0,2009 +PROHIBITS,0,0,0,0,0,0,2009 +PROLONGED,2009,0,0,0,0,0,0 +PROMULGATED,0,0,0,2009,0,0,0 +PROMULGATIONS,0,0,0,2009,0,0,0 +PRORATA,0,0,0,2009,0,0,0 +PROSECUTES,2009,0,0,2009,0,0,0 +PROSECUTOR,0,0,0,2009,0,0,0 +PROSPERING,0,2009,0,0,0,0,0 +PROTEST,2009,0,0,0,0,0,0 +PROTESTING,2009,0,0,0,0,0,0 +PROTRACTED,2009,0,0,0,0,0,0 +PROVISOS,0,0,0,2009,0,0,0 +PROVOKING,2009,0,0,0,0,0,0 +PUNISHING,2009,0,0,0,0,0,0 +PURPORT,2009,0,0,0,0,0,0 +PURPORTS,2009,0,0,0,0,0,0 +QUESTIONED,2009,0,0,0,0,0,0 +QUITCLAIM,0,0,0,2009,0,0,0 +RACKETEERING,2009,0,0,0,0,0,0 +RANDOMIZES,0,0,2009,0,0,0,0 +RATA,0,0,0,2009,0,0,0 +RATIONALIZATIONS,2009,0,0,0,0,0,0 +RATIONALIZING,2009,0,0,0,0,0,0 +ABANDON,2009,0,0,0,0,0,0 +ABANDONMENTS,2009,0,0,0,0,0,0 +ABDICATING,2009,0,0,0,0,0,0 +ABERRATION,2009,0,0,0,0,0,0 +ABEYANCE,0,0,2009,0,0,0,0 +ABLE,0,2009,0,0,0,0,0 +ABNORMALLY,2009,0,0,0,0,0,0 +ABOLISHING,2009,0,0,0,0,0,0 +ABROGATES,2009,0,0,2009,0,0,0 +ABRUPT,2009,0,0,0,0,0,0 +ABSENCES,2009,0,0,0,0,0,0 +ABSOLVES,0,0,0,2009,0,0,0 +ABUSE,2009,0,0,0,0,0,0 +ABUSIVE,2009,0,0,0,0,0,0 +ACCESSIONS,0,0,0,2009,0,0,0 +ACCIDENTS,2009,0,0,0,0,0,0 +ACCOMPLISHES,0,2009,0,0,0,0,0 +ACCUSATION,2009,0,0,0,0,0,0 +ACCUSES,2009,0,0,0,0,0,0 +ACHIEVEMENT,0,2009,0,0,0,0,0 +ACQUIESCE,2009,0,0,0,0,0,0 +ACQUIREES,0,0,0,2011,0,0,0 +ACQUITTAL,2009,0,0,2009,0,0,0 +ACQUITTED,2009,0,0,2009,0,0,0 +ADJOURN,0,0,0,2009,0,0,0 +ADJOURNMENTS,0,0,0,2009,0,0,0 +ADJUDGES,0,0,0,2009,0,0,0 +ADJUDICATES,0,0,0,2009,0,0,0 +ADJUDICATIVE,0,0,0,2009,0,0,0 +ADMISSIBILITY,0,0,0,2009,0,0,0 +ADMISSIONS,0,0,0,2009,0,0,0 +ADULTERATION,2009,0,0,0,0,0,0 +ADVANCES,0,2009,0,0,0,0,0 +ADVANTAGEOUS,0,2009,0,0,0,0,0 +ADVERSARIES,2009,0,0,0,0,0,0 +ADVERSITIES,2009,0,0,0,0,0,0 +AFFIRMANCE,0,0,0,2011,0,0,0 +AFORESAID,0,0,0,2009,0,0,0 +AGAINST,2009,0,0,0,0,0,0 +AGGRAVATING,2009,0,0,0,0,0,0 +ALERTED,2009,0,0,0,0,0,0 +ALIENATES,2009,0,0,0,0,0,0 +ALLEGATION,2009,0,0,2009,0,0,0 +ALLEGEDLY,2009,0,0,2009,0,0,0 +ALLIANCES,0,2009,0,0,0,0,0 +ALWAYS,0,0,0,0,2009,0,0 +AMEND,0,0,0,2009,0,0,0 +AMENDING,0,0,0,2009,0,0,0 +ANNOY,2009,0,0,0,0,0,0 +ANNOYING,2009,0,0,0,0,0,0 +ANNULLING,2009,0,0,0,0,0,0 +ANOMALIES,2009,0,2009,0,0,0,0 +ANTECEDENT,0,0,0,2009,0,0,0 +ANTICIPATES,0,0,2009,0,0,0,0 +ANTICOMPETITIVE,2009,0,0,0,0,0,0 +APPARENT,0,0,2009,0,0,0,0 +APPEALED,0,0,0,2009,0,0,0 +APPEARED,0,0,2009,0,0,2009,0 +APPELLANTS,0,0,0,2009,0,0,0 +APPROXIMATE,0,0,2009,0,0,0,0 +APPROXIMATING,0,0,2009,0,0,0,0 +APPURTENANCES,0,0,0,2009,0,0,0 +ARBITRARILY,0,0,2009,0,0,0,0 +ARBITRATED,0,0,0,2009,0,0,0 +ARBITRATIONAL,0,0,0,2011,0,0,0 +ARBITRATORS,0,0,0,2009,0,0,0 +ARGUMENT,2009,0,0,0,0,0,0 +ARREARAGES,2009,0,0,2009,0,0,0 +ARRESTS,2009,0,0,0,0,0,0 +RETROCEDED,0,0,0,2011,0,0,0 +BOLSTERING,0,2009,0,0,0,0,0 +BOOM,0,2009,0,0,0,0,0 +BOTTLENECK,2009,0,0,0,0,0,0 +BOYCOTT,2009,0,0,0,0,0,0 +BREACH,2009,0,0,2009,0,0,0 +BREAK,2009,0,0,0,0,0,0 +BREAKDOWNS,2009,0,0,0,0,0,0 +BREAKTHROUGHS,0,2009,0,0,0,0,0 +BRIBERY,2009,0,0,0,0,0,0 +BRILLIANT,0,2009,0,0,0,0,0 +BURDENING,2009,0,0,0,0,0,0 +CALAMITIES,2009,0,0,0,0,0,0 +CANCELED,2009,0,0,0,0,0,0 +CANCELLED,2009,0,0,0,0,0,0 +CARELESSLY,2009,0,0,0,0,0,0 +CATASTROPHES,2009,0,0,0,0,0,0 +CAUTIONARY,2009,0,0,0,0,0,0 +CAUTIOUS,0,0,2009,0,0,0,0 +CEASED,2009,0,0,0,0,0,0 +CEDANTS,0,0,0,2012,0,0,0 +CENSURING,2009,0,0,0,0,0,0 +CHALLENGED,2009,0,0,0,0,0,0 +CHARITABLE,0,2009,0,0,0,0,0 +CIRCUMVENT,2009,0,0,0,0,0,0 +CIRCUMVENTIONS,2009,0,0,0,0,0,0 +SHORTAGE,2009,0,0,0,0,0,0 +SHRINKAGE,2009,0,0,0,0,0,0 +SHUTDOWNS,2009,0,0,0,0,0,0 +SLANDERED,2009,0,0,0,0,0,0 +REPUDIATES,2009,0,0,0,0,0,0 +REQUESTER,0,0,0,2011,0,0,0 +REQUIREMENT,0,0,0,0,0,0,2009 +REREGULATION,0,0,0,2011,0,0,0 +RESCINDS,0,0,0,2009,0,0,0 +RESIGNATION,2009,0,0,0,0,0,0 +RESIGNS,2009,0,0,0,0,0,0 +RESTATEMENT,2009,0,0,0,0,0,0 +RESTITUTIONARY,0,0,0,2011,0,0,0 +NOTARIAL,0,0,0,2009,0,0,0 +NOTARIZE,0,0,0,2009,0,0,0 +NOTWITHSTANDING,0,0,0,2009,0,0,0 +NULLIFICATION,2009,0,0,2009,0,0,0 +NULLIFY,2009,0,0,2009,0,0,0 +OBJECTED,2009,0,0,0,0,0,0 +OBJECTIONABLY,2009,0,0,0,0,0,0 +OBLIGATES,0,0,0,0,0,0,2009 +OBLIGATORY,0,0,0,0,0,0,2009 +OBLIGEES,0,0,0,2011,0,0,0 +OBSCENE,2009,0,0,0,0,0,0 +OBSTACLE,2009,0,0,0,0,0,0 +OBSTRUCTING,2009,0,0,0,0,0,0 +OFFENCE,2009,0,0,0,0,0,0 +OFFENDER,2009,0,0,0,0,0,0 +OFFENSE,0,0,0,2009,0,0,0 +OFFERORS,0,0,0,2011,0,0,0 +OMITS,2009,0,0,0,0,0,0 +OPPORTUNISTIC,2009,0,0,0,0,0,0 +OPPOSE,2009,0,0,0,0,0,0 +OPPOSITION,2009,0,0,0,0,0,0 +OPTIONEES,0,0,0,2009,0,0,0 +OUTDATED,2009,0,0,0,0,0,0 +OUTPERFORMING,0,2009,0,0,0,0,0 +OVERBUILD,2009,0,0,0,0,0,0 +OVERBURDEN,2009,0,0,0,0,0,0 +OVERCAPACITY,2009,0,0,0,0,0,0 +OVERCHARGING,2009,0,0,0,0,0,0 +OVERDUE,2009,0,0,0,0,0,0 +OVERESTIMATING,2009,0,0,0,0,0,0 +OVERLOADED,2009,0,0,0,0,0,0 +OVERLOOKED,2009,0,0,0,0,0,0 +OVERPAYMENT,2009,0,0,0,0,0,0 +OVERPRODUCING,2009,0,0,0,0,0,0 +OVERRULES,0,0,0,2009,0,0,0 +OVERRUNS,2009,0,0,0,0,0,0 +OVERSHADOWS,2009,0,0,0,0,0,0 +OVERSTATEMENTS,2009,0,0,0,0,0,0 +OVERSUPPLIES,2009,0,0,0,0,0,0 +OVERTURN,2009,0,0,0,0,0,0 +OVERVALUE,2009,0,0,0,0,0,0 +PANICS,2009,0,0,0,0,0,0 +NECESSITATE,0,0,0,0,0,0,2009 +NEGATIVE,2009,0,0,0,0,0,0 +NEGLECTED,2009,0,0,0,0,0,0 +NEGLIGENCE,2009,0,0,0,0,0,0 +NEVER,0,0,0,0,2009,0,0 +BARRIERS,2009,0,0,0,0,0,0 +BELIEVED,0,0,2009,0,0,0,0 +IDLING,2009,0,0,0,0,0,0 +IGNORING,2009,0,0,0,0,0,0 +ILLEGALITY,2009,0,0,0,0,0,0 +ILLICITLY,2009,0,0,0,0,0,0 +IMBALANCES,2009,0,0,0,0,0,0 +IMPAIR,2009,0,0,0,0,0,2011 +IMPAIRMENTS,2009,0,0,0,0,0,2011 +IMPEDE,2009,0,0,0,0,0,0 +IMPEDIMENTS,2009,0,0,0,0,0,0 +IMPERFECTION,2009,0,0,0,0,0,0 +IMPLEADED,0,0,0,2009,0,0,0 +IMPLICATING,2009,0,0,0,0,0,0 +IMPOSING,0,0,0,0,0,0,2009 +IMPOSSIBLE,2009,0,0,0,0,0,0 +IMPOUNDS,2009,0,0,0,0,0,0 +IMPRACTICALITY,2009,0,0,0,0,0,0 +IMPRESS,0,2009,0,0,0,0,0 +IMPRESSIVE,0,2009,0,0,0,0,0 +IMPROBABLE,0,0,2009,0,0,0,0 +IMPROPRIETY,2009,0,0,0,0,0,0 +IMPROVEMENTS,0,2009,0,0,0,0,0 +IMPRUDENTLY,2009,0,0,0,0,0,0 +INACCURACY,2009,0,0,0,0,0,0 +INACTIONS,2009,0,0,0,0,0,0 +INACTIVATING,2009,0,0,0,0,0,0 +INADEQUACIES,2009,0,0,0,0,0,0 +INADVERTENT,2009,0,0,0,0,0,0 +INAPPROPRIATE,2009,0,0,0,0,0,0 +INCAPABLE,2009,0,0,0,0,0,0 +INCARCERATED,2009,0,0,2009,0,0,0 +INCARCERATIONS,2009,0,0,2009,0,0,0 +INCIDENT,2009,0,0,0,0,0,0 +INCOMPATIBLE,2009,0,0,0,0,0,0 +INCOMPETENTLY,2009,0,0,0,0,0,0 +INCOMPLETENESS,2009,0,2009,0,0,0,0 +INCONSISTENT,2009,0,0,0,0,0,0 +INCONVENIENCE,2009,0,0,0,0,0,0 +INCORRECTLY,2009,0,0,0,0,0,0 +INDEBTED,0,0,0,0,0,0,2009 +INDEFEASIBLY,2009,0,0,0,0,0,0 +INDEMNIFIABLE,0,0,0,2009,0,0,0 +INDEMNIFIES,0,0,0,2009,0,0,0 +INDEMNITEES,0,0,0,2009,0,0,0 +INDEMNITY,0,0,0,2009,0,0,0 +INDICTABLE,2009,0,0,2009,0,0,0 +INDICTMENTS,2009,0,0,2009,0,0,0 +INEFFECTIVENESS,2009,0,0,0,0,0,0 +INEFFICIENTLY,2009,0,0,0,0,0,0 +INEQUITABLY,2009,0,0,0,0,0,0 +INEXACT,0,0,2009,0,0,0,0 +INFERIOR,2009,0,0,0,0,0,0 +INFORMATIVE,0,2009,0,0,0,0,0 +INFRINGED,2009,0,0,0,0,0,0 +INFRINGES,2009,0,0,0,0,0,0 +INHIBITED,2009,0,0,0,0,0,2009 +INJUNCTION,2009,0,0,2009,0,0,0 +INJURED,2009,0,0,0,0,0,0 +INJURIOUS,2009,0,0,0,0,0,0 +INNOVATES,0,2009,0,0,0,0,0 +INNOVATIVE,0,2009,0,0,0,0,0 +INORDINATE,2009,0,0,0,0,0,0 +INSENSITIVE,2009,0,0,0,0,0,0 +INSISTENCE,0,0,0,0,0,0,2009 +INSOLVENCIES,2009,0,0,0,0,0,0 +INSPIRATIONAL,0,2009,0,0,0,0,0 +INSUFFICIENCY,2009,0,0,0,0,0,0 +INSURRECTIONS,2009,0,0,0,0,0,0 +INTENTIONAL,2009,0,0,0,0,0,0 +INTERFERENCES,2009,0,0,0,0,0,0 +INTERMITTENT,2009,0,0,0,0,0,0 +INTERPOSED,0,0,0,2009,0,0,0 +INTERPOSITIONS,0,0,0,2009,0,0,0 +INTERROGATING,0,0,0,2009,0,0,0 +INTERROGATORIES,0,0,0,2009,0,0,0 +INTERRUPTED,2009,0,0,0,0,0,0 +INTERRUPTS,2009,0,0,0,0,0,0 +STABILITY,0,2009,0,0,0,0,0 +STABILIZED,0,2009,0,0,0,0,0 +STAGGERING,2009,0,0,0,0,0,0 +STAGNATES,2009,0,0,0,0,0,0 +STANDSTILLS,2009,0,0,0,0,0,0 +STATUTORY,0,0,0,2009,0,0,0 +STIPULATING,0,0,0,0,0,0,2009 +STOPPAGE,2009,0,0,0,0,0,0 +STOPS,2009,0,0,0,0,0,0 +STRAINS,2009,0,0,0,0,0,0 +STRENGTHENING,0,2009,0,0,0,0,0 +STRESSED,2009,0,0,0,0,0,0 +STRICT,0,0,0,0,0,0,2009 +STRINGENT,2009,0,0,0,0,0,0 +STRONGLY,0,0,0,0,2009,0,0 +SUBJECTED,2009,0,0,0,0,0,0 +SUBLEASEHOLD,0,0,0,2011,0,0,0 +SUBPARAGRAPH,0,0,0,2009,0,0,0 +SUBPOENAS,2009,0,0,2009,0,0,0 +SUBTRUST,0,0,0,2011,0,0,0 +SUCCEEDING,0,2009,0,0,0,0,0 +SUCCESSFUL,0,2009,0,0,0,0,0 +SUE,2009,0,0,2009,0,0,0 +SUFFERED,2009,0,0,0,0,0,0 +SUGGESTED,0,0,2009,0,0,0,0 +SUMMONED,2009,0,0,2009,0,0,0 +SUPERIOR,0,2009,0,0,0,0,0 +SUPERSEDES,0,0,0,2009,0,0,0 +SURPASS,0,2009,0,0,0,0,0 +SUSCEPTIBILITY,2009,0,2009,0,0,0,0 +SUSPECTS,2009,0,0,0,0,0,0 +SUSPENDS,2009,0,0,0,0,0,0 +SUSPICIONS,2009,0,0,0,0,0,0 +REVOCABILITY,0,0,0,2011,0,0,0 +REVOKED,2009,0,0,0,0,0,0 +REVOLUTIONIZED,0,2009,0,0,0,0,0 +REWARDED,0,2009,0,0,0,0,0 +RIDICULED,2009,0,0,0,0,0,0 +RISKED,0,0,2009,0,0,0,0 +RISKING,0,0,2009,0,0,0,0 +RULING,0,0,0,2009,0,0,0 +SACRIFICE,2009,0,0,0,0,0,0 +SACRIFICING,2009,0,0,0,0,0,0 +SATISFIED,0,2009,0,0,0,0,0 +SCANDALOUS,2009,0,0,0,0,0,0 +SCRUTINIZES,2009,0,0,0,0,0,0 +SEEMS,0,0,2009,0,0,0,0 +SEIZING,2009,0,0,0,0,0,0 +SENTENCING,2009,0,0,2009,0,0,0 +SERIOUSNESS,2009,0,0,0,0,0,0 +SETTLEMENTS,0,0,0,2009,0,0,0 +SEVERALLY,0,0,0,2009,0,0,0 +SEVERED,2009,0,0,0,0,0,0 +ENTHUSIASTICALLY,0,2009,0,0,0,0,0 +ERODED,2009,0,0,0,0,0,0 +ERRATIC,2009,0,0,0,0,0,0 +ERRONEOUS,2009,0,0,0,0,0,0 +ERRS,2009,0,0,0,0,0,0 +ESCALATING,2009,0,0,0,0,0,0 +ESCROW,0,0,0,0,0,0,2009 +ESTOPPEL,0,0,0,2011,0,0,0 +EVADING,2009,0,0,0,0,0,0 +EVICT,2009,0,0,0,0,0,0 +EVICTIONS,2009,0,0,0,0,0,0 +EXACERBATE,2009,0,0,0,0,0,0 +EXACERBATION,2009,0,0,0,0,0,0 +EXAGGERATES,2009,0,0,0,0,0,0 +EXCEEDANCES,0,0,0,2011,0,0,0 +EXCELLING,0,2009,0,0,0,0,0 +EXCESSIVE,2009,0,0,0,0,0,0 +EXCITEMENT,0,2009,0,0,0,0,0 +EXCLUSIVENESS,0,2009,0,0,0,0,0 +EXCULPATED,2009,0,0,2009,0,0,0 +EXCULPATIONS,2009,0,0,2009,0,0,0 +EXECUTORY,0,0,0,2009,0,0,0 +EXEMPLARY,0,2009,0,0,0,0,0 +EXONERATING,2009,0,0,0,0,0,0 +EXPLOITATION,2009,0,0,0,0,0,0 +EXPLOITING,2009,0,0,0,0,0,0 +EXPOSES,2009,0,0,0,0,0,0 +EXPROPRIATE,2009,0,0,0,0,0,0 +EXPROPRIATION,2009,0,0,0,0,0,0 +EXTENUATING,2009,0,0,0,0,0,0 +SOLVING,0,2009,0,0,0,0,0 +SOMEWHERE,0,0,2009,0,0,0,0 +LOSE,2009,0,0,0,0,0,0 +LOSSES,2009,0,0,0,0,0,0 +LUCRATIVE,0,2009,0,0,0,0,0 +MALFUNCTION,2009,0,0,0,0,0,0 +MALICE,2009,0,0,0,0,0,0 +MANDAMUS,0,0,0,2009,0,0,0 +MANDATING,0,0,0,0,0,0,2009 +MANIPULATED,2009,0,0,0,0,0,0 +MANIPULATIONS,2009,0,0,0,0,0,0 +MAY,0,0,2009,0,0,2009,0 +MEDIATES,0,0,0,2009,0,0,0 +MEDIATOR,0,0,0,2009,0,0,0 +MISAPPLICATION,2009,0,0,0,0,0,0 +MISAPPLY,2009,0,0,0,0,0,0 +MISAPPROPRIATES,2009,0,0,0,0,0,0 +MISBRANDED,2009,0,0,0,0,0,0 +MISCALCULATING,2009,0,0,0,0,0,0 +MISCHIEF,2009,0,0,0,0,0,0 +MISCLASSIFY,2014,0,0,0,0,0,0 +MISDEMEANOR,2009,0,0,2009,0,0,0 +MISHANDLE,2009,0,0,0,0,0,0 +MISINFORM,2009,0,0,0,0,0,0 +MISINFORMS,2009,0,0,0,0,0,0 +MISINTERPRETED,2009,0,0,0,0,0,0 +MISJUDGED,2009,0,0,0,0,0,0 +MISJUDGMENTS,2009,0,0,0,0,0,0 +MISLABELLED,2009,0,0,0,0,0,0 +MISLEADINGLY,2009,0,0,0,0,0,0 +MISMANAGED,2009,0,0,0,0,0,0 +MISMATCH,2009,0,0,0,0,0,0 +MISPLACED,2009,0,0,0,0,0,0 +MISREPRESENT,2009,0,0,0,0,0,0 +MISREPRESENTING,2009,0,0,0,0,0,0 +MISSES,2009,0,0,0,0,0,0 +WORRY,2009,0,0,0,0,0,0 +WORSENED,2009,0,0,0,0,0,0 +WORTHLESS,2009,0,0,0,0,0,0 +TOLERATE,2009,0,0,0,0,0,0 +TOLERATION,2009,0,0,0,0,0,0 +TORTS,0,0,0,2009,0,0,0 +FICTITIOUS,2009,0,0,0,0,0,0 +FIRED,2009,0,0,0,0,0,0 +NONATTAINMENT,2009,0,0,0,0,0,0 +NONCOMPETITIVE,2009,0,0,0,0,0,0 +NONCOMPLYING,2009,0,0,0,0,0,0 +NONCONTINGENT,0,0,0,2011,0,0,0 +NONDISCLOSURE,2009,0,0,0,0,0,0 +NONFORFEITABLE,0,0,0,2009,0,0,0 +DISCLAIM,2009,0,0,0,0,0,0 +DISCLAIMING,2009,0,0,0,0,0,0 +DISCLOSES,2009,0,0,0,0,0,0 +DISCONTINUATION,2009,0,0,0,0,0,0 +DISCONTINUES,2009,0,0,0,0,0,0 +DISCOURAGES,2009,0,0,0,0,0,0 +DISCREDITING,2009,0,0,0,0,0,0 +SPECTACULAR,0,2009,0,0,0,0,0 +SPECULATES,0,0,2009,0,0,0,0 +SPECULATIVE,0,0,2009,0,0,0,0 +TRAGEDIES,2009,0,0,0,0,0,0 +TRANSFEROR,0,0,0,2009,0,0,0 +LEGISLATES,0,0,0,2009,0,0,0 +LEGISLATIVE,0,0,0,2009,0,0,0 +LEGISLATURE,0,0,0,2009,0,0,0 +LIBELOUS,0,0,0,2009,0,0,0 +LIENHOLDERS,0,0,0,2011,0,0,0 +COMPULSORY,0,0,0,0,0,0,2009 +CONCEDED,2009,0,0,0,0,0,0 +CONCEIVABLY,0,0,2009,0,0,0,0 +CONCILIATING,2009,0,0,0,0,0,0 +CONCLUSIVELY,0,2009,0,0,0,0,0 +CONDEMNED,2009,0,0,0,0,0,0 +CONDITIONAL,0,0,2009,0,0,0,0 +CONDUCIVE,0,2009,0,0,0,0,0 +CONFESSING,2009,0,0,0,0,0,0 +CONFINED,2009,0,0,0,0,0,2009 +CONFINING,2009,0,0,0,0,0,2009 +CONFISCATING,2009,0,0,0,0,0,0 +CONFLICT,2009,0,0,0,0,0,0 +CONFRONT,2009,0,0,0,0,0,0 +CONFRONTED,2009,0,0,0,0,0,0 +CONFUSED,2009,0,0,0,0,0,0 +CONFUSION,2009,0,2009,0,0,0,0 +CONSENTS,0,0,0,2009,0,0,0 +CONSPIRATOR,2009,0,0,0,0,0,0 +CONSPIRED,2009,0,0,0,0,0,0 +CONSTITUTIONAL,0,0,0,2009,0,0,0 +CONSTITUTIVE,0,0,0,2009,0,0,0 +CONSTRAINS,0,0,0,0,0,0,2009 +CONSTRUCTIVELY,0,2009,0,0,0,0,0 +CONSTRUING,0,0,0,2012,0,0,0 +CONTENDING,2009,0,0,0,0,0,0 +CONTENTIOUS,2009,0,0,0,0,0,0 +CONTESTED,2009,0,0,0,0,0,0 +CONTINGENT,0,0,2009,0,0,0,0 +CONTRACTED,0,0,0,2009,0,0,0 +CONTRACTILE,0,0,0,2009,0,0,0 +CONTRACTS,0,0,0,2009,0,0,0 +CONTRADICTED,2009,0,0,0,0,0,0 +CONTRADICTORY,2009,0,0,0,0,0,0 +CONTRAVENED,0,0,0,2009,0,0,0 +CONTRAVENTIONS,0,0,0,2009,0,0,0 +CONTROVERT,0,0,0,2009,0,0,0 +CONVEYANCE,0,0,0,2009,0,0,0 +CONVICTING,2009,0,0,2009,0,0,0 +CORRECTING,2009,0,0,0,0,0,0 +CORRUPT,2009,0,0,0,0,0,0 +CORRUPTIONS,2009,0,0,0,0,0,0 +COTERMINOUS,0,0,0,2009,0,0,0 +COUNSELLED,0,0,0,2009,0,0,0 +COUNTERCLAIMING,2009,0,0,0,0,0,0 +COUNTERFEITER,2009,0,0,0,0,0,0 +COUNTERMEASURE,2009,0,0,0,0,0,0 +COUNTERSUIT,0,0,0,2011,0,0,0 +COURTROOM,0,0,0,2009,0,0,0 +COVENANTING,0,0,0,0,0,0,2011 +CREATIVENESS,0,2009,0,0,0,0,0 +CRIMINAL,2009,0,0,2009,0,0,0 +CRIMINALLY,2009,0,0,2009,0,0,0 +CRITICAL,-2020,0,0,0,0,0,0 +CRITICIZE,2009,0,0,0,0,0,0 +CROSSCLAIM,0,0,0,2011,0,0,0 +CRUCIAL,2009,0,0,0,0,0,0 +CULPABLY,2009,0,0,0,0,0,0 +CURTAILING,2009,0,0,0,0,0,0 +CUT,2009,0,0,0,0,0,0 +CYBERATTACKS,2014,0,0,0,0,0,0 +CYBERCRIMINAL,2014,0,0,0,0,0,0 +TAINT,2009,0,0,0,0,0,0 +TAMPERED,2009,0,0,0,0,0,0 +TENTATIVE,0,0,2009,0,0,0,0 +TERMINATED,2009,0,0,0,0,0,0 +TERMINATIONS,2009,0,0,0,0,0,0 +TESTIFYING,2009,0,0,2009,0,0,0 +THENCEFORWARD,0,0,0,2009,0,0,0 +THEREIN,0,0,0,2009,0,0,0 +THEREOVER,0,0,0,2011,0,0,0 +THEREUNDER,0,0,0,2009,0,0,0 +THREAT,2009,0,0,0,0,0,0 +THREATENS,2009,0,0,0,0,0,0 +FACTO,0,0,0,2011,0,0,0 +FAILINGS,2009,0,0,0,0,0,0 +FALLOUT,2009,0,0,0,0,0,0 +FALSIFICATIONS,2009,0,0,0,0,0,0 +FALSIFYING,2009,0,0,0,0,0,0 +FATALITY,2009,0,0,0,0,0,0 +FAULTS,2009,0,0,0,0,0,0 +FAVORED,0,2009,0,0,0,0,0 +FEAR,2009,0,0,0,0,0,0 +FELONY,2009,0,0,2009,0,0,0 +DAMAGING,2009,0,0,0,0,0,0 +DANGEROUS,2009,0,0,0,0,0,0 +DEADLOCKED,2009,0,0,0,0,0,0 +DEADWEIGHTS,2009,0,0,0,0,0,0 +DECEASED,2009,0,0,0,0,0,0 +DECEITFUL,2009,0,0,0,0,0,0 +DECEIVES,2009,0,0,0,0,0,0 +DECEPTIVE,2009,0,0,0,0,0,0 +DECLINED,2009,0,0,0,0,0,0 +DECREED,0,0,0,2009,0,0,0 +DEFACED,2009,0,0,0,0,0,0 +DEFAMATION,2009,0,0,0,0,0,0 +DEFAMED,2009,0,0,0,0,0,0 +DEFAULTED,2009,0,0,0,0,0,0 +DEFEASANCES,0,0,0,2011,0,0,0 +DEFEASES,0,0,0,2014,0,0,0 +DEFEATING,2009,0,0,0,0,0,0 +DEFECTIVELY,0,0,0,2009,0,0,0 +DEFENDANT,2009,0,0,2009,0,0,0 +DEFENDS,2009,0,0,0,0,0,0 +DEFICIENCIES,2009,0,0,0,0,0,0 +DEFICITS,2009,0,0,0,0,0,0 +DEFRAUDED,2009,0,0,0,0,0,0 +DEGRADATION,2009,0,0,0,0,0,0 +DEGRADES,2009,0,0,0,0,0,0 +DELAYING,2009,0,0,0,0,0,0 +DELEGATEE,0,0,0,2011,0,0,0 +DELIBERATED,2009,0,0,0,0,0,0 +DELIGHTFUL,0,2009,0,0,0,0,0 +DELINQUENCIES,2009,0,0,0,0,0,0 +DELINQUENTS,2009,0,0,0,0,0,0 +DELISTS,2011,0,0,0,0,0,0 +DEMISING,2009,0,0,0,0,0,0 +DEMOLISHING,2009,0,0,0,0,0,0 +DEMOTED,2009,0,0,0,0,0,0 +DEMOTIONS,2009,0,0,0,0,0,0 +DEMURRING,0,0,0,2009,0,0,0 +DENIED,2009,0,0,0,0,0,0 +DENIGRATES,2009,0,0,0,0,0,0 +DENYING,2009,0,0,0,0,0,0 +DEPENDANCE,0,0,0,0,0,0,2011 +DEPENDENCE,0,0,2009,0,0,0,0 +DEPENDING,0,0,2009,0,0,2009,2011 +DEPLETES,2009,0,0,0,0,0,0 +DEPOSE,0,0,0,2009,0,0,0 +DEPOSITION,0,0,0,2009,0,0,0 +INVALIDATE,2009,0,0,0,0,0,0 +INVALIDATION,2009,0,0,0,0,0,0 +INVENTING,0,2009,0,0,0,0,0 +INVENTIVENESS,0,2009,0,0,0,0,0 +INVESTIGATED,2009,0,0,0,0,0,0 +INVESTIGATIONS,2009,0,0,0,0,0,0 +IRRECONCILABLY,2009,0,0,0,0,0,0 +IRREGULARITIES,2009,0,0,0,0,0,0 +IRREPARABLY,2009,0,0,0,0,0,0 +IRREVOCABLY,0,0,0,2009,0,0,2009 +JUDICIAL,0,0,0,2009,0,0,0 +JURIES,0,0,0,2009,0,0,0 +JURISDICTIONALLY,0,0,0,2011,0,0,0 +JURISTS,0,0,0,2009,0,0,0 +JURYMAN,0,0,0,2009,0,0,0 +KICKBACK,2009,0,0,0,0,0,0 +DIMINISH,2009,0,0,0,0,0,0 +DIMINUTION,2009,0,0,0,0,0,0 +DISADVANTAGED,2009,0,0,0,0,0,0 +DISAFFIRM,0,0,0,2009,0,0,0 +DISAGREE,2009,0,0,0,0,0,0 +DISAGREEMENT,2009,0,0,0,0,0,0 +DISALLOWANCE,2009,0,0,0,0,0,0 +DISALLOWS,2009,0,0,0,0,0,0 +DISAPPEARED,2009,0,0,0,0,0,0 +DISAPPOINTED,2009,0,0,0,0,0,0 +DISAPPOINTMENTS,2009,0,0,0,0,0,0 +DISAPPROVE,2009,0,0,0,0,0,0 +DISASSOCIATES,2009,0,0,0,0,0,0 +DISASTER,2009,0,0,0,0,0,0 +DISAVOW,2009,0,0,0,0,0,0 +DISAVOWS,2009,0,0,0,0,0,0 +GRATUITOUS,2009,0,0,0,0,0,0 +GREATEST,0,2009,0,0,0,0,0 +GRIEVANCES,2009,0,0,0,0,0,0 +HALT,2009,0,0,0,0,0,0 +HAMPERING,2009,0,0,0,0,0,0 +HAPPINESS,0,2009,0,0,0,0,0 +HARASSING,2009,0,0,0,0,0,0 +HARM,2009,0,0,0,0,0,0 +HARMING,2009,0,0,0,0,0,0 +HARSHEST,2009,0,0,0,0,0,0 +HAZARDOUS,2009,0,0,0,0,0,0 +NONINFRINGEMENT,0,0,0,2011,0,0,0 +NONJURISDICTIONAL,0,0,0,2011,0,0,0 +NONPERFORMANCES,2009,0,0,0,0,0,0 +HURTING,2009,0,0,0,0,0,0 +DISFAVORING,2009,0,0,0,0,0,0 +DISGORGEMENT,2009,0,0,0,0,0,0 +COMPLICATE,2009,0,0,0,0,0,0 +COMPLICATION,2009,0,0,0,0,0,0 +COMPLIMENTED,0,2009,0,0,0,0,0 +MISSTATEMENT,2009,0,0,0,0,0,0 +MISSTEP,2009,0,0,0,0,0,0 +MISTAKENLY,2009,0,0,0,0,0,0 +MISTRIALS,2009,0,0,2009,0,0,0 +MISUNDERSTOOD,2009,0,0,0,0,0,0 +MISUSING,2009,0,0,0,0,0,0 +MONOPOLIZE,2009,0,0,0,0,0,0 +MONOPOLY,2009,0,0,0,0,0,0 +MOREOVER,0,0,0,2009,0,0,0 +MUST,0,0,0,0,2009,0,0 +SLIPPAGE,2009,0,0,0,0,0,0 +SLOWDOWNS,2009,0,0,0,0,0,0 +SLOWING,2009,0,0,0,0,0,0 +SLUGGISHLY,2009,0,0,0,0,0,0 +SMOOTHLY,0,2009,0,0,0,0,0 +DEPRESSED,2009,0,0,0,0,0,0 +DEPRIVE,2009,0,0,0,0,0,0 +DERELICT,2009,0,0,0,0,0,0 +DEROGATES,0,0,0,2009,0,0,0 +DEROGATORY,2009,0,0,0,0,0,0 +DESIST,0,0,0,2009,0,0,0 +DESTABILIZED,2009,0,0,0,0,0,0 +DESTROYED,2009,0,0,0,0,0,0 +DESTRUCTIVE,2009,0,0,0,0,0,0 +DETENTION,2009,0,0,0,0,0,0 +DETERIORATED,2009,0,0,0,0,0,0 +DETERIORATIONS,2009,0,0,0,0,0,0 +DETERRENT,2009,0,0,0,0,0,0 +DETRACT,2009,0,0,0,0,0,0 +DETRIMENTAL,2009,0,0,0,0,0,0 +DEVALUED,2009,0,0,0,0,0,0 +DEVASTATED,2009,0,0,0,0,0,0 +DEVIATED,2009,0,2009,0,0,0,0 +DEVIATIONS,2009,0,2009,0,0,0,0 +DEVOLVES,2009,0,0,0,0,0,0 +DICTATES,0,0,0,0,0,0,2009 +DIFFERING,0,0,2009,0,0,0,0 +DIFFICULTLY,2009,0,0,0,0,0,0 +ASCENDANT,0,0,0,2009,0,0,0 +ASSAULTING,2009,0,0,0,0,0,0 +ASSIGNATION,0,0,0,2009,0,0,0 +ASSUMED,0,0,2009,0,0,0,0 +ASSUMPTIONS,0,0,2009,0,0,0,0 +ASSURING,0,2009,0,0,0,0,0 +ATTAINMENT,0,2009,0,0,0,0,0 +ATTESTATION,0,0,0,2009,0,0,0 +ATTORN,0,0,0,2011,0,0,0 +ATTORNS,0,0,0,2011,0,0,0 +AVERSELY,2011,0,0,0,0,0,0 +BAILED,0,0,0,2009,0,0,0 +BAILIFFS,0,0,0,2009,0,0,0 +BALKED,2009,0,0,0,0,0,0 +BANKRUPTED,2009,0,0,0,0,0,0 +CLAIMANT,0,0,0,2009,0,0,0 +CLAIMS,2009,0,0,2009,0,0,0 +CLAWBACKS,0,0,0,2014,0,0,0 +CLOSEOUTS,2009,0,0,0,0,0,0 +CLOSURES,2009,0,0,0,0,0,0 +CODICILS,0,0,0,2009,0,0,0 +CODIFIES,0,0,0,2009,0,0,0 +COERCED,2009,0,0,0,0,0,0 +COERCIVE,2009,0,0,0,0,0,0 +DISINCENTIVES,2009,0,0,0,0,0,0 +COLLABORATE,0,2009,0,0,0,0,0 +COLLABORATION,0,2009,0,0,0,0,0 +COLLABORATORS,0,2009,0,0,0,0,0 +COLLAPSING,2009,0,0,0,0,0,0 +COLLUDED,2009,0,0,0,0,0,0 +COLLUSIONS,2009,0,0,0,0,0,0 +POSITIVE,0,2009,0,0,0,0,0 +POSSIBILITY,0,0,2009,0,0,0,0 +POSTCLOSURE,0,0,0,2011,0,0,0 +POSTPONED,2009,0,0,0,0,0,0 +POSTPONING,2009,0,0,0,0,0,0 +WRIT,0,0,0,2009,0,0,0 +WRITEOFFS,2009,0,0,0,0,0,0 +WRONGDOINGS,2009,0,0,0,0,0,0 +HONORING,0,2009,0,0,0,0,0 +REASSESSES,0,0,2009,0,0,0,0 +REASSIGN,2009,0,0,0,0,0,0 +REASSIGNMENTS,2009,0,0,0,0,0,0 +REBOUNDING,0,2009,0,0,0,0,0 +REBUTTABLY,0,0,0,2011,0,0,0 +REBUTTING,0,0,0,2009,0,0,0 +RECALCULATING,0,0,2009,0,0,0,0 +RECALLED,2009,0,0,0,0,0,0 +RECESSION,2009,0,0,0,0,0,0 +RECKLESSLY,2009,0,0,0,0,0,0 +RECONSIDERING,0,0,2009,0,0,0,0 +RECOUPMENT,0,0,0,2009,0,0,0 +RECTIFICATION,0,0,0,2009,0,0,0 +RECUSED,0,0,0,2011,0,0,0 +REDACTED,2009,0,0,2009,0,0,0 +REDEFAULT,2014,0,0,0,0,0,0 +REDRESSED,2009,0,0,0,0,0,0 +REEXAMINE,0,0,2009,0,0,0,0 +REFERENDUMS,0,0,0,2009,0,0,0 +REFILING,0,0,0,2009,0,0,0 +REFUSAL,2009,0,0,0,0,0,0 +REFUSES,2009,0,0,0,0,0,0 +REGAINING,0,2009,0,0,0,0,0 +REGULATING,0,0,0,2009,0,0,0 +REGULATOR,0,0,0,2009,0,0,0 +REHEARD,0,0,0,2009,0,0,0 +VARIABLES,0,0,2009,0,0,0,0 +VARIANT,0,0,2009,0,0,0,0 +VARIED,0,0,2009,0,0,0,0 +VENDEE,0,0,0,2011,0,0,0 +VERSATILE,0,2009,0,0,0,0,0 +VIBRANCY,0,2009,0,0,0,0,0 +VIOLATED,2009,0,0,0,0,0,0 +VIOLATIONS,2009,0,0,0,0,0,0 +VIOLENCE,2009,0,0,0,0,0,0 +VITIATED,2009,0,0,0,0,0,0 +VOIDABLE,0,0,0,2009,0,0,0 +VOLATILITIES,0,0,2009,0,0,0,0 +VULNERABLE,2009,0,0,0,0,0,0 +WARNING,2009,0,0,0,0,0,0 +WARRANTOR,0,0,0,2011,0,0,0 +WEAK,2009,0,0,0,0,0,0 +WEAKENS,2009,0,0,0,0,0,0 +WEAKNESS,2009,0,0,0,0,0,0 +DISHONOR,2009,0,0,0,0,0,0 +DISHONORING,2009,0,0,0,0,0,0 +DISINTERESTED,2009,0,0,0,0,0,0 +DISLOYALLY,2009,0,0,0,0,0,0 +DISMISS,2009,0,0,0,0,0,0 +DISMISSES,2009,0,0,0,0,0,0 +DISPARAGED,2009,0,0,0,0,0,0 +DISPARAGING,2009,0,0,0,0,0,0 +DISPLACE,2009,0,0,0,0,0,0 +DISPLACES,2009,0,0,0,0,0,0 +DISPOSSESS,2009,0,0,0,0,0,0 +DISPOSSESSION,0,0,0,2009,0,0,0 +DISPROPORTIONATE,2009,0,0,0,0,0,0 +DISPUTES,2009,0,0,0,0,0,0 +DISQUALIFIED,2009,0,0,0,0,0,0 +DISREGARD,2009,0,0,0,0,0,0 +DISREPUTABLE,2009,0,0,0,0,0,0 +DISRUPTING,2009,0,0,0,0,0,0 +DISRUPTS,2009,0,0,0,0,0,0 +DISSENTED,2009,0,0,0,0,0,0 +DISSENTS,2009,0,0,0,0,0,0 +DISSOLUTIONS,2009,0,0,0,0,0,0 +DISTINCTIVELY,0,2009,0,0,0,0,0 +DISTORTING,2009,0,0,0,0,0,0 +DISTRACT,2009,0,0,0,0,0,0 +DISTRACTIONS,2009,0,0,0,0,0,0 +DISTRESSED,2009,0,0,0,0,0,0 +DISTURBANCE,2009,0,0,0,0,0,0 +DISTURBS,2009,0,0,0,0,0,0 +DIVERTING,2009,0,0,0,0,0,0 +DIVESTING,2009,0,0,0,0,0,0 +DIVESTMENTS,2009,0,0,0,0,0,0 +DIVULGE,2009,0,0,0,0,0,0 +DOCKET,0,0,0,2009,0,0,0 +DONEES,0,0,0,2011,0,0,0 +DOUBTS,2009,0,2009,0,0,0,0 +DOWNGRADING,2009,0,0,0,0,0,0 +DOWNSIZING,2009,0,0,0,0,0,0 +DOWNTURN,2009,0,0,0,0,0,0 +DRAG,2009,0,0,0,0,0,0 +DRAWBACKS,2009,0,0,0,0,0,0 +DROUGHTS,2009,0,0,0,0,0,0 +DYSFUNCTIONAL,2009,0,0,0,0,0,0 +EARMARKING,0,0,0,0,0,0,2009 +EASING,2009,0,0,0,0,0,0 +EFFICIENCY,0,2009,0,0,0,0,0 +EGREGIOUSLY,2009,0,0,0,0,0,0 +EMBARGOES,2009,0,0,0,0,0,0 +EMBARRASSES,2009,0,0,0,0,0,0 +EMBEZZLE,2009,0,0,0,0,0,0 +EMBEZZLER,2009,0,0,0,0,0,0 +EMPOWERED,0,2009,0,0,0,0,0 +ENABLED,0,2009,0,0,0,0,0 +ENCOURAGEMENT,0,2009,0,0,0,0,0 +ENCROACHED,2009,0,0,0,0,0,0 +ENCROACHMENTS,2009,0,0,0,0,0,0 +ENCUMBERS,2009,0,0,2009,0,0,2009 +ENCUMBRANCES,2009,0,0,2009,0,0,2009 +ENDANGERMENT,2009,0,0,0,0,0,0 +ENFORCEABLE,0,0,0,2009,0,0,0 +ENHANCEMENT,0,2009,0,0,0,0,0 +ENJOIN,2009,0,0,0,0,0,0 +ENJOY,0,2009,0,0,0,0,0 +ENJOYING,0,2009,0,0,0,0,0 +ENTAILED,0,0,0,0,0,0,2009 +PENALIZE,2009,0,0,0,0,0,0 +PENALTIES,2009,0,0,0,0,0,0 +PERFECTED,0,2009,0,0,0,0,0 +PERIL,2009,0,0,0,0,0,0 +PERMISSION,0,0,0,0,0,0,2009 +PERMITTEES,0,0,0,2011,0,0,0 +PERPETRATES,2009,0,0,2009,0,0,0 +PERSISTED,2009,0,0,0,0,0,0 +PERSISTING,2009,0,0,0,0,0,0 +PERVASIVELY,2009,0,0,0,0,0,0 +PETITIONER,0,0,0,2009,0,0,0 +PETTY,2009,0,0,0,0,0,0 +HEREAFTER,0,0,0,2009,0,0,0 +HEREFORE,0,0,0,2014,0,0,0 +HEREINAFTER,0,0,0,2009,0,0,0 +HEREON,0,0,0,2009,0,0,0 +HEREUNTO,0,0,0,2009,0,0,0 +HIDDEN,0,0,2009,0,0,0,0 +HINDERING,2009,0,0,0,0,0,0 +HINGES,0,0,2009,0,0,0,0 +WHEREABOUTS,0,0,0,2009,0,0,0 +WHEREFORE,0,0,0,2009,0,0,0 +WHERETO,0,0,0,2009,0,0,0 +WHISTLEBLOWERS,0,0,0,2011,0,0,0 +WILFUL,0,0,0,2009,0,0,0 +WILLFULNESS,0,0,0,2009,0,0,0 +WINNING,0,2009,0,0,0,0,0 +FLUCTUATE,0,0,2009,0,0,0,0 +FLUCTUATION,0,0,2009,0,0,0,0 +FORBEARANCE,0,0,0,2009,0,0,0 +FORBID,2009,0,0,0,0,0,2009 +FORCE,-2020,0,0,0,0,0,0 +FOREBEARANCE,0,0,0,2011,0,0,0 +FORECLOSES,2009,0,0,0,0,0,0 +FOREGO,2009,0,0,0,0,0,0 +FORESTALLED,2009,0,0,0,0,0,0 +FORFEITABILITY,0,0,0,2011,0,0,0 +FORFEITS,2009,0,0,0,0,0,0 +FORGERY,2009,0,0,0,0,0,0 +FRAUDS,2009,0,0,0,0,0,0 +FRIENDLY,0,2009,0,0,0,0,0 +FRUSTRATED,2009,0,0,0,0,0,0 +FRUSTRATION,2009,0,0,0,0,0,0 +FURTHERANCE,0,0,0,2009,0,0,0 +GAINS,0,2009,0,0,0,0,0 +DISGORGEMENTS,2009,0,0,0,0,0,0 +DISGRACEFUL,2009,0,0,0,0,0,0 +LITIGATE,2009,0,0,2009,0,0,0 +LITIGATION,2009,0,0,2009,0,0,0 +LITIGIOUS,0,0,0,2009,0,0,0 +LACKED,2009,0,0,0,0,0,0 +LAG,2009,0,0,0,0,0,0 +LAPSE,2009,0,0,0,0,0,0 +LATE,-2020,0,0,0,0,0,0 +LAWFULLY,0,0,0,2009,0,0,0 +LAWS,0,0,0,2009,0,0,0 +LAWYERS,0,0,0,2009,0,0,0 +LEADING,0,2009,0,0,0,0,0 +LEGALIZATION,0,0,0,2009,0,0,0 +LEGALIZES,0,0,0,2009,0,0,0 +LEGATEE,0,0,0,2009,0,0,0 +FLAWED,2009,0,0,0,0,0,0 +NONRECOVERABLE,2009,0,0,0,0,0,0 +LIQUIDATES,2009,0,0,0,0,0,0 +LIQUIDATOR,2009,0,0,0,0,0,0 +BENEFICIATION,0,0,0,2011,0,0,0 +BENEFITTED,0,2009,0,0,0,0,0 +POOR,2009,0,0,0,0,0,0 +REINTERPRETATION,0,0,2009,0,0,0,0 +REINTERPRETS,0,0,2009,0,0,0,0 +REJECTION,2009,0,0,0,0,0,0 +RELINQUISH,2009,0,0,0,0,0,0 +RELINQUISHMENT,2009,0,0,0,0,0,0 +REMAND,0,0,0,2009,0,0,0 +REMEDIATE,0,0,0,2009,0,0,0 +REMEDIATIONS,0,0,0,2009,0,0,0 +RENEGOTIATED,2009,0,0,0,0,0,0 +RENEGOTIATIONS,2009,0,0,0,0,0,0 +RENOUNCEMENTS,2009,0,0,0,0,0,0 +REPARATIONS,2009,0,0,0,0,0,0 +REPOSSESSES,2009,0,0,0,0,0,0 +REPRORATED,0,0,0,2018,0,0,0 +TROUBLED,2009,0,0,0,0,0,0 +UNABLE,2009,0,0,0,0,0,0 +UNAMBIGUOUSLY,0,0,0,0,2009,0,0 +UNAPPEALED,0,0,0,2011,0,0,0 +UNAVAILABILITY,2009,0,0,0,0,0,2011 +UNAWARE,2009,0,0,0,0,0,0 +UNCERTAINTY,0,0,2009,0,0,0,0 +UNCOLLECTIBILITY,2009,0,0,0,0,0,0 +UNCOMPLETED,2009,0,0,0,0,0,0 +UNCONSCIONABLY,2009,0,0,0,0,0,0 +UNCONTRACTED,0,0,0,2011,0,0,0 +UNCORRECTED,2009,0,0,0,0,0,0 +UNCOVERS,2009,0,0,0,0,0,0 +UNDELIVERABLE,2009,0,0,0,0,0,0 +UNDERCUTS,2009,0,0,0,0,0,0 +UNDERESTIMATES,2009,0,0,0,0,0,0 +UNDERINSURED,2009,0,0,0,0,0,0 +UNDERMINING,2009,0,0,0,0,0,0 +UNDERPAYS,2009,0,0,0,0,0,0 +UNDERPERFORMING,2009,0,0,0,0,0,0 +UNDERREPORTING,2011,0,0,0,0,0,0 +UNDERSTATEMENTS,2009,0,0,0,0,0,0 +UNDERUTILIZED,2009,0,0,0,0,0,0 +UNDETECTABLE,0,0,2009,0,0,0,0 +UNDISCHARGED,0,0,0,2009,0,0,0 +UNDOUBTEDLY,0,0,0,0,2009,0,0 +UNECONOMICAL,2009,0,0,0,0,0,0 +UNENCUMBER,0,0,0,2014,0,0,0 +UNEQUIVOCAL,0,0,0,0,2009,0,0 +UNEXCUSED,2009,0,0,0,0,0,0 +UNFAIRLY,2009,0,0,0,0,0,0 +UNFAVORABLE,2009,0,0,0,0,0,0 +UNFIT,2009,0,0,0,0,0,0 +UNFORESEEN,2009,0,0,0,0,0,0 +UNFOUNDED,2009,0,0,0,0,0,0 +UNGUARANTEED,0,0,2009,0,0,0,0 +UNINSURED,2009,0,0,0,0,0,0 +UNJUST,2009,0,0,0,0,0,0 +UNJUSTLY,2009,0,0,0,0,0,0 +UNKNOWNS,0,0,2009,0,0,0,0 +UNLICENSED,2009,0,0,0,0,0,0 +UNMERCHANTABLE,2011,0,0,0,0,0,0 +UNNEEDED,2009,0,0,0,0,0,0 +UNPAID,2009,0,0,0,0,0,0 +UNPOPULAR,2009,0,0,0,0,0,0 +UNPREDICTED,2011,0,2011,0,0,0,0 +UNPROVED,0,0,2009,0,0,0,0 +UNQUANTIFIED,0,0,2011,0,0,0,0 +UNREASONABLY,2009,0,0,0,0,0,0 +UNRECOVERED,2009,0,0,0,0,0,0 +UNREMEDIED,2009,0,0,0,0,0,0 +UNSAFE,2009,0,0,0,0,0,0 +UNSATISFIED,2009,0,0,0,0,0,0 +UNSEASONABLY,0,0,2009,0,0,0,0 +UNSOUND,2009,0,0,0,0,0,0 +UNSTABLE,2009,0,0,0,0,0,0 +UNSUCCESSFULLY,2009,0,0,0,0,0,0 +UNSUITED,2009,0,0,0,0,0,0 +UNSUSPECTING,2009,0,0,0,0,0,0 +UNTIMELY,2009,0,0,0,0,0,0 +UNTRUTHFUL,2009,0,0,0,0,0,0 +UNUSABLE,2009,0,0,0,0,0,0 +UNWARRANTED,2009,0,0,0,0,0,0 +UNWRITTEN,0,0,2009,0,0,0,0 +URGENCY,2009,0,0,0,0,0,0 +USURPATION,0,0,0,2009,0,0,0 +USURY,2009,0,0,2009,0,0,0 +VAGUENESS,0,0,2012,0,0,0,0 +VALUABLE,0,2009,0,0,0,0,0 +PLEAD,2009,0,0,0,0,0,0 +PLEADS,2009,0,0,2009,0,0,0 +PLEASED,0,2009,0,0,0,0,0 +PLEDGED,0,0,0,0,0,0,2009 +PLEDGING,0,0,0,0,0,0,2009 +COMPEL,0,0,0,0,0,0,2011 +COMPENSATORY,0,0,0,2009,0,0,0 +COMPLAINED,2009,0,0,0,0,0,0 +COMPLAINTS,2009,0,0,0,0,0,0 +COMMITMENT,0,0,0,0,0,0,2009 +COMMITTING,0,0,0,0,0,0,2009 +LIMITATION,2009,0,0,0,0,0,0 +LINGERING,2009,0,0,0,0,0,0 +RESTRAINING,0,0,0,0,0,0,2009 +RESTRICT,0,0,0,0,0,0,2009 +RESTRICTIONS,0,0,0,0,0,0,2009 +RESTRICTS,0,0,0,0,0,0,2009 +RESTRUCTURING,2009,0,0,0,0,0,0 +RETALIATES,2009,0,0,0,0,0,0 +RETALIATORY,2009,0,0,0,0,0,0 +PRECAUTIONS,0,0,2009,0,0,0,0 +PRECLUDE,2009,0,0,0,0,0,2009 +PRECONDITION,0,0,0,0,0,0,2009 +PREDECEASED,0,0,0,2009,0,0,0 +PREDICTABILITY,0,0,2009,0,0,0,0 +PREDICTIONS,0,0,2009,0,0,0,0 +PREDICTS,0,0,2009,0,0,0,0 +PREJUDICE,2009,0,0,2009,0,0,0 +PREJUDICING,2009,0,0,2009,0,0,0 +PREMATURELY,2009,0,0,0,0,0,0 +PRESET,0,0,0,0,0,0,2009 +PRESUMABLY,0,0,2009,0,0,0,0 +PRESUMING,0,0,2009,0,0,0,0 +PRETRIAL,2009,0,0,2009,0,0,0 +PREVENTION,2009,0,0,0,0,0,0 +PROACTIVE,0,2009,0,0,0,0,0 +PROBABILITY,0,0,2009,0,0,0,0 +PROBATED,0,0,0,2009,0,0,0 +PROBATIONAL,0,0,0,2009,0,0,0 +PROBATIONS,0,0,0,2009,0,0,0 +PROBLEMS,2009,0,0,0,0,0,0 +PROFITABILITY,0,2009,0,0,0,0,0 +PROGRESSED,0,2009,0,0,0,0,0 +PROHIBITED,0,0,0,0,0,0,2009 +PROHIBITIVE,0,0,0,0,0,0,2009 +PROLONG,2009,0,0,0,0,0,0 +PROLONGING,2009,0,0,0,0,0,0 +PROMULGATES,0,0,0,2009,0,0,0 +PROMULGATOR,0,0,0,2009,0,0,0 +PRORATION,0,0,0,2009,0,0,0 +PROSECUTING,2009,0,0,2009,0,0,0 +PROSECUTORIAL,0,0,0,2011,0,0,0 +PROSPERITY,0,2009,0,0,0,0,0 +PROTESTED,2009,0,0,0,0,0,0 +PROTESTOR,2009,0,0,0,0,0,0 +PROTRACTION,2009,0,0,0,0,0,0 +PROVOKE,2009,0,0,0,0,0,0 +PUNISHABLE,0,0,0,2009,0,0,0 +PUNISHMENT,2009,0,0,0,0,0,0 +PURPORTED,2009,0,0,0,0,0,0 +QUESTION,2009,0,0,0,0,0,0 +QUESTIONING,2009,0,0,0,0,0,0 +QUITCLAIMS,0,0,0,2009,0,0,0 +RANDOM,0,0,2009,0,0,0,0 +RANDOMIZING,0,0,2009,0,0,0,0 +RATABLE,0,0,0,2009,0,0,0 +RATIONALIZE,2009,0,0,0,0,0,0 +ABANDONED,2009,0,0,0,0,0,0 +ABANDONS,2009,0,0,0,0,0,0 +ABDICATION,2009,0,0,0,0,0,0 +ABERRATIONAL,2009,0,0,0,0,0,0 +ABEYANCES,0,0,2009,0,0,0,0 +ABNORMAL,2009,0,0,0,0,0,0 +ABOLISH,2009,0,0,0,0,0,0 +ABOVEMENTIONED,0,0,0,2011,0,0,0 +ABROGATING,2009,0,0,2009,0,0,0 +ABRUPTLY,2009,0,0,0,0,0,0 +ABSENTEEISM,2009,0,0,0,0,0,0 +ABSOLVING,0,0,0,2009,0,0,0 +ABUSED,2009,0,0,0,0,0,0 +ABUSIVELY,2009,0,0,0,0,0,0 +ACCIDENT,2009,0,0,0,0,0,0 +ACCLAIMED,0,2009,0,0,0,0,0 +ACCOMPLISHING,0,2009,0,0,0,0,0 +ACCUSATIONS,2009,0,0,0,0,0,0 +ACCUSING,2009,0,0,0,0,0,0 +ACHIEVEMENTS,0,2009,0,0,0,0,0 +ACQUIESCED,2009,0,0,0,0,0,0 +ACQUIRORS,0,0,0,2011,0,0,0 +ACQUITTALS,2009,0,0,2009,0,0,0 +ACQUITTING,2009,0,0,2009,0,0,0 +ADJOURNED,0,0,0,2009,0,0,0 +ADJOURNS,0,0,0,2009,0,0,0 +ADJUDGING,0,0,0,2009,0,0,0 +ADJUDICATING,0,0,0,2009,0,0,0 +ADJUDICATOR,0,0,0,2009,0,0,0 +ADMISSIBLE,0,0,0,2009,0,0,0 +ADULTERATE,2009,0,0,0,0,0,0 +ADULTERATIONS,2009,0,0,0,0,0,0 +ADVANCING,0,2009,0,0,0,0,0 +ADVANTAGEOUSLY,0,2009,0,0,0,0,0 +ADVERSARY,2009,0,0,0,0,0,0 +ADVERSITY,2009,0,0,0,0,0,0 +AFFREIGHTMENT,0,0,0,2012,0,0,0 +AFORESTATED,0,0,0,2011,0,0,0 +AGGRAVATE,2009,0,0,0,0,0,0 +AGGRAVATION,2009,0,0,0,0,0,0 +ALERTING,2009,0,0,0,0,0,0 +ALIENATING,2009,0,0,0,0,0,0 +ALLEGATIONS,2009,0,0,2009,0,0,0 +ALLEGES,2009,0,0,2009,0,0,0 +ALMOST,0,0,2009,0,0,2009,0 +AMBIGUITIES,0,0,2009,0,0,0,0 +AMENDABLE,0,0,0,2009,0,0,0 +AMENDMENT,0,0,0,2009,0,0,0 +ANNOYANCE,2009,0,0,0,0,0,0 +ANNOYS,2009,0,0,0,0,0,0 +ANNULMENT,2009,0,0,0,0,0,0 +ANOMALOUS,2009,0,2009,0,0,0,0 +ANTECEDENTS,0,0,0,2009,0,0,0 +ANTICIPATING,0,0,2009,0,0,0,0 +ANTICORRUPTION,0,0,0,2014,0,0,0 +APPARENTLY,0,0,2009,0,0,2009,0 +APPEALING,0,0,0,2009,0,0,0 +APPEARING,0,0,2009,0,0,2009,0 +APPELLATE,0,0,0,2009,0,0,0 +APPROXIMATED,0,0,2009,0,0,0,0 +APPROXIMATION,0,0,2009,0,0,0,0 +APPURTENANT,0,0,0,2009,0,0,0 +ARBITRARINESS,0,0,2009,0,0,0,0 +ARBITRATES,0,0,0,2009,0,0,0 +ARBITRATIONS,0,0,0,2009,0,0,0 +ARGUE,2009,0,0,0,0,0,0 +ARGUMENTATIVE,2009,0,0,0,0,0,0 +ARREARS,2009,0,0,0,0,0,0 +ARTIFICIALLY,2009,0,0,0,0,0,0 +RETRIBUTION,2009,0,0,0,0,0,0 +RETROCESSIONAIRES,0,0,0,2011,0,0,0 +BOLSTERS,0,2009,0,0,0,0,0 +BOOMING,0,2009,0,0,0,0,0 +BOTTLENECKS,2009,0,0,0,0,0,0 +BOYCOTTED,2009,0,0,0,0,0,0 +BREACHED,2009,0,0,2009,0,0,0 +BREAKAGE,2009,0,0,0,0,0,0 +BREAKING,-2020,0,0,0,0,0,0 +BRIBE,2009,0,0,0,0,0,0 +BRIBES,2009,0,0,0,0,0,0 +BROKEN,-2020,0,0,0,0,0,0 +BURDENS,2009,0,0,0,0,0,0 +CALAMITOUS,2009,0,0,0,0,0,0 +CANCELING,2009,0,0,0,0,0,0 +CANCELLING,2009,0,0,0,0,0,0 +CARELESSNESS,2009,0,0,0,0,0,0 +CATASTROPHIC,2009,0,0,0,0,0,0 +CAUTIONED,2009,0,0,0,0,0,0 +CAUTIOUSLY,0,0,2009,0,0,0,0 +CEASES,2009,0,0,0,0,0,0 +CENSURE,2009,0,0,0,0,0,0 +CERTIORARI,0,0,0,2011,0,0,0 +CHALLENGES,2009,0,0,0,0,0,0 +CHATTEL,0,0,0,2009,0,0,0 +CIRCUMVENTED,2009,0,0,0,0,0,0 +CIRCUMVENTS,2009,0,0,0,0,0,0 +SHALL,0,0,0,2009,0,0,0 +SHORTAGES,2009,0,0,0,0,0,0 +SHRINKAGES,2009,0,0,0,0,0,0 +SHUTS,2009,0,0,0,0,0,0 +SLANDEROUS,2009,0,0,0,0,0,0 +REPUDIATING,2009,0,0,0,0,0,0 +REQUESTOR,0,0,0,2011,0,0,0 +REQUIREMENTS,0,0,0,0,0,0,2009 +RESCIND,0,0,0,2009,0,0,0 +RESCISSION,0,0,0,2009,0,0,0 +RESIGNATIONS,2009,0,0,0,0,0,0 +RESOLVE,0,2009,0,0,0,0,0 +RESTATEMENTS,2009,0,0,0,0,0,0 +NOTARIES,0,0,0,2009,0,0,0 +NOTARIZED,0,0,0,2009,0,0,0 +NOVO,0,0,0,2011,0,0,0 +NULLIFICATIONS,2009,0,0,2009,0,0,0 +NULLIFYING,2009,0,0,2009,0,0,0 +OBJECTING,2009,0,0,0,0,0,0 +OBJECTIONS,2009,0,0,0,0,0,0 +OBLIGATING,0,0,0,0,0,0,2009 +OBLIGE,0,0,0,0,0,0,2009 +OBLIGES,0,0,0,0,0,0,2009 +OBSCENITY,2009,0,0,0,0,0,0 +OBSTACLES,2009,0,0,0,0,0,0 +OBSTRUCTION,2009,0,0,0,0,0,0 +OFFENCES,2009,0,0,0,0,0,0 +OFFENDERS,2009,0,0,0,0,0,0 +OFFEREE,0,0,0,2009,0,0,0 +OMISSION,2009,0,0,0,0,0,0 +OMITTED,2009,0,0,0,0,0,0 +OPPORTUNISTICALLY,2009,0,0,0,0,0,0 +OPPOSED,2009,0,0,0,0,0,0 +OPPOSITIONS,2009,0,0,0,0,0,0 +ORDINARILY,0,0,2009,0,0,0,0 +OUTMODED,2009,0,0,0,0,0,0 +OUTPERFORMS,0,2009,0,0,0,0,0 +OVERBUILDING,2009,0,0,0,0,0,0 +OVERBURDENED,2009,0,0,0,0,0,0 +OVERCHARGE,2009,0,0,0,0,0,0 +OVERCOME,2009,0,0,0,0,0,0 +OVERESTIMATE,2009,0,0,0,0,0,0 +OVERESTIMATION,2009,0,0,0,0,0,0 +OVERLOADING,2009,0,0,0,0,0,0 +OVERLOOKING,2009,0,0,0,0,0,0 +OVERPAYMENTS,2009,0,0,0,0,0,0 +OVERPRODUCTION,2009,0,0,0,0,0,0 +OVERRULING,0,0,0,2009,0,0,0 +OVERSHADOW,2009,0,0,0,0,0,0 +OVERSTATE,2009,0,0,0,0,0,0 +OVERSTATES,2009,0,0,0,0,0,0 +OVERSUPPLY,2009,0,0,0,0,0,0 +OVERTURNED,2009,0,0,0,0,0,0 +OVERVALUED,2009,0,0,0,0,0,0 +PARA,0,0,0,-2020,0,0,0 +NECESSITATED,0,0,0,0,0,0,2009 +NEGATIVELY,2009,0,0,0,0,0,0 +NEGLECTFUL,2009,0,0,0,0,0,0 +NEGLIGENCES,2009,0,0,0,0,0,0 +NOLO,0,0,0,2011,0,0,0 +BEAUTIFUL,0,2009,0,0,0,0,0 +BELIEVES,0,0,2009,0,0,0,0 +IDEAL,0,2009,0,0,0,0,0 +IGNORE,2009,0,0,0,0,0,0 +ILL,2009,0,0,0,0,0,0 +ILLEGALLY,2009,0,0,0,0,0,0 +ILLIQUID,2009,0,0,0,0,0,0 +IMMATERIALITY,0,0,0,2009,0,0,0 +IMPAIRED,2009,0,0,0,0,0,2011 +IMPAIRS,2009,0,0,0,0,0,2011 +IMPEDED,2009,0,0,0,0,0,0 +IMPEDING,2009,0,0,0,0,0,0 +IMPERFECTIONS,2009,0,0,0,0,0,0 +IMPLICATE,2009,0,0,0,0,0,0 +IMPOSE,0,0,0,0,0,0,2009 +IMPOSITION,0,0,0,0,0,0,2009 +IMPOUND,2009,0,0,0,0,0,0 +IMPRACTICABLE,2009,0,0,0,0,0,0 +IMPRECISE,0,0,2009,0,0,0,0 +IMPRESSED,0,2009,0,0,0,0,0 +IMPRESSIVELY,0,2009,0,0,0,0,0 +IMPROPER,2009,0,0,0,0,0,0 +IMPROVE,0,2009,0,0,0,0,0 +IMPROVES,0,2009,0,0,0,0,0 +INABILITY,2009,0,0,0,0,0,0 +INACCURATE,2009,0,0,0,0,0,0 +INACTIVATE,2009,0,0,0,0,0,0 +INACTIVATION,2009,0,0,0,0,0,0 +INADEQUACY,2009,0,0,0,0,0,0 +INADVERTENTLY,2009,0,0,0,0,0,0 +INAPPROPRIATELY,2009,0,0,0,0,0,0 +INCAPACITATED,2009,0,0,0,0,0,0 +INCARCERATES,2009,0,0,2009,0,0,0 +INCHOATE,0,0,0,2009,0,0,0 +INCIDENTS,2009,0,0,0,0,0,0 +INCOMPETENCE,2009,0,0,0,0,0,0 +INCOMPETENTS,2009,0,0,0,0,0,0 +INCONCLUSIVE,2009,0,0,0,0,0,0 +INCONSISTENTLY,2009,0,0,0,0,0,0 +INCONVENIENCES,2009,0,0,0,0,0,0 +INCORRECTNESS,2009,0,0,0,0,0,0 +INDECENCY,2009,0,0,0,0,0,0 +INDEFINITE,0,0,2009,0,0,0,0 +INDEMNIFICATION,0,0,0,2009,0,0,0 +INDEMNIFY,0,0,0,2009,0,0,0 +INDEMNITIES,0,0,0,2009,0,0,0 +INDETERMINABLE,0,0,2009,0,0,0,0 +INDICTED,2009,0,0,2009,0,0,0 +INDORSEES,0,0,0,2011,0,0,0 +INEFFICIENCIES,2009,0,0,0,0,0,0 +INELIGIBILITY,2009,0,0,0,0,0,0 +INEQUITIES,2009,0,0,0,0,0,0 +INEXACTNESS,0,0,2009,0,0,0,0 +INFLICTED,2009,0,0,0,0,0,0 +INFRACTION,2009,0,0,2009,0,0,0 +INFRINGEMENT,2009,0,0,0,0,0,0 +INFRINGING,2009,0,0,0,0,0,0 +INHIBITING,0,0,0,0,0,0,2011 +INJUNCTIONS,2009,0,0,2009,0,0,0 +INJURES,2009,0,0,0,0,0,0 +INJURY,2009,0,0,0,0,0,0 +INNOVATING,0,2009,0,0,0,0,0 +INNOVATIVENESS,0,2011,0,0,0,0,0 +INORDINATELY,2009,0,0,0,0,0,0 +INSIGHTFUL,0,2009,0,0,0,0,0 +INSISTING,0,0,0,0,0,0,2009 +INSOLVENCY,2009,0,0,0,0,0,0 +INSTABILITIES,0,0,2009,0,0,0,0 +INSUFFICIENT,2009,0,0,0,0,0,0 +INTANGIBLE,0,0,2009,0,0,0,0 +INTERFERE,2009,0,0,0,0,0,0 +INTERFERES,2009,0,0,0,0,0,0 +INTERMITTENTLY,2009,0,0,0,0,0,0 +INTERPOSES,0,0,0,2009,0,0,0 +INTERROGATE,0,0,0,2009,0,0,0 +INTERROGATION,0,0,0,2009,0,0,0 +INTERROGATORS,0,0,0,2009,0,0,0 +INTERRUPTING,2009,0,0,0,0,0,0 +INTESTACY,0,0,0,2009,0,0,0 +STABILIZATION,0,2009,0,0,0,0,0 +STABILIZES,0,2009,0,0,0,0,0 +STAGNANT,2009,0,0,0,0,0,0 +STAGNATING,2009,0,0,0,0,0,0 +STATUTE,0,0,0,2009,0,0,0 +STIPULATE,0,0,0,0,0,0,2009 +STIPULATION,0,0,0,0,0,0,2009 +STOPPAGES,2009,0,0,0,0,0,0 +STRAIN,2009,0,0,0,0,0,0 +STRENGTH,0,2009,0,0,0,0,0 +STRENGTHENS,0,2009,0,0,0,0,0 +STRESSES,2009,0,0,0,0,0,0 +STRICTER,0,0,0,0,0,0,2009 +STRONG,0,2009,0,0,0,0,0 +SUBCLAUSE,0,0,0,2009,0,0,0 +SUBJECTING,2009,0,0,0,0,0,0 +SUBLESSORS,0,0,0,2011,0,0,0 +SUBPARAGRAPHS,0,0,0,2009,0,0,0 +SUBROGATED,0,0,0,2009,0,0,0 +SUBTRUSTS,0,0,0,2011,0,0,0 +SUCCEEDS,0,2009,0,0,0,0,0 +SUCCESSFULLY,0,2009,0,0,0,0,0 +SUED,2009,0,0,2009,0,0,0 +SUFFERING,2009,0,0,0,0,0,0 +SUGGESTING,0,0,2009,0,0,0,0 +SUMMONING,2009,0,0,2009,0,0,0 +SUPERSEDE,0,0,0,2009,0,0,0 +SUPERSEDING,0,0,0,2009,0,0,0 +SURPASSED,0,2009,0,0,0,0,0 +SUSCEPTIBLE,2009,0,0,0,0,0,0 +SUSPEND,2009,0,0,0,0,0,0 +SUSPENSION,2009,0,0,0,0,0,0 +SUSPICIOUS,2009,0,0,0,0,0,0 +REVOCATION,2009,0,0,2009,0,0,0 +REVOKES,2009,0,0,0,0,0,0 +REVOLUTIONIZES,0,2009,0,0,0,0,0 +REWARDING,0,2009,0,0,0,0,0 +RIDICULES,2009,0,0,0,0,0,0 +RISKIER,2009,0,2009,0,0,0,0 +RISKS,0,0,2009,0,0,0,0 +RULINGS,0,0,0,2009,0,0,0 +SACRIFICED,2009,0,0,0,0,0,0 +SATISFACTION,0,2009,0,0,0,0,0 +SATISFIES,0,2009,0,0,0,0,0 +SCANDALS,2009,0,0,0,0,0,0 +SCRUTINIZING,2009,0,0,0,0,0,0 +SEIZE,2009,0,0,0,0,0,0 +SELDOM,0,0,2009,0,0,2009,0 +SEQUESTRATOR,0,0,0,2009,0,0,0 +SETBACK,2009,0,0,0,0,0,0 +SEVER,2009,0,0,0,0,0,0 +SEVERANCE,0,0,0,2009,0,0,0 +SEVERELY,2009,0,0,0,0,0,0 +ENTRENCH,0,0,0,0,0,0,2009 +ERODES,2009,0,0,0,0,0,0 +ERRATICALLY,2009,0,0,0,0,0,0 +ERRONEOUSLY,2009,0,0,0,0,0,0 +ESCALATE,2009,0,0,0,0,0,0 +ESCHEAT,0,0,0,2011,0,0,0 +ESCROWED,0,0,0,0,0,0,2009 +EVADE,2009,0,0,0,0,0,0 +EVASION,2009,0,0,0,0,0,0 +EVICTED,2009,0,0,0,0,0,0 +EVICTS,2009,0,0,0,0,0,0 +EXACERBATED,2009,0,0,0,0,0,0 +EXACERBATIONS,2009,0,0,0,0,0,0 +EXAGGERATING,2009,0,0,0,0,0,0 +EXCEEDENCES,0,0,0,2011,0,0,0 +EXCELS,0,2009,0,0,0,0,0 +EXCESSIVELY,2009,0,0,0,0,0,0 +EXCITING,0,2009,0,0,0,0,0 +EXCLUSIVES,0,2009,0,0,0,0,0 +EXCULPATES,2009,0,0,2009,0,0,0 +EXCULPATORY,2009,0,0,2009,0,0,0 +EXECUTRICES,0,0,0,2009,0,0,0 +EXONERATE,2009,0,0,0,0,0,0 +EXONERATION,2009,0,0,0,0,0,0 +EXPLOITATIONS,2009,0,0,0,0,0,0 +EXPLOITS,2009,0,0,0,0,0,0 +EXPOSING,2009,0,0,0,0,0,0 +EXPROPRIATED,2009,0,0,0,0,0,0 +EXPROPRIATIONS,2009,0,0,0,0,0,0 +EXTRACONTRACTUAL,0,0,0,2011,0,0,0 +SOLVENCIES,2009,0,0,0,0,0,0 +SOMETIME,0,0,2009,0,0,0,0 +SPAM,2014,0,0,0,0,0,0 +TRAUMATIC,2009,0,0,0,0,0,0 +LOSES,2009,0,0,0,0,0,0 +LOST,2009,0,0,0,0,0,0 +LYING,2009,0,0,0,0,0,0 +MALFUNCTIONED,2009,0,0,0,0,0,0 +MALICIOUS,2009,0,0,0,0,0,0 +MANDATE,0,0,0,0,0,0,2009 +MANDATORY,0,0,0,0,0,0,2009 +MANIPULATES,2009,0,0,0,0,0,0 +MANIPULATIVE,2009,0,0,0,0,0,0 +MAYBE,0,0,2009,0,0,2009,0 +MEDIATING,0,0,0,2009,0,0,0 +MEDIATORS,0,0,0,2009,0,0,0 +MISAPPLICATIONS,2009,0,0,0,0,0,0 +MISAPPLYING,2009,0,0,0,0,0,0 +MISAPPROPRIATING,2009,0,0,0,0,0,0 +MISCALCULATE,2009,0,0,0,0,0,0 +MISCALCULATION,2009,0,0,0,0,0,0 +MISCLASSIFICATION,2011,0,0,0,0,0,0 +MISCOMMUNICATION,2014,0,0,0,0,0,0 +MISDEMEANORS,2009,0,0,0,0,0,0 +MISHANDLED,2009,0,0,0,0,0,0 +MISINFORMATION,2009,0,0,0,0,0,0 +MISINTERPRET,2009,0,0,0,0,0,0 +MISINTERPRETING,2009,0,0,0,0,0,0 +MISJUDGES,2009,0,0,0,0,0,0 +MISLABEL,2009,0,0,0,0,0,0 +MISLABELS,2009,0,0,0,0,0,0 +MISLEADS,2009,0,0,0,0,0,0 +MISMANAGEMENT,2009,0,0,0,0,0,0 +MISMATCHED,2009,0,0,0,0,0,0 +MISPRICE,2014,0,0,0,0,0,0 +MISREPRESENTATION,2009,0,0,0,0,0,0 +MISREPRESENTS,2009,0,0,0,0,0,0 +WORRYING,2009,0,0,0,0,0,0 +WORSENING,2009,0,0,0,0,0,0 +WORTHY,0,2009,0,0,0,0,0 +TOLERATED,2009,0,0,0,0,0,0 +TORT,0,0,0,2009,0,0,0 +TORTUOUS,2009,0,0,0,0,0,0 +FIDE,0,0,0,2009,0,0,0 +FIRING,2009,0,0,0,0,0,0 +NONBREACHING,0,0,0,2011,0,0,0 +NONCOMPLIANCE,2009,0,0,0,0,0,0 +NONCONFORMING,2009,0,0,0,0,0,0 +NONCONTRACT,0,0,0,2012,0,0,0 +NONFEASANCE,0,0,0,2011,0,0,0 +NONFORFEITURE,0,0,0,2011,0,0,0 +DISCLAIMED,2009,0,0,0,0,0,0 +DISCLAIMS,2009,0,0,0,0,0,0 +DISCLOSING,2009,0,0,0,0,0,0 +DISCONTINUATIONS,2009,0,0,0,0,0,0 +DISCONTINUING,2009,0,0,0,0,0,0 +DISCOURAGING,2009,0,0,0,0,0,0 +DISCREDITS,2009,0,0,0,0,0,0 +SPECTACULARLY,0,2009,0,0,0,0,0 +SPECULATING,0,0,2009,0,0,0,0 +SPECULATIVELY,0,0,2009,0,0,0,0 +TRAGEDY,2009,0,0,0,0,0,0 +TRANSFERORS,0,0,0,2012,0,0,0 +LEGISLATING,0,0,0,2009,0,0,0 +LEGISLATIVELY,0,0,0,2009,0,0,0 +LEGISLATURES,0,0,0,2009,0,0,0 +LIBELS,0,0,0,2009,0,0,0 +CONCEALED,2009,0,0,0,0,0,0 +CONCEDES,2009,0,0,0,0,0,0 +CONCERN,2009,0,0,0,0,0,0 +CONCILIATION,2009,0,0,0,0,0,0 +CONDEMN,2009,0,0,0,0,0,0 +CONDEMNING,2009,0,0,0,0,0,0 +CONDITIONALLY,0,0,2009,0,0,0,0 +CONFESS,2009,0,0,0,0,0,0 +CONFESSION,2009,0,0,0,0,0,0 +CONFINEMENT,2009,0,0,0,0,0,2009 +CONFISCATE,2009,0,0,0,0,0,0 +CONFISCATION,2009,0,0,0,0,0,0 +CONFLICTED,2009,0,0,0,0,0,0 +CONFRONTATION,2009,0,0,0,0,0,0 +CONFRONTING,2009,0,0,0,0,0,0 +CONFUSES,2009,0,2009,0,0,0,0 +CONSENT,0,0,0,2009,0,0,0 +CONSERVATORSHIPS,0,0,0,2011,0,0,0 +CONSPIRATORIAL,2009,0,0,0,0,0,0 +CONSPIRES,2009,0,0,0,0,0,0 +CONSTITUTIONALITY,0,0,0,2009,0,0,0 +CONSTRAIN,0,0,0,0,0,0,2009 +CONSTRAINT,0,0,0,0,0,0,2009 +CONSTRUE,0,0,0,2012,0,0,0 +CONTEMPT,2009,0,0,0,0,0,0 +CONTENDS,2009,0,0,0,0,0,0 +CONTENTIOUSLY,2009,0,0,0,0,0,0 +CONTESTING,2009,0,0,0,0,0,0 +CONTINGENTLY,0,0,2009,0,0,0,0 +CONTRACTHOLDER,0,0,0,2009,0,0,0 +CONTRACTING,0,0,0,2009,0,0,0 +CONTRACTUAL,0,0,0,2009,0,0,0 +CONTRADICTING,2009,0,0,0,0,0,0 +CONTRADICTS,2009,0,0,0,0,0,0 +CONTRAVENES,0,0,0,2009,0,0,0 +CONTROVERSIAL,2009,0,0,0,0,0,0 +CONTROVERTED,0,0,0,2009,0,0,0 +CONVEYANCES,0,0,0,2009,0,0,0 +CONVICTION,2009,0,0,2009,0,0,0 +CORRECTION,2009,0,0,0,0,0,0 +CORRUPTED,2009,0,0,0,0,0,0 +CORRUPTLY,2009,0,0,0,0,0,0 +COULD,0,0,2009,0,0,2009,0 +COUNSELS,0,0,0,2009,0,0,0 +COUNTERCLAIMS,2009,0,0,0,0,0,0 +COUNTERFEITERS,2009,0,0,0,0,0,0 +COUNTERMEASURES,2009,0,0,0,0,0,0 +COUNTERSUITS,0,0,0,2014,0,0,0 +COURTS,0,0,0,2009,0,0,0 +COVENANTS,0,0,0,0,0,0,2011 +CREATIVITY,0,2009,0,0,0,0,0 +CRIMINALITY,0,0,0,2009,0,0,0 +CRIMINALS,2009,0,0,2009,0,0,0 +CRITICALLY,2009,0,0,0,0,0,0 +CRITICIZED,2009,0,0,0,0,0,0 +CROSSCLAIMS,0,0,0,2011,0,0,0 +CRUCIALLY,2009,0,0,0,0,0,0 +CUMBERSOME,2009,0,0,0,0,0,0 +CURTAILMENT,2009,0,0,0,0,0,0 +CUTBACK,2009,0,0,0,0,0,0 +CYBERBULLYING,2014,0,0,0,0,0,0 +CYBERCRIMINALS,2014,0,0,0,0,0,0 +TAINTED,2009,0,0,0,0,0,0 +TENANTABILITY,0,0,0,2011,0,0,0 +TENTATIVELY,0,0,2009,0,0,0,0 +TERMINATES,2009,0,0,0,0,0,0 +TERMINUS,0,0,0,-2020,0,0,0 +TESTIMONY,0,0,0,2009,0,0,0 +THEREAFTER,0,0,0,2009,0,0,0 +THEREINAFTER,0,0,0,2011,0,0,0 +THERETO,0,0,0,2009,0,0,0 +THEREUNTO,0,0,0,2009,0,0,0 +THREATEN,2009,0,0,0,0,0,0 +THREATS,2009,0,0,0,0,0,0 +FAIL,2009,0,0,0,0,0,0 +FAILS,2009,0,0,0,0,0,0 +FALSE,2009,0,0,0,0,0,0 +FALSIFIED,2009,0,0,0,0,0,0 +FALSITY,2009,0,0,0,0,0,0 +FATALLY,2009,0,0,0,0,0,0 +FAULTY,2009,0,0,0,0,0,0 +FAVORING,0,2009,0,0,0,0,0 +FEARS,2009,0,0,0,0,0,0 +DAMAGE,2009,0,0,0,0,0,0 +DAMPEN,2009,0,0,0,0,0,0 +DANGEROUSLY,2009,0,0,0,0,0,0 +DEADLOCKING,2009,0,0,0,0,0,0 +DEBARMENT,2009,0,0,0,0,0,0 +DECEDENT,0,0,0,2009,0,0,0 +DECEITFULNESS,2009,0,0,0,0,0,0 +DECEIVING,2009,0,0,0,0,0,0 +DECEPTIVELY,2009,0,0,0,0,0,0 +DECLINES,2009,0,0,0,0,0,0 +DECREEING,0,0,0,2009,0,0,0 +DEFACEMENT,2009,0,0,0,0,0,0 +DEFAMATIONS,2009,0,0,0,0,0,0 +DEFAMES,2009,0,0,0,0,0,0 +DEFAULTING,2009,0,0,0,0,0,0 +DEFEASE,0,0,0,2009,0,0,0 +DEFEASING,0,0,0,2011,0,0,0 +DEFEATS,2009,0,0,0,0,0,0 +DEFECTS,2009,0,0,0,0,0,0 +DEFENDANTS,2009,0,0,2009,0,0,0 +DEFENSIVE,2009,0,0,0,0,0,0 +DEFICIENCY,2009,0,0,0,0,0,0 +DEFINITELY,0,0,0,0,2009,0,0 +DEFRAUDING,2009,0,0,0,0,0,0 +DEGRADATIONS,2009,0,0,0,0,0,0 +DEGRADING,2009,0,0,0,0,0,0 +DELAYS,2009,0,0,0,0,0,0 +DELEGEES,0,0,0,2011,0,0,0 +DELIBERATELY,2009,0,0,0,0,0,0 +DELIGHTFULLY,0,2009,0,0,0,0,0 +DELINQUENCY,2009,0,0,0,0,0,0 +DELIST,2009,0,0,0,0,0,0 +DEMISE,2009,0,0,0,0,0,0 +DEMOLISH,2009,0,0,0,0,0,0 +DEMOLITION,2009,0,0,0,0,0,0 +DEMOTES,2009,0,0,0,0,0,0 +DEMURRED,0,0,0,2009,0,0,0 +DEMURS,0,0,0,2009,0,0,0 +DENIES,2009,0,0,0,0,0,0 +DENIGRATING,2009,0,0,0,0,0,0 +DEPEND,0,0,2009,0,0,2009,2011 +DEPENDANCES,0,0,0,0,0,0,2011 +DEPENDENCIES,0,0,2009,0,0,0,2011 +DEPENDS,0,0,2009,0,0,2009,2011 +DEPLETING,2009,0,0,0,0,0,0 +DEPOSED,0,0,0,2009,0,0,0 +DEPOSITIONAL,0,0,0,2011,0,0,0 +INVALIDATED,2009,0,0,0,0,0,0 +INVALIDITY,2009,0,0,0,0,0,0 +INVENTION,0,2009,0,0,0,0,0 +INVENTOR,0,2009,0,0,0,0,0 +INVESTIGATES,2009,0,0,0,0,0,0 +INVOLUNTARILY,2009,0,0,0,0,0,0 +IRRECOVERABLE,2009,0,0,0,0,0,0 +IRREGULARITY,2009,0,0,0,0,0,0 +IRREVERSIBLE,2009,0,0,0,0,0,0 +JEOPARDIZE,2009,0,0,0,0,0,0 +JUDICIALLY,0,0,0,2009,0,0,0 +JURIS,0,0,0,2011,0,0,0 +JURISDICTIONS,0,0,0,2009,0,0,0 +JUROR,0,0,0,2009,0,0,0 +JUSTICE,0,0,0,2009,0,0,0 +KICKBACKS,2009,0,0,0,0,0,0 +DIMINISHED,2009,0,0,0,0,0,0 +DIRECTIVE,0,0,0,0,0,0,2009 +DISADVANTAGEOUS,2009,0,0,0,0,0,0 +DISAFFIRMANCE,0,0,0,2009,0,0,0 +DISAGREEABLE,2009,0,0,0,0,0,0 +DISAGREEMENTS,2009,0,0,0,0,0,0 +DISALLOWANCES,2009,0,0,0,0,0,0 +DISAPPEAR,2009,0,0,0,0,0,0 +DISAPPEARING,2009,0,0,0,0,0,0 +DISAPPOINTING,2009,0,0,0,0,0,0 +DISAPPOINTS,2009,0,0,0,0,0,0 +DISAPPROVED,2009,0,0,0,0,0,0 +DISASSOCIATING,2009,0,0,0,0,0,0 +DISASTERS,2009,0,0,0,0,0,0 +DISAVOWAL,2009,0,0,0,0,0,0 +GRATUITOUSLY,2009,0,0,0,0,0,0 +GREATLY,0,2009,0,0,0,0,0 +GROSSLY,2009,0,0,0,0,0,0 +HALTED,2009,0,0,0,0,0,0 +HAMPERS,2009,0,0,0,0,0,0 +HAPPY,0,2009,0,0,0,0,0 +HARASSMENT,2009,0,0,0,0,0,0 +HARMED,2009,0,0,0,0,0,0 +HARMS,2009,0,0,0,0,0,0 +HARSHLY,2009,0,0,0,0,0,0 +HAZARDS,2009,0,0,0,0,0,0 +NONINFRINGING,0,0,0,2011,0,0,0 +NONPAYMENT,2009,0,0,0,0,0,0 +NONPERFORMING,2009,0,0,0,0,0,0 +DISFAVORS,2009,0,0,0,0,0,0 +PREAMENDMENT,0,0,0,2011,0,0,0 +COMPLICATED,2009,0,0,0,0,0,0 +COMPLICATIONS,2009,0,0,0,0,0,0 +COMPLIMENTING,0,2009,0,0,0,0,0 +MISSTATEMENTS,2009,0,0,0,0,0,0 +MISSTEPS,2009,0,0,0,0,0,0 +MISTAKES,2009,0,0,0,0,0,0 +MISUNDERSTAND,2009,0,0,0,0,0,0 +MISUSE,2009,0,0,0,0,0,0 +MONOPOLISTIC,2009,0,0,0,0,0,0 +MONOPOLIZED,2009,0,0,0,0,0,0 +MORATORIA,2009,0,0,0,0,0,0 +MOTHBALLED,2009,0,0,0,0,0,0 +MUTANDIS,0,0,0,2011,0,0,0 +SLIPPAGES,2009,0,0,0,0,0,0 +SLOWED,2009,0,0,0,0,0,0 +SLOWLY,2009,0,0,0,0,0,0 +SLUGGISHNESS,2009,0,0,0,0,0,0 +SMOOTHS,0,2009,0,0,0,0,0 +DEPRESSES,2009,0,0,0,0,0,0 +DEPRIVED,2009,0,0,0,0,0,0 +DERELICTION,2009,0,0,0,0,0,0 +DEROGATING,0,0,0,2009,0,0,0 +DESIGNATOR,0,0,0,2011,0,0,0 +DESPITE,0,2009,0,0,0,0,0 +DESTABILIZING,2009,0,2009,0,0,0,0 +DESTROYING,2009,0,0,0,0,0,0 +DETAIN,2009,0,0,0,0,0,0 +DETENTIONS,2009,0,0,0,0,0,0 +DETERIORATES,2009,0,0,0,0,0,0 +DETERRED,2009,0,0,0,0,0,0 +DETERRENTS,2009,0,0,0,0,0,0 +DETRACTED,2009,0,0,0,0,0,0 +DETRIMENTALLY,2009,0,0,0,0,0,0 +DEVALUES,2009,0,0,0,0,0,0 +DEVASTATING,2009,0,0,0,0,0,0 +DEVIATES,2009,0,2009,0,0,0,0 +DEVISEES,0,0,0,2011,0,0,0 +DEVOLVING,2009,0,0,0,0,0,0 +DICTATING,0,0,0,0,0,0,2009 +DIFFERS,0,0,2009,0,0,0,0 +DIFFICULTY,2009,0,0,0,0,0,0 +ASCENDANTS,0,0,0,2009,0,0,0 +ASSAULTS,2009,0,0,0,0,0,0 +ASSIGNATIONS,0,0,0,2009,0,0,0 +ASSUMES,0,0,2009,0,0,0,0 +ASSURE,0,2009,0,0,0,0,0 +ATTAIN,0,2009,0,0,0,0,0 +ATTAINMENTS,0,2009,0,0,0,0,0 +ATTESTATIONS,0,0,0,2009,0,0,0 +ATTORNEY,0,0,0,2009,0,0,0 +ATTRACTIVE,0,2009,0,0,0,0,0 +BACKDATING,2009,0,0,0,0,0,0 +BAILEE,0,0,0,2009,0,0,0 +BAILMENT,0,0,0,2011,0,0,0 +BANKRUPT,2009,0,0,0,0,0,0 +BANKRUPTING,2009,0,0,0,0,0,0 +CLAIMANTS,0,0,0,2009,0,0,0 +CLARIFICATION,0,0,2009,0,0,0,0 +CLEARLY,0,0,0,0,2009,0,0 +CLOSING,-2020,0,0,0,0,0,0 +CODEFENDANT,0,0,0,2011,0,0,0 +CODIFICATION,0,0,0,2009,0,0,0 +CODIFY,0,0,0,2009,0,0,0 +COERCES,2009,0,0,0,0,0,0 +COLLABORATED,0,2009,0,0,0,0,0 +COLLABORATIONS,0,2009,0,0,0,0,0 +COLLAPSE,2009,0,0,0,0,0,0 +COLLISION,2009,0,0,0,0,0,0 +COLLUDES,2009,0,0,0,0,0,0 +COLLUSIVE,2009,0,0,0,0,0,0 +POSITIVELY,0,2009,0,0,0,0,0 +POSSIBLE,0,0,2009,0,0,2009,0 +POSTCONTRACT,0,0,0,2011,0,0,0 +POSTPONEMENT,2009,0,0,0,0,0,0 +WRITEDOWN,2009,0,0,0,0,0,0 +WRITS,0,0,0,2009,0,0,0 +WRONGFUL,2009,0,0,0,0,0,0 +HONOR,0,2009,0,0,0,0,0 +HONORS,0,2009,0,0,0,0,0 +REARGUMENT,0,0,0,2011,0,0,0 +REASSESSING,0,0,2009,0,0,0,0 +REASSIGNED,2009,0,0,0,0,0,0 +REASSIGNS,2009,0,0,0,0,0,0 +REBUT,0,0,0,2009,0,0,0 +REBUTTAL,0,0,0,2009,0,0,0 +RECALCULATE,0,0,2009,0,0,0,0 +RECALCULATION,0,0,2009,0,0,0,0 +RECALLING,2009,0,0,0,0,0,0 +RECESSIONARY,2009,0,0,0,0,0,0 +RECKLESSNESS,2009,0,0,0,0,0,0 +RECONSIDERS,0,0,2009,0,0,0,0 +RECOUPMENTS,0,0,0,2009,0,0,0 +RECTIFICATIONS,0,0,0,2009,0,0,0 +RECUSES,0,0,0,2014,0,0,0 +REDACTING,2009,0,0,2009,0,0,0 +REDEFAULTED,2012,0,0,0,0,0,0 +REDRESSES,2009,0,0,0,0,0,0 +REEXAMINING,0,0,2009,0,0,0,0 +REFILE,0,0,0,2009,0,0,0 +REFRAIN,0,0,0,0,0,0,2009 +REFUSALS,2009,0,0,0,0,0,0 +REFUSING,2009,0,0,0,0,0,0 +REGULATE,0,0,0,2009,0,0,0 +REGULATION,0,0,0,2009,0,0,0 +REGULATORS,0,0,0,2009,0,0,0 +REHEARING,0,0,0,2009,0,0,0 +VARIABLY,0,0,2009,0,0,0,0 +VARIANTS,0,0,2009,0,0,0,0 +VARIES,0,0,2009,0,0,0,0 +VENDEES,0,0,0,2011,0,0,0 +VERSATILITY,0,2009,0,0,0,0,0 +VIBRANT,0,2009,0,0,0,0,0 +VIOLATES,2009,0,0,0,0,0,0 +VIOLATIVE,2009,0,0,2009,0,0,0 +VIOLENT,2009,0,0,0,0,0,0 +VITIATES,2009,0,0,0,0,0,0 +VOIDED,2009,0,0,2009,0,0,0 +VOLATILITY,2009,0,2009,0,0,0,0 +VULNERABLY,2009,0,0,0,0,0,0 +WARNINGS,2009,0,0,0,0,0,0 +WASTED,2009,0,0,0,0,0,0 +WEAKEN,2009,0,0,0,0,0,0 +WEAKER,2009,0,0,0,0,0,0 +WEAKNESSES,2009,0,0,0,0,0,0 +DISHONORABLE,2009,0,0,0,0,0,0 +DISHONORS,2009,0,0,0,0,0,0 +DISINTERESTEDLY,2009,0,0,0,0,0,0 +DISLOYALTY,2009,0,0,0,0,0,0 +DISMISSAL,2009,0,0,0,0,0,0 +DISMISSING,2009,0,0,0,0,0,0 +DISPARAGEMENT,2009,0,0,0,0,0,0 +DISPARAGINGLY,2009,0,0,0,0,0,0 +DISPLACED,2009,0,0,0,0,0,0 +DISPLACING,2009,0,0,0,0,0,0 +DISPOSSESSED,2009,0,0,0,0,0,0 +DISPOSSESSORY,0,0,0,2011,0,0,0 +DISPROPORTIONATELY,2009,0,0,0,0,0,0 +DISPUTING,2009,0,0,0,0,0,0 +DISQUALIFIES,2009,0,0,0,0,0,0 +DISREGARDED,2009,0,0,0,0,0,0 +DISREPUTE,2009,0,0,0,0,0,0 +DISRUPTION,2009,0,0,0,0,0,0 +DISSATISFACTION,2009,0,0,0,0,0,0 +DISSENTER,2009,0,0,0,0,0,0 +DISSIDENT,2009,0,0,0,0,0,0 +DISTINCTION,0,2009,0,0,0,0,0 +DISTINCTIVENESS,0,2009,0,0,0,0,0 +DISTORTION,2009,0,0,0,0,0,0 +DISTRACTED,2009,0,0,0,0,0,0 +DISTRACTS,2009,0,0,0,0,0,0 +DISTRIBUTEE,0,0,0,2009,0,0,0 +DISTURBANCES,2009,0,0,0,0,0,0 +DIVERSION,2009,0,0,0,0,0,0 +DIVERTS,2009,0,0,0,0,0,0 +DIVESTITURE,2009,0,0,0,0,0,0 +DIVESTS,2009,0,0,0,0,0,0 +DIVULGED,2009,0,0,0,0,0,0 +DOCKETED,0,0,0,2009,0,0,0 +DOUBT,2009,0,2009,0,0,0,0 +DOWNGRADE,2009,0,0,0,0,0,0 +DOWNSIZE,2009,0,0,0,0,0,0 +DOWNSIZINGS,2009,0,0,0,0,0,0 +DOWNTURNS,2009,0,0,0,0,0,0 +DRASTIC,2009,0,0,0,0,0,0 +DREAM,0,2009,0,0,0,0,0 +DULY,0,0,0,2009,0,0,0 +DYSFUNCTIONS,2009,0,0,0,0,0,0 +EARMARKS,0,0,0,0,0,0,2009 +EASY,0,2009,0,0,0,0,0 +EFFICIENT,0,2009,0,0,0,0,0 +EJECTMENT,0,0,0,2011,0,0,0 +EMBARGOING,2009,0,0,0,0,0,0 +EMBARRASSING,2009,0,0,0,0,0,0 +EMBEZZLED,2009,0,0,0,0,0,0 +EMBEZZLES,2009,0,0,0,0,0,0 +EMPOWERING,0,2009,0,0,0,0,0 +ENABLES,0,2009,0,0,0,0,0 +ENCOURAGES,0,2009,0,0,0,0,0 +ENCROACHES,2009,0,0,0,0,0,0 +ENCUMBER,2009,0,0,2009,0,0,2009 +ENCUMBRANCE,2009,0,0,2009,0,0,2009 +ENDANGER,2009,0,0,0,0,0,0 +ENDANGERS,2009,0,0,0,0,0,0 +ENFORCEABLY,0,0,0,2011,0,0,0 +ENHANCEMENTS,0,2009,0,0,0,0,0 +ENJOINED,2009,0,0,0,0,0,0 +ENJOYABLE,0,2009,0,0,0,0,0 +ENJOYMENT,0,2009,0,0,0,0,0 +ENTAILING,0,0,0,0,0,0,2009 +PASSU,0,0,0,2009,0,0,0 +PENALIZED,2009,0,0,0,0,0,0 +PENALTY,2009,0,0,0,0,0,0 +PERFECTLY,0,2009,0,0,0,0,0 +PERILS,2009,0,0,0,0,0,0 +PERMISSIONS,0,0,0,0,0,0,2009 +PERMITTING,0,0,0,0,0,0,2009 +PERPETRATING,2009,0,0,2009,0,0,0 +PERSISTENCE,2009,0,0,0,0,0,0 +PERSISTS,2009,0,0,0,0,0,0 +PERVASIVENESS,2009,0,0,0,0,0,0 +PETITIONERS,0,0,0,2009,0,0,0 +PICKET,2009,0,0,0,0,0,0 +HEREBY,0,0,0,2009,0,0,0 +HEREFROM,0,0,0,2009,0,0,0 +HEREINBEFORE,0,0,0,2009,0,0,0 +HERETO,0,0,0,2009,0,0,0 +HEREUPON,0,0,0,2009,0,0,0 +HIGHEST,0,2009,0,0,2009,0,0 +HINDERS,2009,0,0,0,0,0,0 +WHATEVER,0,0,0,2009,0,0,0 +WHEREAS,0,0,0,2009,0,0,0 +WHEREIN,0,0,0,2009,0,0,0 +WHEREUNDER,0,0,0,2011,0,0,0 +WHOMEVER,0,0,0,2009,0,0,0 +WILL,0,0,0,0,2009,0,0 +WIN,0,2009,0,0,0,0,0 +WITNESS,0,0,0,2009,0,0,0 +FLUCTUATED,0,0,2009,0,0,0,0 +FLUCTUATIONS,0,0,2009,0,0,0,0 +FORBEARANCES,0,0,0,2009,0,0,0 +FORBIDDEN,2009,0,0,0,0,0,2009 +FORCED,2009,0,0,0,0,0,0 +FOREBEARS,0,0,0,2009,0,0,0 +FORECLOSING,2009,0,0,0,0,0,0 +FOREGOES,2009,0,0,0,0,0,0 +FORESTALLING,2009,0,0,0,0,0,0 +FORFEITABLE,0,0,0,2009,0,0,0 +FORFEITURE,2009,0,0,0,0,0,0 +FORTHWITH,0,0,0,2009,0,0,0 +FRAUDULENCE,2009,0,0,0,0,0,0 +FRIVOLOUS,2009,0,0,0,0,0,0 +FRUSTRATES,2009,0,0,0,0,0,0 +FRUSTRATIONS,2009,0,0,0,0,0,0 +GAIN,0,2009,0,0,0,0,0 +GOOD,0,2009,0,0,0,0,0 +DISGORGES,2009,0,0,0,0,0,0 +DISGRACEFULLY,2009,0,0,0,0,0,0 +LITIGATED,2009,0,0,2009,0,0,0 +LITIGATIONS,2009,0,0,2009,0,0,0 +LITIGIOUSNESS,0,0,0,2009,0,0,0 +LACKING,2009,0,0,0,0,0,0 +LAGGED,2009,0,0,0,0,0,0 +LAPSED,2009,0,0,0,0,0,0 +LAUNDERING,2009,0,0,0,0,0,0 +LAWFULNESS,0,0,0,2009,0,0,0 +LAWSUIT,0,0,0,2009,0,0,0 +LAYOFF,2009,0,0,0,0,0,0 +LEGAL,0,0,0,2009,0,0,0 +LEGALIZATIONS,0,0,0,2009,0,0,0 +LEGALIZING,0,0,0,2009,0,0,0 +LEGATEES,0,0,0,2009,0,0,0 +FLAWS,2009,0,0,0,0,0,0 +NONRENEWAL,2009,0,0,0,0,0,0 +LIQUIDATING,2009,0,0,0,0,0,0 +LIQUIDATORS,2009,0,0,0,0,0,0 +BENEFICIAL,0,-2020,0,2020,0,0,0 +BENEFIT,0,-2020,0,0,0,0,0 +BENEFITTING,0,2009,0,0,0,0,0 +POORLY,2009,0,0,0,0,0,0 +REINTERPRETATIONS,0,0,2009,0,0,0,0 +REJECT,2009,0,0,0,0,0,0 +REJECTIONS,2009,0,0,0,0,0,0 +RELINQUISHED,2009,0,0,0,0,0,0 +RELINQUISHMENTS,2009,0,0,0,0,0,0 +REMANDED,0,0,0,2009,0,0,0 +REMEDIATED,0,0,0,2009,0,0,0 +REMEDIED,0,0,0,2009,0,0,0 +RENEGOTIATES,2009,0,0,0,0,0,0 +RENOUNCE,2009,0,0,0,0,0,0 +RENOUNCES,2009,0,0,0,0,0,0 +REPLEDGED,0,0,0,2012,0,0,0 +REPOSSESSING,2009,0,0,0,0,0,0 +TROUBLES,2009,0,0,0,0,0,0 +UNACCEPTABLE,2009,0,0,0,0,0,0 +UNANNOUNCED,2009,0,0,0,0,0,0 +UNAPPROVED,2009,0,0,0,0,0,0 +UNAVAILABLE,2009,0,0,0,0,0,2011 +UNCERTAIN,0,0,2009,0,0,2009,0 +UNCLEAR,0,0,2009,0,0,0,0 +UNCOLLECTIBLE,2009,0,0,0,0,0,0 +UNCOMPROMISING,0,0,0,0,2009,0,0 +UNCONSTITUTIONAL,0,0,0,2009,0,0,0 +UNCONTROLLABLE,2009,0,0,0,0,0,0 +UNCOVER,2009,0,0,0,0,0,0 +UNDECIDED,0,0,2009,0,0,0,0 +UNDELIVERED,2009,0,0,0,0,0,0 +UNDERCUTTING,2009,0,0,0,0,0,0 +UNDERESTIMATING,2009,0,0,0,0,0,0 +UNDERMINE,2009,0,0,0,0,0,0 +UNDERPAID,2009,0,0,0,0,0,0 +UNDERPERFORM,2011,0,0,0,0,0,0 +UNDERPERFORMS,2014,0,0,0,0,0,0 +UNDERSTATE,2009,0,0,0,0,0,0 +UNDERSTATES,2009,0,0,0,0,0,0 +UNDESIGNATED,0,0,2009,0,0,0,0 +UNDETECTED,2009,0,0,0,0,0,0 +UNDISCLOSED,2009,0,0,0,0,0,0 +UNDUE,2009,0,0,0,0,0,0 +UNECONOMICALLY,2009,0,0,0,0,0,0 +UNENCUMBERED,0,0,0,2009,0,0,0 +UNEQUIVOCALLY,0,0,0,0,2009,0,0 +UNEXPECTED,2009,0,2009,0,0,0,0 +UNFAMILIAR,0,0,2009,0,0,0,0 +UNFAVORABLY,2009,0,0,0,0,0,0 +UNFITNESS,2009,0,0,0,0,0,0 +UNFORSEEN,2011,0,2011,0,0,0,0 +UNFRIENDLY,2009,0,0,0,0,0,0 +UNHEDGED,0,0,2009,0,0,0,0 +UNINTENDED,2009,0,0,0,0,0,0 +UNJUSTIFIABLE,2009,0,0,0,0,0,0 +UNKNOWING,2009,0,0,0,0,0,0 +UNLAWFUL,2009,0,0,2009,0,0,0 +UNLIQUIDATED,2009,0,0,0,0,0,0 +UNMERITORIOUS,2014,0,0,0,0,0,0 +UNOBSERVABLE,0,0,2009,0,0,0,0 +UNPARALLELED,0,2009,0,0,2009,0,0 +UNPREDICTABILITY,2009,0,2009,0,0,0,0 +UNPRODUCTIVE,2009,0,0,0,0,0,0 +UNPROVEN,0,0,2009,0,0,0,0 +UNREALISTIC,2009,0,0,0,0,0,0 +UNRECEPTIVE,2014,0,0,0,0,0,0 +UNREIMBURSED,2009,0,0,0,0,0,0 +UNREPORTED,2009,0,0,0,0,0,0 +UNSALABLE,2009,0,0,0,0,0,0 +UNSAVORY,2009,0,0,0,0,0,0 +UNSELLABLE,2014,0,0,0,0,0,0 +UNSPECIFIC,0,0,2009,0,0,0,0 +UNSTAYED,0,0,0,2009,0,0,0 +UNSUITABILITY,2009,0,0,0,0,0,0 +UNSURE,2009,0,0,0,0,0,0 +UNSUSTAINABLE,2009,0,0,0,0,0,0 +UNTO,0,0,0,2009,0,0,0 +UNTRUTHFULLY,2009,0,0,0,0,0,0 +UNUSUAL,0,0,2009,0,0,0,0 +UNWELCOME,2009,0,0,0,0,0,0 +UPSET,2009,0,0,0,0,0,0 +URGENT,2009,0,0,0,0,0,0 +USURPED,2009,0,0,2009,0,0,0 +VAGARIES,0,0,2009,0,0,0,0 +VAGUENESSES,0,0,2012,0,0,0,0 +VANDALISM,2009,0,0,0,0,0,0 +PLAINTIFF,2009,0,0,2009,0,0,0 +PLEADED,2009,0,0,0,0,0,0 +PLEAS,2009,0,0,2009,0,0,0 +PLEASURE,0,2009,0,0,0,0,0 +PLEDGEE,0,0,0,2009,0,0,0 +PLEDGOR,0,0,0,2009,0,0,0 +COMPELLED,0,0,0,0,0,0,2009 +COMPLAIN,2009,0,0,0,0,0,0 +COMPLAINING,2009,0,0,0,0,0,0 +COMMITMENTS,0,0,0,0,0,0,2009 +LIMITATIONS,2009,0,0,0,0,0,0 +RESTRAINS,0,0,0,0,0,0,2009 +RESTRICTED,0,0,0,0,0,0,2009 +RESTRICTIVE,0,0,0,0,0,0,2009 +RESTRUCTURE,2009,0,0,0,0,0,0 +RESTRUCTURINGS,2009,0,0,0,0,0,0 +RETALIATING,2009,0,0,0,0,0,0 +RETENDERING,0,0,0,2011,0,0,0 +PRECIPITATED,2009,0,0,0,0,0,0 +PRECLUDED,2009,0,0,0,0,0,2009 +PRECONDITIONS,0,0,0,0,0,0,2009 +PREDECEASES,0,0,0,2009,0,0,0 +PREDICTED,0,0,2009,0,0,0,0 +PREDICTIVE,0,0,2009,0,0,0,0 +PREEMINENCE,0,2009,0,0,0,0,0 +PREJUDICED,2009,0,0,2009,0,0,0 +PRELIMINARILY,0,0,2009,0,0,0,0 +PREMIER,0,2009,0,0,0,0,0 +PRESSING,2009,0,0,0,0,0,0 +PRESUME,0,0,2009,0,0,0,0 +PRESUMPTION,0,0,2009,0,0,0,0 +PREVENT,0,0,0,0,0,0,2009 +PREVENTS,2009,0,0,0,0,0,2009 +PROACTIVELY,0,2009,0,0,0,0,0 +PROBABLE,0,0,2009,0,0,0,0 +PROBATES,0,0,0,2009,0,0,0 +PROBATIONARY,0,0,0,2009,0,0,0 +PROBLEM,2009,0,0,0,0,0,0 +PROFICIENCY,0,2009,0,0,0,0,0 +PROFITABLE,0,2009,0,0,0,0,0 +PROGRESSES,0,2009,0,0,0,0,0 +PROHIBITING,0,0,0,0,0,0,2009 +PROHIBITIVELY,0,0,0,0,0,0,2009 +PROLONGATION,2009,0,0,0,0,0,0 +PROLONGS,2009,0,0,0,0,0,0 +PROMULGATING,0,0,0,2009,0,0,0 +PROMULGATORS,0,0,0,2009,0,0,0 +PROSECUTE,2009,0,0,2009,0,0,0 +PROSECUTION,2009,0,0,2009,0,0,0 +PROSECUTORS,0,0,0,2009,0,0,0 +PROSPEROUS,0,2009,0,0,0,0,0 +PROTESTER,2009,0,0,0,0,0,0 +PROTESTORS,2009,0,0,0,0,0,0 +PROVISO,0,0,0,2009,0,0,0 +PROVOKED,2009,0,0,0,0,0,0 +PUNISHED,2009,0,0,0,0,0,0 +PUNISHMENTS,2009,0,0,0,0,0,0 +PURPORTEDLY,2009,0,0,0,0,0,0 +QUESTIONABLE,2009,0,0,0,0,0,0 +QUESTIONS,2009,0,0,0,0,0,0 +QUITTING,2009,0,0,0,0,0,0 +RANDOMIZE,0,0,2009,0,0,0,0 +RANDOMLY,0,0,2009,0,0,0,0 +RATABLY,0,0,0,2009,0,0,0 +RATIONALIZED,2009,0,0,0,0,0,0 +ABANDONING,2009,0,0,0,0,0,0 +ABDICATED,2009,0,0,0,0,0,0 +ABDICATIONS,2009,0,0,0,0,0,0 +ABERRATIONS,2009,0,0,0,0,0,0 +ABIDE,0,0,0,0,0,0,2009 +ABNORMALITIES,2009,0,0,0,0,0,0 +ABOLISHED,2009,0,0,0,0,0,0 +ABROGATE,2009,0,0,2009,0,0,0 +ABROGATION,2009,0,0,2009,0,0,0 +ABRUPTNESS,2009,0,0,0,0,0,0 +ABSOLVE,0,0,0,2009,0,0,0 +ABUNDANCE,0,2009,0,0,0,0,0 +ABUSES,2009,0,0,0,0,0,0 +ABUSIVENESS,2009,0,0,0,0,0,0 +ACCIDENTAL,2009,0,0,0,0,0,0 +ACCOMPLISH,0,2009,0,0,0,0,0 +ACCOMPLISHMENT,0,2009,0,0,0,0,0 +ACCUSE,2009,0,0,0,0,0,0 +ACHIEVE,0,2009,0,0,0,0,0 +ACHIEVES,0,2009,0,0,0,0,0 +ACQUIESCES,2009,0,0,0,0,0,0 +ACQUIT,2009,0,0,2009,0,0,0 +ACQUITTANCE,0,0,0,2009,0,0,0 +ADDENDUMS,0,0,0,2011,0,0,0 +ADJOURNING,0,0,0,2009,0,0,0 +ADJUDGE,0,0,0,2009,0,0,0 +ADJUDICATE,0,0,0,2009,0,0,0 +ADJUDICATION,0,0,0,2009,0,0,0 +ADJUDICATORS,0,0,0,2009,0,0,0 +ADMISSIBLY,0,0,0,2009,0,0,0 +ADULTERATED,2009,0,0,0,0,0,0 +ADVANCEMENT,0,2009,0,0,0,0,0 +ADVANTAGE,0,2009,0,0,0,0,0 +ADVANTAGES,0,2009,0,0,0,0,0 +ADVERSE,2009,0,0,0,0,0,0 +AFFIDAVIT,0,0,0,2009,0,0,0 +AFOREDESCRIBED,0,0,0,2011,0,0,0 +AFTERMATH,2009,0,0,0,0,0,0 +AGGRAVATED,2009,0,0,0,0,0,0 +AGGRAVATIONS,2009,0,0,0,0,0,0 +ALIENATE,2009,0,0,0,0,0,0 +ALIENATION,2009,0,0,0,0,0,0 +ALLEGE,2009,0,0,2009,0,0,0 +ALLEGING,2009,0,0,2009,0,0,0 +ALTERATION,0,0,2009,0,0,0,0 +AMBIGUITY,0,0,2009,0,0,0,0 +AMENDATORY,0,0,0,2009,0,0,0 +AMENDMENTS,0,0,0,2009,0,0,0 +ANNOYANCES,2009,0,0,0,0,0,0 +ANNUL,2009,0,0,0,0,0,0 +ANNULMENTS,2009,0,0,0,0,0,0 +ANOMALOUSLY,2009,0,2009,0,0,0,0 +ANTICIPATE,0,0,2009,0,0,0,0 +ANTICIPATION,0,0,2009,0,0,0,0 +ANTITRUST,2009,0,0,2009,0,0,0 +APPEAL,0,0,0,2009,0,0,0 +APPEALS,0,0,0,2009,0,0,0 +APPEARS,0,0,2009,0,0,2009,0 +APPELLEES,0,0,0,2011,0,0,0 +APPROXIMATELY,0,0,2009,0,0,0,0 +APPROXIMATIONS,0,0,2009,0,0,0,0 +ARBITRABILITY,0,0,0,2011,0,0,0 +ARBITRARY,0,0,2009,0,0,0,0 +ARBITRATING,0,0,0,2009,0,0,0 +ARBITRATIVE,0,0,0,2011,0,0,0 +ARGUED,2009,0,0,0,0,0,0 +ARGUMENTS,2009,0,0,0,0,0,0 +ARREST,2009,0,0,0,0,0,0 +RETRIBUTIONS,2009,0,0,0,0,0,0 +BONA,0,0,0,2009,0,0,0 +BOOST,0,2009,0,0,0,0,0 +BOUND,0,0,0,0,0,0,2011 +BOYCOTTING,2009,0,0,0,0,0,0 +BREACHES,2009,0,0,2009,0,0,0 +BREAKAGES,2009,0,0,0,0,0,0 +BREAKS,2009,0,0,0,0,0,0 +BRIBED,2009,0,0,0,0,0,0 +BRIBING,2009,0,0,0,0,0,0 +BURDEN,2009,0,0,0,0,0,0 +BURDENSOME,2009,0,0,0,0,0,0 +CALAMITY,2009,0,0,0,0,0,0 +CANCELLATION,2009,0,0,0,0,0,0 +CANCELS,2009,0,0,0,0,0,0 +CATASTROPHICALLY,2009,0,0,0,0,0,0 +CAUTIONING,2009,0,0,0,0,0,0 +CAUTIOUSNESS,0,0,2009,0,0,0,0 +CEASING,2009,0,0,0,0,0,0 +CENSURED,2009,0,0,0,0,0,0 +CESSION,0,0,0,2009,0,0,0 +CHALLENGING,2009,0,0,0,0,0,0 +CHATTELS,0,0,0,2009,0,0,0 +CIRCUMVENTING,2009,0,0,0,0,0,0 +SHARPLY,2009,0,0,0,0,0,0 +SHORTFALL,2009,0,0,0,0,0,0 +SHUT,2009,0,0,0,0,0,0 +SHUTTING,2009,0,0,0,0,0,0 +SLANDERS,2009,0,0,0,0,0,0 +REPUDIATE,2009,0,0,0,0,0,0 +REPUDIATION,2009,0,0,0,0,0,0 +REQUIRE,0,0,0,0,0,0,2009 +REQUIRES,0,0,0,0,0,0,2009 +RESCINDED,0,0,0,2009,0,0,0 +RESCISSIONS,0,0,0,2009,0,0,0 +RESIGNED,2009,0,0,0,0,0,0 +RESTATE,2009,0,0,0,0,0,0 +RESTATES,2009,0,0,0,0,0,0 +NONTERMINABLE,0,0,0,2011,0,0,0 +NOTARIZATION,0,0,0,2009,0,0,0 +NOTARIZING,0,0,0,2009,0,0,0 +NUISANCE,2009,0,0,0,0,0,0 +NULLIFIED,2009,0,0,2009,0,0,0 +NULLITIES,0,0,0,2009,0,0,0 +OBJECTION,2009,0,0,0,0,0,0 +OBLIGATE,0,0,0,0,0,0,2009 +OBLIGATION,0,0,0,0,0,0,2009 +OBLIGED,0,0,0,0,0,0,2009 +OBLIGOR,0,0,0,2009,0,0,0 +OBSOLESCENCE,2009,0,0,0,0,0,0 +OBSTRUCT,2009,0,0,0,0,0,0 +OBSTRUCTIONS,2009,0,0,0,0,0,0 +OFFEND,2009,0,0,0,0,0,0 +OFFENDING,2009,0,0,0,0,0,0 +OFFEREES,0,0,0,2011,0,0,0 +OMISSIONS,2009,0,0,0,0,0,0 +OMITTING,2009,0,0,0,0,0,0 +OPPORTUNITIES,0,2009,0,0,0,0,0 +OPPOSES,2009,0,0,0,0,0,0 +OPTIMISTIC,0,2009,0,0,0,0,0 +OUTAGE,2009,0,0,0,0,0,0 +OUTPERFORM,0,2009,0,0,0,0,0 +OVERAGE,2009,0,0,0,0,0,0 +OVERBUILDS,2009,0,0,0,0,0,0 +OVERBURDENING,2009,0,0,0,0,0,0 +OVERCHARGED,2009,0,0,0,0,0,0 +OVERCOMES,2009,0,0,0,0,0,0 +OVERESTIMATED,2009,0,0,0,0,0,0 +OVERESTIMATIONS,2009,0,0,0,0,0,0 +OVERLOADS,2009,0,0,0,0,0,0 +OVERLOOKS,2009,0,0,0,0,0,0 +OVERPRODUCED,2009,0,0,0,0,0,0 +OVERRULE,0,0,0,2009,0,0,0 +OVERRUN,2009,0,0,0,0,0,0 +OVERSHADOWED,2009,0,0,0,0,0,0 +OVERSTATED,2009,0,0,0,0,0,0 +OVERSTATING,2009,0,0,0,0,0,0 +OVERSUPPLYING,2009,0,0,0,0,0,0 +OVERTURNING,2009,0,0,0,0,0,0 +OVERVALUING,2009,0,0,0,0,0,0 +PARI,0,0,0,2009,0,0,0 +NECESSITATES,0,0,0,0,0,0,2009 +NEGATIVES,2009,0,0,0,0,0,0 +NEGLECTING,2009,0,0,0,0,0,0 +NEGLIGENT,2009,0,0,0,0,0,0 +BARRED,2009,0,0,0,0,0,0 +BEAUTIFULLY,0,2009,0,0,0,0,0 +BELIEVING,0,0,2009,0,0,0,0 +IDLE,2009,0,0,0,0,0,0 +IGNORED,2009,0,0,0,0,0,0 +ILLEGAL,2009,0,0,0,0,0,0 +ILLEGIBLE,2009,0,0,0,0,0,0 +ILLIQUIDITY,2009,0,0,0,0,0,0 +IMMATURE,2009,0,0,0,0,0,0 +IMPAIRING,2009,0,0,0,0,0,2011 +IMPASSE,2009,0,0,0,0,0,0 +IMPEDES,2009,0,0,0,0,0,0 +IMPENDING,2009,0,0,0,0,0,0 +IMPERIL,2009,0,0,0,0,0,0 +IMPLICATED,2009,0,0,0,0,0,0 +IMPOSED,0,0,0,0,0,0,2009 +IMPOSITIONS,0,0,0,0,0,0,2009 +IMPOUNDED,2009,0,0,0,0,0,0 +IMPRACTICAL,2009,0,0,0,0,0,0 +IMPRECISION,0,0,2009,0,0,0,0 +IMPRESSES,0,2009,0,0,0,0,0 +IMPRISONMENT,2009,0,0,0,0,0,0 +IMPROPERLY,2009,0,0,0,0,0,0 +IMPROVED,0,2009,0,0,0,0,0 +IMPROVING,0,2009,0,0,0,0,0 +INACCESSIBLE,2009,0,0,0,0,0,0 +INACCURATELY,2009,0,0,0,0,0,0 +INACTIVATED,2009,0,0,0,0,0,0 +INACTIVATIONS,2009,0,0,0,0,0,0 +INADEQUATE,2009,0,0,0,0,0,0 +INADVISABILITY,2009,0,0,0,0,0,0 +INASMUCH,0,0,0,2009,0,0,0 +INCAPACITY,2009,0,0,2009,0,0,0 +INCARCERATING,2009,0,0,2009,0,0,0 +INCIDENCE,2009,0,0,0,0,0,0 +INCOMPATIBILITIES,2009,0,0,0,0,0,0 +INCOMPETENCY,2009,0,0,0,0,0,0 +INCOMPLETE,2009,0,0,0,0,0,0 +INCONSISTENCIES,2009,0,0,0,0,0,0 +INCONTESTABILITY,0,0,0,2009,0,0,0 +INCONVENIENT,2009,0,0,0,0,0,0 +INCREDIBLE,0,2009,0,0,0,0,0 +INDECENT,2009,0,0,0,0,0,0 +INDEFINITELY,0,0,2009,0,0,0,0 +INDEMNIFICATIONS,0,0,0,2009,0,0,0 +INDEMNIFYING,0,0,0,2009,0,0,0 +INDEMNITOR,0,0,0,2009,0,0,0 +INDETERMINATE,0,0,2009,0,0,0,0 +INDICTING,2009,0,0,2009,0,0,0 +INEFFECTIVE,2009,0,0,0,0,0,0 +INEFFICIENCY,2009,0,0,0,0,0,0 +INELIGIBLE,2009,0,0,0,0,0,0 +INEQUITY,2009,0,0,0,0,0,0 +INEXPERIENCE,2009,0,0,0,0,0,0 +INFLUENTIAL,0,2009,0,0,0,0,0 +INFRACTIONS,2009,0,0,2009,0,0,0 +INFRINGEMENTS,2009,0,0,0,0,0,0 +INGENUITY,0,2009,0,0,0,0,0 +INHIBITS,0,0,0,0,0,0,2011 +INJUNCTIVE,0,0,0,2009,0,0,0 +INJURIES,2009,0,0,0,0,0,0 +INNOVATE,0,2009,0,0,0,0,0 +INNOVATION,0,2009,0,0,0,0,0 +INNOVATOR,0,2009,0,0,0,0,0 +INQUIRY,2009,0,0,0,0,0,0 +INSIST,0,0,0,0,0,0,2009 +INSISTS,0,0,0,0,0,0,2009 +INSOLVENT,2009,0,0,0,0,0,0 +INSTABILITY,2009,0,2009,0,0,0,0 +INSUFFICIENTLY,2009,0,0,0,0,0,0 +INTANGIBLES,0,0,2009,0,0,0,0 +INTERFERED,2009,0,0,0,0,0,0 +INTERFERING,2009,0,0,0,0,0,0 +INTERPLEADER,0,0,0,2009,0,0,0 +INTERPOSING,0,0,0,2009,0,0,0 +INTERROGATED,0,0,0,2009,0,0,0 +INTERROGATIONS,0,0,0,2009,0,0,0 +INTERROGATORY,0,0,0,2009,0,0,0 +INTERRUPTION,2009,0,0,0,0,0,0 +INTESTATE,0,0,0,2009,0,0,0 +SPORADIC,0,0,2009,0,0,0,0 +STABILIZATIONS,0,2009,0,0,0,0,0 +STABILIZING,0,2009,0,0,0,0,0 +STAGNATE,2009,0,0,0,0,0,0 +STAGNATION,2009,0,0,0,0,0,0 +STATUTES,0,0,0,2009,0,0,0 +STIPULATED,0,0,0,0,0,0,2009 +STIPULATIONS,0,0,0,0,0,0,2009 +STOPPED,2009,0,0,0,0,0,0 +STRAINED,2009,0,0,0,0,0,0 +STRENGTHEN,0,2009,0,0,0,0,0 +STRENGTHS,0,2009,0,0,0,0,0 +STRESSFUL,2009,0,0,0,0,0,0 +STRICTEST,0,0,0,0,0,0,2009 +STRONGER,0,2009,0,0,0,0,0 +SUBCLAUSES,0,0,0,2009,0,0,0 +SUBJECTION,2009,0,0,0,0,0,0 +SUBLICENSEE,0,0,0,2009,0,0,0 +SUBPOENA,2009,0,0,2009,0,0,0 +SUBROGATION,0,0,0,2009,0,0,0 +SUCCEED,0,2009,0,0,0,0,0 +SUCCESS,0,2009,0,0,0,0,0 +SUDDEN,0,0,2009,0,0,0,0 +SUES,2009,0,0,2009,0,0,0 +SUFFERS,2009,0,0,0,0,0,0 +SUGGESTS,0,0,2009,0,0,2009,0 +SUMMONS,2009,0,0,2009,0,0,0 +SUPERSEDEAS,0,0,0,2011,0,0,0 +SURETIES,0,0,0,2009,0,0,0 +SURPASSES,0,2009,0,0,0,0,0 +SUSPECT,2009,0,0,0,0,0,0 +SUSPENDED,2009,0,0,0,0,0,0 +SUSPENSIONS,2009,0,0,0,0,0,0 +SUSPICIOUSLY,2009,0,0,0,0,0,0 +REVISE,0,0,2009,0,0,0,0 +REVOCATIONS,2009,0,0,2009,0,0,0 +REVOKING,2009,0,0,0,0,0,0 +REVOLUTIONIZING,0,2009,0,0,0,0,0 +REWARDS,0,-2020,0,0,0,0,0 +RIDICULING,2009,0,0,0,0,0,0 +RISKIEST,2009,0,2009,0,0,0,0 +RISKY,2009,0,2009,0,0,0,0 +RUMORS,0,0,2009,0,0,0,0 +SACRIFICES,2009,0,0,0,0,0,0 +SATISFACTORILY,0,2009,0,0,0,0,0 +SATISFY,0,2009,0,0,0,0,0 +SCRUTINIZE,2009,0,0,0,0,0,0 +SCRUTINY,2009,0,0,0,0,0,0 +SEIZED,2009,0,0,0,0,0,0 +SELDOMLY,0,0,2009,0,0,2009,0 +SERIOUS,2009,0,0,0,0,0,0 +SETBACKS,2009,0,0,0,0,0,0 +SEVERABILITY,0,0,0,2009,0,0,0 +SEVERANCES,0,0,0,2009,0,0,0 +SEVERITIES,2009,0,0,0,0,0,0 +ENTHUSIASM,0,2009,0,0,0,0,0 +ENTRENCHED,0,0,0,0,0,0,2009 +ERODING,2009,0,0,0,0,0,0 +ERRED,2009,0,0,0,0,0,0 +ERROR,2009,0,0,0,0,0,0 +ESCALATED,2009,0,0,0,0,0,0 +ESCHEATED,0,0,0,2011,0,0,0 +ESCROWING,0,0,0,2011,0,0,0 +EVADED,2009,0,0,0,0,0,0 +EVASIONS,2009,0,0,0,0,0,0 +EVICTING,2009,0,0,0,0,0,0 +EVIDENTIAL,0,0,0,2011,0,0,0 +EXACERBATES,2009,0,0,0,0,0,0 +EXAGGERATE,2009,0,0,0,0,0,0 +EXAGGERATION,2009,0,0,0,0,0,0 +EXCELLENCE,0,2009,0,0,0,0,0 +EXCEPTIONAL,0,2009,0,0,0,0,0 +EXCISED,0,0,0,2009,0,0,0 +EXCLUSIVE,0,2009,0,0,0,0,0 +EXCLUSIVITY,0,2009,0,0,0,0,0 +EXCULPATING,2009,0,0,2009,0,0,0 +EXECUTOR,0,0,0,2009,0,0,0 +EXECUTRIX,0,0,0,2009,0,0,0 +EXONERATED,2009,0,0,0,0,0,0 +EXONERATIONS,2009,0,0,0,0,0,0 +EXPLOITATIVE,2009,0,0,0,0,0,0 +EXPOSE,2009,0,0,0,0,0,0 +EXPOSURE,0,0,2009,0,0,0,0 +EXPROPRIATES,2009,0,0,0,0,0,0 +EXPULSION,2009,0,0,0,0,0,0 +EXTRACORPOREAL,0,0,0,2011,0,0,0 +SOLVENCY,2009,0,0,0,0,0,0 +SOMETIMES,0,0,2009,0,0,2009,0 +SPAMMERS,2014,0,0,0,0,0,0 +TREMENDOUS,0,2009,0,0,0,0,0 +LOCKOUT,2009,0,0,0,0,0,0 +LOSING,2009,0,0,0,0,0,0 +LOWEST,0,0,0,0,2009,0,0 +MAJEURE,0,0,0,2011,0,0,0 +MALFUNCTIONING,2009,0,0,0,0,0,0 +MALICIOUSLY,2009,0,0,0,0,0,0 +MANDATED,0,0,0,0,0,0,2009 +MANDITORILY,0,0,0,0,0,0,2011 +MANIPULATING,2009,0,0,0,0,0,0 +MARKDOWN,2009,0,0,0,0,0,0 +MEDIATE,0,0,0,2009,0,0,0 +MEDIATION,0,0,0,2009,0,0,0 +MERITORIOUS,0,2009,0,0,0,0,0 +MISAPPLIED,2009,0,0,0,0,0,0 +MISAPPROPRIATE,2009,0,0,0,0,0,0 +MISAPPROPRIATION,2009,0,0,0,0,0,0 +MISCALCULATED,2009,0,0,0,0,0,0 +MISCALCULATIONS,2009,0,0,0,0,0,0 +MISCLASSIFICATIONS,2014,0,0,0,0,0,0 +MISCONDUCT,2009,0,0,0,0,0,0 +MISDIRECTED,2009,0,0,0,0,0,0 +MISHANDLES,2009,0,0,0,0,0,0 +MISINFORMED,2009,0,0,0,0,0,0 +MISINTERPRETATION,2009,0,0,0,0,0,0 +MISINTERPRETS,2009,0,0,0,0,0,0 +MISJUDGING,2009,0,0,0,0,0,0 +MISLABELED,2009,0,0,0,0,0,0 +MISLEAD,2009,0,0,0,0,0,0 +MISLED,2009,0,0,0,0,0,0 +MISMANAGES,2009,0,0,0,0,0,0 +MISMATCHES,2009,0,0,0,0,0,0 +MISPRICING,2014,0,0,0,0,0,0 +MISREPRESENTATIONS,2009,0,0,0,0,0,0 +MISS,2009,0,0,0,0,0,0 +WORSE,2009,0,0,0,0,0,0 +WORSENS,2009,0,0,0,0,0,0 +TOLERATES,2009,0,0,0,0,0,0 +TORTIOUS,0,0,0,2009,0,0,0 +TORTUOUSLY,2009,0,0,0,0,0,0 +FINED,2009,0,0,0,0,0,0 +NONAPPEALABLE,0,0,0,2009,0,0,0 +NONCANCELABLE,0,0,0,0,0,0,2009 +NONCOMPLIANCES,2009,0,0,0,0,0,0 +NONCONFORMITIES,2009,0,0,0,0,0,0 +NONCONTRACTUAL,0,0,0,2011,0,0,0 +NONFIDUCIARY,0,0,0,2011,0,0,0 +NONFUNCTIONAL,2009,0,0,0,0,0,0 +DISCLAIMER,2009,0,0,0,0,0,0 +DISCLOSE,2009,0,0,0,0,0,0 +DISCONTINUANCE,2009,0,0,0,0,0,0 +DISCONTINUE,2009,0,0,0,0,0,0 +DISCOURAGE,2009,0,0,0,0,0,0 +DISCREDIT,2009,0,0,0,0,0,0 +DISCREPANCIES,2009,0,0,0,0,0,0 +SPECULATE,0,0,2009,0,0,0,0 +SPECULATION,0,0,2009,0,0,0,0 +TRAGIC,2009,0,0,0,0,0,0 +TRANSPARENCY,0,2009,0,0,0,0,0 +LEGISLATE,0,0,0,2009,0,0,0 +LEGISLATION,0,0,0,2009,0,0,0 +LEGISLATOR,0,0,0,2009,0,0,0 +LIBEL,0,0,0,2009,0,0,0 +LICENSABLE,0,0,0,2011,0,0,0 +CONCEALING,2009,0,0,0,0,0,0 +CONCEDING,2009,0,0,0,0,0,0 +CONCERNED,2009,0,0,0,0,0,0 +CONCILIATIONS,2009,0,0,0,0,0,0 +CONDEMNATION,2009,0,0,0,0,0,0 +CONDEMNOR,0,0,0,2011,0,0,0 +CONDONE,2009,0,0,0,0,0,0 +CONFESSED,2009,0,0,0,0,0,0 +CONFIDENT,0,2009,0,0,0,0,0 +CONFINEMENTS,2009,0,0,0,0,0,0 +CONFISCATED,2009,0,0,0,0,0,0 +CONFISCATIONS,2009,0,0,0,0,0,0 +CONFLICTING,2009,0,0,0,0,0,0 +CONFRONTATIONAL,2009,0,0,0,0,0,0 +CONFRONTS,2009,0,0,0,0,0,0 +CONFUSING,2009,0,2009,0,0,0,0 +CONSENTED,0,0,0,2009,0,0,0 +CONSPIRACIES,2009,0,0,0,0,0,0 +CONSPIRATORS,2009,0,0,0,0,0,0 +CONSPIRING,2009,0,0,0,0,0,0 +CONSTITUTIONALLY,0,0,0,2009,0,0,0 +CONSTRAINED,0,0,0,0,0,0,2009 +CONSTRAINTS,0,0,0,0,0,0,2009 +CONSTRUED,0,0,0,2012,0,0,0 +CONTEND,2009,0,0,0,0,0,0 +CONTENTION,2009,0,0,0,0,0,0 +CONTESTABILITY,0,0,0,2014,0,0,0 +CONTINGENCIES,0,0,2009,0,0,0,0 +CONTINGENTS,0,0,2009,0,0,0,0 +CONTRACTHOLDERS,0,0,0,2009,0,0,0 +CONTRACTION,2009,0,0,0,0,0,0 +CONTRACTUALLY,0,0,0,2009,0,0,0 +CONTRADICTION,2009,0,0,0,0,0,0 +CONTRARY,2009,0,0,0,0,0,0 +CONTRAVENING,0,0,0,2009,0,0,0 +CONTROVERSIES,2009,0,0,0,0,0,0 +CONTROVERTING,0,0,0,2009,0,0,0 +CONVICT,2009,0,0,2009,0,0,0 +CONVICTIONS,2009,0,0,2009,0,0,0 +CORRECTIONS,2009,0,0,0,0,0,0 +CORRUPTING,2009,0,0,0,0,0,0 +CORRUPTNESS,2009,0,0,0,0,0,0 +COUNSEL,0,0,0,2009,0,0,0 +COUNTERCLAIM,2009,0,0,0,0,0,0 +COUNTERFEIT,2009,0,0,0,0,0,0 +COUNTERFEITING,2009,0,0,0,0,0,0 +COUNTERSIGNOR,0,0,0,2011,0,0,0 +COURT,0,0,0,2009,0,0,0 +COVENANT,0,0,0,0,0,0,2011 +CREATIVE,0,2009,0,0,0,0,0 +CRIME,2009,0,0,2009,0,0,0 +CRIMINALIZE,0,0,0,2014,0,0,0 +CRISES,2009,0,0,0,0,0,0 +CRITICISM,2009,0,0,0,0,0,0 +CRITICIZES,2009,0,0,0,0,0,0 +CROSSROAD,0,0,2009,0,0,0,0 +CULPABILITY,2009,0,0,0,0,0,0 +CURTAIL,2009,0,0,0,0,0,0 +CURTAILMENTS,2009,0,0,0,0,0,0 +CUTBACKS,2009,0,0,0,0,0,0 +CYBERCRIME,2014,0,0,0,0,0,0 +TAINTING,2009,0,0,0,0,0,0 +TENDING,0,0,2009,0,0,0,0 +TERMINABLE,0,0,0,2009,0,0,0 +TERMINATING,2009,0,0,0,0,0,0 +TESTAMENTARY,0,0,0,2009,0,0,0 +THENCE,0,0,0,2009,0,0,0 +THEREAT,0,0,0,2009,0,0,0 +THEREOF,0,0,0,2009,0,0,0 +THERETOFOR,0,0,0,2011,0,0,0 +THEREUPON,0,0,0,2009,0,0,0 +THREATENED,2009,0,0,0,0,0,0 +FAILED,2009,0,0,0,0,0,0 +FAILURE,2009,0,0,0,0,0,0 +FALSELY,2009,0,0,0,0,0,0 +FALSIFIES,2009,0,0,0,0,0,0 +FANTASTIC,0,2009,0,0,0,0,0 +FAULT,2009,0,0,0,0,0,0 +FAVORABLE,0,2009,0,0,0,0,0 +FAVORITE,0,2009,0,0,0,0,0 +FELONIES,2009,0,0,2009,0,0,0 +DAMAGED,2009,0,0,0,0,0,0 +DAMPENED,2009,0,0,0,0,0,0 +DANGERS,2009,0,0,0,0,0,0 +DEADLOCKS,2009,0,0,0,0,0,0 +DEBARMENTS,2009,0,0,0,0,0,0 +DECEDENTS,0,0,0,2009,0,0,0 +DECEIVE,2009,0,0,0,0,0,0 +DECEPTION,2009,0,0,0,0,0,0 +DECLARANT,0,0,0,2011,0,0,0 +DECLINING,2009,0,0,0,0,0,0 +DECREES,0,0,0,2009,0,0,0 +DEFALCATION,0,0,0,2009,0,0,0 +DEFAMATORY,2009,0,0,0,0,0,0 +DEFAMING,2009,0,0,0,0,0,0 +DEFAULTS,2009,0,0,0,0,0,0 +DEFEASED,0,0,0,2009,0,0,0 +DEFEAT,2009,0,0,0,0,0,0 +DEFECT,2009,0,0,0,0,0,0 +DEFEND,2009,0,0,0,0,0,0 +DEFENDED,2009,0,0,0,0,0,0 +DEFER,2009,0,0,0,0,0,0 +DEFICIENT,2009,0,0,0,0,0,0 +DEFINITIVELY,0,0,0,0,2009,0,0 +DEFRAUDS,2009,0,0,0,0,0,0 +DEGRADE,2009,0,0,0,0,0,0 +DELAY,2009,0,0,0,0,0,0 +DELEGABLE,0,0,0,2009,0,0,0 +DELETERIOUS,2009,0,0,0,0,0,0 +DELIGHT,0,2009,0,0,0,0,0 +DELIGHTING,0,2009,0,0,0,0,0 +DELINQUENT,2009,0,0,0,0,0,0 +DELISTED,2009,0,0,0,0,0,0 +DEMISED,2009,0,0,0,0,0,0 +DEMOLISHED,2009,0,0,0,0,0,0 +DEMOLITIONS,2009,0,0,0,0,0,0 +DEMOTING,2009,0,0,0,0,0,0 +DEMURRER,0,0,0,2009,0,0,0 +DENIAL,2009,0,0,0,0,0,0 +DENIGRATE,2009,0,0,0,0,0,0 +DENIGRATION,2009,0,0,0,0,0,0 +DEPENDABILITY,0,2009,0,0,0,0,0 +DEPENDANT,0,0,0,0,0,0,2011 +DEPENDENCY,0,0,2009,0,0,0,0 +DEPLETE,2009,0,0,0,0,0,0 +DEPLETION,2009,0,0,0,0,0,0 +DEPOSES,0,0,0,2009,0,0,0 +DEPOSITIONS,0,0,0,2009,0,0,0 +INTRUSION,2009,0,0,0,0,0,0 +INVALIDATES,2009,0,0,0,0,0,0 +INVENT,0,2009,0,0,0,0,0 +INVENTIONS,0,2009,0,0,0,0,0 +INVENTORS,0,2009,0,0,0,0,0 +INVESTIGATING,2009,0,0,0,0,0,0 +INVOLUNTARY,2009,0,0,0,0,0,0 +IRRECOVERABLY,2009,0,0,0,0,0,0 +IRREGULARLY,2009,0,0,0,0,0,0 +IRREVOCABILITY,0,0,0,2011,0,0,0 +JEOPARDIZED,2009,0,0,0,0,0,0 +JUDICIARIES,0,0,0,2009,0,0,0 +JURISDICTION,0,0,0,2009,0,0,0 +JURISPRUDENCE,0,0,0,2009,0,0,0 +JURORS,0,0,0,2009,0,0,0 +JUSTICES,0,0,0,2009,0,0,0 +KNOWINGLY,2009,0,0,0,0,0,0 +DILIGENT,0,2009,0,0,0,0,0 +DIMINISHES,2009,0,0,0,0,0,0 +DIRECTIVES,0,0,0,0,0,0,2009 +DISADVANTAGES,2009,0,0,0,0,0,0 +DISAFFIRMED,0,0,0,2011,0,0,0 +DISAGREED,2009,0,0,0,0,0,0 +DISAGREES,2009,0,0,0,0,0,0 +DISALLOWED,2009,0,0,0,0,0,0 +DISAPPEARANCE,2009,0,0,0,0,0,0 +DISAPPEARS,2009,0,0,0,0,0,0 +DISAPPOINTINGLY,2009,0,0,0,0,0,0 +DISAPPROVAL,2009,0,0,0,0,0,0 +DISAPPROVES,2009,0,0,0,0,0,0 +DISASSOCIATION,2009,0,0,0,0,0,0 +DISASTROUS,2009,0,0,0,0,0,0 +DISAVOWED,2009,0,0,0,0,0,0 +GREAT,0,-2020,0,0,0,0,0 +GREATNESS,0,2009,0,0,0,0,0 +GROUNDLESS,2009,0,0,0,0,0,0 +HAMPER,2009,0,0,0,0,0,0 +HAPPIEST,0,2009,0,0,0,0,0 +HARASS,2009,0,0,0,0,0,0 +HARDSHIP,2009,0,0,0,0,0,0 +HARMFUL,2009,0,0,0,0,0,0 +HARSH,2009,0,0,0,0,0,0 +HARSHNESS,2009,0,0,0,0,0,0 +NONJUDICIAL,0,0,0,2009,0,0,0 +NONPAYMENTS,2009,0,0,0,0,0,0 \ No newline at end of file diff --git a/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/go-solution/main.go b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/go-solution/main.go new file mode 100644 index 000000000000..0765b87574d2 --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/go-solution/main.go @@ -0,0 +1,171 @@ +/* + * 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. + */ + +// beam-playground: +// name: FinalSolution2 +// description: Final challenge solution 2. +// multifile: true +// files: +// - name: analysis.csv +// context_line: 54 +// categories: +// - Quickstart +// complexity: ADVANCED +// tags: +// - hellobeam + +package main + +import ( + "context" + "fmt" + "github.com/apache/beam/sdks/v2/go/pkg/beam" + "github.com/apache/beam/sdks/v2/go/pkg/beam/io/textio" + "github.com/apache/beam/sdks/v2/go/pkg/beam/log" + "github.com/apache/beam/sdks/v2/go/pkg/beam/transforms/filter" + "github.com/apache/beam/sdks/v2/go/pkg/beam/transforms/stats" + "github.com/apache/beam/sdks/v2/go/pkg/beam/x/beamx" + "github.com/apache/beam/sdks/v2/go/pkg/beam/x/debug" + "strings" +) + +type Analysis struct { + Word string + Negative string + Positive string + Uncertainty string + Litigious string + Strong string + Weak string + Constraining string +} + +func (a Analysis) toString() string { + return fmt.Sprintf("Word: %s, Negative: %s, Positive: %s, Uncertainty: %s, Litigious: %s, Strong: %s, Weak: %s, Constraining: %s", + a.Word, a.Negative, a.Positive, a.Uncertainty, a.Litigious, a.Strong, a.Weak, a.Constraining) +} + +func main() { + + ctx := context.Background() + + beam.Init() + + p := beam.NewPipeline() + s := p.Root() + + shakespeare := textio.Read(s, "gs://apache-beam-samples/shakespeare/kinglear.txt") + shakespeareWords := getWords(s, shakespeare) + analysis := textio.Read(s, "analysis.csv") + analysisRecords := parseAnalysis(s, analysis) + + result := matchWords(s, shakespeareWords, analysisRecords) + + parts := partition(s, result) + + negativeWords := parts[0] + positiveWords := parts[1] + + negativeWordsCount := extractCountFn("negative", s, negativeWords) + positiveWordsCount := extractCountFn("positive", s, positiveWords) + debug.Print(s, negativeWordsCount) + debug.Print(s, positiveWordsCount) + + negativeWordsCountWithModel := extractModelCountFn("negative-with-model", s, negativeWords) + positiveWordsCountWithModel := extractModelCountFn("positive-with-model", s, positiveWords) + debug.Print(s, negativeWordsCountWithModel) + debug.Print(s, positiveWordsCountWithModel) + + err := beamx.Run(ctx, p) + + if err != nil { + log.Exitf(context.Background(), "Failed to execute job: %v", err) + } +} + +func parseAnalysis(s beam.Scope, input beam.PCollection) beam.PCollection { + return beam.ParDo(s, func(line string, emit func(analysis Analysis)) { + parts := strings.Split(line, ",") + if parts[1] != "Negative" { + emit(Analysis{ + Word: strings.ToLower(parts[0]), + Negative: parts[1], + Positive: parts[2], + Uncertainty: parts[3], + Litigious: parts[4], + Strong: parts[5], + Weak: parts[6], + Constraining: parts[7], + }) + } + }, input) +} + +func getWords(s beam.Scope, input beam.PCollection) beam.PCollection { + return beam.ParDo(s, func(line string, emit func(string)) { + c := strings.Split(strings.ToLower(line), " ") + for _, word := range c { + emit(word) + } + }, input) +} + +func matchWords(s beam.Scope, input beam.PCollection, viewPCollection beam.PCollection) beam.PCollection { + view := beam.SideInput{ + Input: viewPCollection, + } + return beam.ParDo(s, matchFn, input, view) +} + +func matchFn(word string, view func(analysis *Analysis) bool, emit func(Analysis)) { + var newAnalysis Analysis + for view(&newAnalysis) { + if word == newAnalysis.Word { + emit(newAnalysis) + } + } +} + +func partition(s beam.Scope, input beam.PCollection) []beam.PCollection { + return beam.Partition(s, 3, func(analysis Analysis) int { + if analysis.Negative != "0" { + return 0 + } + if analysis.Positive != "0" { + return 1 + } + return 2 + }, input) +} + +func extractCountFn(prefix string, s beam.Scope, input beam.PCollection) beam.PCollection { + col := beam.ParDo(s, func(analysis Analysis, emit func(string2 string)) { + emit(prefix) + }, input) + return stats.Count(s, col) +} + +func extractModelCountFn(prefix string, s beam.Scope, input beam.PCollection) beam.PCollection { + col := filter.Include(s, input, func(analysis Analysis) bool { + return analysis.Strong != "0" || analysis.Weak != "0" + }) + result := beam.ParDo(s, func(analysis Analysis, emit func(string2 string)) { + emit(prefix) + }, col) + return stats.Count(s, result) +} diff --git a/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/hint1.md b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/hint1.md new file mode 100644 index 000000000000..e95938f45123 --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/hint1.md @@ -0,0 +1,182 @@ + +{{if (eq .Sdk "go")}} +1. Process the file with the analyzed words to return a `PCollection` with `Analysis` objects. + + Write own DoFn `func parseAnalysis(s beam.Scope, input beam.PCollection) beam.PCollection { + return beam.ParDo(s, func(line string, emit func(analysis Analysis)) { + parts := strings.Split(line, ",") + if parts[0] != "Word" { + emit(Analysis{ + Word: strings.ToLower(parts[0]), + Negative: parts[1], + Positive: parts[2], + Uncertainty: parts[3], + Litigious: parts[4], + Strong: parts[5], + Weak: parts[6], + Constraining: parts[7], + }) + } + }, input) + }` +2. Add a fixed-window that runs for 30 seconds. And add a trigger that works after the first element with a delay of 5 seconds. + + Window and trigger: `trigger := trigger.AfterEndOfWindow().EarlyFiring(trigger.AfterProcessingTime(). + PlusDelay(5 * time.Second)). + LateFiring(trigger.Repeat(trigger.AfterCount(1))) + fixedWindowedItems := beam.WindowInto(s, window.NewFixedWindows(30*time.Second), shakespeareWords, + beam.Trigger(trigger), + beam.AllowedLateness(30*time.Second), + beam.PanesDiscard(), + ) + ` + +3. Write your own function that works with `side-input`. Its logic should check whether the words from shakespeare are contained in the list of analyzed words + + Function: `func matchWords(s beam.Scope, input beam.PCollection, viewPCollection beam.PCollection) beam.PCollection { + view := beam.SideInput{ + Input: viewPCollection, + } + return beam.ParDo(s, matchFn, input, view) + } + func matchFn(word string, view func(analysis *Analysis) bool, emit func(analysis Analysis)) { + var newAnalysis Analysis + for view(&newAnalysis) { + if word == newAnalysis.Word { + emit(newAnalysis) + } + } + }` +4. Divide the words into portions in the first **positive** words. In the **second** negative. And all the others in the third. + + Partition:`func partition(s beam.Scope, input beam.PCollection) []beam.PCollection { + return beam.Partition(s, 3, func(analysis Analysis) int { + if analysis.Negative != "0" { + return 0 + } + if analysis.Positive != "0" { + return 1 + } + return 2 + }, input) + } + ` +5. To calculate the count with windows, use `ParDo` with `stats.Count(s, col)`. + + Apply the transformation: `func extractCountFn(prefix string, s beam.Scope, input beam.PCollection) beam.PCollection { + col := beam.ParDo(s, func(analysis Analysis, emit func(string2 string)) { + emit(prefix) + }, input) + return stats.Count(s, col) + }` + +6. To identify words with amplifying effects, you need to add a filter. + + Function: `func extractModelCountFn(prefix string, s beam.Scope, input beam.PCollection) beam.PCollection { + col := filter.Include(s, input, func(analysis Analysis) bool { + return analysis.Strong != "0" || analysis.Weak != "0" + }) + result := beam.ParDo(s, func(analysis Analysis, emit func(string2 string)) { + emit(prefix) + }, col) + return stats.Count(s, result) + }` +{{end}} + +{{if (eq .Sdk "java")}} +1. Change `getAnalysisPCollection` so that it returns a `PCollection` with `Row` objects. + + Write own DoFn `static class SentimentAnalysisExtractFn extends DoFn { + @ProcessElement + public void processElement(ProcessContext c) { + String[] items = c.element().split(","); + if (!items[1].equals("Negative")) { + c.output(Row.withSchema(schema) + .addValues(items[0].toLowerCase(), items[1], items[2], items[3], items[4], items[5], items[6], items[7]) + .build()); + } + } + }` +2. To use the analyzed words in the `side-input`, turn to `.apply(View.asList())` +3. Add a fixed-window that runs for 30 seconds `Window.into(Fixed Windows.of(Duration.standard Seconds(30)))`. And add a trigger that works after the first element with a delay of 5 seconds `AfterProcessingTime.pastFirstElementInPane().plusDelayOf(Duration.standardSeconds(5))` +4. Write your own function that works with `side-input`. Its logic should check whether the words from shakespeare are contained in the list of analyzed words + + Function: `static PCollection getAnalysis(PCollection pCollection, PCollectionView> viewAnalysisPCollection) { + return pCollection.apply(ParDo.of(new DoFn() { + @ProcessElement + public void processElement(@Element String word, OutputReceiver out, ProcessContext context) { + List analysisPCollection = context.sideInput(viewAnalysisPCollection); + analysisPCollection.forEach(it -> { + if (it.getString("word").equals(word)) { + out.output(it); + } + }); + } + }).withSideInputs(viewAnalysisPCollection)).setCoder(RowCoder.of(schema)); + }` +5. Divide the words into portions in the first **positive** words. In the **second** negative. And all the others in the third. + + Partition:`static PCollectionList getPartitions(PCollection input) { + return input + .apply(Partition.of(3, + (Partition.PartitionFn) (analysis, numPartitions) -> { + if (!analysis.getString("positive").equals("0")) { + return 0; + } + if (!analysis.getString("negative").equals("0")) { + return 1; + } + return 2; + })); + }` +6. To calculate the count with windows, use `Combine.globally` with `withoutDefaults()`. Apply the transformation `.apply(Combine.globally(Count.combineFn()).withoutDefaults())` + +7. To identify words with amplifying effects, you need to add a filter `.apply(Filter.by(it -> !it.getString("strong").equals("0") || !it.getString("weak").equals("0")))` +{{end}} +{{if (eq .Sdk "python")}} +1. Process the file with the analyzed words to return a `PCollection` with `Analysis` objects. + + Write own DoFn `class ExtractAnalysis(beam.DoFn): + def process(self, element): + items = re.split(r',(?=(?:[^"]*"[^"]*")*[^"]*$)', element) + if items[1] != 'Negative': + yield Analysis(items[0].lower(), items[1], items[2], items[3], items[4], items[5], items[6], items[7]) + ` +2. Add a fixed-window that runs for 30 seconds. And add a trigger that works after the first element with a delay of 5 seconds. + + Window and trigger: `windowed_words = (shakespeare + | 'Window' >> beam.WindowInto(window.FixedWindows(30), trigger=trigger.AfterWatermark( + early=trigger.AfterProcessingTime(5).has_ontime_pane(), late=trigger.AfterAll()), allowed_lateness=30, + accumulation_mode=trigger.AccumulationMode.DISCARDING))` +3. To use the analyzed words in the `side-input`, turn to `windowed_words | beam.ParDo(MatchWordDoFn(), beam.pvalue.AsList(analysis))` +4. Write your own function that works with `side-input`. Its logic should check whether the words from shakespeare are contained in the list of analyzed words + + Function: `class MatchWordDoFn(beam.DoFn): + def process(self, element, analysis): + for a in analysis: + if a.word == element: + yield a` +5. Divide the words into portions in the first **positive** words. In the **second** negative. And all the others in the third. + Partition: `class Partition(beam.PTransform):def expand(self, pcoll):return pcoll | beam.Partition(self._analysis_partition_fn, 3) + @staticmethod + def _analysis_partition_fn(analysis, num_partitions): + if analysis.positive != "0": + return 0 + elif analysis.negative != "0": + return 1 + else:return 2 + ` +6. To calculate the count with windows, use `beam.CombineGlobally` with `withoutDefaults()`. Apply the transformation `beam.CombineGlobally(CountCombineFn()).without_defaults()` + +7. To identify words with amplifying effects, you need to add a filter `beam.Filter(lambda analysis: analysis.strong != '0' or analysis.weak != '0')` +{{end}} \ No newline at end of file diff --git a/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/java-challenge/Task.java b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/java-challenge/Task.java new file mode 100644 index 000000000000..99eab35d359f --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/java-challenge/Task.java @@ -0,0 +1,107 @@ +/* + * 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. + */ + +// beam-playground: +// name: FinalChallenge2 +// description: Final challenge 2. +// multifile: true +// files: +// - name: analysis.csv +// context_line: 50 +// categories: +// - Quickstart +// complexity: ADVANCED +// tags: +// - hellobeam + +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.io.TextIO; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +import org.apache.beam.sdk.schemas.Schema; +import org.apache.beam.sdk.transforms.DoFn; +import org.apache.beam.sdk.transforms.Filter; +import org.apache.beam.sdk.transforms.FlatMapElements; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.TypeDescriptors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; + +public class Task { + private static final Logger LOG = LoggerFactory.getLogger(Task.class); + private static final Integer WINDOW_TIME = 30; + private static final Integer TIME_OUTPUT_AFTER_FIRST_ELEMENT = 5; + private static final Integer ALLOWED_LATENESS_TIME = 1; + + private static final Schema schema = Schema.builder() + .addField("word", Schema.FieldType.STRING) + .addField("negative", Schema.FieldType.STRING) + .addField("positive", Schema.FieldType.STRING) + .addField("uncertainty", Schema.FieldType.STRING) + .addField("litigious", Schema.FieldType.STRING) + .addField("strong", Schema.FieldType.STRING) + .addField("weak", Schema.FieldType.STRING) + .addField("constraining", Schema.FieldType.STRING) + .build(); + + + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.fromArgs(args).withValidation().create(); + runChallenge(options); + } + + static void runChallenge(PipelineOptions options) { + Pipeline pipeline = Pipeline.create(options); + + PCollection shakespeare = getPCollection(pipeline); + + pipeline.run(); + } + + public static PCollection getPCollection(Pipeline pipeline) { + PCollection rides = pipeline.apply(TextIO.read().from("gs://apache-beam-samples/shakespeare/kinglear.txt")); + return rides.apply(FlatMapElements.into(TypeDescriptors.strings()).via(line -> Arrays.asList(line.toLowerCase().split(" ")))) + .apply(Filter.by((String word) -> !word.isEmpty())); + } + + public static PCollection getAnalysisPCollection(Pipeline pipeline) { + PCollection words = pipeline.apply(TextIO.read().from("analysis.csv")); + return words; + } + + static class LogOutput extends DoFn { + + private final String prefix; + + LogOutput() { + this.prefix = "Processing element"; + } + + LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) { + LOG.info(prefix + ": " + c.element()); + c.output(c.element()); + } + } +} diff --git a/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/java-challenge/analysis.csv b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/java-challenge/analysis.csv new file mode 100644 index 000000000000..5c4a1246021e --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/java-challenge/analysis.csv @@ -0,0 +1,3877 @@ +Word,Negative,Positive,Uncertainty,Litigious,Strong_Modal,Weak_Modal,Constraining +NONSEVERABLE,0,0,0,2011,0,0,0 +DISFAVOR,2009,0,0,0,0,0,0 +DISGORGE,2009,0,0,0,0,0,0 +COMPLICATES,2009,0,0,0,0,0,0 +COMPLIMENT,0,2009,0,0,0,0,0 +COMPLIMENTS,0,2009,0,0,0,0,0 +MISSTATE,2009,0,0,0,0,0,0 +MISSTATES,2009,0,0,0,0,0,0 +MISTAKE,2009,0,0,0,0,0,0 +MISTAKING,2009,0,0,0,0,0,0 +MISUNDERSTANDING,2009,0,0,0,0,0,0 +MISUSED,2009,0,0,0,0,0,0 +MONOPOLISTS,2009,0,0,0,0,0,0 +MONOPOLIZES,2009,0,0,0,0,0,0 +MORATORIUM,2009,0,0,0,0,0,0 +MOTHBALLING,2009,0,0,0,0,0,0 +SLOW,2009,0,0,0,0,0,0 +SLOWER,2009,0,0,0,0,0,0 +SLOWNESS,2009,0,0,0,0,0,0 +SMOOTH,0,2009,0,0,0,0,0 +DEPRECATION,2009,0,0,0,0,0,0 +DEPRESSING,2009,0,0,0,0,0,0 +DEPRIVES,2009,0,0,0,0,0,0 +DEROGATE,0,0,0,2009,0,0,0 +DEROGATION,0,0,0,2009,0,0,0 +DESIRABLE,0,2009,0,0,0,0,0 +DESTABILIZATION,2009,0,0,0,0,0,0 +DESTINED,0,2009,0,0,0,0,0 +DESTROYS,2009,0,0,0,0,0,0 +DETAINED,2009,0,0,0,0,0,0 +DETER,2009,0,0,0,0,0,0 +DETERIORATING,2009,0,0,0,0,0,0 +DETERRENCE,2009,0,0,0,0,0,0 +DETERRING,2009,0,0,0,0,0,0 +DETRACTING,2009,0,0,0,0,0,0 +DETRIMENTS,2009,0,0,0,0,0,0 +DEVALUING,2009,0,0,0,0,0,0 +DEVASTATION,2009,0,0,0,0,0,0 +DEVIATING,2009,0,2009,0,0,0,0 +DEVOLVE,2009,0,0,0,0,0,0 +DICTATE,0,0,0,0,0,0,2009 +DIFFER,0,0,2009,0,0,0,0 +DIFFICULT,2009,0,0,0,0,0,0 +ASSAULT,2009,0,0,0,0,0,0 +ASSERTABLE,0,0,0,2011,0,0,0 +ASSUMABLE,0,0,0,2009,0,0,0 +ASSUMING,0,0,2009,0,0,0,0 +ASSURED,0,2009,0,0,0,0,0 +ATTAINED,0,2009,0,0,0,0,0 +ATTAINS,0,2009,0,0,0,0,0 +ATTESTED,0,0,0,2009,0,0,0 +ATTORNEYS,0,0,0,2009,0,0,0 +ATTRACTIVENESS,0,2009,0,0,0,0,0 +BAD,2009,0,0,0,0,0,0 +BAILEES,0,0,0,2011,0,0,0 +BAILOUT,2009,0,0,0,0,0,0 +BANKRUPTCIES,2009,0,0,0,0,0,0 +BANKRUPTS,2009,0,0,0,0,0,0 +CLAIM,0,0,0,2009,0,0,0 +CLAIMHOLDER,0,0,0,2014,0,0,0 +CLARIFICATIONS,0,0,2009,0,0,0,0 +CLOSED,-2020,0,0,0,0,0,0 +CLOSINGS,2009,0,0,0,0,0,0 +CODEFENDANTS,0,0,0,2011,0,0,0 +CODIFICATIONS,0,0,0,2009,0,0,0 +CODIFYING,0,0,0,2009,0,0,0 +COERCING,2009,0,0,0,0,0,0 +COLLABORATES,0,2009,0,0,0,0,0 +COLLABORATIVE,0,2009,0,0,0,0,0 +COLLAPSED,2009,0,0,0,0,0,0 +COLLISIONS,2009,0,0,0,0,0,0 +COLLUDING,2009,0,0,0,0,0,0 +POSES,2009,0,0,0,0,0,0 +POSSESSORY,0,0,0,2009,0,0,0 +POSSIBLY,0,0,2009,0,0,2009,0 +POSTJUDGMENT,0,0,0,2011,0,0,0 +POSTPONEMENTS,2009,0,0,0,0,0,0 +WRITEDOWNS,2009,0,0,0,0,0,0 +WRONG,2009,0,0,0,0,0,0 +WRONGFULLY,2009,0,0,0,0,0,0 +HONORABLE,0,-2020,0,0,0,0,0 +HOSTILE,2009,0,0,0,0,0,0 +REASSESS,0,0,2009,0,0,0,0 +REASSESSMENT,2009,0,2009,0,0,0,0 +REASSIGNING,2009,0,0,0,0,0,0 +REBOUND,0,2009,0,0,0,0,0 +REBUTS,0,0,0,2009,0,0,0 +REBUTTALS,0,0,0,2009,0,0,0 +RECALCULATED,0,0,2009,0,0,0,0 +RECALCULATIONS,0,0,2009,0,0,0,0 +RECALLS,2009,0,0,0,0,0,0 +RECESSIONS,2009,0,0,0,0,0,0 +RECONSIDER,0,0,2009,0,0,0,0 +RECORDATION,0,0,0,2009,0,0,0 +RECOURSE,0,0,0,2009,0,0,0 +RECUSAL,0,0,0,2011,0,0,0 +RECUSING,0,0,0,2011,0,0,0 +REDACTION,2009,0,0,2009,0,0,0 +REDEFAULTS,2014,0,0,0,0,0,0 +REDRESSING,2009,0,0,0,0,0,0 +REFERENDA,0,0,0,2009,0,0,0 +REFILED,0,0,0,2009,0,0,0 +REFRAINING,0,0,0,0,0,0,2009 +REFUSE,2009,0,0,0,0,0,0 +REGAIN,0,2009,0,0,0,0,0 +REGULATED,0,0,0,2009,0,0,0 +REGULATIONS,0,0,0,2009,0,0,0 +REGULATORY,0,0,0,2009,0,0,0 +REHEARINGS,0,0,0,2009,0,0,0 +VARIABILITY,0,0,2009,0,0,0,0 +VARIANCE,0,0,2009,0,0,0,0 +VARIATION,0,0,2009,0,0,0,0 +VARY,0,0,2009,0,0,0,0 +VERDICT,2009,0,0,2009,0,0,0 +VETOED,2009,0,0,0,0,0,0 +VICTIMS,2009,0,0,0,0,0,0 +VIOLATING,2009,0,0,0,0,0,0 +VIOLATOR,2009,0,0,0,0,0,0 +VIOLENTLY,2009,0,0,0,0,0,0 +VITIATING,2009,0,0,0,0,0,0 +VOIDING,2009,0,0,2009,0,0,0 +VULNERABILITIES,2009,0,0,0,0,0,0 +WARN,2009,0,0,0,0,0,0 +WARNS,2009,0,0,0,0,0,0 +WASTEFUL,2009,0,0,0,0,0,0 +WEAKENED,2009,0,0,0,0,0,0 +WEAKEST,2009,0,0,0,0,0,0 +DISHONESTLY,2009,0,0,0,0,0,0 +DISHONORABLY,2009,0,0,0,0,0,0 +DISINTERESTEDNESS,2009,0,0,0,0,0,0 +DISMAL,2009,0,0,0,0,0,0 +DISMISSALS,2009,0,0,0,0,0,0 +DISORDERLY,2009,0,0,0,0,0,0 +DISPARAGEMENTS,2009,0,0,0,0,0,0 +DISPARITIES,2009,0,0,0,0,0,0 +DISPLACEMENT,2009,0,0,0,0,0,0 +DISPOSE,2009,0,0,0,0,0,0 +DISPOSSESSES,2009,0,0,0,0,0,0 +DISPROPORTION,2009,0,0,0,0,0,0 +DISPUTE,2009,0,0,0,0,0,0 +DISQUALIFICATION,2009,0,0,0,0,0,0 +DISQUALIFY,2009,0,0,0,0,0,0 +DISREGARDING,2009,0,0,0,0,0,0 +DISRUPT,2009,0,0,0,0,0,0 +DISRUPTIONS,2009,0,0,0,0,0,0 +DISSATISFIED,2009,0,0,0,0,0,0 +DISSENTERS,2009,0,0,0,0,0,0 +DISSIDENTS,2009,0,0,0,0,0,0 +DISTINCTIONS,0,2009,0,0,0,0,0 +DISTORT,2009,0,0,0,0,0,0 +DISTORTIONS,2009,0,0,0,0,0,0 +DISTRACTING,2009,0,0,0,0,0,0 +DISTRAINT,0,0,0,2009,0,0,0 +DISTRIBUTEES,0,0,0,2009,0,0,0 +DISTURBED,2009,0,0,0,0,0,0 +DIVERT,2009,0,0,0,0,0,0 +DIVEST,2009,0,0,0,0,0,0 +DIVESTITURES,2009,0,0,0,0,0,0 +DIVORCE,2009,0,0,0,0,0,0 +DIVULGES,2009,0,0,0,0,0,0 +DOCKETING,0,0,0,2009,0,0,0 +DOUBTED,2009,0,2009,0,0,0,0 +DOWNGRADED,2009,0,0,0,0,0,0 +DOWNSIZED,2009,0,0,0,0,0,0 +DOWNTIME,2009,0,0,0,0,0,0 +DOWNWARD,2009,0,0,0,0,0,0 +DRASTICALLY,2009,0,0,0,0,0,0 +DROPPED,2009,0,0,0,0,0,0 +DURESS,2009,0,0,0,0,0,0 +EARMARK,0,0,0,0,0,0,2009 +EASIER,0,2009,0,0,0,0,0 +EFFECTIVE,0,-2020,0,0,0,0,0 +EFFICIENTLY,0,2009,0,0,0,0,0 +EMBARGO,2009,0,0,0,0,0,0 +EMBARRASS,2009,0,0,0,0,0,0 +EMBARRASSMENT,2009,0,0,0,0,0,0 +EMBEZZLEMENT,2009,0,0,0,0,0,0 +EMBEZZLING,2009,0,0,0,0,0,0 +EMPOWERS,0,2009,0,0,0,0,0 +ENABLING,0,2009,0,0,0,0,0 +ENCOURAGING,0,2009,0,0,0,0,0 +ENCROACHING,2009,0,0,0,0,0,0 +ENCUMBERED,2009,0,0,2009,0,0,2009 +ENCUMBRANCER,0,0,0,2009,0,0,0 +ENDANGERED,2009,0,0,0,0,0,0 +ENDORSEE,0,0,0,2011,0,0,0 +ENHANCE,0,2009,0,0,0,0,0 +ENHANCES,0,2009,0,0,0,0,0 +ENJOINING,2009,0,0,0,0,0,0 +ENJOYABLY,0,2009,0,0,0,0,0 +ENJOYS,0,2009,0,0,0,0,0 +ENTAILS,0,0,0,0,0,0,2009 +PATENTEE,0,0,0,2014,0,0,0 +PENALIZES,2009,0,0,0,0,0,0 +PENDING,0,0,2009,0,0,0,0 +PERFECTS,0,2009,0,0,0,0,0 +PERJURY,2009,0,0,2009,0,0,0 +PERMITTED,0,0,0,0,0,0,2009 +PERPETRATE,2009,0,0,2009,0,0,0 +PERPETRATION,2009,0,0,2009,0,0,0 +PERSISTENT,2009,0,0,0,0,0,0 +PERSONAM,0,0,0,2011,0,0,0 +PETITION,0,0,0,2009,0,0,0 +PETITIONING,0,0,0,2009,0,0,0 +PICKETED,2009,0,0,0,0,0,0 +HENCEFORTH,0,0,0,2009,0,0,0 +HEREDITAMENTS,0,0,0,2009,0,0,0 +HEREIN,0,0,0,2009,0,0,0 +HEREINBELOW,0,0,0,2009,0,0,0 +HERETOFORE,0,0,0,2009,0,0,0 +HEREWITH,0,0,0,2009,0,0,0 +HINDER,2009,0,0,0,0,0,0 +HINDRANCE,2009,0,0,0,0,0,0 +WHATSOEVER,0,0,0,2009,0,0,0 +WHEREAT,0,0,0,2009,0,0,0 +WHEREOF,0,0,0,2009,0,0,0 +WHEREUPON,0,0,0,2009,0,0,0 +WHOMSOEVER,0,0,0,2009,0,0,0 +WILLFUL,0,0,0,2009,0,0,0 +WINNER,0,2009,0,0,0,0,0 +WITNESSES,0,0,0,2009,0,0,0 +FLUCTUATES,0,0,2009,0,0,0,0 +FORBADE,0,0,0,2009,0,0,2011 +FORBEARING,0,0,0,2009,0,0,0 +FORBIDDING,2009,0,0,0,0,0,2009 +FORCING,2009,0,0,0,0,0,0 +FORECLOSE,2009,0,0,0,0,0,0 +FORECLOSURE,2009,0,0,0,0,0,0 +FOREGONE,2009,0,0,0,0,0,0 +FORESTALLS,2009,0,0,0,0,0,0 +FORFEITED,2009,0,0,0,0,0,0 +FORFEITURES,2009,0,0,0,0,0,0 +FORWHICH,0,0,0,2012,0,0,0 +FRAUDULENT,2009,0,0,0,0,0,0 +FRIVOLOUSLY,2009,0,0,0,0,0,0 +FRUSTRATING,2009,0,0,0,0,0,0 +FUGITIVE,-2020,0,0,2009,0,0,0 +GAINED,0,2009,0,0,0,0,0 +GRANTOR,0,0,0,2009,0,0,0 +DISGORGING,2009,0,0,0,0,0,0 +DISHONEST,2009,0,0,0,0,0,0 +LITIGANT,2009,0,0,2009,0,0,0 +LITIGATES,2009,0,0,2009,0,0,0 +LITIGATOR,0,0,0,2009,0,0,0 +LACKLUSTER,2009,0,0,0,0,0,0 +LAGGING,2009,0,0,0,0,0,0 +LAPSES,2009,0,0,0,0,0,0 +LAW,0,0,0,2009,0,0,0 +LAWMAKERS,0,0,0,2009,0,0,0 +LAWSUITS,0,0,0,2009,0,0,0 +LAYOFFS,2009,0,0,0,0,0,0 +LEGALESE,0,0,0,2009,0,0,0 +LEGALIZE,0,0,0,2009,0,0,0 +LEGALLY,0,0,0,2009,0,0,0 +NONPRODUCING,2009,0,0,0,0,0,0 +LIQUIDATE,2009,0,0,0,0,0,0 +LIQUIDATION,2009,0,0,0,0,0,0 +BENEFICIALLY,0,2009,0,0,0,0,0 +BENEFITED,0,2009,0,0,0,0,0 +BEST,0,2012,0,0,2009,0,0 +POPULAR,0,2009,0,0,0,0,0 +REINTERPRETED,0,0,2009,0,0,0,0 +REJECTED,2009,0,0,0,0,0,0 +REJECTS,2009,0,0,0,0,0,0 +RELINQUISHES,2009,0,0,0,0,0,0 +RELUCTANCE,2009,0,0,0,0,0,0 +REMANDING,0,0,0,2009,0,0,0 +REMEDIATING,0,0,0,2009,0,0,0 +REMISED,0,0,0,2011,0,0,0 +RENEGOTIATING,2009,0,0,0,0,0,0 +RENOUNCED,2009,0,0,0,0,0,0 +RENOUNCING,2009,0,0,0,0,0,0 +REPLEVIN,0,0,0,2009,0,0,0 +REPOSSESSION,2009,0,0,0,0,0,0 +TURBULENCE,2009,0,2009,0,0,0,0 +UNACCEPTABLY,2009,0,0,0,0,0,0 +UNANTICIPATED,2009,0,0,0,0,0,0 +UNATTRACTIVE,2009,0,0,0,0,0,0 +UNAVOIDABLE,2009,0,0,0,0,0,0 +UNCERTAINLY,0,0,2009,0,0,2009,0 +UNCOLLECTABLE,2009,0,0,0,0,0,0 +UNCOLLECTIBLES,2009,0,0,0,0,0,0 +UNCONFIRMED,0,0,2009,0,0,0,0 +UNCONSTITUTIONALITY,0,0,0,2009,0,0,0 +UNCONTROLLABLY,2009,0,0,0,0,0,0 +UNCOVERED,2009,0,0,0,0,0,0 +UNDEFEASED,0,0,0,2012,0,0,0 +UNDERCAPITALIZED,2009,0,0,0,0,0,0 +UNDERESTIMATE,2009,0,0,0,0,0,0 +UNDERESTIMATION,2009,0,0,0,0,0,0 +UNDERMINED,2009,0,0,0,0,0,0 +UNDERPAYMENT,2009,0,0,0,0,0,0 +UNDERPERFORMANCE,2009,0,0,0,0,0,0 +UNDERPRODUCED,2009,0,0,0,0,0,0 +UNDERSTATED,2009,0,0,0,0,0,0 +UNDERSTATING,2009,0,0,0,0,0,0 +UNDESIRABLE,2009,0,0,0,0,0,0 +UNDETERMINABLE,0,0,2009,0,0,0,0 +UNDISPUTED,0,0,0,0,2009,0,0 +UNDULY,2009,0,0,0,0,0,0 +UNEMPLOYED,2009,0,0,0,0,0,0 +UNENFORCEABILITY,0,0,0,2009,0,0,0 +UNETHICAL,2009,0,0,0,0,0,0 +UNEXPECTEDLY,2009,0,2009,0,0,0,0 +UNFAMILIARITY,0,0,2009,0,0,0,0 +UNFAVOURABLE,2011,0,0,0,0,0,0 +UNFORECASTED,0,0,2011,0,0,0,0 +UNFORTUNATE,2009,0,0,0,0,0,0 +UNFULFILLED,2009,0,0,0,0,0,0 +UNIDENTIFIABLE,0,0,2009,0,0,0,0 +UNINTENTIONAL,2009,0,0,0,0,0,0 +UNJUSTIFIABLY,2009,0,0,0,0,0,0 +UNKNOWINGLY,2009,0,0,0,0,0,0 +UNLAWFULLY,2009,0,0,2009,0,0,0 +UNMARKETABLE,2009,0,0,0,0,0,0 +UNNECESSARILY,2009,0,0,0,0,0,0 +UNOBTAINABLE,2009,0,0,0,0,0,0 +UNPERFORMED,2009,0,0,0,0,0,0 +UNPREDICTABLE,2009,0,2009,0,0,0,0 +UNPROFITABILITY,2011,0,0,0,0,0,0 +UNQUALIFIED,2009,0,0,0,0,0,0 +UNREASONABLE,2009,0,0,0,0,0,0 +UNRECONCILED,0,0,2011,0,0,0,0 +UNRELIABLE,2009,0,0,0,0,0,0 +UNRESOLVED,2009,0,0,0,0,0,0 +UNSALEABLE,2009,0,0,0,0,0,0 +UNSCHEDULED,2009,0,0,0,0,0,0 +UNSETTLED,0,0,2009,0,0,0,0 +UNSPECIFIED,0,0,2009,0,0,0,0 +UNSUBSTANTIATED,2009,0,0,0,0,0,0 +UNSUITABLE,2009,0,0,0,0,0,0 +UNSURPASSED,0,2009,0,0,2009,0,0 +UNTENABLE,2009,0,0,0,0,0,0 +UNTRUSTED,2014,0,0,0,0,0,0 +UNTRUTHFULNESS,2009,0,0,0,0,0,0 +UNUSUALLY,0,0,2009,0,0,0,0 +UNWILLING,2009,0,0,0,0,0,0 +UPTURN,0,2009,0,0,0,0,0 +USURIOUS,2009,0,0,2009,0,0,0 +USURPING,2009,0,0,2009,0,0,0 +VAGUE,0,0,2012,0,0,0,0 +VAGUER,0,0,2012,0,0,0,0 +PLAINTIFFS,2009,0,0,2009,0,0,0 +PLEADING,2009,0,0,2009,0,0,0 +PLEASANT,0,2009,0,0,0,0,0 +PLED,2009,0,0,0,0,0,0 +PLEDGEES,0,0,0,2011,0,0,0 +PLEDGORS,0,0,0,2012,0,0,0 +COMPELLING,0,0,0,0,0,0,2011 +COMPLAINANT,0,0,0,2009,0,0,0 +COMPLAINS,2009,0,0,0,0,0,0 +COMMITS,0,0,0,0,0,0,2009 +LIKELIHOOD,0,0,2009,0,0,0,0 +LIMITING,0,0,0,0,0,0,2009 +RESTRAIN,0,0,0,0,0,0,2009 +RESTRAINT,0,0,0,0,0,0,2009 +RESTRICTING,0,0,0,0,0,0,2009 +RESTRICTIVELY,0,0,0,0,0,0,2009 +RESTRUCTURED,2009,0,0,0,0,0,0 +RETALIATE,2009,0,0,0,0,0,0 +RETALIATION,2009,0,0,0,0,0,0 +PRECAUTION,0,0,2009,0,0,0,0 +PRECIPITOUS,2009,0,0,0,0,0,0 +PRECLUDES,2009,0,0,0,0,0,2009 +PREDATORY,2009,0,0,0,0,0,0 +PREDECEASING,0,0,0,2009,0,0,0 +PREDICTING,0,0,2009,0,0,0,0 +PREDICTOR,0,0,2009,0,0,0,0 +PREEMINENT,0,2009,0,0,0,0,0 +PREJUDICES,2009,0,0,2009,0,0,0 +PRELIMINARY,0,0,2009,0,0,0,0 +PREMIERE,0,2009,0,0,0,0,0 +PRESTIGE,0,2009,0,0,0,0,0 +PRESUMED,0,0,2009,0,0,0,0 +PRESUMPTIONS,0,0,2009,0,0,0,0 +PREVENTED,0,0,0,0,0,0,2009 +PRIMA,0,0,0,2009,0,0,0 +PROBABILISTIC,0,0,2009,0,0,0,0 +PROBABLY,0,0,2009,0,0,0,0 +PROBATING,0,0,0,2009,0,0,0 +PROBATIONER,0,0,0,2009,0,0,0 +PROBLEMATIC,2009,0,0,0,0,0,0 +PROFICIENT,0,2009,0,0,0,0,0 +PROFITABLY,0,2009,0,0,0,0,0 +PROGRESSING,0,2009,0,0,0,0,0 +PROHIBITION,0,0,0,0,0,0,2009 +PROHIBITORY,0,0,0,0,0,0,2009 +PROLONGATIONS,2009,0,0,0,0,0,0 +PROMULGATE,0,0,0,2009,0,0,0 +PROMULGATION,0,0,0,2009,0,0,0 +PRONE,2009,0,0,0,0,0,0 +PROSECUTED,2009,0,0,2009,0,0,0 +PROSECUTIONS,2009,0,0,2009,0,0,0 +PROSPERED,0,2009,0,0,0,0,0 +PROSPERS,0,2009,0,0,0,0,0 +PROTESTERS,2009,0,0,0,0,0,0 +PROTESTS,2009,0,0,0,0,0,0 +PROVISOES,0,0,0,2009,0,0,0 +PROVOKES,2009,0,0,0,0,0,0 +PUNISHES,2009,0,0,0,0,0,0 +PUNITIVE,2009,0,0,0,0,0,0 +PURPORTING,2009,0,0,0,0,0,0 +QUESTIONABLY,2009,0,0,0,0,0,0 +QUIT,2009,0,0,0,0,0,0 +RACKETEER,2009,0,0,0,0,0,0 +RANDOMIZED,0,0,2009,0,0,0,0 +RANDOMNESS,0,0,2009,0,0,0,0 +RATIONALIZATION,2009,0,0,0,0,0,0 +RATIONALIZES,2009,0,0,0,0,0,0 +ABANDONMENT,2009,0,0,0,0,0,0 +ABDICATES,2009,0,0,0,0,0,0 +ABERRANT,2009,0,0,0,0,0,0 +ABETTING,2009,0,0,0,0,0,0 +ABIDING,0,0,0,0,0,0,2009 +ABNORMALITY,2009,0,0,0,0,0,0 +ABOLISHES,2009,0,0,0,0,0,0 +ABROGATED,2009,0,0,2009,0,0,0 +ABROGATIONS,2009,0,0,2009,0,0,0 +ABSENCE,2009,0,0,0,0,0,0 +ABSOLVED,0,0,0,2009,0,0,0 +ABUNDANT,0,2009,0,0,0,0,0 +ABUSING,2009,0,0,0,0,0,0 +ACCESSION,0,0,0,2009,0,0,0 +ACCIDENTALLY,2009,0,0,0,0,0,0 +ACCOMPLISHED,0,2009,0,0,0,0,0 +ACCOMPLISHMENTS,0,2009,0,0,0,0,0 +ACCUSED,2009,0,0,0,0,0,0 +ACHIEVED,0,2009,0,0,0,0,0 +ACHIEVING,0,2009,0,0,0,0,0 +ACQUIESCING,2009,0,0,0,0,0,0 +ACQUITS,2009,0,0,2009,0,0,0 +ACQUITTANCES,0,0,0,2011,0,0,0 +ADEQUATELY,0,2009,0,0,0,0,0 +ADJOURNMENT,0,0,0,2009,0,0,0 +ADJUDGED,0,0,0,2009,0,0,0 +ADJUDICATED,0,0,0,2009,0,0,0 +ADJUDICATIONS,0,0,0,2009,0,0,0 +ADJUDICATORY,0,0,0,2009,0,0,0 +ADMISSION,0,0,0,2009,0,0,0 +ADULTERATING,2009,0,0,0,0,0,0 +ADVANCEMENTS,0,2009,0,0,0,0,0 +ADVANTAGED,0,2009,0,0,0,0,0 +ADVERSARIAL,2009,0,0,0,0,0,0 +ADVERSELY,2009,0,0,0,0,0,0 +AFFIDAVITS,0,0,0,2009,0,0,0 +AFOREMENTIONED,0,0,0,2009,0,0,0 +AFTERMATHS,2009,0,0,0,0,0,0 +AGGRAVATES,2009,0,0,0,0,0,0 +AGGRIEVED,0,0,0,2009,0,0,0 +ALIENATED,2009,0,0,0,0,0,0 +ALIENATIONS,2009,0,0,0,0,0,0 +ALLEGED,2009,0,0,2009,0,0,0 +ALLIANCE,0,2009,0,0,0,0,0 +ALTERATIONS,0,0,2009,0,0,0,0 +AMBIGUOUS,0,0,2009,0,0,0,0 +AMENDED,0,0,0,2009,0,0,0 +AMENDS,0,0,0,2009,0,0,0 +ANNOYED,2009,0,0,0,0,0,0 +ANNULLED,2009,0,0,0,0,0,0 +ANNULS,2009,0,0,0,0,0,0 +ANOMALY,2009,0,2009,0,0,0,0 +ANTICIPATED,0,0,2009,0,0,0,0 +ANTICIPATIONS,0,0,2009,0,0,0,0 +ANYWISE,0,0,0,2009,0,0,0 +APPEALABLE,0,0,0,2009,0,0,0 +APPEAR,0,0,2009,0,0,0,0 +APPELLANT,0,0,0,2009,0,0,0 +APPOINTOR,0,0,0,2011,0,0,0 +APPROXIMATES,0,0,2009,0,0,0,0 +APPURTENANCE,0,0,0,2009,0,0,0 +ARBITRAL,0,0,0,2009,0,0,0 +ARBITRATE,0,0,0,2009,0,0,0 +ARBITRATION,0,0,0,2009,0,0,0 +ARBITRATOR,0,0,0,2009,0,0,0 +ARGUING,2009,0,0,0,0,0,0 +ARREARAGE,2009,0,0,2009,0,0,0 +ARRESTED,2009,0,0,0,0,0,0 +RETROCEDE,0,0,0,2011,0,0,0 +BOLSTERED,0,2009,0,0,0,0,0 +BONAFIDE,0,0,0,2009,0,0,0 +BOOSTED,0,2009,0,0,0,0,0 +BOUNDED,0,0,0,0,0,0,2009 +BOYCOTTS,2009,0,0,0,0,0,0 +BREACHING,2009,0,0,2009,0,0,0 +BREAKDOWN,2009,0,0,0,0,0,0 +BREAKTHROUGH,0,2009,0,0,0,0,0 +BRIBERIES,2009,0,0,0,0,0,0 +BRIDGE,-2020,0,0,0,0,0,0 +BURDENED,2009,0,0,0,0,0,0 +BURNED,2009,0,0,0,0,0,0 +CANCEL,2009,0,0,0,0,0,0 +CANCELLATIONS,2009,0,0,0,0,0,0 +CARELESS,2009,0,0,0,0,0,0 +CATASTROPHE,2009,0,0,0,0,0,0 +CAUTION,2009,0,0,0,0,0,0 +CAUTIONS,2009,0,0,0,0,0,0 +CEASE,2009,0,0,0,0,0,0 +CEDANT,0,0,0,2012,0,0,0 +CENSURES,2009,0,0,0,0,0,0 +CHALLENGE,2009,0,0,0,0,0,0 +CHARGEOFFS,2009,0,0,0,0,0,0 +CHOATE,0,0,0,2011,0,0,0 +CIRCUMVENTION,2009,0,0,0,0,0,0 +SHOCKED,2009,0,0,0,0,0,0 +SHORTFALLS,2009,0,0,0,0,0,0 +SHUTDOWN,2009,0,0,0,0,0,0 +SLANDER,2009,0,0,0,0,0,0 +REPUDIATED,2009,0,0,0,0,0,0 +REPUDIATIONS,2009,0,0,0,0,0,0 +REQUIRED,0,0,0,0,0,0,2009 +REQUIRING,0,0,0,0,0,0,2009 +RESCINDING,0,0,0,2009,0,0,0 +RESIGN,2009,0,0,0,0,0,0 +RESIGNING,2009,0,0,0,0,0,0 +RESTATED,2009,0,0,0,0,0,0 +RESTATING,2009,0,0,0,0,0,0 +NONUSURIOUS,0,0,0,2011,0,0,0 +NOTARIZATIONS,0,0,0,2009,0,0,0 +NOTARY,0,0,0,2009,0,0,0 +NUISANCES,2009,0,0,0,0,0,0 +NULLIFIES,2009,0,0,2009,0,0,0 +NULLITY,0,0,0,2009,0,0,0 +OBJECTIONABLE,2009,0,0,0,0,0,0 +OBLIGATED,0,0,0,0,0,0,2009 +OBLIGATIONS,0,0,0,0,0,0,2009 +OBLIGEE,0,0,0,2009,0,0,0 +OBLIGORS,0,0,0,2009,0,0,0 +OBSOLETE,2009,0,0,0,0,0,0 +OBSTRUCTED,2009,0,0,0,0,0,0 +OCCASIONALLY,0,0,2009,0,0,2009,0 +OFFENDED,2009,0,0,0,0,0,0 +OFFENDS,2009,0,0,0,0,0,0 +OFFEROR,0,0,0,2009,0,0,0 +OMIT,2009,0,0,0,0,0,0 +ONEROUS,2009,0,0,0,0,0,0 +OPPORTUNITY,0,2009,0,0,0,0,0 +OPPOSING,2009,0,0,0,0,0,0 +OPTIONEE,0,0,0,2009,0,0,0 +OUTAGES,2009,0,0,0,0,0,0 +OUTPERFORMED,0,2009,0,0,0,0,0 +OVERAGES,2009,0,0,0,0,0,0 +OVERBUILT,2009,0,0,0,0,0,0 +OVERCAPACITIES,2009,0,0,0,0,0,0 +OVERCHARGES,2009,0,0,0,0,0,0 +OVERCOMING,2009,0,0,0,0,0,0 +OVERESTIMATES,2009,0,0,0,0,0,0 +OVERLOAD,2009,0,0,0,0,0,0 +OVERLOOK,2009,0,0,0,0,0,0 +OVERPAID,2009,0,0,0,0,0,0 +OVERPRODUCES,2009,0,0,0,0,0,0 +OVERRULED,0,0,0,2009,0,0,0 +OVERRUNNING,2009,0,0,0,0,0,0 +OVERSHADOWING,2009,0,0,0,0,0,0 +OVERSTATEMENT,2009,0,0,0,0,0,0 +OVERSUPPLIED,2009,0,0,0,0,0,0 +OVERTLY,2009,0,0,0,0,0,0 +OVERTURNS,2009,0,0,0,0,0,0 +PANIC,2009,0,0,0,0,0,0 +NEARLY,0,0,2009,0,0,2009,0 +NECESSITATING,0,0,0,0,0,0,2009 +NEGLECT,2009,0,0,0,0,0,0 +NEGLECTS,2009,0,0,0,0,0,0 +NEGLIGENTLY,2009,0,0,0,0,0,0 +BARRIER,2009,0,0,0,0,0,0 +BELIEVE,0,0,2009,0,0,0,0 +IDLED,2009,0,0,0,0,0,0 +IGNORES,2009,0,0,0,0,0,0 +ILLEGALITIES,2009,0,0,0,0,0,0 +ILLICIT,2009,0,0,0,0,0,0 +IMBALANCE,2009,0,0,0,0,0,0 +IMMORAL,2009,0,0,0,0,0,0 +IMPAIRMENT,2009,0,0,0,0,0,2011 +IMPASSES,2009,0,0,0,0,0,0 +IMPEDIMENT,2009,0,0,0,0,0,0 +IMPERATIVE,2009,0,0,0,0,0,0 +IMPERMISSIBLE,2009,0,0,0,0,0,0 +IMPLICATES,2009,0,0,0,0,0,0 +IMPOSES,0,0,0,0,0,0,2009 +IMPOSSIBILITY,2009,0,0,0,0,0,0 +IMPOUNDING,2009,0,0,0,0,0,0 +IMPRACTICALITIES,2009,0,0,0,0,0,0 +IMPRECISIONS,0,0,2009,0,0,0,0 +IMPRESSING,0,2009,0,0,0,0,0 +IMPROBABILITY,0,0,2009,0,0,0,0 +IMPROPRIETIES,2009,0,0,0,0,0,0 +IMPROVEMENT,0,2009,0,0,0,0,0 +IMPRUDENT,2009,0,0,0,0,0,0 +INACCURACIES,2009,0,0,0,0,0,0 +INACTION,2009,0,0,0,0,0,0 +INACTIVATES,2009,0,0,0,0,0,0 +INACTIVITY,2009,0,0,0,0,0,0 +INADEQUATELY,2009,0,0,0,0,0,0 +INADVISABLE,2009,0,0,0,0,0,0 +INATTENTION,2009,0,0,0,0,0,0 +INCARCERATE,2009,0,0,2009,0,0,0 +INCARCERATION,2009,0,0,2009,0,0,0 +INCIDENCES,2009,0,0,0,0,0,0 +INCOMPATIBILITY,2009,0,0,0,0,0,0 +INCOMPETENT,2009,0,0,0,0,0,0 +INCOMPLETELY,2009,0,0,0,0,0,0 +INCONSISTENCY,2009,0,0,0,0,0,0 +INCONTESTABLE,0,0,0,2009,0,0,0 +INCORRECT,2009,0,0,0,0,0,0 +INCREDIBLY,0,2009,0,0,0,0,0 +INDEFEASIBLE,2009,0,0,0,0,0,0 +INDEFINITENESS,0,0,2009,0,0,0,0 +INDEMNIFIED,0,0,0,2009,0,0,0 +INDEMNITEE,0,0,0,2009,0,0,0 +INDEMNITORS,0,0,0,2009,0,0,0 +INDICT,2009,0,0,2009,0,0,0 +INDICTMENT,2009,0,0,2009,0,0,0 +INEFFECTIVELY,2009,0,0,0,0,0,0 +INEFFICIENT,2009,0,0,0,0,0,0 +INEQUITABLE,2009,0,0,0,0,0,0 +INEVITABLE,2009,0,0,0,0,0,0 +INEXPERIENCED,2009,0,0,0,0,0,0 +INFORCE,0,0,0,2009,0,0,0 +INFRINGE,2009,0,0,0,0,0,0 +INFRINGER,0,0,0,2009,0,0,0 +INHIBIT,0,0,0,0,0,0,2011 +INIMICAL,2009,0,0,0,0,0,0 +INJURE,2009,0,0,0,0,0,0 +INJURING,2009,0,0,0,0,0,0 +INNOVATED,0,2009,0,0,0,0,0 +INNOVATIONS,0,2009,0,0,0,0,0 +INNOVATORS,0,2009,0,0,0,0,0 +INSECURE,2009,0,0,0,0,0,0 +INSISTED,0,0,0,0,0,0,2009 +INSOFAR,0,0,0,2009,0,0,0 +INSPIRATION,0,2009,0,0,0,0,0 +INSUBORDINATION,2009,0,0,0,0,0,0 +INSURRECTION,2009,0,0,0,0,0,0 +INTEGRITY,0,2009,0,0,0,0,0 +INTERFERENCE,2009,0,0,0,0,0,0 +INTERLOCUTORY,0,0,0,2009,0,0,0 +INTERPOSE,0,0,0,2009,0,0,0 +INTERPOSITION,0,0,0,2009,0,0,0 +INTERROGATES,0,0,0,2009,0,0,0 +INTERROGATOR,0,0,0,2009,0,0,0 +INTERRUPT,2009,0,0,0,0,0,0 +INTERRUPTIONS,2009,0,0,0,0,0,0 +INTIMIDATION,2009,0,0,0,0,0,0 +SPORADICALLY,0,0,2009,0,0,0,0 +STABILIZE,0,2009,0,0,0,0,0 +STABLE,0,2009,0,0,0,0,0 +STAGNATED,2009,0,0,0,0,0,0 +STANDSTILL,2009,0,0,0,0,0,0 +STATUTORILY,0,0,0,2009,0,0,0 +STIPULATES,0,0,0,0,0,0,2009 +STOLEN,2009,0,0,0,0,0,0 +STOPPING,2009,0,0,0,0,0,0 +STRAINING,2009,0,0,0,0,0,0 +STRENGTHENED,0,2009,0,0,0,0,0 +STRESS,2009,0,0,0,0,0,0 +STRESSING,2009,0,0,0,0,0,0 +STRICTLY,0,0,0,0,0,0,2009 +STRONGEST,0,2009,0,0,0,0,0 +SUBDOCKET,0,0,0,2012,0,0,0 +SUBLEASEE,0,0,0,2011,0,0,0 +SUBLICENSOR,0,0,0,2011,0,0,0 +SUBPOENAED,2009,0,0,2009,0,0,0 +SUBSTANDARD,2009,0,0,0,0,0,0 +SUCCEEDED,0,2009,0,0,0,0,0 +SUCCESSES,0,2009,0,0,0,0,0 +SUDDENLY,0,0,2009,0,0,0,0 +SUFFER,2009,0,0,0,0,0,0 +SUGGEST,0,0,2009,0,0,2009,0 +SUING,2009,0,0,2009,0,0,0 +SUMMONSES,2009,0,0,2009,0,0,0 +SUPERSEDED,0,0,0,2009,0,0,0 +SURETY,0,0,0,2009,0,0,0 +SURPASSING,0,2009,0,0,0,0,0 +SUSPECTED,2009,0,0,0,0,0,0 +SUSPENDING,2009,0,0,0,0,0,0 +SUSPICION,2009,0,0,0,0,0,0 +REVISED,0,0,2009,0,0,0,0 +REVOKE,2009,0,0,0,0,0,0 +REVOLUTIONIZE,0,2009,0,0,0,0,0 +REWARD,0,2009,0,0,0,0,0 +RIDICULE,2009,0,0,0,0,0,0 +RISK,0,0,2009,0,0,0,0 +RISKINESS,0,0,2009,0,0,0,0 +ROUGHLY,0,0,2009,0,0,0,0 +SABOTAGE,2009,0,0,0,0,0,0 +SACRIFICIAL,2009,0,0,0,0,0,0 +SATISFACTORY,0,2009,0,0,0,0,0 +SATISFYING,0,2009,0,0,0,0,0 +SCRUTINIZED,2009,0,0,0,0,0,0 +SECRECY,-2020,0,0,0,0,0,0 +SEIZES,2009,0,0,0,0,0,0 +SENTENCED,2009,0,0,2009,0,0,0 +SERIOUSLY,2009,0,0,0,0,0,0 +SETTLEMENT,0,0,0,2009,0,0,0 +SEVERABLE,0,0,0,2009,0,0,0 +SEVERE,2009,0,0,0,0,0,0 +SEVERITY,2009,0,0,0,0,0,0 +ENTHUSIASTIC,0,2009,0,0,0,0,0 +ERODE,2009,0,0,0,0,0,0 +EROSION,2009,0,0,0,0,0,0 +ERRING,2009,0,0,0,0,0,0 +ERRORS,2009,0,0,0,0,0,0 +ESCALATES,2009,0,0,0,0,0,0 +ESCHEATMENT,0,0,0,2011,0,0,0 +ESCROWS,0,0,0,0,0,0,2009 +EVADES,2009,0,0,0,0,0,0 +EVASIVE,2009,0,0,0,0,0,0 +EVICTION,2009,0,0,0,0,0,0 +EVIDENTIARY,0,0,0,2009,0,0,0 +EXACERBATING,2009,0,0,0,0,0,0 +EXAGGERATED,2009,0,0,0,0,0,0 +EXCEEDANCE,0,0,0,2011,0,0,0 +EXCELLENT,0,2009,0,0,0,0,0 +EXCEPTIONALLY,0,2009,0,0,0,0,0 +EXCITED,0,2009,0,0,0,0,0 +EXCLUSIVELY,0,2009,0,0,0,0,0 +EXCULPATE,2009,0,0,2009,0,0,0 +EXCULPATION,2009,0,0,2009,0,0,0 +EXECUTORS,0,0,0,2009,0,0,0 +EXECUTRIXES,0,0,0,2009,0,0,0 +EXONERATES,2009,0,0,0,0,0,0 +EXPLOIT,2009,0,0,0,0,0,0 +EXPLOITED,2009,0,0,0,0,0,0 +EXPOSED,2009,0,0,0,0,0,0 +EXPOSURES,0,0,2009,0,0,0,0 +EXPROPRIATING,2009,0,0,0,0,0,0 +EXPULSIONS,2009,0,0,0,0,0,0 +EXTRAJUDICIAL,0,0,0,2014,0,0,0 +SOLVES,0,2009,0,0,0,0,0 +SOMEWHAT,0,0,2009,0,0,2009,0 +SPAMMING,2014,0,0,0,0,0,0 +TREMENDOUSLY,0,2009,0,0,0,0,0 +LOCKOUTS,2009,0,0,0,0,0,0 +LOSS,2009,0,0,0,0,0,0 +LOYAL,0,2009,0,0,0,0,0 +MALFEASANCE,2009,0,0,0,0,0,0 +MALFUNCTIONS,2009,0,0,0,0,0,0 +MALPRACTICE,2009,0,0,0,0,0,0 +MANDATES,0,0,0,0,0,0,2009 +MANIPULATE,2009,0,0,0,0,0,0 +MANIPULATION,2009,0,0,0,0,0,0 +MARKDOWNS,2009,0,0,0,0,0,0 +MEDIATED,0,0,0,2009,0,0,0 +MEDIATIONS,0,0,0,2009,0,0,0 +MIGHT,0,0,2009,0,0,2009,0 +MISAPPLIES,2009,0,0,0,0,0,0 +MISAPPROPRIATED,2009,0,0,0,0,0,0 +MISAPPROPRIATIONS,2009,0,0,0,0,0,0 +MISCALCULATES,2009,0,0,0,0,0,0 +MISCHARACTERIZATION,2014,0,0,0,0,0,0 +MISCLASSIFIED,2011,0,0,0,0,0,0 +MISDATED,2011,0,0,0,0,0,0 +MISFEASANCE,0,0,0,2009,0,0,0 +MISHANDLING,2009,0,0,0,0,0,0 +MISINFORMING,2009,0,0,0,0,0,0 +MISINTERPRETATIONS,2009,0,0,0,0,0,0 +MISJUDGE,2009,0,0,0,0,0,0 +MISJUDGMENT,2009,0,0,0,0,0,0 +MISLABELING,2009,0,0,0,0,0,0 +MISLEADING,2009,0,0,0,0,0,0 +MISMANAGE,2009,0,0,0,0,0,0 +MISMANAGING,2009,0,0,0,0,0,0 +MISMATCHING,2009,0,0,0,0,0,0 +MISPRICINGS,2014,0,0,0,0,0,0 +MISREPRESENTED,2009,0,0,0,0,0,0 +MISSED,2009,0,0,0,0,0,0 +WORRIES,2009,0,0,0,0,0,0 +WORSEN,2009,0,0,0,0,0,0 +WORST,2009,0,0,0,0,0,0 +TIGHTENING,2009,0,0,0,0,0,0 +TOLERATING,2009,0,0,0,0,0,0 +TORTIOUSLY,0,0,0,2009,0,0,0 +FINES,2009,0,0,0,0,0,0 +NONASSESSABLE,0,0,2009,0,0,0,0 +NONCANCELLABLE,0,0,0,0,0,0,2009 +NONCOMPLIANT,2009,0,0,0,0,0,0 +NONCONFORMITY,2009,0,0,0,0,0,0 +NONCONTRIBUTORY,0,0,0,2009,0,0,0 +NONFORFEITABILITY,0,0,0,2011,0,0,0 +NONGUARANTOR,0,0,0,2011,0,0,0 +DISCIPLINARY,2009,0,0,0,0,0,0 +DISCLAIMERS,2009,0,0,0,0,0,0 +DISCLOSED,2009,0,0,0,0,0,0 +DISCONTINUANCES,2009,0,0,0,0,0,0 +DISCONTINUED,2009,0,0,0,0,0,0 +DISCOURAGED,2009,0,0,0,0,0,0 +DISCREDITED,2009,0,0,0,0,0,0 +DISCREPANCY,2009,0,0,0,0,0,0 +SPECULATED,0,0,2009,0,0,0,0 +SPECULATIONS,0,0,2009,0,0,0,0 +TRAGICALLY,2009,0,0,0,0,0,0 +LEGISLATED,0,0,0,2009,0,0,0 +LEGISLATIONS,0,0,0,2009,0,0,0 +LEGISLATORS,0,0,0,2009,0,0,0 +LIBELED,0,0,0,2009,0,0,0 +LIE,2009,0,0,0,0,0,0 +COMPULSION,2009,0,0,0,0,0,2009 +CONCEDE,2009,0,0,0,0,0,0 +CONCEIVABLE,0,0,2009,0,0,2009,0 +CONCERNS,2009,0,0,0,0,0,0 +CONCLUSIVE,0,2009,0,0,0,0,0 +CONDEMNATIONS,2009,0,0,0,0,0,0 +CONDEMNS,2009,0,0,0,0,0,0 +CONDONED,2009,0,0,0,0,0,0 +CONFESSES,2009,0,0,0,0,0,0 +CONFINE,2009,0,0,0,0,0,2009 +CONFINES,2009,0,0,0,0,0,2009 +CONFISCATES,2009,0,0,0,0,0,0 +CONFISCATORY,0,0,0,2009,0,0,0 +CONFLICTS,2009,0,0,0,0,0,0 +CONFRONTATIONS,2009,0,0,0,0,0,0 +CONFUSE,2009,0,0,0,0,0,0 +CONFUSINGLY,2009,0,2009,0,0,0,0 +CONSENTING,0,0,0,2009,0,0,0 +CONSPIRACY,2009,0,0,0,0,0,0 +CONSPIRE,2009,0,0,0,0,0,0 +CONSTITUTION,0,0,0,2009,0,0,0 +CONSTITUTIONS,0,0,0,2009,0,0,0 +CONSTRAINING,0,0,0,0,0,0,2009 +CONSTRUCTIVE,0,2009,0,0,0,0,0 +CONSTRUES,0,0,0,2012,0,0,0 +CONTENDED,2009,0,0,0,0,0,0 +CONTENTIONS,2009,0,0,0,0,0,0 +CONTESTATION,0,0,0,2011,0,0,0 +CONTINGENCY,0,0,2009,0,0,0,0 +CONTRACT,0,0,0,2009,0,0,0 +CONTRACTIBLE,0,0,0,2009,0,0,0 +CONTRACTIONS,2009,0,0,0,0,0,0 +CONTRADICT,2009,0,0,0,0,0,0 +CONTRADICTIONS,2009,0,0,0,0,0,0 +CONTRAVENE,0,0,0,2009,0,0,0 +CONTRAVENTION,0,0,0,2009,0,0,0 +CONTROVERSY,2009,0,0,0,0,0,0 +CONVENIENS,0,0,0,2012,0,0,0 +CONVICTED,2009,0,0,2009,0,0,0 +CORRECTED,2009,0,0,0,0,0,0 +CORRECTS,2009,0,0,0,0,0,0 +CORRUPTION,2009,0,0,0,0,0,0 +COSTLY,2009,0,0,0,0,0,0 +COUNSELED,0,0,0,2009,0,0,0 +COUNTERCLAIMED,2009,0,0,0,0,0,0 +COUNTERFEITED,2009,0,0,0,0,0,0 +COUNTERFEITS,2009,0,0,0,0,0,0 +COUNTERSUED,0,0,0,2011,0,0,0 +COURTEOUS,0,2009,0,0,0,0,0 +COVENANTED,0,0,0,0,0,0,2011 +CREATIVELY,0,2009,0,0,0,0,0 +CRIMES,2009,0,0,2009,0,0,0 +CRIMINALIZING,0,0,0,2014,0,0,0 +CRISIS,2009,0,0,0,0,0,0 +CRITICISMS,2009,0,0,0,0,0,0 +CRITICIZING,2009,0,0,0,0,0,0 +CROSSROADS,0,0,2009,0,0,0,0 +CULPABLE,2009,0,0,0,0,0,0 +CURTAILED,2009,0,0,0,0,0,0 +CURTAILS,2009,0,0,0,0,0,0 +CYBERATTACK,2014,0,0,0,0,0,0 +CYBERCRIMES,2014,0,0,0,0,0,0 +TAINTS,2009,0,0,0,0,0,0 +TENSE,2009,0,0,0,0,0,0 +TERMINATE,2009,0,0,0,0,0,0 +TERMINATION,2009,0,0,0,0,0,0 +TESTIFY,2009,0,0,2009,0,0,0 +THENCEFORTH,0,0,0,2009,0,0,0 +THEREFROM,0,0,0,2009,0,0,0 +THEREON,0,0,0,2009,0,0,0 +THERETOFORE,0,0,0,2009,0,0,0 +THEREWITH,0,0,0,2009,0,0,0 +THREATENING,2009,0,0,0,0,0,0 +FACIE,0,0,0,2009,0,0,0 +FAILING,2009,0,0,0,0,0,0 +FAILURES,2009,0,0,0,0,0,0 +FALSIFICATION,2009,0,0,0,0,0,0 +FALSIFY,2009,0,0,0,0,0,0 +FATALITIES,2009,0,0,0,0,0,0 +FAULTED,2009,0,0,0,0,0,0 +FAVORABLY,0,2009,0,0,0,0,0 +FAVORITES,0,2009,0,0,0,0,0 +FELONIOUS,2009,0,0,2009,0,0,0 +DAMAGES,2009,0,0,0,0,0,0 +DANGER,2009,0,0,0,0,0,0 +DEADLOCK,2009,0,0,0,0,0,0 +DEADWEIGHT,2009,0,0,0,0,0,0 +DEBARRED,2009,0,0,0,0,0,0 +DECEIT,2009,0,0,0,0,0,0 +DECEIVED,2009,0,0,0,0,0,0 +DECEPTIONS,2009,0,0,0,0,0,0 +DECLINE,2009,0,0,0,0,0,0 +DECREE,0,0,0,2009,0,0,0 +DEFACE,2009,0,0,0,0,0,0 +DEFALCATIONS,0,0,0,2009,0,0,0 +DEFAME,2009,0,0,0,0,0,0 +DEFAULT,2009,0,0,0,0,0,0 +DEFEASANCE,0,0,0,2009,0,0,0 +DEFEASEMENT,0,0,0,2014,0,0,0 +DEFEATED,2009,0,0,0,0,0,0 +DEFECTIVE,2009,0,0,0,0,0,0 +DEFENDABLE,0,0,0,2014,0,0,0 +DEFENDING,2009,0,0,0,0,0,0 +DEFERENCE,0,0,0,2009,0,0,0 +DEFICIT,2009,0,0,0,0,0,0 +DEFRAUD,2009,0,0,0,0,0,0 +DEFUNCT,2009,0,0,0,0,0,0 +DEGRADED,2009,0,0,0,0,0,0 +DELAYED,2009,0,0,0,0,0,0 +DELEGATABLE,0,0,0,2011,0,0,0 +DELIBERATE,2009,0,0,0,0,0,0 +DELIGHTED,0,2009,0,0,0,0,0 +DELIGHTS,0,2009,0,0,0,0,0 +DELINQUENTLY,2009,0,0,0,0,0,0 +DELISTING,2009,0,0,0,0,0,0 +DEMISES,2009,0,0,0,0,0,0 +DEMOLISHES,2009,0,0,0,0,0,0 +DEMOTE,2009,0,0,0,0,0,0 +DEMOTION,2009,0,0,0,0,0,0 +DEMURRERS,0,0,0,2009,0,0,0 +DENIALS,2009,0,0,0,0,0,0 +DENIGRATED,2009,0,0,0,0,0,0 +DENY,2009,0,0,0,0,0,0 +DEPENDABLE,0,2009,0,0,0,0,0 +DEPENDED,0,0,2009,0,0,2009,0 +DEPENDENT,0,0,2009,0,0,0,2011 +DEPLETED,2009,0,0,0,0,0,0 +DEPLETIONS,2009,0,0,0,0,0,0 +DEPOSING,0,0,0,2009,0,0,0 +INVALID,2009,0,0,0,0,0,0 +INVALIDATING,2009,0,0,0,0,0,0 +INVENTED,0,2009,0,0,0,0,0 +INVENTIVE,0,2009,0,0,0,0,0 +INVESTIGATE,2009,0,0,0,0,0,0 +INVESTIGATION,2009,0,0,0,0,0,0 +IRRECONCILABLE,2009,0,0,0,0,0,0 +IRREGULAR,2009,0,0,0,0,0,0 +IRREPARABLE,2009,0,0,0,0,0,0 +IRREVOCABLE,0,0,0,2009,0,0,2009 +JOINDER,0,0,0,2009,0,0,0 +JUDICIARY,0,0,0,2009,0,0,0 +JURISDICTIONAL,0,0,0,2009,0,0,0 +JURIST,0,0,0,2009,0,0,0 +JURY,0,0,0,2009,0,0,0 +JUSTIFIABLE,2009,0,0,0,0,0,0 +DILIGENTLY,0,2009,0,0,0,0,0 +DIMINISHING,2009,0,0,0,0,0,0 +DISADVANTAGE,2009,0,0,0,0,0,0 +DISAFFILIATION,2009,0,0,2009,0,0,0 +DISAFFIRMS,0,0,0,2011,0,0,0 +DISAGREEING,2009,0,0,0,0,0,0 +DISALLOW,2009,0,0,0,0,0,0 +DISALLOWING,2009,0,0,0,0,0,0 +DISAPPEARANCES,2009,0,0,0,0,0,0 +DISAPPOINT,2009,0,0,0,0,0,0 +DISAPPOINTMENT,2009,0,0,0,0,0,0 +DISAPPROVALS,2009,0,0,0,0,0,0 +DISAPPROVING,2009,0,0,0,0,0,0 +DISASSOCIATIONS,2009,0,0,0,0,0,0 +DISASTROUSLY,2009,0,0,0,0,0,0 +DISAVOWING,2009,0,0,0,0,0,0 +GREATER,0,-2020,0,0,0,0,0 +GRIEVANCE,2009,0,0,0,0,0,0 +GUILTY,2009,0,0,0,0,0,0 +HAMPERED,2009,0,0,0,0,0,0 +HAPPILY,0,2009,0,0,0,0,0 +HARASSED,2009,0,0,0,0,0,0 +HARDSHIPS,2009,0,0,0,0,0,0 +HARMFULLY,2009,0,0,0,0,0,0 +HARSHER,2009,0,0,0,0,0,0 +HAZARD,2009,0,0,0,0,0,0 +NONJUDICIALLY,0,0,0,2011,0,0,0 +NONPERFORMANCE,2009,0,0,0,0,0,0 +HURT,2009,0,0,0,0,0,0 +DISFAVORED,2009,0,0,0,0,0,0 +DISGORGED,2009,0,0,0,0,0,0 +COMPLICATING,2009,0,0,0,0,0,0 +COMPLIMENTARY,0,2009,0,0,0,0,0 +COMPLY,0,0,0,0,0,0,2009 +MISSTATED,2009,0,0,0,0,0,0 +MISSTATING,2009,0,0,0,0,0,0 +MISTAKEN,2009,0,0,0,0,0,0 +MISTRIAL,2009,0,0,2009,0,0,0 +MISUNDERSTANDINGS,2009,0,0,0,0,0,0 +MISUSES,2009,0,0,0,0,0,0 +MONOPOLIZATION,2009,0,0,0,0,0,0 +MONOPOLIZING,2009,0,0,0,0,0,0 +MORATORIUMS,2009,0,0,0,0,0,0 +MOTIONS,0,0,0,2009,0,0,0 +SLOWDOWN,2009,0,0,0,0,0,0 +SLOWEST,2009,0,0,0,0,0,0 +SLUGGISH,2009,0,0,0,0,0,0 +SMOOTHING,0,2009,0,0,0,0,0 +DEPRESS,2009,0,0,0,0,0,0 +DEPRIVATION,2009,0,0,0,0,0,0 +DEPRIVING,2009,0,0,0,0,0,0 +DEROGATED,0,0,0,2009,0,0,0 +DEROGATIONS,0,0,0,2009,0,0,0 +DESIRED,0,2009,0,0,0,0,0 +DESTABILIZE,2009,0,0,0,0,0,0 +DESTROY,2009,0,0,0,0,0,0 +DESTRUCTION,2009,0,0,0,0,0,0 +DETAINER,0,0,0,2009,0,0,0 +DETERIORATE,2009,0,0,0,0,0,0 +DETERIORATION,2009,0,0,0,0,0,0 +DETERRENCES,2009,0,0,0,0,0,0 +DETERS,2009,0,0,0,0,0,0 +DETRIMENT,2009,0,0,0,0,0,0 +DEVALUE,2009,0,0,0,0,0,0 +DEVASTATE,2009,0,0,0,0,0,0 +DEVIATE,2009,0,2009,0,0,0,0 +DEVIATION,2009,0,2009,0,0,0,0 +DEVOLVED,2009,0,0,0,0,0,0 +DICTATED,0,0,0,0,0,0,2009 +DIFFERED,0,0,2009,0,0,0,0 +DIFFICULTIES,2009,0,0,0,0,0,0 +ASCENDANCY,0,0,0,2009,0,0,0 +ASSAULTED,2009,0,0,0,0,0,0 +ASSERTIONS,2009,0,0,0,0,0,0 +ASSUME,0,0,2009,0,0,0,0 +ASSUMPTION,0,0,2009,0,0,0,0 +ASSURES,0,2009,0,0,0,0,0 +ATTAINING,0,2009,0,0,0,0,0 +ATTEST,0,0,0,2009,0,0,0 +ATTESTING,0,0,0,2009,0,0,0 +ATTORNMENT,0,0,0,2009,0,0,0 +ATTRITION,2009,0,0,0,0,0,0 +BAIL,2009,0,0,2009,0,0,0 +BAILIFF,0,0,0,2009,0,0,0 +BALK,2009,0,0,0,0,0,0 +BANKRUPTCY,2009,0,0,0,0,0,0 +BANS,2009,0,0,0,0,0,0 +CLAIMABLE,0,0,0,2009,0,0,0 +CLAIMING,2009,0,0,0,0,0,0 +CLAWBACK,2009,0,0,0,0,0,0 +CLOSEOUT,2009,0,0,0,0,0,0 +CLOSURE,2009,0,0,0,0,0,0 +CODICIL,0,0,0,2009,0,0,0 +CODIFIED,0,0,0,2009,0,0,0 +COERCE,2009,0,0,0,0,0,0 +COERCION,2009,0,0,0,0,0,0 +COLLABORATING,0,2009,0,0,0,0,0 +COLLABORATOR,0,2009,0,0,0,0,0 +COLLAPSES,2009,0,0,0,0,0,0 +COLLUDE,2009,0,0,0,0,0,0 +COLLUSION,2009,0,0,2009,0,0,0 +POSING,2009,0,0,0,0,0,0 +POSSIBILITIES,0,0,2009,0,0,0,0 +POSTCLOSING,0,0,0,2011,0,0,0 +POSTPONE,2009,0,0,0,0,0,0 +POSTPONES,2009,0,0,0,0,0,0 +WRITEOFF,2009,0,0,0,0,0,0 +WRONGDOING,2009,0,0,0,0,0,0 +WRONGLY,2009,0,0,0,0,0,0 +HONORED,0,2009,0,0,0,0,0 +HOSTILITY,2009,0,0,0,0,0,0 +REASSESSED,0,0,2009,0,0,0,0 +REASSESSMENTS,2009,0,2009,0,0,0,0 +REASSIGNMENT,2009,0,0,0,0,0,0 +REBOUNDED,0,2009,0,0,0,0,0 +REBUTTABLE,0,0,0,2009,0,0,0 +REBUTTED,0,0,0,2009,0,0,0 +RECALCULATES,0,0,2009,0,0,0,0 +RECALL,2009,0,0,0,0,0,0 +RECEPTIVE,0,2009,0,0,0,0,0 +RECKLESS,2009,0,0,0,0,0,0 +RECONSIDERED,0,0,2009,0,0,0,0 +RECOUPABLE,0,0,0,2009,0,0,0 +RECOURSES,0,0,0,2009,0,0,0 +RECUSE,0,0,0,2011,0,0,0 +REDACT,2009,0,0,2009,0,0,0 +REDACTIONS,2009,0,0,2009,0,0,0 +REDRESS,2009,0,0,0,0,0,0 +REEXAMINATION,0,0,2009,0,0,0,0 +REFERENDUM,0,0,0,2009,0,0,0 +REFILES,0,0,0,2009,0,0,0 +REFRAINS,0,0,0,0,0,0,2009 +REFUSED,2009,0,0,0,0,0,0 +REGAINED,0,2009,0,0,0,0,0 +REGULATES,0,0,0,2009,0,0,0 +REGULATIVE,0,0,0,2009,0,0,0 +REHEAR,0,0,0,2009,0,0,0 +VARIABLE,0,0,2009,0,0,0,0 +VARIANCES,0,0,2009,0,0,0,0 +VARIATIONS,0,0,2009,0,0,0,0 +VARYING,0,0,2009,0,0,0,0 +VERDICTS,2009,0,0,2009,0,0,0 +VIATICAL,0,0,0,2011,0,0,0 +VIOLATE,2009,0,0,0,0,0,0 +VIOLATION,2009,0,0,0,0,0,0 +VIOLATORS,2009,0,0,0,0,0,0 +VITIATE,2009,0,0,0,0,0,0 +VITIATION,2009,0,0,0,0,0,0 +VOLATILE,2009,0,2009,0,0,0,0 +VULNERABILITY,2009,0,0,0,0,0,0 +WARNED,2009,0,0,0,0,0,0 +WARRANTEES,0,0,0,2011,0,0,0 +WASTING,2009,0,0,0,0,0,0 +WEAKENING,2009,0,0,0,0,0,0 +WEAKLY,2009,0,0,0,0,0,0 +DISHONESTY,2009,0,0,0,0,0,0 +DISHONORED,2009,0,0,0,0,0,0 +DISLOYAL,2009,0,0,0,0,0,0 +DISMALLY,2009,0,0,0,0,0,0 +DISMISSED,2009,0,0,0,0,0,0 +DISPARAGE,2009,0,0,0,0,0,0 +DISPARAGES,2009,0,0,0,0,0,0 +DISPARITY,2009,0,0,0,0,0,0 +DISPLACEMENTS,2009,0,0,0,0,0,0 +DISPOSITIVE,0,0,0,2009,0,0,0 +DISPOSSESSING,2009,0,0,0,0,0,0 +DISPROPORTIONAL,2009,0,0,0,0,0,0 +DISPUTED,2009,0,0,0,0,0,0 +DISQUALIFICATIONS,2009,0,0,0,0,0,0 +DISQUALIFYING,2009,0,0,0,0,0,0 +DISREGARDS,2009,0,0,0,0,0,0 +DISRUPTED,2009,0,0,0,0,0,0 +DISRUPTIVE,2009,0,0,0,0,0,0 +DISSENT,2009,0,0,0,0,0,0 +DISSENTING,2009,0,0,0,0,0,0 +DISSOLUTION,2009,0,0,0,0,0,0 +DISTINCTIVE,0,2009,0,0,0,0,0 +DISTORTED,2009,0,0,0,0,0,0 +DISTORTS,2009,0,0,0,0,0,0 +DISTRACTION,2009,0,0,0,0,0,0 +DISTRESS,2009,0,0,0,0,0,0 +DISTURB,2009,0,0,0,0,0,0 +DISTURBING,2009,0,0,0,0,0,0 +DIVERTED,2009,0,0,0,0,0,0 +DIVESTED,2009,0,0,0,0,0,0 +DIVESTMENT,2009,0,0,0,0,0,0 +DIVORCED,2009,0,0,0,0,0,0 +DIVULGING,2009,0,0,0,0,0,0 +DOCKETS,0,0,0,2009,0,0,0 +DOUBTFUL,2009,0,2009,0,0,0,0 +DOWNGRADES,2009,0,0,0,0,0,0 +DOWNSIZES,2009,0,0,0,0,0,0 +DOWNTIMES,2009,0,0,0,0,0,0 +DOWNWARDS,2009,0,0,0,0,0,0 +DRAWBACK,2009,0,0,0,0,0,0 +DROUGHT,2009,0,0,0,0,0,0 +DYSFUNCTION,2009,0,0,0,0,0,0 +EARMARKED,0,0,0,0,0,0,2009 +EASILY,0,2009,0,0,0,0,0 +EFFICIENCIES,0,2009,0,0,0,0,0 +EGREGIOUS,2009,0,0,0,0,0,0 +EMBARGOED,2009,0,0,0,0,0,0 +EMBARRASSED,2009,0,0,0,0,0,0 +EMBARRASSMENTS,2009,0,0,0,0,0,0 +EMBEZZLEMENTS,2009,0,0,0,0,0,0 +EMPOWER,0,2009,0,0,0,0,0 +ENABLE,0,2009,0,0,0,0,0 +ENCOURAGED,0,2009,0,0,0,0,0 +ENCROACH,2009,0,0,0,0,0,0 +ENCROACHMENT,2009,0,0,0,0,0,0 +ENCUMBERING,2009,0,0,2009,0,0,2009 +ENCUMBRANCERS,0,0,0,2011,0,0,0 +ENDANGERING,2009,0,0,0,0,0,0 +ENFORCEABILITY,0,0,0,2009,0,0,0 +ENHANCED,0,2009,0,0,0,0,0 +ENHANCING,0,2009,0,0,0,0,0 +ENJOINS,2009,0,0,0,0,0,0 +ENJOYED,0,2009,0,0,0,0,0 +ENTAIL,0,0,0,0,0,0,2009 +PECUNIARILY,0,0,0,2009,0,0,0 +PENALIZING,2009,0,0,0,0,0,0 +PERFECT,0,2009,0,0,0,0,0 +PERHAPS,0,0,2009,0,0,2009,0 +PERMISSIBLE,0,0,0,0,0,0,2009 +PERMITTEE,0,0,0,2011,0,0,0 +PERPETRATED,2009,0,0,2009,0,0,0 +PERSIST,2009,0,0,0,0,0,0 +PERSISTENTLY,2009,0,0,0,0,0,0 +PERVASIVE,2009,0,0,0,0,0,0 +PETITIONED,0,0,0,2009,0,0,0 +PETITIONS,0,0,0,2009,0,0,0 +PICKETING,2009,0,0,0,0,0,0 +HENCEFORWARD,0,0,0,2009,0,0,0 +HEREFOR,0,0,0,2009,0,0,0 +HEREINABOVE,0,0,0,2009,0,0,0 +HEREOF,0,0,0,2009,0,0,0 +HEREUNDER,0,0,0,2009,0,0,0 +HEREWITHIN,0,0,0,2014,0,0,0 +HINDERED,2009,0,0,0,0,0,0 +HINDRANCES,2009,0,0,0,0,0,0 +WHENSOEVER,0,0,0,2009,0,0,0 +WHEREBY,0,0,0,2009,0,0,0 +WHEREON,0,0,0,2009,0,0,0 +WHEREWITH,0,0,0,2009,0,0,0 +WHOSOEVER,0,0,0,2009,0,0,0 +WILLFULLY,2009,0,0,2009,0,0,0 +WINNERS,0,2009,0,0,0,0,0 +FLUCTUATING,0,0,2009,0,0,0,0 +FORBEAR,0,0,0,2009,0,0,0 +FORBEARS,0,0,0,2009,0,0,0 +FORBIDS,2009,0,0,0,0,0,2009 +FOREBEAR,0,0,0,2009,0,0,0 +FORECLOSED,2009,0,0,0,0,0,0 +FORECLOSURES,2009,0,0,0,0,0,0 +FORESTALL,2009,0,0,0,0,0,0 +FORFEIT,2009,0,0,0,0,0,0 +FORFEITING,2009,0,0,0,0,0,0 +FORGERS,2009,0,0,0,0,0,0 +FRAUD,2009,0,0,0,0,0,0 +FRAUDULENTLY,2009,0,0,0,0,0,0 +FRUSTRATE,2009,0,0,0,0,0,0 +FRUSTRATINGLY,2009,0,0,0,0,0,0 +FUGITIVES,2009,0,0,2009,0,0,0 +GAINING,0,2009,0,0,0,0,0 +GRANTORS,0,0,0,2009,0,0,0 +DISGRACE,2009,0,0,0,0,0,0 +LITIGANTS,2009,0,0,2009,0,0,0 +LITIGATING,2009,0,0,2009,0,0,0 +LITIGATORS,0,0,0,2009,0,0,0 +LACK,2009,0,0,0,0,0,0 +LACKS,2009,0,0,0,0,0,0 +LAGS,2009,0,0,0,0,0,0 +LAPSING,2009,0,0,0,0,0,0 +LAWFUL,0,0,0,2009,0,0,0 +LAWMAKING,0,0,0,2009,0,0,0 +LAWYER,0,0,0,2009,0,0,0 +LEADERSHIP,0,2009,0,0,0,0,0 +LEGALITY,0,0,0,2009,0,0,0 +LEGALIZED,0,0,0,2009,0,0,0 +LEGALS,0,0,0,2009,0,0,0 +FLAW,2009,0,0,0,0,0,0 +NONPRODUCTIVE,2009,0,0,0,0,0,0 +LIQUIDATED,2009,0,0,0,0,0,0 +LIQUIDATIONS,2009,0,0,0,0,0,0 +BENEFICIATED,0,0,0,2014,0,0,0 +BENEFITING,0,2009,0,0,0,0,0 +BETTER,0,2009,0,0,0,0,0 +POPULARITY,0,2009,0,0,0,0,0 +REINTERPRET,0,0,2009,0,0,0,0 +REINTERPRETING,0,0,2009,0,0,0,0 +REJECTING,2009,0,0,0,0,0,0 +RELEASEES,0,0,0,2011,0,0,0 +RELINQUISHING,2009,0,0,0,0,0,0 +RELUCTANT,2009,0,0,0,0,0,0 +REMANDS,0,0,0,2009,0,0,0 +REMEDIATION,0,0,0,2009,0,0,0 +RENEGOTIATE,2009,0,0,0,0,0,0 +RENEGOTIATION,2009,0,0,0,0,0,0 +RENOUNCEMENT,2009,0,0,0,0,0,0 +REPARATION,2009,0,0,0,0,0,0 +REPOSSESSED,2009,0,0,0,0,0,0 +REPOSSESSIONS,2009,0,0,0,0,0,0 +TROUBLE,2009,0,0,0,0,0,0 +TURMOIL,2009,0,0,0,0,0,0 +UNACCOUNTED,2009,0,0,0,0,0,0 +UNAPPEALABLE,0,0,0,2009,0,0,0 +UNAUTHORIZED,2009,0,0,0,0,0,0 +UNAVOIDABLY,2009,0,0,0,0,0,0 +UNCERTAINTIES,0,0,2009,0,0,0,0 +UNCOLLECTED,2009,0,0,0,0,0,0 +UNCOMPETITIVE,2009,0,0,0,0,0,0 +UNCONSCIONABLE,2009,0,0,0,0,0,0 +UNCONSTITUTIONALLY,0,0,0,2009,0,0,0 +UNCONTROLLED,2009,0,0,0,0,0,0 +UNCOVERING,2009,0,0,0,0,0,0 +UNDEFINED,0,0,2009,0,0,0,0 +UNDERCUT,2009,0,0,0,0,0,0 +UNDERESTIMATED,2009,0,0,0,0,0,0 +UNDERFUNDED,2009,0,0,0,0,0,0 +UNDERMINES,2009,0,0,0,0,0,0 +UNDERPAYMENTS,2009,0,0,0,0,0,0 +UNDERPERFORMED,2011,0,0,0,0,0,0 +UNDERPRODUCTION,2009,0,0,0,0,0,0 +UNDERSTATEMENT,2009,0,0,0,0,0,0 +UNDERUTILIZATION,2009,0,0,0,0,0,0 +UNDESIRED,2009,0,0,0,0,0,0 +UNDETERMINED,2009,0,2009,0,0,0,0 +UNDOCUMENTED,2009,0,2009,0,0,0,0 +UNECONOMIC,2009,0,0,0,0,0,0 +UNEMPLOYMENT,2009,0,0,0,0,0,0 +UNENFORCEABLE,0,0,0,2009,0,0,0 +UNETHICALLY,2009,0,0,0,0,0,0 +UNFAIR,2009,0,0,0,0,0,0 +UNFAVORABILITY,2014,0,0,0,0,0,0 +UNFEASIBLE,2009,0,0,0,0,0,0 +UNFORESEEABLE,2009,0,0,0,0,0,0 +UNFORTUNATELY,2009,0,0,0,0,0,0 +UNFUNDED,2009,0,0,0,0,0,0 +UNIDENTIFIED,0,0,2009,0,0,0,0 +UNINTENTIONALLY,2009,0,0,0,0,0,0 +UNJUSTIFIED,2009,0,0,0,0,0,0 +UNKNOWN,0,0,2009,0,0,0,0 +UNLAWFULNESS,0,0,0,2009,0,0,0 +UNMATCHED,0,2009,0,0,0,0,0 +UNNECESSARY,2009,0,0,0,0,0,0 +UNOCCUPIED,2009,0,0,0,0,0,0 +UNPLANNED,2009,0,2009,0,0,0,0 +UNPREDICTABLY,2009,0,2009,0,0,0,0 +UNPROFITABLE,2009,0,0,0,0,0,0 +UNQUANTIFIABLE,0,0,2011,0,0,0,0 +UNREASONABLENESS,2009,0,0,0,0,0,0 +UNRECOVERABLE,2009,0,0,0,0,0,0 +UNREMEDIATED,0,0,0,2011,0,0,0 +UNREST,2009,0,0,0,0,0,0 +UNSATISFACTORY,2009,0,0,0,0,0,0 +UNSEASONABLE,0,0,2009,0,0,0,0 +UNSOLD,2009,0,0,0,0,0,0 +UNSTABILIZED,2014,0,0,0,0,0,0 +UNSUCCESSFUL,2009,0,0,0,0,0,0 +UNSUITABLY,2009,0,0,0,0,0,0 +UNSUSPECTED,2009,0,0,0,0,0,0 +UNTESTED,0,0,2009,0,0,0,0 +UNTRUTH,2009,0,0,0,0,0,0 +UNTRUTHS,2009,0,0,0,0,0,0 +UNWANTED,2009,0,0,0,0,0,0 +UNWILLINGNESS,2009,0,0,0,0,0,0 +UPTURNS,0,2009,0,0,0,0,0 +USURP,2009,0,0,2009,0,0,0 +USURPS,2009,0,0,2009,0,0,0 +VAGUELY,0,0,2012,0,0,0,0 +VAGUEST,0,0,2012,0,0,0,0 +PLEA,2009,0,0,0,0,0,0 +PLEADINGS,2009,0,0,2009,0,0,0 +PLEASANTLY,0,2009,0,0,0,0,0 +PLEDGE,0,0,0,0,0,0,2009 +PLEDGES,0,0,0,0,0,0,2009 +PLENTIFUL,0,2009,0,0,0,0,0 +COMPELS,0,0,0,0,0,0,2009 +COMPLAINANTS,0,0,0,2009,0,0,0 +COMPLAINT,2009,0,0,0,0,0,0 +COMMIT,0,0,0,0,0,0,2009 +COMMITTED,0,0,0,0,0,0,2009 +LIMIT,0,0,0,0,0,0,2009 +LIMITS,0,0,0,0,0,0,2009 +RESTRAINED,0,0,0,0,0,0,2009 +RESTRAINTS,0,0,0,0,0,0,2009 +RESTRICTION,0,0,0,0,0,0,2009 +RESTRICTIVENESS,0,0,0,0,0,0,2009 +RESTRUCTURES,2009,0,0,0,0,0,0 +RETALIATED,2009,0,0,0,0,0,0 +RETALIATIONS,2009,0,0,0,0,0,0 +PRECAUTIONARY,0,0,2009,0,0,0,0 +PRECIPITOUSLY,2009,0,0,0,0,0,0 +PRECLUDING,2009,0,0,0,0,0,2009 +PREDECEASE,0,0,0,2009,0,0,0 +PREDICT,0,0,2009,0,0,0,0 +PREDICTION,0,0,2009,0,0,0,0 +PREDICTORS,0,0,2009,0,0,0,0 +PREHEARING,0,0,0,2011,0,0,0 +PREJUDICIAL,2009,0,0,2009,0,0,0 +PREMATURE,2009,0,0,0,0,0,0 +PREPETITION,0,0,0,2009,0,0,0 +PRESTIGIOUS,0,2009,0,0,0,0,0 +PRESUMES,0,0,2009,0,0,0,0 +PRESUMPTIVELY,0,0,0,2009,0,0,0 +PREVENTING,2009,0,0,0,0,0,2009 +PRIVITY,0,0,0,2011,0,0,0 +PROBABILITIES,0,0,2009,0,0,0,0 +PROBATE,0,0,0,2009,0,0,0 +PROBATION,0,0,0,2009,0,0,0 +PROBATIONERS,0,0,0,2009,0,0,0 +PROBLEMATICAL,2009,0,0,0,0,0,0 +PROFICIENTLY,0,2009,0,0,0,0,0 +PROGRESS,0,2009,0,0,0,0,0 +PROHIBIT,0,0,0,0,0,0,2009 +PROHIBITIONS,0,0,0,0,0,0,2009 +PROHIBITS,0,0,0,0,0,0,2009 +PROLONGED,2009,0,0,0,0,0,0 +PROMULGATED,0,0,0,2009,0,0,0 +PROMULGATIONS,0,0,0,2009,0,0,0 +PRORATA,0,0,0,2009,0,0,0 +PROSECUTES,2009,0,0,2009,0,0,0 +PROSECUTOR,0,0,0,2009,0,0,0 +PROSPERING,0,2009,0,0,0,0,0 +PROTEST,2009,0,0,0,0,0,0 +PROTESTING,2009,0,0,0,0,0,0 +PROTRACTED,2009,0,0,0,0,0,0 +PROVISOS,0,0,0,2009,0,0,0 +PROVOKING,2009,0,0,0,0,0,0 +PUNISHING,2009,0,0,0,0,0,0 +PURPORT,2009,0,0,0,0,0,0 +PURPORTS,2009,0,0,0,0,0,0 +QUESTIONED,2009,0,0,0,0,0,0 +QUITCLAIM,0,0,0,2009,0,0,0 +RACKETEERING,2009,0,0,0,0,0,0 +RANDOMIZES,0,0,2009,0,0,0,0 +RATA,0,0,0,2009,0,0,0 +RATIONALIZATIONS,2009,0,0,0,0,0,0 +RATIONALIZING,2009,0,0,0,0,0,0 +ABANDON,2009,0,0,0,0,0,0 +ABANDONMENTS,2009,0,0,0,0,0,0 +ABDICATING,2009,0,0,0,0,0,0 +ABERRATION,2009,0,0,0,0,0,0 +ABEYANCE,0,0,2009,0,0,0,0 +ABLE,0,2009,0,0,0,0,0 +ABNORMALLY,2009,0,0,0,0,0,0 +ABOLISHING,2009,0,0,0,0,0,0 +ABROGATES,2009,0,0,2009,0,0,0 +ABRUPT,2009,0,0,0,0,0,0 +ABSENCES,2009,0,0,0,0,0,0 +ABSOLVES,0,0,0,2009,0,0,0 +ABUSE,2009,0,0,0,0,0,0 +ABUSIVE,2009,0,0,0,0,0,0 +ACCESSIONS,0,0,0,2009,0,0,0 +ACCIDENTS,2009,0,0,0,0,0,0 +ACCOMPLISHES,0,2009,0,0,0,0,0 +ACCUSATION,2009,0,0,0,0,0,0 +ACCUSES,2009,0,0,0,0,0,0 +ACHIEVEMENT,0,2009,0,0,0,0,0 +ACQUIESCE,2009,0,0,0,0,0,0 +ACQUIREES,0,0,0,2011,0,0,0 +ACQUITTAL,2009,0,0,2009,0,0,0 +ACQUITTED,2009,0,0,2009,0,0,0 +ADJOURN,0,0,0,2009,0,0,0 +ADJOURNMENTS,0,0,0,2009,0,0,0 +ADJUDGES,0,0,0,2009,0,0,0 +ADJUDICATES,0,0,0,2009,0,0,0 +ADJUDICATIVE,0,0,0,2009,0,0,0 +ADMISSIBILITY,0,0,0,2009,0,0,0 +ADMISSIONS,0,0,0,2009,0,0,0 +ADULTERATION,2009,0,0,0,0,0,0 +ADVANCES,0,2009,0,0,0,0,0 +ADVANTAGEOUS,0,2009,0,0,0,0,0 +ADVERSARIES,2009,0,0,0,0,0,0 +ADVERSITIES,2009,0,0,0,0,0,0 +AFFIRMANCE,0,0,0,2011,0,0,0 +AFORESAID,0,0,0,2009,0,0,0 +AGAINST,2009,0,0,0,0,0,0 +AGGRAVATING,2009,0,0,0,0,0,0 +ALERTED,2009,0,0,0,0,0,0 +ALIENATES,2009,0,0,0,0,0,0 +ALLEGATION,2009,0,0,2009,0,0,0 +ALLEGEDLY,2009,0,0,2009,0,0,0 +ALLIANCES,0,2009,0,0,0,0,0 +ALWAYS,0,0,0,0,2009,0,0 +AMEND,0,0,0,2009,0,0,0 +AMENDING,0,0,0,2009,0,0,0 +ANNOY,2009,0,0,0,0,0,0 +ANNOYING,2009,0,0,0,0,0,0 +ANNULLING,2009,0,0,0,0,0,0 +ANOMALIES,2009,0,2009,0,0,0,0 +ANTECEDENT,0,0,0,2009,0,0,0 +ANTICIPATES,0,0,2009,0,0,0,0 +ANTICOMPETITIVE,2009,0,0,0,0,0,0 +APPARENT,0,0,2009,0,0,0,0 +APPEALED,0,0,0,2009,0,0,0 +APPEARED,0,0,2009,0,0,2009,0 +APPELLANTS,0,0,0,2009,0,0,0 +APPROXIMATE,0,0,2009,0,0,0,0 +APPROXIMATING,0,0,2009,0,0,0,0 +APPURTENANCES,0,0,0,2009,0,0,0 +ARBITRARILY,0,0,2009,0,0,0,0 +ARBITRATED,0,0,0,2009,0,0,0 +ARBITRATIONAL,0,0,0,2011,0,0,0 +ARBITRATORS,0,0,0,2009,0,0,0 +ARGUMENT,2009,0,0,0,0,0,0 +ARREARAGES,2009,0,0,2009,0,0,0 +ARRESTS,2009,0,0,0,0,0,0 +RETROCEDED,0,0,0,2011,0,0,0 +BOLSTERING,0,2009,0,0,0,0,0 +BOOM,0,2009,0,0,0,0,0 +BOTTLENECK,2009,0,0,0,0,0,0 +BOYCOTT,2009,0,0,0,0,0,0 +BREACH,2009,0,0,2009,0,0,0 +BREAK,2009,0,0,0,0,0,0 +BREAKDOWNS,2009,0,0,0,0,0,0 +BREAKTHROUGHS,0,2009,0,0,0,0,0 +BRIBERY,2009,0,0,0,0,0,0 +BRILLIANT,0,2009,0,0,0,0,0 +BURDENING,2009,0,0,0,0,0,0 +CALAMITIES,2009,0,0,0,0,0,0 +CANCELED,2009,0,0,0,0,0,0 +CANCELLED,2009,0,0,0,0,0,0 +CARELESSLY,2009,0,0,0,0,0,0 +CATASTROPHES,2009,0,0,0,0,0,0 +CAUTIONARY,2009,0,0,0,0,0,0 +CAUTIOUS,0,0,2009,0,0,0,0 +CEASED,2009,0,0,0,0,0,0 +CEDANTS,0,0,0,2012,0,0,0 +CENSURING,2009,0,0,0,0,0,0 +CHALLENGED,2009,0,0,0,0,0,0 +CHARITABLE,0,2009,0,0,0,0,0 +CIRCUMVENT,2009,0,0,0,0,0,0 +CIRCUMVENTIONS,2009,0,0,0,0,0,0 +SHORTAGE,2009,0,0,0,0,0,0 +SHRINKAGE,2009,0,0,0,0,0,0 +SHUTDOWNS,2009,0,0,0,0,0,0 +SLANDERED,2009,0,0,0,0,0,0 +REPUDIATES,2009,0,0,0,0,0,0 +REQUESTER,0,0,0,2011,0,0,0 +REQUIREMENT,0,0,0,0,0,0,2009 +REREGULATION,0,0,0,2011,0,0,0 +RESCINDS,0,0,0,2009,0,0,0 +RESIGNATION,2009,0,0,0,0,0,0 +RESIGNS,2009,0,0,0,0,0,0 +RESTATEMENT,2009,0,0,0,0,0,0 +RESTITUTIONARY,0,0,0,2011,0,0,0 +NOTARIAL,0,0,0,2009,0,0,0 +NOTARIZE,0,0,0,2009,0,0,0 +NOTWITHSTANDING,0,0,0,2009,0,0,0 +NULLIFICATION,2009,0,0,2009,0,0,0 +NULLIFY,2009,0,0,2009,0,0,0 +OBJECTED,2009,0,0,0,0,0,0 +OBJECTIONABLY,2009,0,0,0,0,0,0 +OBLIGATES,0,0,0,0,0,0,2009 +OBLIGATORY,0,0,0,0,0,0,2009 +OBLIGEES,0,0,0,2011,0,0,0 +OBSCENE,2009,0,0,0,0,0,0 +OBSTACLE,2009,0,0,0,0,0,0 +OBSTRUCTING,2009,0,0,0,0,0,0 +OFFENCE,2009,0,0,0,0,0,0 +OFFENDER,2009,0,0,0,0,0,0 +OFFENSE,0,0,0,2009,0,0,0 +OFFERORS,0,0,0,2011,0,0,0 +OMITS,2009,0,0,0,0,0,0 +OPPORTUNISTIC,2009,0,0,0,0,0,0 +OPPOSE,2009,0,0,0,0,0,0 +OPPOSITION,2009,0,0,0,0,0,0 +OPTIONEES,0,0,0,2009,0,0,0 +OUTDATED,2009,0,0,0,0,0,0 +OUTPERFORMING,0,2009,0,0,0,0,0 +OVERBUILD,2009,0,0,0,0,0,0 +OVERBURDEN,2009,0,0,0,0,0,0 +OVERCAPACITY,2009,0,0,0,0,0,0 +OVERCHARGING,2009,0,0,0,0,0,0 +OVERDUE,2009,0,0,0,0,0,0 +OVERESTIMATING,2009,0,0,0,0,0,0 +OVERLOADED,2009,0,0,0,0,0,0 +OVERLOOKED,2009,0,0,0,0,0,0 +OVERPAYMENT,2009,0,0,0,0,0,0 +OVERPRODUCING,2009,0,0,0,0,0,0 +OVERRULES,0,0,0,2009,0,0,0 +OVERRUNS,2009,0,0,0,0,0,0 +OVERSHADOWS,2009,0,0,0,0,0,0 +OVERSTATEMENTS,2009,0,0,0,0,0,0 +OVERSUPPLIES,2009,0,0,0,0,0,0 +OVERTURN,2009,0,0,0,0,0,0 +OVERVALUE,2009,0,0,0,0,0,0 +PANICS,2009,0,0,0,0,0,0 +NECESSITATE,0,0,0,0,0,0,2009 +NEGATIVE,2009,0,0,0,0,0,0 +NEGLECTED,2009,0,0,0,0,0,0 +NEGLIGENCE,2009,0,0,0,0,0,0 +NEVER,0,0,0,0,2009,0,0 +BARRIERS,2009,0,0,0,0,0,0 +BELIEVED,0,0,2009,0,0,0,0 +IDLING,2009,0,0,0,0,0,0 +IGNORING,2009,0,0,0,0,0,0 +ILLEGALITY,2009,0,0,0,0,0,0 +ILLICITLY,2009,0,0,0,0,0,0 +IMBALANCES,2009,0,0,0,0,0,0 +IMPAIR,2009,0,0,0,0,0,2011 +IMPAIRMENTS,2009,0,0,0,0,0,2011 +IMPEDE,2009,0,0,0,0,0,0 +IMPEDIMENTS,2009,0,0,0,0,0,0 +IMPERFECTION,2009,0,0,0,0,0,0 +IMPLEADED,0,0,0,2009,0,0,0 +IMPLICATING,2009,0,0,0,0,0,0 +IMPOSING,0,0,0,0,0,0,2009 +IMPOSSIBLE,2009,0,0,0,0,0,0 +IMPOUNDS,2009,0,0,0,0,0,0 +IMPRACTICALITY,2009,0,0,0,0,0,0 +IMPRESS,0,2009,0,0,0,0,0 +IMPRESSIVE,0,2009,0,0,0,0,0 +IMPROBABLE,0,0,2009,0,0,0,0 +IMPROPRIETY,2009,0,0,0,0,0,0 +IMPROVEMENTS,0,2009,0,0,0,0,0 +IMPRUDENTLY,2009,0,0,0,0,0,0 +INACCURACY,2009,0,0,0,0,0,0 +INACTIONS,2009,0,0,0,0,0,0 +INACTIVATING,2009,0,0,0,0,0,0 +INADEQUACIES,2009,0,0,0,0,0,0 +INADVERTENT,2009,0,0,0,0,0,0 +INAPPROPRIATE,2009,0,0,0,0,0,0 +INCAPABLE,2009,0,0,0,0,0,0 +INCARCERATED,2009,0,0,2009,0,0,0 +INCARCERATIONS,2009,0,0,2009,0,0,0 +INCIDENT,2009,0,0,0,0,0,0 +INCOMPATIBLE,2009,0,0,0,0,0,0 +INCOMPETENTLY,2009,0,0,0,0,0,0 +INCOMPLETENESS,2009,0,2009,0,0,0,0 +INCONSISTENT,2009,0,0,0,0,0,0 +INCONVENIENCE,2009,0,0,0,0,0,0 +INCORRECTLY,2009,0,0,0,0,0,0 +INDEBTED,0,0,0,0,0,0,2009 +INDEFEASIBLY,2009,0,0,0,0,0,0 +INDEMNIFIABLE,0,0,0,2009,0,0,0 +INDEMNIFIES,0,0,0,2009,0,0,0 +INDEMNITEES,0,0,0,2009,0,0,0 +INDEMNITY,0,0,0,2009,0,0,0 +INDICTABLE,2009,0,0,2009,0,0,0 +INDICTMENTS,2009,0,0,2009,0,0,0 +INEFFECTIVENESS,2009,0,0,0,0,0,0 +INEFFICIENTLY,2009,0,0,0,0,0,0 +INEQUITABLY,2009,0,0,0,0,0,0 +INEXACT,0,0,2009,0,0,0,0 +INFERIOR,2009,0,0,0,0,0,0 +INFORMATIVE,0,2009,0,0,0,0,0 +INFRINGED,2009,0,0,0,0,0,0 +INFRINGES,2009,0,0,0,0,0,0 +INHIBITED,2009,0,0,0,0,0,2009 +INJUNCTION,2009,0,0,2009,0,0,0 +INJURED,2009,0,0,0,0,0,0 +INJURIOUS,2009,0,0,0,0,0,0 +INNOVATES,0,2009,0,0,0,0,0 +INNOVATIVE,0,2009,0,0,0,0,0 +INORDINATE,2009,0,0,0,0,0,0 +INSENSITIVE,2009,0,0,0,0,0,0 +INSISTENCE,0,0,0,0,0,0,2009 +INSOLVENCIES,2009,0,0,0,0,0,0 +INSPIRATIONAL,0,2009,0,0,0,0,0 +INSUFFICIENCY,2009,0,0,0,0,0,0 +INSURRECTIONS,2009,0,0,0,0,0,0 +INTENTIONAL,2009,0,0,0,0,0,0 +INTERFERENCES,2009,0,0,0,0,0,0 +INTERMITTENT,2009,0,0,0,0,0,0 +INTERPOSED,0,0,0,2009,0,0,0 +INTERPOSITIONS,0,0,0,2009,0,0,0 +INTERROGATING,0,0,0,2009,0,0,0 +INTERROGATORIES,0,0,0,2009,0,0,0 +INTERRUPTED,2009,0,0,0,0,0,0 +INTERRUPTS,2009,0,0,0,0,0,0 +STABILITY,0,2009,0,0,0,0,0 +STABILIZED,0,2009,0,0,0,0,0 +STAGGERING,2009,0,0,0,0,0,0 +STAGNATES,2009,0,0,0,0,0,0 +STANDSTILLS,2009,0,0,0,0,0,0 +STATUTORY,0,0,0,2009,0,0,0 +STIPULATING,0,0,0,0,0,0,2009 +STOPPAGE,2009,0,0,0,0,0,0 +STOPS,2009,0,0,0,0,0,0 +STRAINS,2009,0,0,0,0,0,0 +STRENGTHENING,0,2009,0,0,0,0,0 +STRESSED,2009,0,0,0,0,0,0 +STRICT,0,0,0,0,0,0,2009 +STRINGENT,2009,0,0,0,0,0,0 +STRONGLY,0,0,0,0,2009,0,0 +SUBJECTED,2009,0,0,0,0,0,0 +SUBLEASEHOLD,0,0,0,2011,0,0,0 +SUBPARAGRAPH,0,0,0,2009,0,0,0 +SUBPOENAS,2009,0,0,2009,0,0,0 +SUBTRUST,0,0,0,2011,0,0,0 +SUCCEEDING,0,2009,0,0,0,0,0 +SUCCESSFUL,0,2009,0,0,0,0,0 +SUE,2009,0,0,2009,0,0,0 +SUFFERED,2009,0,0,0,0,0,0 +SUGGESTED,0,0,2009,0,0,0,0 +SUMMONED,2009,0,0,2009,0,0,0 +SUPERIOR,0,2009,0,0,0,0,0 +SUPERSEDES,0,0,0,2009,0,0,0 +SURPASS,0,2009,0,0,0,0,0 +SUSCEPTIBILITY,2009,0,2009,0,0,0,0 +SUSPECTS,2009,0,0,0,0,0,0 +SUSPENDS,2009,0,0,0,0,0,0 +SUSPICIONS,2009,0,0,0,0,0,0 +REVOCABILITY,0,0,0,2011,0,0,0 +REVOKED,2009,0,0,0,0,0,0 +REVOLUTIONIZED,0,2009,0,0,0,0,0 +REWARDED,0,2009,0,0,0,0,0 +RIDICULED,2009,0,0,0,0,0,0 +RISKED,0,0,2009,0,0,0,0 +RISKING,0,0,2009,0,0,0,0 +RULING,0,0,0,2009,0,0,0 +SACRIFICE,2009,0,0,0,0,0,0 +SACRIFICING,2009,0,0,0,0,0,0 +SATISFIED,0,2009,0,0,0,0,0 +SCANDALOUS,2009,0,0,0,0,0,0 +SCRUTINIZES,2009,0,0,0,0,0,0 +SEEMS,0,0,2009,0,0,0,0 +SEIZING,2009,0,0,0,0,0,0 +SENTENCING,2009,0,0,2009,0,0,0 +SERIOUSNESS,2009,0,0,0,0,0,0 +SETTLEMENTS,0,0,0,2009,0,0,0 +SEVERALLY,0,0,0,2009,0,0,0 +SEVERED,2009,0,0,0,0,0,0 +ENTHUSIASTICALLY,0,2009,0,0,0,0,0 +ERODED,2009,0,0,0,0,0,0 +ERRATIC,2009,0,0,0,0,0,0 +ERRONEOUS,2009,0,0,0,0,0,0 +ERRS,2009,0,0,0,0,0,0 +ESCALATING,2009,0,0,0,0,0,0 +ESCROW,0,0,0,0,0,0,2009 +ESTOPPEL,0,0,0,2011,0,0,0 +EVADING,2009,0,0,0,0,0,0 +EVICT,2009,0,0,0,0,0,0 +EVICTIONS,2009,0,0,0,0,0,0 +EXACERBATE,2009,0,0,0,0,0,0 +EXACERBATION,2009,0,0,0,0,0,0 +EXAGGERATES,2009,0,0,0,0,0,0 +EXCEEDANCES,0,0,0,2011,0,0,0 +EXCELLING,0,2009,0,0,0,0,0 +EXCESSIVE,2009,0,0,0,0,0,0 +EXCITEMENT,0,2009,0,0,0,0,0 +EXCLUSIVENESS,0,2009,0,0,0,0,0 +EXCULPATED,2009,0,0,2009,0,0,0 +EXCULPATIONS,2009,0,0,2009,0,0,0 +EXECUTORY,0,0,0,2009,0,0,0 +EXEMPLARY,0,2009,0,0,0,0,0 +EXONERATING,2009,0,0,0,0,0,0 +EXPLOITATION,2009,0,0,0,0,0,0 +EXPLOITING,2009,0,0,0,0,0,0 +EXPOSES,2009,0,0,0,0,0,0 +EXPROPRIATE,2009,0,0,0,0,0,0 +EXPROPRIATION,2009,0,0,0,0,0,0 +EXTENUATING,2009,0,0,0,0,0,0 +SOLVING,0,2009,0,0,0,0,0 +SOMEWHERE,0,0,2009,0,0,0,0 +LOSE,2009,0,0,0,0,0,0 +LOSSES,2009,0,0,0,0,0,0 +LUCRATIVE,0,2009,0,0,0,0,0 +MALFUNCTION,2009,0,0,0,0,0,0 +MALICE,2009,0,0,0,0,0,0 +MANDAMUS,0,0,0,2009,0,0,0 +MANDATING,0,0,0,0,0,0,2009 +MANIPULATED,2009,0,0,0,0,0,0 +MANIPULATIONS,2009,0,0,0,0,0,0 +MAY,0,0,2009,0,0,2009,0 +MEDIATES,0,0,0,2009,0,0,0 +MEDIATOR,0,0,0,2009,0,0,0 +MISAPPLICATION,2009,0,0,0,0,0,0 +MISAPPLY,2009,0,0,0,0,0,0 +MISAPPROPRIATES,2009,0,0,0,0,0,0 +MISBRANDED,2009,0,0,0,0,0,0 +MISCALCULATING,2009,0,0,0,0,0,0 +MISCHIEF,2009,0,0,0,0,0,0 +MISCLASSIFY,2014,0,0,0,0,0,0 +MISDEMEANOR,2009,0,0,2009,0,0,0 +MISHANDLE,2009,0,0,0,0,0,0 +MISINFORM,2009,0,0,0,0,0,0 +MISINFORMS,2009,0,0,0,0,0,0 +MISINTERPRETED,2009,0,0,0,0,0,0 +MISJUDGED,2009,0,0,0,0,0,0 +MISJUDGMENTS,2009,0,0,0,0,0,0 +MISLABELLED,2009,0,0,0,0,0,0 +MISLEADINGLY,2009,0,0,0,0,0,0 +MISMANAGED,2009,0,0,0,0,0,0 +MISMATCH,2009,0,0,0,0,0,0 +MISPLACED,2009,0,0,0,0,0,0 +MISREPRESENT,2009,0,0,0,0,0,0 +MISREPRESENTING,2009,0,0,0,0,0,0 +MISSES,2009,0,0,0,0,0,0 +WORRY,2009,0,0,0,0,0,0 +WORSENED,2009,0,0,0,0,0,0 +WORTHLESS,2009,0,0,0,0,0,0 +TOLERATE,2009,0,0,0,0,0,0 +TOLERATION,2009,0,0,0,0,0,0 +TORTS,0,0,0,2009,0,0,0 +FICTITIOUS,2009,0,0,0,0,0,0 +FIRED,2009,0,0,0,0,0,0 +NONATTAINMENT,2009,0,0,0,0,0,0 +NONCOMPETITIVE,2009,0,0,0,0,0,0 +NONCOMPLYING,2009,0,0,0,0,0,0 +NONCONTINGENT,0,0,0,2011,0,0,0 +NONDISCLOSURE,2009,0,0,0,0,0,0 +NONFORFEITABLE,0,0,0,2009,0,0,0 +DISCLAIM,2009,0,0,0,0,0,0 +DISCLAIMING,2009,0,0,0,0,0,0 +DISCLOSES,2009,0,0,0,0,0,0 +DISCONTINUATION,2009,0,0,0,0,0,0 +DISCONTINUES,2009,0,0,0,0,0,0 +DISCOURAGES,2009,0,0,0,0,0,0 +DISCREDITING,2009,0,0,0,0,0,0 +SPECTACULAR,0,2009,0,0,0,0,0 +SPECULATES,0,0,2009,0,0,0,0 +SPECULATIVE,0,0,2009,0,0,0,0 +TRAGEDIES,2009,0,0,0,0,0,0 +TRANSFEROR,0,0,0,2009,0,0,0 +LEGISLATES,0,0,0,2009,0,0,0 +LEGISLATIVE,0,0,0,2009,0,0,0 +LEGISLATURE,0,0,0,2009,0,0,0 +LIBELOUS,0,0,0,2009,0,0,0 +LIENHOLDERS,0,0,0,2011,0,0,0 +COMPULSORY,0,0,0,0,0,0,2009 +CONCEDED,2009,0,0,0,0,0,0 +CONCEIVABLY,0,0,2009,0,0,0,0 +CONCILIATING,2009,0,0,0,0,0,0 +CONCLUSIVELY,0,2009,0,0,0,0,0 +CONDEMNED,2009,0,0,0,0,0,0 +CONDITIONAL,0,0,2009,0,0,0,0 +CONDUCIVE,0,2009,0,0,0,0,0 +CONFESSING,2009,0,0,0,0,0,0 +CONFINED,2009,0,0,0,0,0,2009 +CONFINING,2009,0,0,0,0,0,2009 +CONFISCATING,2009,0,0,0,0,0,0 +CONFLICT,2009,0,0,0,0,0,0 +CONFRONT,2009,0,0,0,0,0,0 +CONFRONTED,2009,0,0,0,0,0,0 +CONFUSED,2009,0,0,0,0,0,0 +CONFUSION,2009,0,2009,0,0,0,0 +CONSENTS,0,0,0,2009,0,0,0 +CONSPIRATOR,2009,0,0,0,0,0,0 +CONSPIRED,2009,0,0,0,0,0,0 +CONSTITUTIONAL,0,0,0,2009,0,0,0 +CONSTITUTIVE,0,0,0,2009,0,0,0 +CONSTRAINS,0,0,0,0,0,0,2009 +CONSTRUCTIVELY,0,2009,0,0,0,0,0 +CONSTRUING,0,0,0,2012,0,0,0 +CONTENDING,2009,0,0,0,0,0,0 +CONTENTIOUS,2009,0,0,0,0,0,0 +CONTESTED,2009,0,0,0,0,0,0 +CONTINGENT,0,0,2009,0,0,0,0 +CONTRACTED,0,0,0,2009,0,0,0 +CONTRACTILE,0,0,0,2009,0,0,0 +CONTRACTS,0,0,0,2009,0,0,0 +CONTRADICTED,2009,0,0,0,0,0,0 +CONTRADICTORY,2009,0,0,0,0,0,0 +CONTRAVENED,0,0,0,2009,0,0,0 +CONTRAVENTIONS,0,0,0,2009,0,0,0 +CONTROVERT,0,0,0,2009,0,0,0 +CONVEYANCE,0,0,0,2009,0,0,0 +CONVICTING,2009,0,0,2009,0,0,0 +CORRECTING,2009,0,0,0,0,0,0 +CORRUPT,2009,0,0,0,0,0,0 +CORRUPTIONS,2009,0,0,0,0,0,0 +COTERMINOUS,0,0,0,2009,0,0,0 +COUNSELLED,0,0,0,2009,0,0,0 +COUNTERCLAIMING,2009,0,0,0,0,0,0 +COUNTERFEITER,2009,0,0,0,0,0,0 +COUNTERMEASURE,2009,0,0,0,0,0,0 +COUNTERSUIT,0,0,0,2011,0,0,0 +COURTROOM,0,0,0,2009,0,0,0 +COVENANTING,0,0,0,0,0,0,2011 +CREATIVENESS,0,2009,0,0,0,0,0 +CRIMINAL,2009,0,0,2009,0,0,0 +CRIMINALLY,2009,0,0,2009,0,0,0 +CRITICAL,-2020,0,0,0,0,0,0 +CRITICIZE,2009,0,0,0,0,0,0 +CROSSCLAIM,0,0,0,2011,0,0,0 +CRUCIAL,2009,0,0,0,0,0,0 +CULPABLY,2009,0,0,0,0,0,0 +CURTAILING,2009,0,0,0,0,0,0 +CUT,2009,0,0,0,0,0,0 +CYBERATTACKS,2014,0,0,0,0,0,0 +CYBERCRIMINAL,2014,0,0,0,0,0,0 +TAINT,2009,0,0,0,0,0,0 +TAMPERED,2009,0,0,0,0,0,0 +TENTATIVE,0,0,2009,0,0,0,0 +TERMINATED,2009,0,0,0,0,0,0 +TERMINATIONS,2009,0,0,0,0,0,0 +TESTIFYING,2009,0,0,2009,0,0,0 +THENCEFORWARD,0,0,0,2009,0,0,0 +THEREIN,0,0,0,2009,0,0,0 +THEREOVER,0,0,0,2011,0,0,0 +THEREUNDER,0,0,0,2009,0,0,0 +THREAT,2009,0,0,0,0,0,0 +THREATENS,2009,0,0,0,0,0,0 +FACTO,0,0,0,2011,0,0,0 +FAILINGS,2009,0,0,0,0,0,0 +FALLOUT,2009,0,0,0,0,0,0 +FALSIFICATIONS,2009,0,0,0,0,0,0 +FALSIFYING,2009,0,0,0,0,0,0 +FATALITY,2009,0,0,0,0,0,0 +FAULTS,2009,0,0,0,0,0,0 +FAVORED,0,2009,0,0,0,0,0 +FEAR,2009,0,0,0,0,0,0 +FELONY,2009,0,0,2009,0,0,0 +DAMAGING,2009,0,0,0,0,0,0 +DANGEROUS,2009,0,0,0,0,0,0 +DEADLOCKED,2009,0,0,0,0,0,0 +DEADWEIGHTS,2009,0,0,0,0,0,0 +DECEASED,2009,0,0,0,0,0,0 +DECEITFUL,2009,0,0,0,0,0,0 +DECEIVES,2009,0,0,0,0,0,0 +DECEPTIVE,2009,0,0,0,0,0,0 +DECLINED,2009,0,0,0,0,0,0 +DECREED,0,0,0,2009,0,0,0 +DEFACED,2009,0,0,0,0,0,0 +DEFAMATION,2009,0,0,0,0,0,0 +DEFAMED,2009,0,0,0,0,0,0 +DEFAULTED,2009,0,0,0,0,0,0 +DEFEASANCES,0,0,0,2011,0,0,0 +DEFEASES,0,0,0,2014,0,0,0 +DEFEATING,2009,0,0,0,0,0,0 +DEFECTIVELY,0,0,0,2009,0,0,0 +DEFENDANT,2009,0,0,2009,0,0,0 +DEFENDS,2009,0,0,0,0,0,0 +DEFICIENCIES,2009,0,0,0,0,0,0 +DEFICITS,2009,0,0,0,0,0,0 +DEFRAUDED,2009,0,0,0,0,0,0 +DEGRADATION,2009,0,0,0,0,0,0 +DEGRADES,2009,0,0,0,0,0,0 +DELAYING,2009,0,0,0,0,0,0 +DELEGATEE,0,0,0,2011,0,0,0 +DELIBERATED,2009,0,0,0,0,0,0 +DELIGHTFUL,0,2009,0,0,0,0,0 +DELINQUENCIES,2009,0,0,0,0,0,0 +DELINQUENTS,2009,0,0,0,0,0,0 +DELISTS,2011,0,0,0,0,0,0 +DEMISING,2009,0,0,0,0,0,0 +DEMOLISHING,2009,0,0,0,0,0,0 +DEMOTED,2009,0,0,0,0,0,0 +DEMOTIONS,2009,0,0,0,0,0,0 +DEMURRING,0,0,0,2009,0,0,0 +DENIED,2009,0,0,0,0,0,0 +DENIGRATES,2009,0,0,0,0,0,0 +DENYING,2009,0,0,0,0,0,0 +DEPENDANCE,0,0,0,0,0,0,2011 +DEPENDENCE,0,0,2009,0,0,0,0 +DEPENDING,0,0,2009,0,0,2009,2011 +DEPLETES,2009,0,0,0,0,0,0 +DEPOSE,0,0,0,2009,0,0,0 +DEPOSITION,0,0,0,2009,0,0,0 +INVALIDATE,2009,0,0,0,0,0,0 +INVALIDATION,2009,0,0,0,0,0,0 +INVENTING,0,2009,0,0,0,0,0 +INVENTIVENESS,0,2009,0,0,0,0,0 +INVESTIGATED,2009,0,0,0,0,0,0 +INVESTIGATIONS,2009,0,0,0,0,0,0 +IRRECONCILABLY,2009,0,0,0,0,0,0 +IRREGULARITIES,2009,0,0,0,0,0,0 +IRREPARABLY,2009,0,0,0,0,0,0 +IRREVOCABLY,0,0,0,2009,0,0,2009 +JUDICIAL,0,0,0,2009,0,0,0 +JURIES,0,0,0,2009,0,0,0 +JURISDICTIONALLY,0,0,0,2011,0,0,0 +JURISTS,0,0,0,2009,0,0,0 +JURYMAN,0,0,0,2009,0,0,0 +KICKBACK,2009,0,0,0,0,0,0 +DIMINISH,2009,0,0,0,0,0,0 +DIMINUTION,2009,0,0,0,0,0,0 +DISADVANTAGED,2009,0,0,0,0,0,0 +DISAFFIRM,0,0,0,2009,0,0,0 +DISAGREE,2009,0,0,0,0,0,0 +DISAGREEMENT,2009,0,0,0,0,0,0 +DISALLOWANCE,2009,0,0,0,0,0,0 +DISALLOWS,2009,0,0,0,0,0,0 +DISAPPEARED,2009,0,0,0,0,0,0 +DISAPPOINTED,2009,0,0,0,0,0,0 +DISAPPOINTMENTS,2009,0,0,0,0,0,0 +DISAPPROVE,2009,0,0,0,0,0,0 +DISASSOCIATES,2009,0,0,0,0,0,0 +DISASTER,2009,0,0,0,0,0,0 +DISAVOW,2009,0,0,0,0,0,0 +DISAVOWS,2009,0,0,0,0,0,0 +GRATUITOUS,2009,0,0,0,0,0,0 +GREATEST,0,2009,0,0,0,0,0 +GRIEVANCES,2009,0,0,0,0,0,0 +HALT,2009,0,0,0,0,0,0 +HAMPERING,2009,0,0,0,0,0,0 +HAPPINESS,0,2009,0,0,0,0,0 +HARASSING,2009,0,0,0,0,0,0 +HARM,2009,0,0,0,0,0,0 +HARMING,2009,0,0,0,0,0,0 +HARSHEST,2009,0,0,0,0,0,0 +HAZARDOUS,2009,0,0,0,0,0,0 +NONINFRINGEMENT,0,0,0,2011,0,0,0 +NONJURISDICTIONAL,0,0,0,2011,0,0,0 +NONPERFORMANCES,2009,0,0,0,0,0,0 +HURTING,2009,0,0,0,0,0,0 +DISFAVORING,2009,0,0,0,0,0,0 +DISGORGEMENT,2009,0,0,0,0,0,0 +COMPLICATE,2009,0,0,0,0,0,0 +COMPLICATION,2009,0,0,0,0,0,0 +COMPLIMENTED,0,2009,0,0,0,0,0 +MISSTATEMENT,2009,0,0,0,0,0,0 +MISSTEP,2009,0,0,0,0,0,0 +MISTAKENLY,2009,0,0,0,0,0,0 +MISTRIALS,2009,0,0,2009,0,0,0 +MISUNDERSTOOD,2009,0,0,0,0,0,0 +MISUSING,2009,0,0,0,0,0,0 +MONOPOLIZE,2009,0,0,0,0,0,0 +MONOPOLY,2009,0,0,0,0,0,0 +MOREOVER,0,0,0,2009,0,0,0 +MUST,0,0,0,0,2009,0,0 +SLIPPAGE,2009,0,0,0,0,0,0 +SLOWDOWNS,2009,0,0,0,0,0,0 +SLOWING,2009,0,0,0,0,0,0 +SLUGGISHLY,2009,0,0,0,0,0,0 +SMOOTHLY,0,2009,0,0,0,0,0 +DEPRESSED,2009,0,0,0,0,0,0 +DEPRIVE,2009,0,0,0,0,0,0 +DERELICT,2009,0,0,0,0,0,0 +DEROGATES,0,0,0,2009,0,0,0 +DEROGATORY,2009,0,0,0,0,0,0 +DESIST,0,0,0,2009,0,0,0 +DESTABILIZED,2009,0,0,0,0,0,0 +DESTROYED,2009,0,0,0,0,0,0 +DESTRUCTIVE,2009,0,0,0,0,0,0 +DETENTION,2009,0,0,0,0,0,0 +DETERIORATED,2009,0,0,0,0,0,0 +DETERIORATIONS,2009,0,0,0,0,0,0 +DETERRENT,2009,0,0,0,0,0,0 +DETRACT,2009,0,0,0,0,0,0 +DETRIMENTAL,2009,0,0,0,0,0,0 +DEVALUED,2009,0,0,0,0,0,0 +DEVASTATED,2009,0,0,0,0,0,0 +DEVIATED,2009,0,2009,0,0,0,0 +DEVIATIONS,2009,0,2009,0,0,0,0 +DEVOLVES,2009,0,0,0,0,0,0 +DICTATES,0,0,0,0,0,0,2009 +DIFFERING,0,0,2009,0,0,0,0 +DIFFICULTLY,2009,0,0,0,0,0,0 +ASCENDANT,0,0,0,2009,0,0,0 +ASSAULTING,2009,0,0,0,0,0,0 +ASSIGNATION,0,0,0,2009,0,0,0 +ASSUMED,0,0,2009,0,0,0,0 +ASSUMPTIONS,0,0,2009,0,0,0,0 +ASSURING,0,2009,0,0,0,0,0 +ATTAINMENT,0,2009,0,0,0,0,0 +ATTESTATION,0,0,0,2009,0,0,0 +ATTORN,0,0,0,2011,0,0,0 +ATTORNS,0,0,0,2011,0,0,0 +AVERSELY,2011,0,0,0,0,0,0 +BAILED,0,0,0,2009,0,0,0 +BAILIFFS,0,0,0,2009,0,0,0 +BALKED,2009,0,0,0,0,0,0 +BANKRUPTED,2009,0,0,0,0,0,0 +CLAIMANT,0,0,0,2009,0,0,0 +CLAIMS,2009,0,0,2009,0,0,0 +CLAWBACKS,0,0,0,2014,0,0,0 +CLOSEOUTS,2009,0,0,0,0,0,0 +CLOSURES,2009,0,0,0,0,0,0 +CODICILS,0,0,0,2009,0,0,0 +CODIFIES,0,0,0,2009,0,0,0 +COERCED,2009,0,0,0,0,0,0 +COERCIVE,2009,0,0,0,0,0,0 +DISINCENTIVES,2009,0,0,0,0,0,0 +COLLABORATE,0,2009,0,0,0,0,0 +COLLABORATION,0,2009,0,0,0,0,0 +COLLABORATORS,0,2009,0,0,0,0,0 +COLLAPSING,2009,0,0,0,0,0,0 +COLLUDED,2009,0,0,0,0,0,0 +COLLUSIONS,2009,0,0,0,0,0,0 +POSITIVE,0,2009,0,0,0,0,0 +POSSIBILITY,0,0,2009,0,0,0,0 +POSTCLOSURE,0,0,0,2011,0,0,0 +POSTPONED,2009,0,0,0,0,0,0 +POSTPONING,2009,0,0,0,0,0,0 +WRIT,0,0,0,2009,0,0,0 +WRITEOFFS,2009,0,0,0,0,0,0 +WRONGDOINGS,2009,0,0,0,0,0,0 +HONORING,0,2009,0,0,0,0,0 +REASSESSES,0,0,2009,0,0,0,0 +REASSIGN,2009,0,0,0,0,0,0 +REASSIGNMENTS,2009,0,0,0,0,0,0 +REBOUNDING,0,2009,0,0,0,0,0 +REBUTTABLY,0,0,0,2011,0,0,0 +REBUTTING,0,0,0,2009,0,0,0 +RECALCULATING,0,0,2009,0,0,0,0 +RECALLED,2009,0,0,0,0,0,0 +RECESSION,2009,0,0,0,0,0,0 +RECKLESSLY,2009,0,0,0,0,0,0 +RECONSIDERING,0,0,2009,0,0,0,0 +RECOUPMENT,0,0,0,2009,0,0,0 +RECTIFICATION,0,0,0,2009,0,0,0 +RECUSED,0,0,0,2011,0,0,0 +REDACTED,2009,0,0,2009,0,0,0 +REDEFAULT,2014,0,0,0,0,0,0 +REDRESSED,2009,0,0,0,0,0,0 +REEXAMINE,0,0,2009,0,0,0,0 +REFERENDUMS,0,0,0,2009,0,0,0 +REFILING,0,0,0,2009,0,0,0 +REFUSAL,2009,0,0,0,0,0,0 +REFUSES,2009,0,0,0,0,0,0 +REGAINING,0,2009,0,0,0,0,0 +REGULATING,0,0,0,2009,0,0,0 +REGULATOR,0,0,0,2009,0,0,0 +REHEARD,0,0,0,2009,0,0,0 +VARIABLES,0,0,2009,0,0,0,0 +VARIANT,0,0,2009,0,0,0,0 +VARIED,0,0,2009,0,0,0,0 +VENDEE,0,0,0,2011,0,0,0 +VERSATILE,0,2009,0,0,0,0,0 +VIBRANCY,0,2009,0,0,0,0,0 +VIOLATED,2009,0,0,0,0,0,0 +VIOLATIONS,2009,0,0,0,0,0,0 +VIOLENCE,2009,0,0,0,0,0,0 +VITIATED,2009,0,0,0,0,0,0 +VOIDABLE,0,0,0,2009,0,0,0 +VOLATILITIES,0,0,2009,0,0,0,0 +VULNERABLE,2009,0,0,0,0,0,0 +WARNING,2009,0,0,0,0,0,0 +WARRANTOR,0,0,0,2011,0,0,0 +WEAK,2009,0,0,0,0,0,0 +WEAKENS,2009,0,0,0,0,0,0 +WEAKNESS,2009,0,0,0,0,0,0 +DISHONOR,2009,0,0,0,0,0,0 +DISHONORING,2009,0,0,0,0,0,0 +DISINTERESTED,2009,0,0,0,0,0,0 +DISLOYALLY,2009,0,0,0,0,0,0 +DISMISS,2009,0,0,0,0,0,0 +DISMISSES,2009,0,0,0,0,0,0 +DISPARAGED,2009,0,0,0,0,0,0 +DISPARAGING,2009,0,0,0,0,0,0 +DISPLACE,2009,0,0,0,0,0,0 +DISPLACES,2009,0,0,0,0,0,0 +DISPOSSESS,2009,0,0,0,0,0,0 +DISPOSSESSION,0,0,0,2009,0,0,0 +DISPROPORTIONATE,2009,0,0,0,0,0,0 +DISPUTES,2009,0,0,0,0,0,0 +DISQUALIFIED,2009,0,0,0,0,0,0 +DISREGARD,2009,0,0,0,0,0,0 +DISREPUTABLE,2009,0,0,0,0,0,0 +DISRUPTING,2009,0,0,0,0,0,0 +DISRUPTS,2009,0,0,0,0,0,0 +DISSENTED,2009,0,0,0,0,0,0 +DISSENTS,2009,0,0,0,0,0,0 +DISSOLUTIONS,2009,0,0,0,0,0,0 +DISTINCTIVELY,0,2009,0,0,0,0,0 +DISTORTING,2009,0,0,0,0,0,0 +DISTRACT,2009,0,0,0,0,0,0 +DISTRACTIONS,2009,0,0,0,0,0,0 +DISTRESSED,2009,0,0,0,0,0,0 +DISTURBANCE,2009,0,0,0,0,0,0 +DISTURBS,2009,0,0,0,0,0,0 +DIVERTING,2009,0,0,0,0,0,0 +DIVESTING,2009,0,0,0,0,0,0 +DIVESTMENTS,2009,0,0,0,0,0,0 +DIVULGE,2009,0,0,0,0,0,0 +DOCKET,0,0,0,2009,0,0,0 +DONEES,0,0,0,2011,0,0,0 +DOUBTS,2009,0,2009,0,0,0,0 +DOWNGRADING,2009,0,0,0,0,0,0 +DOWNSIZING,2009,0,0,0,0,0,0 +DOWNTURN,2009,0,0,0,0,0,0 +DRAG,2009,0,0,0,0,0,0 +DRAWBACKS,2009,0,0,0,0,0,0 +DROUGHTS,2009,0,0,0,0,0,0 +DYSFUNCTIONAL,2009,0,0,0,0,0,0 +EARMARKING,0,0,0,0,0,0,2009 +EASING,2009,0,0,0,0,0,0 +EFFICIENCY,0,2009,0,0,0,0,0 +EGREGIOUSLY,2009,0,0,0,0,0,0 +EMBARGOES,2009,0,0,0,0,0,0 +EMBARRASSES,2009,0,0,0,0,0,0 +EMBEZZLE,2009,0,0,0,0,0,0 +EMBEZZLER,2009,0,0,0,0,0,0 +EMPOWERED,0,2009,0,0,0,0,0 +ENABLED,0,2009,0,0,0,0,0 +ENCOURAGEMENT,0,2009,0,0,0,0,0 +ENCROACHED,2009,0,0,0,0,0,0 +ENCROACHMENTS,2009,0,0,0,0,0,0 +ENCUMBERS,2009,0,0,2009,0,0,2009 +ENCUMBRANCES,2009,0,0,2009,0,0,2009 +ENDANGERMENT,2009,0,0,0,0,0,0 +ENFORCEABLE,0,0,0,2009,0,0,0 +ENHANCEMENT,0,2009,0,0,0,0,0 +ENJOIN,2009,0,0,0,0,0,0 +ENJOY,0,2009,0,0,0,0,0 +ENJOYING,0,2009,0,0,0,0,0 +ENTAILED,0,0,0,0,0,0,2009 +PENALIZE,2009,0,0,0,0,0,0 +PENALTIES,2009,0,0,0,0,0,0 +PERFECTED,0,2009,0,0,0,0,0 +PERIL,2009,0,0,0,0,0,0 +PERMISSION,0,0,0,0,0,0,2009 +PERMITTEES,0,0,0,2011,0,0,0 +PERPETRATES,2009,0,0,2009,0,0,0 +PERSISTED,2009,0,0,0,0,0,0 +PERSISTING,2009,0,0,0,0,0,0 +PERVASIVELY,2009,0,0,0,0,0,0 +PETITIONER,0,0,0,2009,0,0,0 +PETTY,2009,0,0,0,0,0,0 +HEREAFTER,0,0,0,2009,0,0,0 +HEREFORE,0,0,0,2014,0,0,0 +HEREINAFTER,0,0,0,2009,0,0,0 +HEREON,0,0,0,2009,0,0,0 +HEREUNTO,0,0,0,2009,0,0,0 +HIDDEN,0,0,2009,0,0,0,0 +HINDERING,2009,0,0,0,0,0,0 +HINGES,0,0,2009,0,0,0,0 +WHEREABOUTS,0,0,0,2009,0,0,0 +WHEREFORE,0,0,0,2009,0,0,0 +WHERETO,0,0,0,2009,0,0,0 +WHISTLEBLOWERS,0,0,0,2011,0,0,0 +WILFUL,0,0,0,2009,0,0,0 +WILLFULNESS,0,0,0,2009,0,0,0 +WINNING,0,2009,0,0,0,0,0 +FLUCTUATE,0,0,2009,0,0,0,0 +FLUCTUATION,0,0,2009,0,0,0,0 +FORBEARANCE,0,0,0,2009,0,0,0 +FORBID,2009,0,0,0,0,0,2009 +FORCE,-2020,0,0,0,0,0,0 +FOREBEARANCE,0,0,0,2011,0,0,0 +FORECLOSES,2009,0,0,0,0,0,0 +FOREGO,2009,0,0,0,0,0,0 +FORESTALLED,2009,0,0,0,0,0,0 +FORFEITABILITY,0,0,0,2011,0,0,0 +FORFEITS,2009,0,0,0,0,0,0 +FORGERY,2009,0,0,0,0,0,0 +FRAUDS,2009,0,0,0,0,0,0 +FRIENDLY,0,2009,0,0,0,0,0 +FRUSTRATED,2009,0,0,0,0,0,0 +FRUSTRATION,2009,0,0,0,0,0,0 +FURTHERANCE,0,0,0,2009,0,0,0 +GAINS,0,2009,0,0,0,0,0 +DISGORGEMENTS,2009,0,0,0,0,0,0 +DISGRACEFUL,2009,0,0,0,0,0,0 +LITIGATE,2009,0,0,2009,0,0,0 +LITIGATION,2009,0,0,2009,0,0,0 +LITIGIOUS,0,0,0,2009,0,0,0 +LACKED,2009,0,0,0,0,0,0 +LAG,2009,0,0,0,0,0,0 +LAPSE,2009,0,0,0,0,0,0 +LATE,-2020,0,0,0,0,0,0 +LAWFULLY,0,0,0,2009,0,0,0 +LAWS,0,0,0,2009,0,0,0 +LAWYERS,0,0,0,2009,0,0,0 +LEADING,0,2009,0,0,0,0,0 +LEGALIZATION,0,0,0,2009,0,0,0 +LEGALIZES,0,0,0,2009,0,0,0 +LEGATEE,0,0,0,2009,0,0,0 +FLAWED,2009,0,0,0,0,0,0 +NONRECOVERABLE,2009,0,0,0,0,0,0 +LIQUIDATES,2009,0,0,0,0,0,0 +LIQUIDATOR,2009,0,0,0,0,0,0 +BENEFICIATION,0,0,0,2011,0,0,0 +BENEFITTED,0,2009,0,0,0,0,0 +POOR,2009,0,0,0,0,0,0 +REINTERPRETATION,0,0,2009,0,0,0,0 +REINTERPRETS,0,0,2009,0,0,0,0 +REJECTION,2009,0,0,0,0,0,0 +RELINQUISH,2009,0,0,0,0,0,0 +RELINQUISHMENT,2009,0,0,0,0,0,0 +REMAND,0,0,0,2009,0,0,0 +REMEDIATE,0,0,0,2009,0,0,0 +REMEDIATIONS,0,0,0,2009,0,0,0 +RENEGOTIATED,2009,0,0,0,0,0,0 +RENEGOTIATIONS,2009,0,0,0,0,0,0 +RENOUNCEMENTS,2009,0,0,0,0,0,0 +REPARATIONS,2009,0,0,0,0,0,0 +REPOSSESSES,2009,0,0,0,0,0,0 +REPRORATED,0,0,0,2018,0,0,0 +TROUBLED,2009,0,0,0,0,0,0 +UNABLE,2009,0,0,0,0,0,0 +UNAMBIGUOUSLY,0,0,0,0,2009,0,0 +UNAPPEALED,0,0,0,2011,0,0,0 +UNAVAILABILITY,2009,0,0,0,0,0,2011 +UNAWARE,2009,0,0,0,0,0,0 +UNCERTAINTY,0,0,2009,0,0,0,0 +UNCOLLECTIBILITY,2009,0,0,0,0,0,0 +UNCOMPLETED,2009,0,0,0,0,0,0 +UNCONSCIONABLY,2009,0,0,0,0,0,0 +UNCONTRACTED,0,0,0,2011,0,0,0 +UNCORRECTED,2009,0,0,0,0,0,0 +UNCOVERS,2009,0,0,0,0,0,0 +UNDELIVERABLE,2009,0,0,0,0,0,0 +UNDERCUTS,2009,0,0,0,0,0,0 +UNDERESTIMATES,2009,0,0,0,0,0,0 +UNDERINSURED,2009,0,0,0,0,0,0 +UNDERMINING,2009,0,0,0,0,0,0 +UNDERPAYS,2009,0,0,0,0,0,0 +UNDERPERFORMING,2009,0,0,0,0,0,0 +UNDERREPORTING,2011,0,0,0,0,0,0 +UNDERSTATEMENTS,2009,0,0,0,0,0,0 +UNDERUTILIZED,2009,0,0,0,0,0,0 +UNDETECTABLE,0,0,2009,0,0,0,0 +UNDISCHARGED,0,0,0,2009,0,0,0 +UNDOUBTEDLY,0,0,0,0,2009,0,0 +UNECONOMICAL,2009,0,0,0,0,0,0 +UNENCUMBER,0,0,0,2014,0,0,0 +UNEQUIVOCAL,0,0,0,0,2009,0,0 +UNEXCUSED,2009,0,0,0,0,0,0 +UNFAIRLY,2009,0,0,0,0,0,0 +UNFAVORABLE,2009,0,0,0,0,0,0 +UNFIT,2009,0,0,0,0,0,0 +UNFORESEEN,2009,0,0,0,0,0,0 +UNFOUNDED,2009,0,0,0,0,0,0 +UNGUARANTEED,0,0,2009,0,0,0,0 +UNINSURED,2009,0,0,0,0,0,0 +UNJUST,2009,0,0,0,0,0,0 +UNJUSTLY,2009,0,0,0,0,0,0 +UNKNOWNS,0,0,2009,0,0,0,0 +UNLICENSED,2009,0,0,0,0,0,0 +UNMERCHANTABLE,2011,0,0,0,0,0,0 +UNNEEDED,2009,0,0,0,0,0,0 +UNPAID,2009,0,0,0,0,0,0 +UNPOPULAR,2009,0,0,0,0,0,0 +UNPREDICTED,2011,0,2011,0,0,0,0 +UNPROVED,0,0,2009,0,0,0,0 +UNQUANTIFIED,0,0,2011,0,0,0,0 +UNREASONABLY,2009,0,0,0,0,0,0 +UNRECOVERED,2009,0,0,0,0,0,0 +UNREMEDIED,2009,0,0,0,0,0,0 +UNSAFE,2009,0,0,0,0,0,0 +UNSATISFIED,2009,0,0,0,0,0,0 +UNSEASONABLY,0,0,2009,0,0,0,0 +UNSOUND,2009,0,0,0,0,0,0 +UNSTABLE,2009,0,0,0,0,0,0 +UNSUCCESSFULLY,2009,0,0,0,0,0,0 +UNSUITED,2009,0,0,0,0,0,0 +UNSUSPECTING,2009,0,0,0,0,0,0 +UNTIMELY,2009,0,0,0,0,0,0 +UNTRUTHFUL,2009,0,0,0,0,0,0 +UNUSABLE,2009,0,0,0,0,0,0 +UNWARRANTED,2009,0,0,0,0,0,0 +UNWRITTEN,0,0,2009,0,0,0,0 +URGENCY,2009,0,0,0,0,0,0 +USURPATION,0,0,0,2009,0,0,0 +USURY,2009,0,0,2009,0,0,0 +VAGUENESS,0,0,2012,0,0,0,0 +VALUABLE,0,2009,0,0,0,0,0 +PLEAD,2009,0,0,0,0,0,0 +PLEADS,2009,0,0,2009,0,0,0 +PLEASED,0,2009,0,0,0,0,0 +PLEDGED,0,0,0,0,0,0,2009 +PLEDGING,0,0,0,0,0,0,2009 +COMPEL,0,0,0,0,0,0,2011 +COMPENSATORY,0,0,0,2009,0,0,0 +COMPLAINED,2009,0,0,0,0,0,0 +COMPLAINTS,2009,0,0,0,0,0,0 +COMMITMENT,0,0,0,0,0,0,2009 +COMMITTING,0,0,0,0,0,0,2009 +LIMITATION,2009,0,0,0,0,0,0 +LINGERING,2009,0,0,0,0,0,0 +RESTRAINING,0,0,0,0,0,0,2009 +RESTRICT,0,0,0,0,0,0,2009 +RESTRICTIONS,0,0,0,0,0,0,2009 +RESTRICTS,0,0,0,0,0,0,2009 +RESTRUCTURING,2009,0,0,0,0,0,0 +RETALIATES,2009,0,0,0,0,0,0 +RETALIATORY,2009,0,0,0,0,0,0 +PRECAUTIONS,0,0,2009,0,0,0,0 +PRECLUDE,2009,0,0,0,0,0,2009 +PRECONDITION,0,0,0,0,0,0,2009 +PREDECEASED,0,0,0,2009,0,0,0 +PREDICTABILITY,0,0,2009,0,0,0,0 +PREDICTIONS,0,0,2009,0,0,0,0 +PREDICTS,0,0,2009,0,0,0,0 +PREJUDICE,2009,0,0,2009,0,0,0 +PREJUDICING,2009,0,0,2009,0,0,0 +PREMATURELY,2009,0,0,0,0,0,0 +PRESET,0,0,0,0,0,0,2009 +PRESUMABLY,0,0,2009,0,0,0,0 +PRESUMING,0,0,2009,0,0,0,0 +PRETRIAL,2009,0,0,2009,0,0,0 +PREVENTION,2009,0,0,0,0,0,0 +PROACTIVE,0,2009,0,0,0,0,0 +PROBABILITY,0,0,2009,0,0,0,0 +PROBATED,0,0,0,2009,0,0,0 +PROBATIONAL,0,0,0,2009,0,0,0 +PROBATIONS,0,0,0,2009,0,0,0 +PROBLEMS,2009,0,0,0,0,0,0 +PROFITABILITY,0,2009,0,0,0,0,0 +PROGRESSED,0,2009,0,0,0,0,0 +PROHIBITED,0,0,0,0,0,0,2009 +PROHIBITIVE,0,0,0,0,0,0,2009 +PROLONG,2009,0,0,0,0,0,0 +PROLONGING,2009,0,0,0,0,0,0 +PROMULGATES,0,0,0,2009,0,0,0 +PROMULGATOR,0,0,0,2009,0,0,0 +PRORATION,0,0,0,2009,0,0,0 +PROSECUTING,2009,0,0,2009,0,0,0 +PROSECUTORIAL,0,0,0,2011,0,0,0 +PROSPERITY,0,2009,0,0,0,0,0 +PROTESTED,2009,0,0,0,0,0,0 +PROTESTOR,2009,0,0,0,0,0,0 +PROTRACTION,2009,0,0,0,0,0,0 +PROVOKE,2009,0,0,0,0,0,0 +PUNISHABLE,0,0,0,2009,0,0,0 +PUNISHMENT,2009,0,0,0,0,0,0 +PURPORTED,2009,0,0,0,0,0,0 +QUESTION,2009,0,0,0,0,0,0 +QUESTIONING,2009,0,0,0,0,0,0 +QUITCLAIMS,0,0,0,2009,0,0,0 +RANDOM,0,0,2009,0,0,0,0 +RANDOMIZING,0,0,2009,0,0,0,0 +RATABLE,0,0,0,2009,0,0,0 +RATIONALIZE,2009,0,0,0,0,0,0 +ABANDONED,2009,0,0,0,0,0,0 +ABANDONS,2009,0,0,0,0,0,0 +ABDICATION,2009,0,0,0,0,0,0 +ABERRATIONAL,2009,0,0,0,0,0,0 +ABEYANCES,0,0,2009,0,0,0,0 +ABNORMAL,2009,0,0,0,0,0,0 +ABOLISH,2009,0,0,0,0,0,0 +ABOVEMENTIONED,0,0,0,2011,0,0,0 +ABROGATING,2009,0,0,2009,0,0,0 +ABRUPTLY,2009,0,0,0,0,0,0 +ABSENTEEISM,2009,0,0,0,0,0,0 +ABSOLVING,0,0,0,2009,0,0,0 +ABUSED,2009,0,0,0,0,0,0 +ABUSIVELY,2009,0,0,0,0,0,0 +ACCIDENT,2009,0,0,0,0,0,0 +ACCLAIMED,0,2009,0,0,0,0,0 +ACCOMPLISHING,0,2009,0,0,0,0,0 +ACCUSATIONS,2009,0,0,0,0,0,0 +ACCUSING,2009,0,0,0,0,0,0 +ACHIEVEMENTS,0,2009,0,0,0,0,0 +ACQUIESCED,2009,0,0,0,0,0,0 +ACQUIRORS,0,0,0,2011,0,0,0 +ACQUITTALS,2009,0,0,2009,0,0,0 +ACQUITTING,2009,0,0,2009,0,0,0 +ADJOURNED,0,0,0,2009,0,0,0 +ADJOURNS,0,0,0,2009,0,0,0 +ADJUDGING,0,0,0,2009,0,0,0 +ADJUDICATING,0,0,0,2009,0,0,0 +ADJUDICATOR,0,0,0,2009,0,0,0 +ADMISSIBLE,0,0,0,2009,0,0,0 +ADULTERATE,2009,0,0,0,0,0,0 +ADULTERATIONS,2009,0,0,0,0,0,0 +ADVANCING,0,2009,0,0,0,0,0 +ADVANTAGEOUSLY,0,2009,0,0,0,0,0 +ADVERSARY,2009,0,0,0,0,0,0 +ADVERSITY,2009,0,0,0,0,0,0 +AFFREIGHTMENT,0,0,0,2012,0,0,0 +AFORESTATED,0,0,0,2011,0,0,0 +AGGRAVATE,2009,0,0,0,0,0,0 +AGGRAVATION,2009,0,0,0,0,0,0 +ALERTING,2009,0,0,0,0,0,0 +ALIENATING,2009,0,0,0,0,0,0 +ALLEGATIONS,2009,0,0,2009,0,0,0 +ALLEGES,2009,0,0,2009,0,0,0 +ALMOST,0,0,2009,0,0,2009,0 +AMBIGUITIES,0,0,2009,0,0,0,0 +AMENDABLE,0,0,0,2009,0,0,0 +AMENDMENT,0,0,0,2009,0,0,0 +ANNOYANCE,2009,0,0,0,0,0,0 +ANNOYS,2009,0,0,0,0,0,0 +ANNULMENT,2009,0,0,0,0,0,0 +ANOMALOUS,2009,0,2009,0,0,0,0 +ANTECEDENTS,0,0,0,2009,0,0,0 +ANTICIPATING,0,0,2009,0,0,0,0 +ANTICORRUPTION,0,0,0,2014,0,0,0 +APPARENTLY,0,0,2009,0,0,2009,0 +APPEALING,0,0,0,2009,0,0,0 +APPEARING,0,0,2009,0,0,2009,0 +APPELLATE,0,0,0,2009,0,0,0 +APPROXIMATED,0,0,2009,0,0,0,0 +APPROXIMATION,0,0,2009,0,0,0,0 +APPURTENANT,0,0,0,2009,0,0,0 +ARBITRARINESS,0,0,2009,0,0,0,0 +ARBITRATES,0,0,0,2009,0,0,0 +ARBITRATIONS,0,0,0,2009,0,0,0 +ARGUE,2009,0,0,0,0,0,0 +ARGUMENTATIVE,2009,0,0,0,0,0,0 +ARREARS,2009,0,0,0,0,0,0 +ARTIFICIALLY,2009,0,0,0,0,0,0 +RETRIBUTION,2009,0,0,0,0,0,0 +RETROCESSIONAIRES,0,0,0,2011,0,0,0 +BOLSTERS,0,2009,0,0,0,0,0 +BOOMING,0,2009,0,0,0,0,0 +BOTTLENECKS,2009,0,0,0,0,0,0 +BOYCOTTED,2009,0,0,0,0,0,0 +BREACHED,2009,0,0,2009,0,0,0 +BREAKAGE,2009,0,0,0,0,0,0 +BREAKING,-2020,0,0,0,0,0,0 +BRIBE,2009,0,0,0,0,0,0 +BRIBES,2009,0,0,0,0,0,0 +BROKEN,-2020,0,0,0,0,0,0 +BURDENS,2009,0,0,0,0,0,0 +CALAMITOUS,2009,0,0,0,0,0,0 +CANCELING,2009,0,0,0,0,0,0 +CANCELLING,2009,0,0,0,0,0,0 +CARELESSNESS,2009,0,0,0,0,0,0 +CATASTROPHIC,2009,0,0,0,0,0,0 +CAUTIONED,2009,0,0,0,0,0,0 +CAUTIOUSLY,0,0,2009,0,0,0,0 +CEASES,2009,0,0,0,0,0,0 +CENSURE,2009,0,0,0,0,0,0 +CERTIORARI,0,0,0,2011,0,0,0 +CHALLENGES,2009,0,0,0,0,0,0 +CHATTEL,0,0,0,2009,0,0,0 +CIRCUMVENTED,2009,0,0,0,0,0,0 +CIRCUMVENTS,2009,0,0,0,0,0,0 +SHALL,0,0,0,2009,0,0,0 +SHORTAGES,2009,0,0,0,0,0,0 +SHRINKAGES,2009,0,0,0,0,0,0 +SHUTS,2009,0,0,0,0,0,0 +SLANDEROUS,2009,0,0,0,0,0,0 +REPUDIATING,2009,0,0,0,0,0,0 +REQUESTOR,0,0,0,2011,0,0,0 +REQUIREMENTS,0,0,0,0,0,0,2009 +RESCIND,0,0,0,2009,0,0,0 +RESCISSION,0,0,0,2009,0,0,0 +RESIGNATIONS,2009,0,0,0,0,0,0 +RESOLVE,0,2009,0,0,0,0,0 +RESTATEMENTS,2009,0,0,0,0,0,0 +NOTARIES,0,0,0,2009,0,0,0 +NOTARIZED,0,0,0,2009,0,0,0 +NOVO,0,0,0,2011,0,0,0 +NULLIFICATIONS,2009,0,0,2009,0,0,0 +NULLIFYING,2009,0,0,2009,0,0,0 +OBJECTING,2009,0,0,0,0,0,0 +OBJECTIONS,2009,0,0,0,0,0,0 +OBLIGATING,0,0,0,0,0,0,2009 +OBLIGE,0,0,0,0,0,0,2009 +OBLIGES,0,0,0,0,0,0,2009 +OBSCENITY,2009,0,0,0,0,0,0 +OBSTACLES,2009,0,0,0,0,0,0 +OBSTRUCTION,2009,0,0,0,0,0,0 +OFFENCES,2009,0,0,0,0,0,0 +OFFENDERS,2009,0,0,0,0,0,0 +OFFEREE,0,0,0,2009,0,0,0 +OMISSION,2009,0,0,0,0,0,0 +OMITTED,2009,0,0,0,0,0,0 +OPPORTUNISTICALLY,2009,0,0,0,0,0,0 +OPPOSED,2009,0,0,0,0,0,0 +OPPOSITIONS,2009,0,0,0,0,0,0 +ORDINARILY,0,0,2009,0,0,0,0 +OUTMODED,2009,0,0,0,0,0,0 +OUTPERFORMS,0,2009,0,0,0,0,0 +OVERBUILDING,2009,0,0,0,0,0,0 +OVERBURDENED,2009,0,0,0,0,0,0 +OVERCHARGE,2009,0,0,0,0,0,0 +OVERCOME,2009,0,0,0,0,0,0 +OVERESTIMATE,2009,0,0,0,0,0,0 +OVERESTIMATION,2009,0,0,0,0,0,0 +OVERLOADING,2009,0,0,0,0,0,0 +OVERLOOKING,2009,0,0,0,0,0,0 +OVERPAYMENTS,2009,0,0,0,0,0,0 +OVERPRODUCTION,2009,0,0,0,0,0,0 +OVERRULING,0,0,0,2009,0,0,0 +OVERSHADOW,2009,0,0,0,0,0,0 +OVERSTATE,2009,0,0,0,0,0,0 +OVERSTATES,2009,0,0,0,0,0,0 +OVERSUPPLY,2009,0,0,0,0,0,0 +OVERTURNED,2009,0,0,0,0,0,0 +OVERVALUED,2009,0,0,0,0,0,0 +PARA,0,0,0,-2020,0,0,0 +NECESSITATED,0,0,0,0,0,0,2009 +NEGATIVELY,2009,0,0,0,0,0,0 +NEGLECTFUL,2009,0,0,0,0,0,0 +NEGLIGENCES,2009,0,0,0,0,0,0 +NOLO,0,0,0,2011,0,0,0 +BEAUTIFUL,0,2009,0,0,0,0,0 +BELIEVES,0,0,2009,0,0,0,0 +IDEAL,0,2009,0,0,0,0,0 +IGNORE,2009,0,0,0,0,0,0 +ILL,2009,0,0,0,0,0,0 +ILLEGALLY,2009,0,0,0,0,0,0 +ILLIQUID,2009,0,0,0,0,0,0 +IMMATERIALITY,0,0,0,2009,0,0,0 +IMPAIRED,2009,0,0,0,0,0,2011 +IMPAIRS,2009,0,0,0,0,0,2011 +IMPEDED,2009,0,0,0,0,0,0 +IMPEDING,2009,0,0,0,0,0,0 +IMPERFECTIONS,2009,0,0,0,0,0,0 +IMPLICATE,2009,0,0,0,0,0,0 +IMPOSE,0,0,0,0,0,0,2009 +IMPOSITION,0,0,0,0,0,0,2009 +IMPOUND,2009,0,0,0,0,0,0 +IMPRACTICABLE,2009,0,0,0,0,0,0 +IMPRECISE,0,0,2009,0,0,0,0 +IMPRESSED,0,2009,0,0,0,0,0 +IMPRESSIVELY,0,2009,0,0,0,0,0 +IMPROPER,2009,0,0,0,0,0,0 +IMPROVE,0,2009,0,0,0,0,0 +IMPROVES,0,2009,0,0,0,0,0 +INABILITY,2009,0,0,0,0,0,0 +INACCURATE,2009,0,0,0,0,0,0 +INACTIVATE,2009,0,0,0,0,0,0 +INACTIVATION,2009,0,0,0,0,0,0 +INADEQUACY,2009,0,0,0,0,0,0 +INADVERTENTLY,2009,0,0,0,0,0,0 +INAPPROPRIATELY,2009,0,0,0,0,0,0 +INCAPACITATED,2009,0,0,0,0,0,0 +INCARCERATES,2009,0,0,2009,0,0,0 +INCHOATE,0,0,0,2009,0,0,0 +INCIDENTS,2009,0,0,0,0,0,0 +INCOMPETENCE,2009,0,0,0,0,0,0 +INCOMPETENTS,2009,0,0,0,0,0,0 +INCONCLUSIVE,2009,0,0,0,0,0,0 +INCONSISTENTLY,2009,0,0,0,0,0,0 +INCONVENIENCES,2009,0,0,0,0,0,0 +INCORRECTNESS,2009,0,0,0,0,0,0 +INDECENCY,2009,0,0,0,0,0,0 +INDEFINITE,0,0,2009,0,0,0,0 +INDEMNIFICATION,0,0,0,2009,0,0,0 +INDEMNIFY,0,0,0,2009,0,0,0 +INDEMNITIES,0,0,0,2009,0,0,0 +INDETERMINABLE,0,0,2009,0,0,0,0 +INDICTED,2009,0,0,2009,0,0,0 +INDORSEES,0,0,0,2011,0,0,0 +INEFFICIENCIES,2009,0,0,0,0,0,0 +INELIGIBILITY,2009,0,0,0,0,0,0 +INEQUITIES,2009,0,0,0,0,0,0 +INEXACTNESS,0,0,2009,0,0,0,0 +INFLICTED,2009,0,0,0,0,0,0 +INFRACTION,2009,0,0,2009,0,0,0 +INFRINGEMENT,2009,0,0,0,0,0,0 +INFRINGING,2009,0,0,0,0,0,0 +INHIBITING,0,0,0,0,0,0,2011 +INJUNCTIONS,2009,0,0,2009,0,0,0 +INJURES,2009,0,0,0,0,0,0 +INJURY,2009,0,0,0,0,0,0 +INNOVATING,0,2009,0,0,0,0,0 +INNOVATIVENESS,0,2011,0,0,0,0,0 +INORDINATELY,2009,0,0,0,0,0,0 +INSIGHTFUL,0,2009,0,0,0,0,0 +INSISTING,0,0,0,0,0,0,2009 +INSOLVENCY,2009,0,0,0,0,0,0 +INSTABILITIES,0,0,2009,0,0,0,0 +INSUFFICIENT,2009,0,0,0,0,0,0 +INTANGIBLE,0,0,2009,0,0,0,0 +INTERFERE,2009,0,0,0,0,0,0 +INTERFERES,2009,0,0,0,0,0,0 +INTERMITTENTLY,2009,0,0,0,0,0,0 +INTERPOSES,0,0,0,2009,0,0,0 +INTERROGATE,0,0,0,2009,0,0,0 +INTERROGATION,0,0,0,2009,0,0,0 +INTERROGATORS,0,0,0,2009,0,0,0 +INTERRUPTING,2009,0,0,0,0,0,0 +INTESTACY,0,0,0,2009,0,0,0 +STABILIZATION,0,2009,0,0,0,0,0 +STABILIZES,0,2009,0,0,0,0,0 +STAGNANT,2009,0,0,0,0,0,0 +STAGNATING,2009,0,0,0,0,0,0 +STATUTE,0,0,0,2009,0,0,0 +STIPULATE,0,0,0,0,0,0,2009 +STIPULATION,0,0,0,0,0,0,2009 +STOPPAGES,2009,0,0,0,0,0,0 +STRAIN,2009,0,0,0,0,0,0 +STRENGTH,0,2009,0,0,0,0,0 +STRENGTHENS,0,2009,0,0,0,0,0 +STRESSES,2009,0,0,0,0,0,0 +STRICTER,0,0,0,0,0,0,2009 +STRONG,0,2009,0,0,0,0,0 +SUBCLAUSE,0,0,0,2009,0,0,0 +SUBJECTING,2009,0,0,0,0,0,0 +SUBLESSORS,0,0,0,2011,0,0,0 +SUBPARAGRAPHS,0,0,0,2009,0,0,0 +SUBROGATED,0,0,0,2009,0,0,0 +SUBTRUSTS,0,0,0,2011,0,0,0 +SUCCEEDS,0,2009,0,0,0,0,0 +SUCCESSFULLY,0,2009,0,0,0,0,0 +SUED,2009,0,0,2009,0,0,0 +SUFFERING,2009,0,0,0,0,0,0 +SUGGESTING,0,0,2009,0,0,0,0 +SUMMONING,2009,0,0,2009,0,0,0 +SUPERSEDE,0,0,0,2009,0,0,0 +SUPERSEDING,0,0,0,2009,0,0,0 +SURPASSED,0,2009,0,0,0,0,0 +SUSCEPTIBLE,2009,0,0,0,0,0,0 +SUSPEND,2009,0,0,0,0,0,0 +SUSPENSION,2009,0,0,0,0,0,0 +SUSPICIOUS,2009,0,0,0,0,0,0 +REVOCATION,2009,0,0,2009,0,0,0 +REVOKES,2009,0,0,0,0,0,0 +REVOLUTIONIZES,0,2009,0,0,0,0,0 +REWARDING,0,2009,0,0,0,0,0 +RIDICULES,2009,0,0,0,0,0,0 +RISKIER,2009,0,2009,0,0,0,0 +RISKS,0,0,2009,0,0,0,0 +RULINGS,0,0,0,2009,0,0,0 +SACRIFICED,2009,0,0,0,0,0,0 +SATISFACTION,0,2009,0,0,0,0,0 +SATISFIES,0,2009,0,0,0,0,0 +SCANDALS,2009,0,0,0,0,0,0 +SCRUTINIZING,2009,0,0,0,0,0,0 +SEIZE,2009,0,0,0,0,0,0 +SELDOM,0,0,2009,0,0,2009,0 +SEQUESTRATOR,0,0,0,2009,0,0,0 +SETBACK,2009,0,0,0,0,0,0 +SEVER,2009,0,0,0,0,0,0 +SEVERANCE,0,0,0,2009,0,0,0 +SEVERELY,2009,0,0,0,0,0,0 +ENTRENCH,0,0,0,0,0,0,2009 +ERODES,2009,0,0,0,0,0,0 +ERRATICALLY,2009,0,0,0,0,0,0 +ERRONEOUSLY,2009,0,0,0,0,0,0 +ESCALATE,2009,0,0,0,0,0,0 +ESCHEAT,0,0,0,2011,0,0,0 +ESCROWED,0,0,0,0,0,0,2009 +EVADE,2009,0,0,0,0,0,0 +EVASION,2009,0,0,0,0,0,0 +EVICTED,2009,0,0,0,0,0,0 +EVICTS,2009,0,0,0,0,0,0 +EXACERBATED,2009,0,0,0,0,0,0 +EXACERBATIONS,2009,0,0,0,0,0,0 +EXAGGERATING,2009,0,0,0,0,0,0 +EXCEEDENCES,0,0,0,2011,0,0,0 +EXCELS,0,2009,0,0,0,0,0 +EXCESSIVELY,2009,0,0,0,0,0,0 +EXCITING,0,2009,0,0,0,0,0 +EXCLUSIVES,0,2009,0,0,0,0,0 +EXCULPATES,2009,0,0,2009,0,0,0 +EXCULPATORY,2009,0,0,2009,0,0,0 +EXECUTRICES,0,0,0,2009,0,0,0 +EXONERATE,2009,0,0,0,0,0,0 +EXONERATION,2009,0,0,0,0,0,0 +EXPLOITATIONS,2009,0,0,0,0,0,0 +EXPLOITS,2009,0,0,0,0,0,0 +EXPOSING,2009,0,0,0,0,0,0 +EXPROPRIATED,2009,0,0,0,0,0,0 +EXPROPRIATIONS,2009,0,0,0,0,0,0 +EXTRACONTRACTUAL,0,0,0,2011,0,0,0 +SOLVENCIES,2009,0,0,0,0,0,0 +SOMETIME,0,0,2009,0,0,0,0 +SPAM,2014,0,0,0,0,0,0 +TRAUMATIC,2009,0,0,0,0,0,0 +LOSES,2009,0,0,0,0,0,0 +LOST,2009,0,0,0,0,0,0 +LYING,2009,0,0,0,0,0,0 +MALFUNCTIONED,2009,0,0,0,0,0,0 +MALICIOUS,2009,0,0,0,0,0,0 +MANDATE,0,0,0,0,0,0,2009 +MANDATORY,0,0,0,0,0,0,2009 +MANIPULATES,2009,0,0,0,0,0,0 +MANIPULATIVE,2009,0,0,0,0,0,0 +MAYBE,0,0,2009,0,0,2009,0 +MEDIATING,0,0,0,2009,0,0,0 +MEDIATORS,0,0,0,2009,0,0,0 +MISAPPLICATIONS,2009,0,0,0,0,0,0 +MISAPPLYING,2009,0,0,0,0,0,0 +MISAPPROPRIATING,2009,0,0,0,0,0,0 +MISCALCULATE,2009,0,0,0,0,0,0 +MISCALCULATION,2009,0,0,0,0,0,0 +MISCLASSIFICATION,2011,0,0,0,0,0,0 +MISCOMMUNICATION,2014,0,0,0,0,0,0 +MISDEMEANORS,2009,0,0,0,0,0,0 +MISHANDLED,2009,0,0,0,0,0,0 +MISINFORMATION,2009,0,0,0,0,0,0 +MISINTERPRET,2009,0,0,0,0,0,0 +MISINTERPRETING,2009,0,0,0,0,0,0 +MISJUDGES,2009,0,0,0,0,0,0 +MISLABEL,2009,0,0,0,0,0,0 +MISLABELS,2009,0,0,0,0,0,0 +MISLEADS,2009,0,0,0,0,0,0 +MISMANAGEMENT,2009,0,0,0,0,0,0 +MISMATCHED,2009,0,0,0,0,0,0 +MISPRICE,2014,0,0,0,0,0,0 +MISREPRESENTATION,2009,0,0,0,0,0,0 +MISREPRESENTS,2009,0,0,0,0,0,0 +WORRYING,2009,0,0,0,0,0,0 +WORSENING,2009,0,0,0,0,0,0 +WORTHY,0,2009,0,0,0,0,0 +TOLERATED,2009,0,0,0,0,0,0 +TORT,0,0,0,2009,0,0,0 +TORTUOUS,2009,0,0,0,0,0,0 +FIDE,0,0,0,2009,0,0,0 +FIRING,2009,0,0,0,0,0,0 +NONBREACHING,0,0,0,2011,0,0,0 +NONCOMPLIANCE,2009,0,0,0,0,0,0 +NONCONFORMING,2009,0,0,0,0,0,0 +NONCONTRACT,0,0,0,2012,0,0,0 +NONFEASANCE,0,0,0,2011,0,0,0 +NONFORFEITURE,0,0,0,2011,0,0,0 +DISCLAIMED,2009,0,0,0,0,0,0 +DISCLAIMS,2009,0,0,0,0,0,0 +DISCLOSING,2009,0,0,0,0,0,0 +DISCONTINUATIONS,2009,0,0,0,0,0,0 +DISCONTINUING,2009,0,0,0,0,0,0 +DISCOURAGING,2009,0,0,0,0,0,0 +DISCREDITS,2009,0,0,0,0,0,0 +SPECTACULARLY,0,2009,0,0,0,0,0 +SPECULATING,0,0,2009,0,0,0,0 +SPECULATIVELY,0,0,2009,0,0,0,0 +TRAGEDY,2009,0,0,0,0,0,0 +TRANSFERORS,0,0,0,2012,0,0,0 +LEGISLATING,0,0,0,2009,0,0,0 +LEGISLATIVELY,0,0,0,2009,0,0,0 +LEGISLATURES,0,0,0,2009,0,0,0 +LIBELS,0,0,0,2009,0,0,0 +CONCEALED,2009,0,0,0,0,0,0 +CONCEDES,2009,0,0,0,0,0,0 +CONCERN,2009,0,0,0,0,0,0 +CONCILIATION,2009,0,0,0,0,0,0 +CONDEMN,2009,0,0,0,0,0,0 +CONDEMNING,2009,0,0,0,0,0,0 +CONDITIONALLY,0,0,2009,0,0,0,0 +CONFESS,2009,0,0,0,0,0,0 +CONFESSION,2009,0,0,0,0,0,0 +CONFINEMENT,2009,0,0,0,0,0,2009 +CONFISCATE,2009,0,0,0,0,0,0 +CONFISCATION,2009,0,0,0,0,0,0 +CONFLICTED,2009,0,0,0,0,0,0 +CONFRONTATION,2009,0,0,0,0,0,0 +CONFRONTING,2009,0,0,0,0,0,0 +CONFUSES,2009,0,2009,0,0,0,0 +CONSENT,0,0,0,2009,0,0,0 +CONSERVATORSHIPS,0,0,0,2011,0,0,0 +CONSPIRATORIAL,2009,0,0,0,0,0,0 +CONSPIRES,2009,0,0,0,0,0,0 +CONSTITUTIONALITY,0,0,0,2009,0,0,0 +CONSTRAIN,0,0,0,0,0,0,2009 +CONSTRAINT,0,0,0,0,0,0,2009 +CONSTRUE,0,0,0,2012,0,0,0 +CONTEMPT,2009,0,0,0,0,0,0 +CONTENDS,2009,0,0,0,0,0,0 +CONTENTIOUSLY,2009,0,0,0,0,0,0 +CONTESTING,2009,0,0,0,0,0,0 +CONTINGENTLY,0,0,2009,0,0,0,0 +CONTRACTHOLDER,0,0,0,2009,0,0,0 +CONTRACTING,0,0,0,2009,0,0,0 +CONTRACTUAL,0,0,0,2009,0,0,0 +CONTRADICTING,2009,0,0,0,0,0,0 +CONTRADICTS,2009,0,0,0,0,0,0 +CONTRAVENES,0,0,0,2009,0,0,0 +CONTROVERSIAL,2009,0,0,0,0,0,0 +CONTROVERTED,0,0,0,2009,0,0,0 +CONVEYANCES,0,0,0,2009,0,0,0 +CONVICTION,2009,0,0,2009,0,0,0 +CORRECTION,2009,0,0,0,0,0,0 +CORRUPTED,2009,0,0,0,0,0,0 +CORRUPTLY,2009,0,0,0,0,0,0 +COULD,0,0,2009,0,0,2009,0 +COUNSELS,0,0,0,2009,0,0,0 +COUNTERCLAIMS,2009,0,0,0,0,0,0 +COUNTERFEITERS,2009,0,0,0,0,0,0 +COUNTERMEASURES,2009,0,0,0,0,0,0 +COUNTERSUITS,0,0,0,2014,0,0,0 +COURTS,0,0,0,2009,0,0,0 +COVENANTS,0,0,0,0,0,0,2011 +CREATIVITY,0,2009,0,0,0,0,0 +CRIMINALITY,0,0,0,2009,0,0,0 +CRIMINALS,2009,0,0,2009,0,0,0 +CRITICALLY,2009,0,0,0,0,0,0 +CRITICIZED,2009,0,0,0,0,0,0 +CROSSCLAIMS,0,0,0,2011,0,0,0 +CRUCIALLY,2009,0,0,0,0,0,0 +CUMBERSOME,2009,0,0,0,0,0,0 +CURTAILMENT,2009,0,0,0,0,0,0 +CUTBACK,2009,0,0,0,0,0,0 +CYBERBULLYING,2014,0,0,0,0,0,0 +CYBERCRIMINALS,2014,0,0,0,0,0,0 +TAINTED,2009,0,0,0,0,0,0 +TENANTABILITY,0,0,0,2011,0,0,0 +TENTATIVELY,0,0,2009,0,0,0,0 +TERMINATES,2009,0,0,0,0,0,0 +TERMINUS,0,0,0,-2020,0,0,0 +TESTIMONY,0,0,0,2009,0,0,0 +THEREAFTER,0,0,0,2009,0,0,0 +THEREINAFTER,0,0,0,2011,0,0,0 +THERETO,0,0,0,2009,0,0,0 +THEREUNTO,0,0,0,2009,0,0,0 +THREATEN,2009,0,0,0,0,0,0 +THREATS,2009,0,0,0,0,0,0 +FAIL,2009,0,0,0,0,0,0 +FAILS,2009,0,0,0,0,0,0 +FALSE,2009,0,0,0,0,0,0 +FALSIFIED,2009,0,0,0,0,0,0 +FALSITY,2009,0,0,0,0,0,0 +FATALLY,2009,0,0,0,0,0,0 +FAULTY,2009,0,0,0,0,0,0 +FAVORING,0,2009,0,0,0,0,0 +FEARS,2009,0,0,0,0,0,0 +DAMAGE,2009,0,0,0,0,0,0 +DAMPEN,2009,0,0,0,0,0,0 +DANGEROUSLY,2009,0,0,0,0,0,0 +DEADLOCKING,2009,0,0,0,0,0,0 +DEBARMENT,2009,0,0,0,0,0,0 +DECEDENT,0,0,0,2009,0,0,0 +DECEITFULNESS,2009,0,0,0,0,0,0 +DECEIVING,2009,0,0,0,0,0,0 +DECEPTIVELY,2009,0,0,0,0,0,0 +DECLINES,2009,0,0,0,0,0,0 +DECREEING,0,0,0,2009,0,0,0 +DEFACEMENT,2009,0,0,0,0,0,0 +DEFAMATIONS,2009,0,0,0,0,0,0 +DEFAMES,2009,0,0,0,0,0,0 +DEFAULTING,2009,0,0,0,0,0,0 +DEFEASE,0,0,0,2009,0,0,0 +DEFEASING,0,0,0,2011,0,0,0 +DEFEATS,2009,0,0,0,0,0,0 +DEFECTS,2009,0,0,0,0,0,0 +DEFENDANTS,2009,0,0,2009,0,0,0 +DEFENSIVE,2009,0,0,0,0,0,0 +DEFICIENCY,2009,0,0,0,0,0,0 +DEFINITELY,0,0,0,0,2009,0,0 +DEFRAUDING,2009,0,0,0,0,0,0 +DEGRADATIONS,2009,0,0,0,0,0,0 +DEGRADING,2009,0,0,0,0,0,0 +DELAYS,2009,0,0,0,0,0,0 +DELEGEES,0,0,0,2011,0,0,0 +DELIBERATELY,2009,0,0,0,0,0,0 +DELIGHTFULLY,0,2009,0,0,0,0,0 +DELINQUENCY,2009,0,0,0,0,0,0 +DELIST,2009,0,0,0,0,0,0 +DEMISE,2009,0,0,0,0,0,0 +DEMOLISH,2009,0,0,0,0,0,0 +DEMOLITION,2009,0,0,0,0,0,0 +DEMOTES,2009,0,0,0,0,0,0 +DEMURRED,0,0,0,2009,0,0,0 +DEMURS,0,0,0,2009,0,0,0 +DENIES,2009,0,0,0,0,0,0 +DENIGRATING,2009,0,0,0,0,0,0 +DEPEND,0,0,2009,0,0,2009,2011 +DEPENDANCES,0,0,0,0,0,0,2011 +DEPENDENCIES,0,0,2009,0,0,0,2011 +DEPENDS,0,0,2009,0,0,2009,2011 +DEPLETING,2009,0,0,0,0,0,0 +DEPOSED,0,0,0,2009,0,0,0 +DEPOSITIONAL,0,0,0,2011,0,0,0 +INVALIDATED,2009,0,0,0,0,0,0 +INVALIDITY,2009,0,0,0,0,0,0 +INVENTION,0,2009,0,0,0,0,0 +INVENTOR,0,2009,0,0,0,0,0 +INVESTIGATES,2009,0,0,0,0,0,0 +INVOLUNTARILY,2009,0,0,0,0,0,0 +IRRECOVERABLE,2009,0,0,0,0,0,0 +IRREGULARITY,2009,0,0,0,0,0,0 +IRREVERSIBLE,2009,0,0,0,0,0,0 +JEOPARDIZE,2009,0,0,0,0,0,0 +JUDICIALLY,0,0,0,2009,0,0,0 +JURIS,0,0,0,2011,0,0,0 +JURISDICTIONS,0,0,0,2009,0,0,0 +JUROR,0,0,0,2009,0,0,0 +JUSTICE,0,0,0,2009,0,0,0 +KICKBACKS,2009,0,0,0,0,0,0 +DIMINISHED,2009,0,0,0,0,0,0 +DIRECTIVE,0,0,0,0,0,0,2009 +DISADVANTAGEOUS,2009,0,0,0,0,0,0 +DISAFFIRMANCE,0,0,0,2009,0,0,0 +DISAGREEABLE,2009,0,0,0,0,0,0 +DISAGREEMENTS,2009,0,0,0,0,0,0 +DISALLOWANCES,2009,0,0,0,0,0,0 +DISAPPEAR,2009,0,0,0,0,0,0 +DISAPPEARING,2009,0,0,0,0,0,0 +DISAPPOINTING,2009,0,0,0,0,0,0 +DISAPPOINTS,2009,0,0,0,0,0,0 +DISAPPROVED,2009,0,0,0,0,0,0 +DISASSOCIATING,2009,0,0,0,0,0,0 +DISASTERS,2009,0,0,0,0,0,0 +DISAVOWAL,2009,0,0,0,0,0,0 +GRATUITOUSLY,2009,0,0,0,0,0,0 +GREATLY,0,2009,0,0,0,0,0 +GROSSLY,2009,0,0,0,0,0,0 +HALTED,2009,0,0,0,0,0,0 +HAMPERS,2009,0,0,0,0,0,0 +HAPPY,0,2009,0,0,0,0,0 +HARASSMENT,2009,0,0,0,0,0,0 +HARMED,2009,0,0,0,0,0,0 +HARMS,2009,0,0,0,0,0,0 +HARSHLY,2009,0,0,0,0,0,0 +HAZARDS,2009,0,0,0,0,0,0 +NONINFRINGING,0,0,0,2011,0,0,0 +NONPAYMENT,2009,0,0,0,0,0,0 +NONPERFORMING,2009,0,0,0,0,0,0 +DISFAVORS,2009,0,0,0,0,0,0 +PREAMENDMENT,0,0,0,2011,0,0,0 +COMPLICATED,2009,0,0,0,0,0,0 +COMPLICATIONS,2009,0,0,0,0,0,0 +COMPLIMENTING,0,2009,0,0,0,0,0 +MISSTATEMENTS,2009,0,0,0,0,0,0 +MISSTEPS,2009,0,0,0,0,0,0 +MISTAKES,2009,0,0,0,0,0,0 +MISUNDERSTAND,2009,0,0,0,0,0,0 +MISUSE,2009,0,0,0,0,0,0 +MONOPOLISTIC,2009,0,0,0,0,0,0 +MONOPOLIZED,2009,0,0,0,0,0,0 +MORATORIA,2009,0,0,0,0,0,0 +MOTHBALLED,2009,0,0,0,0,0,0 +MUTANDIS,0,0,0,2011,0,0,0 +SLIPPAGES,2009,0,0,0,0,0,0 +SLOWED,2009,0,0,0,0,0,0 +SLOWLY,2009,0,0,0,0,0,0 +SLUGGISHNESS,2009,0,0,0,0,0,0 +SMOOTHS,0,2009,0,0,0,0,0 +DEPRESSES,2009,0,0,0,0,0,0 +DEPRIVED,2009,0,0,0,0,0,0 +DERELICTION,2009,0,0,0,0,0,0 +DEROGATING,0,0,0,2009,0,0,0 +DESIGNATOR,0,0,0,2011,0,0,0 +DESPITE,0,2009,0,0,0,0,0 +DESTABILIZING,2009,0,2009,0,0,0,0 +DESTROYING,2009,0,0,0,0,0,0 +DETAIN,2009,0,0,0,0,0,0 +DETENTIONS,2009,0,0,0,0,0,0 +DETERIORATES,2009,0,0,0,0,0,0 +DETERRED,2009,0,0,0,0,0,0 +DETERRENTS,2009,0,0,0,0,0,0 +DETRACTED,2009,0,0,0,0,0,0 +DETRIMENTALLY,2009,0,0,0,0,0,0 +DEVALUES,2009,0,0,0,0,0,0 +DEVASTATING,2009,0,0,0,0,0,0 +DEVIATES,2009,0,2009,0,0,0,0 +DEVISEES,0,0,0,2011,0,0,0 +DEVOLVING,2009,0,0,0,0,0,0 +DICTATING,0,0,0,0,0,0,2009 +DIFFERS,0,0,2009,0,0,0,0 +DIFFICULTY,2009,0,0,0,0,0,0 +ASCENDANTS,0,0,0,2009,0,0,0 +ASSAULTS,2009,0,0,0,0,0,0 +ASSIGNATIONS,0,0,0,2009,0,0,0 +ASSUMES,0,0,2009,0,0,0,0 +ASSURE,0,2009,0,0,0,0,0 +ATTAIN,0,2009,0,0,0,0,0 +ATTAINMENTS,0,2009,0,0,0,0,0 +ATTESTATIONS,0,0,0,2009,0,0,0 +ATTORNEY,0,0,0,2009,0,0,0 +ATTRACTIVE,0,2009,0,0,0,0,0 +BACKDATING,2009,0,0,0,0,0,0 +BAILEE,0,0,0,2009,0,0,0 +BAILMENT,0,0,0,2011,0,0,0 +BANKRUPT,2009,0,0,0,0,0,0 +BANKRUPTING,2009,0,0,0,0,0,0 +CLAIMANTS,0,0,0,2009,0,0,0 +CLARIFICATION,0,0,2009,0,0,0,0 +CLEARLY,0,0,0,0,2009,0,0 +CLOSING,-2020,0,0,0,0,0,0 +CODEFENDANT,0,0,0,2011,0,0,0 +CODIFICATION,0,0,0,2009,0,0,0 +CODIFY,0,0,0,2009,0,0,0 +COERCES,2009,0,0,0,0,0,0 +COLLABORATED,0,2009,0,0,0,0,0 +COLLABORATIONS,0,2009,0,0,0,0,0 +COLLAPSE,2009,0,0,0,0,0,0 +COLLISION,2009,0,0,0,0,0,0 +COLLUDES,2009,0,0,0,0,0,0 +COLLUSIVE,2009,0,0,0,0,0,0 +POSITIVELY,0,2009,0,0,0,0,0 +POSSIBLE,0,0,2009,0,0,2009,0 +POSTCONTRACT,0,0,0,2011,0,0,0 +POSTPONEMENT,2009,0,0,0,0,0,0 +WRITEDOWN,2009,0,0,0,0,0,0 +WRITS,0,0,0,2009,0,0,0 +WRONGFUL,2009,0,0,0,0,0,0 +HONOR,0,2009,0,0,0,0,0 +HONORS,0,2009,0,0,0,0,0 +REARGUMENT,0,0,0,2011,0,0,0 +REASSESSING,0,0,2009,0,0,0,0 +REASSIGNED,2009,0,0,0,0,0,0 +REASSIGNS,2009,0,0,0,0,0,0 +REBUT,0,0,0,2009,0,0,0 +REBUTTAL,0,0,0,2009,0,0,0 +RECALCULATE,0,0,2009,0,0,0,0 +RECALCULATION,0,0,2009,0,0,0,0 +RECALLING,2009,0,0,0,0,0,0 +RECESSIONARY,2009,0,0,0,0,0,0 +RECKLESSNESS,2009,0,0,0,0,0,0 +RECONSIDERS,0,0,2009,0,0,0,0 +RECOUPMENTS,0,0,0,2009,0,0,0 +RECTIFICATIONS,0,0,0,2009,0,0,0 +RECUSES,0,0,0,2014,0,0,0 +REDACTING,2009,0,0,2009,0,0,0 +REDEFAULTED,2012,0,0,0,0,0,0 +REDRESSES,2009,0,0,0,0,0,0 +REEXAMINING,0,0,2009,0,0,0,0 +REFILE,0,0,0,2009,0,0,0 +REFRAIN,0,0,0,0,0,0,2009 +REFUSALS,2009,0,0,0,0,0,0 +REFUSING,2009,0,0,0,0,0,0 +REGULATE,0,0,0,2009,0,0,0 +REGULATION,0,0,0,2009,0,0,0 +REGULATORS,0,0,0,2009,0,0,0 +REHEARING,0,0,0,2009,0,0,0 +VARIABLY,0,0,2009,0,0,0,0 +VARIANTS,0,0,2009,0,0,0,0 +VARIES,0,0,2009,0,0,0,0 +VENDEES,0,0,0,2011,0,0,0 +VERSATILITY,0,2009,0,0,0,0,0 +VIBRANT,0,2009,0,0,0,0,0 +VIOLATES,2009,0,0,0,0,0,0 +VIOLATIVE,2009,0,0,2009,0,0,0 +VIOLENT,2009,0,0,0,0,0,0 +VITIATES,2009,0,0,0,0,0,0 +VOIDED,2009,0,0,2009,0,0,0 +VOLATILITY,2009,0,2009,0,0,0,0 +VULNERABLY,2009,0,0,0,0,0,0 +WARNINGS,2009,0,0,0,0,0,0 +WASTED,2009,0,0,0,0,0,0 +WEAKEN,2009,0,0,0,0,0,0 +WEAKER,2009,0,0,0,0,0,0 +WEAKNESSES,2009,0,0,0,0,0,0 +DISHONORABLE,2009,0,0,0,0,0,0 +DISHONORS,2009,0,0,0,0,0,0 +DISINTERESTEDLY,2009,0,0,0,0,0,0 +DISLOYALTY,2009,0,0,0,0,0,0 +DISMISSAL,2009,0,0,0,0,0,0 +DISMISSING,2009,0,0,0,0,0,0 +DISPARAGEMENT,2009,0,0,0,0,0,0 +DISPARAGINGLY,2009,0,0,0,0,0,0 +DISPLACED,2009,0,0,0,0,0,0 +DISPLACING,2009,0,0,0,0,0,0 +DISPOSSESSED,2009,0,0,0,0,0,0 +DISPOSSESSORY,0,0,0,2011,0,0,0 +DISPROPORTIONATELY,2009,0,0,0,0,0,0 +DISPUTING,2009,0,0,0,0,0,0 +DISQUALIFIES,2009,0,0,0,0,0,0 +DISREGARDED,2009,0,0,0,0,0,0 +DISREPUTE,2009,0,0,0,0,0,0 +DISRUPTION,2009,0,0,0,0,0,0 +DISSATISFACTION,2009,0,0,0,0,0,0 +DISSENTER,2009,0,0,0,0,0,0 +DISSIDENT,2009,0,0,0,0,0,0 +DISTINCTION,0,2009,0,0,0,0,0 +DISTINCTIVENESS,0,2009,0,0,0,0,0 +DISTORTION,2009,0,0,0,0,0,0 +DISTRACTED,2009,0,0,0,0,0,0 +DISTRACTS,2009,0,0,0,0,0,0 +DISTRIBUTEE,0,0,0,2009,0,0,0 +DISTURBANCES,2009,0,0,0,0,0,0 +DIVERSION,2009,0,0,0,0,0,0 +DIVERTS,2009,0,0,0,0,0,0 +DIVESTITURE,2009,0,0,0,0,0,0 +DIVESTS,2009,0,0,0,0,0,0 +DIVULGED,2009,0,0,0,0,0,0 +DOCKETED,0,0,0,2009,0,0,0 +DOUBT,2009,0,2009,0,0,0,0 +DOWNGRADE,2009,0,0,0,0,0,0 +DOWNSIZE,2009,0,0,0,0,0,0 +DOWNSIZINGS,2009,0,0,0,0,0,0 +DOWNTURNS,2009,0,0,0,0,0,0 +DRASTIC,2009,0,0,0,0,0,0 +DREAM,0,2009,0,0,0,0,0 +DULY,0,0,0,2009,0,0,0 +DYSFUNCTIONS,2009,0,0,0,0,0,0 +EARMARKS,0,0,0,0,0,0,2009 +EASY,0,2009,0,0,0,0,0 +EFFICIENT,0,2009,0,0,0,0,0 +EJECTMENT,0,0,0,2011,0,0,0 +EMBARGOING,2009,0,0,0,0,0,0 +EMBARRASSING,2009,0,0,0,0,0,0 +EMBEZZLED,2009,0,0,0,0,0,0 +EMBEZZLES,2009,0,0,0,0,0,0 +EMPOWERING,0,2009,0,0,0,0,0 +ENABLES,0,2009,0,0,0,0,0 +ENCOURAGES,0,2009,0,0,0,0,0 +ENCROACHES,2009,0,0,0,0,0,0 +ENCUMBER,2009,0,0,2009,0,0,2009 +ENCUMBRANCE,2009,0,0,2009,0,0,2009 +ENDANGER,2009,0,0,0,0,0,0 +ENDANGERS,2009,0,0,0,0,0,0 +ENFORCEABLY,0,0,0,2011,0,0,0 +ENHANCEMENTS,0,2009,0,0,0,0,0 +ENJOINED,2009,0,0,0,0,0,0 +ENJOYABLE,0,2009,0,0,0,0,0 +ENJOYMENT,0,2009,0,0,0,0,0 +ENTAILING,0,0,0,0,0,0,2009 +PASSU,0,0,0,2009,0,0,0 +PENALIZED,2009,0,0,0,0,0,0 +PENALTY,2009,0,0,0,0,0,0 +PERFECTLY,0,2009,0,0,0,0,0 +PERILS,2009,0,0,0,0,0,0 +PERMISSIONS,0,0,0,0,0,0,2009 +PERMITTING,0,0,0,0,0,0,2009 +PERPETRATING,2009,0,0,2009,0,0,0 +PERSISTENCE,2009,0,0,0,0,0,0 +PERSISTS,2009,0,0,0,0,0,0 +PERVASIVENESS,2009,0,0,0,0,0,0 +PETITIONERS,0,0,0,2009,0,0,0 +PICKET,2009,0,0,0,0,0,0 +HEREBY,0,0,0,2009,0,0,0 +HEREFROM,0,0,0,2009,0,0,0 +HEREINBEFORE,0,0,0,2009,0,0,0 +HERETO,0,0,0,2009,0,0,0 +HEREUPON,0,0,0,2009,0,0,0 +HIGHEST,0,2009,0,0,2009,0,0 +HINDERS,2009,0,0,0,0,0,0 +WHATEVER,0,0,0,2009,0,0,0 +WHEREAS,0,0,0,2009,0,0,0 +WHEREIN,0,0,0,2009,0,0,0 +WHEREUNDER,0,0,0,2011,0,0,0 +WHOMEVER,0,0,0,2009,0,0,0 +WILL,0,0,0,0,2009,0,0 +WIN,0,2009,0,0,0,0,0 +WITNESS,0,0,0,2009,0,0,0 +FLUCTUATED,0,0,2009,0,0,0,0 +FLUCTUATIONS,0,0,2009,0,0,0,0 +FORBEARANCES,0,0,0,2009,0,0,0 +FORBIDDEN,2009,0,0,0,0,0,2009 +FORCED,2009,0,0,0,0,0,0 +FOREBEARS,0,0,0,2009,0,0,0 +FORECLOSING,2009,0,0,0,0,0,0 +FOREGOES,2009,0,0,0,0,0,0 +FORESTALLING,2009,0,0,0,0,0,0 +FORFEITABLE,0,0,0,2009,0,0,0 +FORFEITURE,2009,0,0,0,0,0,0 +FORTHWITH,0,0,0,2009,0,0,0 +FRAUDULENCE,2009,0,0,0,0,0,0 +FRIVOLOUS,2009,0,0,0,0,0,0 +FRUSTRATES,2009,0,0,0,0,0,0 +FRUSTRATIONS,2009,0,0,0,0,0,0 +GAIN,0,2009,0,0,0,0,0 +GOOD,0,2009,0,0,0,0,0 +DISGORGES,2009,0,0,0,0,0,0 +DISGRACEFULLY,2009,0,0,0,0,0,0 +LITIGATED,2009,0,0,2009,0,0,0 +LITIGATIONS,2009,0,0,2009,0,0,0 +LITIGIOUSNESS,0,0,0,2009,0,0,0 +LACKING,2009,0,0,0,0,0,0 +LAGGED,2009,0,0,0,0,0,0 +LAPSED,2009,0,0,0,0,0,0 +LAUNDERING,2009,0,0,0,0,0,0 +LAWFULNESS,0,0,0,2009,0,0,0 +LAWSUIT,0,0,0,2009,0,0,0 +LAYOFF,2009,0,0,0,0,0,0 +LEGAL,0,0,0,2009,0,0,0 +LEGALIZATIONS,0,0,0,2009,0,0,0 +LEGALIZING,0,0,0,2009,0,0,0 +LEGATEES,0,0,0,2009,0,0,0 +FLAWS,2009,0,0,0,0,0,0 +NONRENEWAL,2009,0,0,0,0,0,0 +LIQUIDATING,2009,0,0,0,0,0,0 +LIQUIDATORS,2009,0,0,0,0,0,0 +BENEFICIAL,0,-2020,0,2020,0,0,0 +BENEFIT,0,-2020,0,0,0,0,0 +BENEFITTING,0,2009,0,0,0,0,0 +POORLY,2009,0,0,0,0,0,0 +REINTERPRETATIONS,0,0,2009,0,0,0,0 +REJECT,2009,0,0,0,0,0,0 +REJECTIONS,2009,0,0,0,0,0,0 +RELINQUISHED,2009,0,0,0,0,0,0 +RELINQUISHMENTS,2009,0,0,0,0,0,0 +REMANDED,0,0,0,2009,0,0,0 +REMEDIATED,0,0,0,2009,0,0,0 +REMEDIED,0,0,0,2009,0,0,0 +RENEGOTIATES,2009,0,0,0,0,0,0 +RENOUNCE,2009,0,0,0,0,0,0 +RENOUNCES,2009,0,0,0,0,0,0 +REPLEDGED,0,0,0,2012,0,0,0 +REPOSSESSING,2009,0,0,0,0,0,0 +TROUBLES,2009,0,0,0,0,0,0 +UNACCEPTABLE,2009,0,0,0,0,0,0 +UNANNOUNCED,2009,0,0,0,0,0,0 +UNAPPROVED,2009,0,0,0,0,0,0 +UNAVAILABLE,2009,0,0,0,0,0,2011 +UNCERTAIN,0,0,2009,0,0,2009,0 +UNCLEAR,0,0,2009,0,0,0,0 +UNCOLLECTIBLE,2009,0,0,0,0,0,0 +UNCOMPROMISING,0,0,0,0,2009,0,0 +UNCONSTITUTIONAL,0,0,0,2009,0,0,0 +UNCONTROLLABLE,2009,0,0,0,0,0,0 +UNCOVER,2009,0,0,0,0,0,0 +UNDECIDED,0,0,2009,0,0,0,0 +UNDELIVERED,2009,0,0,0,0,0,0 +UNDERCUTTING,2009,0,0,0,0,0,0 +UNDERESTIMATING,2009,0,0,0,0,0,0 +UNDERMINE,2009,0,0,0,0,0,0 +UNDERPAID,2009,0,0,0,0,0,0 +UNDERPERFORM,2011,0,0,0,0,0,0 +UNDERPERFORMS,2014,0,0,0,0,0,0 +UNDERSTATE,2009,0,0,0,0,0,0 +UNDERSTATES,2009,0,0,0,0,0,0 +UNDESIGNATED,0,0,2009,0,0,0,0 +UNDETECTED,2009,0,0,0,0,0,0 +UNDISCLOSED,2009,0,0,0,0,0,0 +UNDUE,2009,0,0,0,0,0,0 +UNECONOMICALLY,2009,0,0,0,0,0,0 +UNENCUMBERED,0,0,0,2009,0,0,0 +UNEQUIVOCALLY,0,0,0,0,2009,0,0 +UNEXPECTED,2009,0,2009,0,0,0,0 +UNFAMILIAR,0,0,2009,0,0,0,0 +UNFAVORABLY,2009,0,0,0,0,0,0 +UNFITNESS,2009,0,0,0,0,0,0 +UNFORSEEN,2011,0,2011,0,0,0,0 +UNFRIENDLY,2009,0,0,0,0,0,0 +UNHEDGED,0,0,2009,0,0,0,0 +UNINTENDED,2009,0,0,0,0,0,0 +UNJUSTIFIABLE,2009,0,0,0,0,0,0 +UNKNOWING,2009,0,0,0,0,0,0 +UNLAWFUL,2009,0,0,2009,0,0,0 +UNLIQUIDATED,2009,0,0,0,0,0,0 +UNMERITORIOUS,2014,0,0,0,0,0,0 +UNOBSERVABLE,0,0,2009,0,0,0,0 +UNPARALLELED,0,2009,0,0,2009,0,0 +UNPREDICTABILITY,2009,0,2009,0,0,0,0 +UNPRODUCTIVE,2009,0,0,0,0,0,0 +UNPROVEN,0,0,2009,0,0,0,0 +UNREALISTIC,2009,0,0,0,0,0,0 +UNRECEPTIVE,2014,0,0,0,0,0,0 +UNREIMBURSED,2009,0,0,0,0,0,0 +UNREPORTED,2009,0,0,0,0,0,0 +UNSALABLE,2009,0,0,0,0,0,0 +UNSAVORY,2009,0,0,0,0,0,0 +UNSELLABLE,2014,0,0,0,0,0,0 +UNSPECIFIC,0,0,2009,0,0,0,0 +UNSTAYED,0,0,0,2009,0,0,0 +UNSUITABILITY,2009,0,0,0,0,0,0 +UNSURE,2009,0,0,0,0,0,0 +UNSUSTAINABLE,2009,0,0,0,0,0,0 +UNTO,0,0,0,2009,0,0,0 +UNTRUTHFULLY,2009,0,0,0,0,0,0 +UNUSUAL,0,0,2009,0,0,0,0 +UNWELCOME,2009,0,0,0,0,0,0 +UPSET,2009,0,0,0,0,0,0 +URGENT,2009,0,0,0,0,0,0 +USURPED,2009,0,0,2009,0,0,0 +VAGARIES,0,0,2009,0,0,0,0 +VAGUENESSES,0,0,2012,0,0,0,0 +VANDALISM,2009,0,0,0,0,0,0 +PLAINTIFF,2009,0,0,2009,0,0,0 +PLEADED,2009,0,0,0,0,0,0 +PLEAS,2009,0,0,2009,0,0,0 +PLEASURE,0,2009,0,0,0,0,0 +PLEDGEE,0,0,0,2009,0,0,0 +PLEDGOR,0,0,0,2009,0,0,0 +COMPELLED,0,0,0,0,0,0,2009 +COMPLAIN,2009,0,0,0,0,0,0 +COMPLAINING,2009,0,0,0,0,0,0 +COMMITMENTS,0,0,0,0,0,0,2009 +LIMITATIONS,2009,0,0,0,0,0,0 +RESTRAINS,0,0,0,0,0,0,2009 +RESTRICTED,0,0,0,0,0,0,2009 +RESTRICTIVE,0,0,0,0,0,0,2009 +RESTRUCTURE,2009,0,0,0,0,0,0 +RESTRUCTURINGS,2009,0,0,0,0,0,0 +RETALIATING,2009,0,0,0,0,0,0 +RETENDERING,0,0,0,2011,0,0,0 +PRECIPITATED,2009,0,0,0,0,0,0 +PRECLUDED,2009,0,0,0,0,0,2009 +PRECONDITIONS,0,0,0,0,0,0,2009 +PREDECEASES,0,0,0,2009,0,0,0 +PREDICTED,0,0,2009,0,0,0,0 +PREDICTIVE,0,0,2009,0,0,0,0 +PREEMINENCE,0,2009,0,0,0,0,0 +PREJUDICED,2009,0,0,2009,0,0,0 +PRELIMINARILY,0,0,2009,0,0,0,0 +PREMIER,0,2009,0,0,0,0,0 +PRESSING,2009,0,0,0,0,0,0 +PRESUME,0,0,2009,0,0,0,0 +PRESUMPTION,0,0,2009,0,0,0,0 +PREVENT,0,0,0,0,0,0,2009 +PREVENTS,2009,0,0,0,0,0,2009 +PROACTIVELY,0,2009,0,0,0,0,0 +PROBABLE,0,0,2009,0,0,0,0 +PROBATES,0,0,0,2009,0,0,0 +PROBATIONARY,0,0,0,2009,0,0,0 +PROBLEM,2009,0,0,0,0,0,0 +PROFICIENCY,0,2009,0,0,0,0,0 +PROFITABLE,0,2009,0,0,0,0,0 +PROGRESSES,0,2009,0,0,0,0,0 +PROHIBITING,0,0,0,0,0,0,2009 +PROHIBITIVELY,0,0,0,0,0,0,2009 +PROLONGATION,2009,0,0,0,0,0,0 +PROLONGS,2009,0,0,0,0,0,0 +PROMULGATING,0,0,0,2009,0,0,0 +PROMULGATORS,0,0,0,2009,0,0,0 +PROSECUTE,2009,0,0,2009,0,0,0 +PROSECUTION,2009,0,0,2009,0,0,0 +PROSECUTORS,0,0,0,2009,0,0,0 +PROSPEROUS,0,2009,0,0,0,0,0 +PROTESTER,2009,0,0,0,0,0,0 +PROTESTORS,2009,0,0,0,0,0,0 +PROVISO,0,0,0,2009,0,0,0 +PROVOKED,2009,0,0,0,0,0,0 +PUNISHED,2009,0,0,0,0,0,0 +PUNISHMENTS,2009,0,0,0,0,0,0 +PURPORTEDLY,2009,0,0,0,0,0,0 +QUESTIONABLE,2009,0,0,0,0,0,0 +QUESTIONS,2009,0,0,0,0,0,0 +QUITTING,2009,0,0,0,0,0,0 +RANDOMIZE,0,0,2009,0,0,0,0 +RANDOMLY,0,0,2009,0,0,0,0 +RATABLY,0,0,0,2009,0,0,0 +RATIONALIZED,2009,0,0,0,0,0,0 +ABANDONING,2009,0,0,0,0,0,0 +ABDICATED,2009,0,0,0,0,0,0 +ABDICATIONS,2009,0,0,0,0,0,0 +ABERRATIONS,2009,0,0,0,0,0,0 +ABIDE,0,0,0,0,0,0,2009 +ABNORMALITIES,2009,0,0,0,0,0,0 +ABOLISHED,2009,0,0,0,0,0,0 +ABROGATE,2009,0,0,2009,0,0,0 +ABROGATION,2009,0,0,2009,0,0,0 +ABRUPTNESS,2009,0,0,0,0,0,0 +ABSOLVE,0,0,0,2009,0,0,0 +ABUNDANCE,0,2009,0,0,0,0,0 +ABUSES,2009,0,0,0,0,0,0 +ABUSIVENESS,2009,0,0,0,0,0,0 +ACCIDENTAL,2009,0,0,0,0,0,0 +ACCOMPLISH,0,2009,0,0,0,0,0 +ACCOMPLISHMENT,0,2009,0,0,0,0,0 +ACCUSE,2009,0,0,0,0,0,0 +ACHIEVE,0,2009,0,0,0,0,0 +ACHIEVES,0,2009,0,0,0,0,0 +ACQUIESCES,2009,0,0,0,0,0,0 +ACQUIT,2009,0,0,2009,0,0,0 +ACQUITTANCE,0,0,0,2009,0,0,0 +ADDENDUMS,0,0,0,2011,0,0,0 +ADJOURNING,0,0,0,2009,0,0,0 +ADJUDGE,0,0,0,2009,0,0,0 +ADJUDICATE,0,0,0,2009,0,0,0 +ADJUDICATION,0,0,0,2009,0,0,0 +ADJUDICATORS,0,0,0,2009,0,0,0 +ADMISSIBLY,0,0,0,2009,0,0,0 +ADULTERATED,2009,0,0,0,0,0,0 +ADVANCEMENT,0,2009,0,0,0,0,0 +ADVANTAGE,0,2009,0,0,0,0,0 +ADVANTAGES,0,2009,0,0,0,0,0 +ADVERSE,2009,0,0,0,0,0,0 +AFFIDAVIT,0,0,0,2009,0,0,0 +AFOREDESCRIBED,0,0,0,2011,0,0,0 +AFTERMATH,2009,0,0,0,0,0,0 +AGGRAVATED,2009,0,0,0,0,0,0 +AGGRAVATIONS,2009,0,0,0,0,0,0 +ALIENATE,2009,0,0,0,0,0,0 +ALIENATION,2009,0,0,0,0,0,0 +ALLEGE,2009,0,0,2009,0,0,0 +ALLEGING,2009,0,0,2009,0,0,0 +ALTERATION,0,0,2009,0,0,0,0 +AMBIGUITY,0,0,2009,0,0,0,0 +AMENDATORY,0,0,0,2009,0,0,0 +AMENDMENTS,0,0,0,2009,0,0,0 +ANNOYANCES,2009,0,0,0,0,0,0 +ANNUL,2009,0,0,0,0,0,0 +ANNULMENTS,2009,0,0,0,0,0,0 +ANOMALOUSLY,2009,0,2009,0,0,0,0 +ANTICIPATE,0,0,2009,0,0,0,0 +ANTICIPATION,0,0,2009,0,0,0,0 +ANTITRUST,2009,0,0,2009,0,0,0 +APPEAL,0,0,0,2009,0,0,0 +APPEALS,0,0,0,2009,0,0,0 +APPEARS,0,0,2009,0,0,2009,0 +APPELLEES,0,0,0,2011,0,0,0 +APPROXIMATELY,0,0,2009,0,0,0,0 +APPROXIMATIONS,0,0,2009,0,0,0,0 +ARBITRABILITY,0,0,0,2011,0,0,0 +ARBITRARY,0,0,2009,0,0,0,0 +ARBITRATING,0,0,0,2009,0,0,0 +ARBITRATIVE,0,0,0,2011,0,0,0 +ARGUED,2009,0,0,0,0,0,0 +ARGUMENTS,2009,0,0,0,0,0,0 +ARREST,2009,0,0,0,0,0,0 +RETRIBUTIONS,2009,0,0,0,0,0,0 +BONA,0,0,0,2009,0,0,0 +BOOST,0,2009,0,0,0,0,0 +BOUND,0,0,0,0,0,0,2011 +BOYCOTTING,2009,0,0,0,0,0,0 +BREACHES,2009,0,0,2009,0,0,0 +BREAKAGES,2009,0,0,0,0,0,0 +BREAKS,2009,0,0,0,0,0,0 +BRIBED,2009,0,0,0,0,0,0 +BRIBING,2009,0,0,0,0,0,0 +BURDEN,2009,0,0,0,0,0,0 +BURDENSOME,2009,0,0,0,0,0,0 +CALAMITY,2009,0,0,0,0,0,0 +CANCELLATION,2009,0,0,0,0,0,0 +CANCELS,2009,0,0,0,0,0,0 +CATASTROPHICALLY,2009,0,0,0,0,0,0 +CAUTIONING,2009,0,0,0,0,0,0 +CAUTIOUSNESS,0,0,2009,0,0,0,0 +CEASING,2009,0,0,0,0,0,0 +CENSURED,2009,0,0,0,0,0,0 +CESSION,0,0,0,2009,0,0,0 +CHALLENGING,2009,0,0,0,0,0,0 +CHATTELS,0,0,0,2009,0,0,0 +CIRCUMVENTING,2009,0,0,0,0,0,0 +SHARPLY,2009,0,0,0,0,0,0 +SHORTFALL,2009,0,0,0,0,0,0 +SHUT,2009,0,0,0,0,0,0 +SHUTTING,2009,0,0,0,0,0,0 +SLANDERS,2009,0,0,0,0,0,0 +REPUDIATE,2009,0,0,0,0,0,0 +REPUDIATION,2009,0,0,0,0,0,0 +REQUIRE,0,0,0,0,0,0,2009 +REQUIRES,0,0,0,0,0,0,2009 +RESCINDED,0,0,0,2009,0,0,0 +RESCISSIONS,0,0,0,2009,0,0,0 +RESIGNED,2009,0,0,0,0,0,0 +RESTATE,2009,0,0,0,0,0,0 +RESTATES,2009,0,0,0,0,0,0 +NONTERMINABLE,0,0,0,2011,0,0,0 +NOTARIZATION,0,0,0,2009,0,0,0 +NOTARIZING,0,0,0,2009,0,0,0 +NUISANCE,2009,0,0,0,0,0,0 +NULLIFIED,2009,0,0,2009,0,0,0 +NULLITIES,0,0,0,2009,0,0,0 +OBJECTION,2009,0,0,0,0,0,0 +OBLIGATE,0,0,0,0,0,0,2009 +OBLIGATION,0,0,0,0,0,0,2009 +OBLIGED,0,0,0,0,0,0,2009 +OBLIGOR,0,0,0,2009,0,0,0 +OBSOLESCENCE,2009,0,0,0,0,0,0 +OBSTRUCT,2009,0,0,0,0,0,0 +OBSTRUCTIONS,2009,0,0,0,0,0,0 +OFFEND,2009,0,0,0,0,0,0 +OFFENDING,2009,0,0,0,0,0,0 +OFFEREES,0,0,0,2011,0,0,0 +OMISSIONS,2009,0,0,0,0,0,0 +OMITTING,2009,0,0,0,0,0,0 +OPPORTUNITIES,0,2009,0,0,0,0,0 +OPPOSES,2009,0,0,0,0,0,0 +OPTIMISTIC,0,2009,0,0,0,0,0 +OUTAGE,2009,0,0,0,0,0,0 +OUTPERFORM,0,2009,0,0,0,0,0 +OVERAGE,2009,0,0,0,0,0,0 +OVERBUILDS,2009,0,0,0,0,0,0 +OVERBURDENING,2009,0,0,0,0,0,0 +OVERCHARGED,2009,0,0,0,0,0,0 +OVERCOMES,2009,0,0,0,0,0,0 +OVERESTIMATED,2009,0,0,0,0,0,0 +OVERESTIMATIONS,2009,0,0,0,0,0,0 +OVERLOADS,2009,0,0,0,0,0,0 +OVERLOOKS,2009,0,0,0,0,0,0 +OVERPRODUCED,2009,0,0,0,0,0,0 +OVERRULE,0,0,0,2009,0,0,0 +OVERRUN,2009,0,0,0,0,0,0 +OVERSHADOWED,2009,0,0,0,0,0,0 +OVERSTATED,2009,0,0,0,0,0,0 +OVERSTATING,2009,0,0,0,0,0,0 +OVERSUPPLYING,2009,0,0,0,0,0,0 +OVERTURNING,2009,0,0,0,0,0,0 +OVERVALUING,2009,0,0,0,0,0,0 +PARI,0,0,0,2009,0,0,0 +NECESSITATES,0,0,0,0,0,0,2009 +NEGATIVES,2009,0,0,0,0,0,0 +NEGLECTING,2009,0,0,0,0,0,0 +NEGLIGENT,2009,0,0,0,0,0,0 +BARRED,2009,0,0,0,0,0,0 +BEAUTIFULLY,0,2009,0,0,0,0,0 +BELIEVING,0,0,2009,0,0,0,0 +IDLE,2009,0,0,0,0,0,0 +IGNORED,2009,0,0,0,0,0,0 +ILLEGAL,2009,0,0,0,0,0,0 +ILLEGIBLE,2009,0,0,0,0,0,0 +ILLIQUIDITY,2009,0,0,0,0,0,0 +IMMATURE,2009,0,0,0,0,0,0 +IMPAIRING,2009,0,0,0,0,0,2011 +IMPASSE,2009,0,0,0,0,0,0 +IMPEDES,2009,0,0,0,0,0,0 +IMPENDING,2009,0,0,0,0,0,0 +IMPERIL,2009,0,0,0,0,0,0 +IMPLICATED,2009,0,0,0,0,0,0 +IMPOSED,0,0,0,0,0,0,2009 +IMPOSITIONS,0,0,0,0,0,0,2009 +IMPOUNDED,2009,0,0,0,0,0,0 +IMPRACTICAL,2009,0,0,0,0,0,0 +IMPRECISION,0,0,2009,0,0,0,0 +IMPRESSES,0,2009,0,0,0,0,0 +IMPRISONMENT,2009,0,0,0,0,0,0 +IMPROPERLY,2009,0,0,0,0,0,0 +IMPROVED,0,2009,0,0,0,0,0 +IMPROVING,0,2009,0,0,0,0,0 +INACCESSIBLE,2009,0,0,0,0,0,0 +INACCURATELY,2009,0,0,0,0,0,0 +INACTIVATED,2009,0,0,0,0,0,0 +INACTIVATIONS,2009,0,0,0,0,0,0 +INADEQUATE,2009,0,0,0,0,0,0 +INADVISABILITY,2009,0,0,0,0,0,0 +INASMUCH,0,0,0,2009,0,0,0 +INCAPACITY,2009,0,0,2009,0,0,0 +INCARCERATING,2009,0,0,2009,0,0,0 +INCIDENCE,2009,0,0,0,0,0,0 +INCOMPATIBILITIES,2009,0,0,0,0,0,0 +INCOMPETENCY,2009,0,0,0,0,0,0 +INCOMPLETE,2009,0,0,0,0,0,0 +INCONSISTENCIES,2009,0,0,0,0,0,0 +INCONTESTABILITY,0,0,0,2009,0,0,0 +INCONVENIENT,2009,0,0,0,0,0,0 +INCREDIBLE,0,2009,0,0,0,0,0 +INDECENT,2009,0,0,0,0,0,0 +INDEFINITELY,0,0,2009,0,0,0,0 +INDEMNIFICATIONS,0,0,0,2009,0,0,0 +INDEMNIFYING,0,0,0,2009,0,0,0 +INDEMNITOR,0,0,0,2009,0,0,0 +INDETERMINATE,0,0,2009,0,0,0,0 +INDICTING,2009,0,0,2009,0,0,0 +INEFFECTIVE,2009,0,0,0,0,0,0 +INEFFICIENCY,2009,0,0,0,0,0,0 +INELIGIBLE,2009,0,0,0,0,0,0 +INEQUITY,2009,0,0,0,0,0,0 +INEXPERIENCE,2009,0,0,0,0,0,0 +INFLUENTIAL,0,2009,0,0,0,0,0 +INFRACTIONS,2009,0,0,2009,0,0,0 +INFRINGEMENTS,2009,0,0,0,0,0,0 +INGENUITY,0,2009,0,0,0,0,0 +INHIBITS,0,0,0,0,0,0,2011 +INJUNCTIVE,0,0,0,2009,0,0,0 +INJURIES,2009,0,0,0,0,0,0 +INNOVATE,0,2009,0,0,0,0,0 +INNOVATION,0,2009,0,0,0,0,0 +INNOVATOR,0,2009,0,0,0,0,0 +INQUIRY,2009,0,0,0,0,0,0 +INSIST,0,0,0,0,0,0,2009 +INSISTS,0,0,0,0,0,0,2009 +INSOLVENT,2009,0,0,0,0,0,0 +INSTABILITY,2009,0,2009,0,0,0,0 +INSUFFICIENTLY,2009,0,0,0,0,0,0 +INTANGIBLES,0,0,2009,0,0,0,0 +INTERFERED,2009,0,0,0,0,0,0 +INTERFERING,2009,0,0,0,0,0,0 +INTERPLEADER,0,0,0,2009,0,0,0 +INTERPOSING,0,0,0,2009,0,0,0 +INTERROGATED,0,0,0,2009,0,0,0 +INTERROGATIONS,0,0,0,2009,0,0,0 +INTERROGATORY,0,0,0,2009,0,0,0 +INTERRUPTION,2009,0,0,0,0,0,0 +INTESTATE,0,0,0,2009,0,0,0 +SPORADIC,0,0,2009,0,0,0,0 +STABILIZATIONS,0,2009,0,0,0,0,0 +STABILIZING,0,2009,0,0,0,0,0 +STAGNATE,2009,0,0,0,0,0,0 +STAGNATION,2009,0,0,0,0,0,0 +STATUTES,0,0,0,2009,0,0,0 +STIPULATED,0,0,0,0,0,0,2009 +STIPULATIONS,0,0,0,0,0,0,2009 +STOPPED,2009,0,0,0,0,0,0 +STRAINED,2009,0,0,0,0,0,0 +STRENGTHEN,0,2009,0,0,0,0,0 +STRENGTHS,0,2009,0,0,0,0,0 +STRESSFUL,2009,0,0,0,0,0,0 +STRICTEST,0,0,0,0,0,0,2009 +STRONGER,0,2009,0,0,0,0,0 +SUBCLAUSES,0,0,0,2009,0,0,0 +SUBJECTION,2009,0,0,0,0,0,0 +SUBLICENSEE,0,0,0,2009,0,0,0 +SUBPOENA,2009,0,0,2009,0,0,0 +SUBROGATION,0,0,0,2009,0,0,0 +SUCCEED,0,2009,0,0,0,0,0 +SUCCESS,0,2009,0,0,0,0,0 +SUDDEN,0,0,2009,0,0,0,0 +SUES,2009,0,0,2009,0,0,0 +SUFFERS,2009,0,0,0,0,0,0 +SUGGESTS,0,0,2009,0,0,2009,0 +SUMMONS,2009,0,0,2009,0,0,0 +SUPERSEDEAS,0,0,0,2011,0,0,0 +SURETIES,0,0,0,2009,0,0,0 +SURPASSES,0,2009,0,0,0,0,0 +SUSPECT,2009,0,0,0,0,0,0 +SUSPENDED,2009,0,0,0,0,0,0 +SUSPENSIONS,2009,0,0,0,0,0,0 +SUSPICIOUSLY,2009,0,0,0,0,0,0 +REVISE,0,0,2009,0,0,0,0 +REVOCATIONS,2009,0,0,2009,0,0,0 +REVOKING,2009,0,0,0,0,0,0 +REVOLUTIONIZING,0,2009,0,0,0,0,0 +REWARDS,0,-2020,0,0,0,0,0 +RIDICULING,2009,0,0,0,0,0,0 +RISKIEST,2009,0,2009,0,0,0,0 +RISKY,2009,0,2009,0,0,0,0 +RUMORS,0,0,2009,0,0,0,0 +SACRIFICES,2009,0,0,0,0,0,0 +SATISFACTORILY,0,2009,0,0,0,0,0 +SATISFY,0,2009,0,0,0,0,0 +SCRUTINIZE,2009,0,0,0,0,0,0 +SCRUTINY,2009,0,0,0,0,0,0 +SEIZED,2009,0,0,0,0,0,0 +SELDOMLY,0,0,2009,0,0,2009,0 +SERIOUS,2009,0,0,0,0,0,0 +SETBACKS,2009,0,0,0,0,0,0 +SEVERABILITY,0,0,0,2009,0,0,0 +SEVERANCES,0,0,0,2009,0,0,0 +SEVERITIES,2009,0,0,0,0,0,0 +ENTHUSIASM,0,2009,0,0,0,0,0 +ENTRENCHED,0,0,0,0,0,0,2009 +ERODING,2009,0,0,0,0,0,0 +ERRED,2009,0,0,0,0,0,0 +ERROR,2009,0,0,0,0,0,0 +ESCALATED,2009,0,0,0,0,0,0 +ESCHEATED,0,0,0,2011,0,0,0 +ESCROWING,0,0,0,2011,0,0,0 +EVADED,2009,0,0,0,0,0,0 +EVASIONS,2009,0,0,0,0,0,0 +EVICTING,2009,0,0,0,0,0,0 +EVIDENTIAL,0,0,0,2011,0,0,0 +EXACERBATES,2009,0,0,0,0,0,0 +EXAGGERATE,2009,0,0,0,0,0,0 +EXAGGERATION,2009,0,0,0,0,0,0 +EXCELLENCE,0,2009,0,0,0,0,0 +EXCEPTIONAL,0,2009,0,0,0,0,0 +EXCISED,0,0,0,2009,0,0,0 +EXCLUSIVE,0,2009,0,0,0,0,0 +EXCLUSIVITY,0,2009,0,0,0,0,0 +EXCULPATING,2009,0,0,2009,0,0,0 +EXECUTOR,0,0,0,2009,0,0,0 +EXECUTRIX,0,0,0,2009,0,0,0 +EXONERATED,2009,0,0,0,0,0,0 +EXONERATIONS,2009,0,0,0,0,0,0 +EXPLOITATIVE,2009,0,0,0,0,0,0 +EXPOSE,2009,0,0,0,0,0,0 +EXPOSURE,0,0,2009,0,0,0,0 +EXPROPRIATES,2009,0,0,0,0,0,0 +EXPULSION,2009,0,0,0,0,0,0 +EXTRACORPOREAL,0,0,0,2011,0,0,0 +SOLVENCY,2009,0,0,0,0,0,0 +SOMETIMES,0,0,2009,0,0,2009,0 +SPAMMERS,2014,0,0,0,0,0,0 +TREMENDOUS,0,2009,0,0,0,0,0 +LOCKOUT,2009,0,0,0,0,0,0 +LOSING,2009,0,0,0,0,0,0 +LOWEST,0,0,0,0,2009,0,0 +MAJEURE,0,0,0,2011,0,0,0 +MALFUNCTIONING,2009,0,0,0,0,0,0 +MALICIOUSLY,2009,0,0,0,0,0,0 +MANDATED,0,0,0,0,0,0,2009 +MANDITORILY,0,0,0,0,0,0,2011 +MANIPULATING,2009,0,0,0,0,0,0 +MARKDOWN,2009,0,0,0,0,0,0 +MEDIATE,0,0,0,2009,0,0,0 +MEDIATION,0,0,0,2009,0,0,0 +MERITORIOUS,0,2009,0,0,0,0,0 +MISAPPLIED,2009,0,0,0,0,0,0 +MISAPPROPRIATE,2009,0,0,0,0,0,0 +MISAPPROPRIATION,2009,0,0,0,0,0,0 +MISCALCULATED,2009,0,0,0,0,0,0 +MISCALCULATIONS,2009,0,0,0,0,0,0 +MISCLASSIFICATIONS,2014,0,0,0,0,0,0 +MISCONDUCT,2009,0,0,0,0,0,0 +MISDIRECTED,2009,0,0,0,0,0,0 +MISHANDLES,2009,0,0,0,0,0,0 +MISINFORMED,2009,0,0,0,0,0,0 +MISINTERPRETATION,2009,0,0,0,0,0,0 +MISINTERPRETS,2009,0,0,0,0,0,0 +MISJUDGING,2009,0,0,0,0,0,0 +MISLABELED,2009,0,0,0,0,0,0 +MISLEAD,2009,0,0,0,0,0,0 +MISLED,2009,0,0,0,0,0,0 +MISMANAGES,2009,0,0,0,0,0,0 +MISMATCHES,2009,0,0,0,0,0,0 +MISPRICING,2014,0,0,0,0,0,0 +MISREPRESENTATIONS,2009,0,0,0,0,0,0 +MISS,2009,0,0,0,0,0,0 +WORSE,2009,0,0,0,0,0,0 +WORSENS,2009,0,0,0,0,0,0 +TOLERATES,2009,0,0,0,0,0,0 +TORTIOUS,0,0,0,2009,0,0,0 +TORTUOUSLY,2009,0,0,0,0,0,0 +FINED,2009,0,0,0,0,0,0 +NONAPPEALABLE,0,0,0,2009,0,0,0 +NONCANCELABLE,0,0,0,0,0,0,2009 +NONCOMPLIANCES,2009,0,0,0,0,0,0 +NONCONFORMITIES,2009,0,0,0,0,0,0 +NONCONTRACTUAL,0,0,0,2011,0,0,0 +NONFIDUCIARY,0,0,0,2011,0,0,0 +NONFUNCTIONAL,2009,0,0,0,0,0,0 +DISCLAIMER,2009,0,0,0,0,0,0 +DISCLOSE,2009,0,0,0,0,0,0 +DISCONTINUANCE,2009,0,0,0,0,0,0 +DISCONTINUE,2009,0,0,0,0,0,0 +DISCOURAGE,2009,0,0,0,0,0,0 +DISCREDIT,2009,0,0,0,0,0,0 +DISCREPANCIES,2009,0,0,0,0,0,0 +SPECULATE,0,0,2009,0,0,0,0 +SPECULATION,0,0,2009,0,0,0,0 +TRAGIC,2009,0,0,0,0,0,0 +TRANSPARENCY,0,2009,0,0,0,0,0 +LEGISLATE,0,0,0,2009,0,0,0 +LEGISLATION,0,0,0,2009,0,0,0 +LEGISLATOR,0,0,0,2009,0,0,0 +LIBEL,0,0,0,2009,0,0,0 +LICENSABLE,0,0,0,2011,0,0,0 +CONCEALING,2009,0,0,0,0,0,0 +CONCEDING,2009,0,0,0,0,0,0 +CONCERNED,2009,0,0,0,0,0,0 +CONCILIATIONS,2009,0,0,0,0,0,0 +CONDEMNATION,2009,0,0,0,0,0,0 +CONDEMNOR,0,0,0,2011,0,0,0 +CONDONE,2009,0,0,0,0,0,0 +CONFESSED,2009,0,0,0,0,0,0 +CONFIDENT,0,2009,0,0,0,0,0 +CONFINEMENTS,2009,0,0,0,0,0,0 +CONFISCATED,2009,0,0,0,0,0,0 +CONFISCATIONS,2009,0,0,0,0,0,0 +CONFLICTING,2009,0,0,0,0,0,0 +CONFRONTATIONAL,2009,0,0,0,0,0,0 +CONFRONTS,2009,0,0,0,0,0,0 +CONFUSING,2009,0,2009,0,0,0,0 +CONSENTED,0,0,0,2009,0,0,0 +CONSPIRACIES,2009,0,0,0,0,0,0 +CONSPIRATORS,2009,0,0,0,0,0,0 +CONSPIRING,2009,0,0,0,0,0,0 +CONSTITUTIONALLY,0,0,0,2009,0,0,0 +CONSTRAINED,0,0,0,0,0,0,2009 +CONSTRAINTS,0,0,0,0,0,0,2009 +CONSTRUED,0,0,0,2012,0,0,0 +CONTEND,2009,0,0,0,0,0,0 +CONTENTION,2009,0,0,0,0,0,0 +CONTESTABILITY,0,0,0,2014,0,0,0 +CONTINGENCIES,0,0,2009,0,0,0,0 +CONTINGENTS,0,0,2009,0,0,0,0 +CONTRACTHOLDERS,0,0,0,2009,0,0,0 +CONTRACTION,2009,0,0,0,0,0,0 +CONTRACTUALLY,0,0,0,2009,0,0,0 +CONTRADICTION,2009,0,0,0,0,0,0 +CONTRARY,2009,0,0,0,0,0,0 +CONTRAVENING,0,0,0,2009,0,0,0 +CONTROVERSIES,2009,0,0,0,0,0,0 +CONTROVERTING,0,0,0,2009,0,0,0 +CONVICT,2009,0,0,2009,0,0,0 +CONVICTIONS,2009,0,0,2009,0,0,0 +CORRECTIONS,2009,0,0,0,0,0,0 +CORRUPTING,2009,0,0,0,0,0,0 +CORRUPTNESS,2009,0,0,0,0,0,0 +COUNSEL,0,0,0,2009,0,0,0 +COUNTERCLAIM,2009,0,0,0,0,0,0 +COUNTERFEIT,2009,0,0,0,0,0,0 +COUNTERFEITING,2009,0,0,0,0,0,0 +COUNTERSIGNOR,0,0,0,2011,0,0,0 +COURT,0,0,0,2009,0,0,0 +COVENANT,0,0,0,0,0,0,2011 +CREATIVE,0,2009,0,0,0,0,0 +CRIME,2009,0,0,2009,0,0,0 +CRIMINALIZE,0,0,0,2014,0,0,0 +CRISES,2009,0,0,0,0,0,0 +CRITICISM,2009,0,0,0,0,0,0 +CRITICIZES,2009,0,0,0,0,0,0 +CROSSROAD,0,0,2009,0,0,0,0 +CULPABILITY,2009,0,0,0,0,0,0 +CURTAIL,2009,0,0,0,0,0,0 +CURTAILMENTS,2009,0,0,0,0,0,0 +CUTBACKS,2009,0,0,0,0,0,0 +CYBERCRIME,2014,0,0,0,0,0,0 +TAINTING,2009,0,0,0,0,0,0 +TENDING,0,0,2009,0,0,0,0 +TERMINABLE,0,0,0,2009,0,0,0 +TERMINATING,2009,0,0,0,0,0,0 +TESTAMENTARY,0,0,0,2009,0,0,0 +THENCE,0,0,0,2009,0,0,0 +THEREAT,0,0,0,2009,0,0,0 +THEREOF,0,0,0,2009,0,0,0 +THERETOFOR,0,0,0,2011,0,0,0 +THEREUPON,0,0,0,2009,0,0,0 +THREATENED,2009,0,0,0,0,0,0 +FAILED,2009,0,0,0,0,0,0 +FAILURE,2009,0,0,0,0,0,0 +FALSELY,2009,0,0,0,0,0,0 +FALSIFIES,2009,0,0,0,0,0,0 +FANTASTIC,0,2009,0,0,0,0,0 +FAULT,2009,0,0,0,0,0,0 +FAVORABLE,0,2009,0,0,0,0,0 +FAVORITE,0,2009,0,0,0,0,0 +FELONIES,2009,0,0,2009,0,0,0 +DAMAGED,2009,0,0,0,0,0,0 +DAMPENED,2009,0,0,0,0,0,0 +DANGERS,2009,0,0,0,0,0,0 +DEADLOCKS,2009,0,0,0,0,0,0 +DEBARMENTS,2009,0,0,0,0,0,0 +DECEDENTS,0,0,0,2009,0,0,0 +DECEIVE,2009,0,0,0,0,0,0 +DECEPTION,2009,0,0,0,0,0,0 +DECLARANT,0,0,0,2011,0,0,0 +DECLINING,2009,0,0,0,0,0,0 +DECREES,0,0,0,2009,0,0,0 +DEFALCATION,0,0,0,2009,0,0,0 +DEFAMATORY,2009,0,0,0,0,0,0 +DEFAMING,2009,0,0,0,0,0,0 +DEFAULTS,2009,0,0,0,0,0,0 +DEFEASED,0,0,0,2009,0,0,0 +DEFEAT,2009,0,0,0,0,0,0 +DEFECT,2009,0,0,0,0,0,0 +DEFEND,2009,0,0,0,0,0,0 +DEFENDED,2009,0,0,0,0,0,0 +DEFER,2009,0,0,0,0,0,0 +DEFICIENT,2009,0,0,0,0,0,0 +DEFINITIVELY,0,0,0,0,2009,0,0 +DEFRAUDS,2009,0,0,0,0,0,0 +DEGRADE,2009,0,0,0,0,0,0 +DELAY,2009,0,0,0,0,0,0 +DELEGABLE,0,0,0,2009,0,0,0 +DELETERIOUS,2009,0,0,0,0,0,0 +DELIGHT,0,2009,0,0,0,0,0 +DELIGHTING,0,2009,0,0,0,0,0 +DELINQUENT,2009,0,0,0,0,0,0 +DELISTED,2009,0,0,0,0,0,0 +DEMISED,2009,0,0,0,0,0,0 +DEMOLISHED,2009,0,0,0,0,0,0 +DEMOLITIONS,2009,0,0,0,0,0,0 +DEMOTING,2009,0,0,0,0,0,0 +DEMURRER,0,0,0,2009,0,0,0 +DENIAL,2009,0,0,0,0,0,0 +DENIGRATE,2009,0,0,0,0,0,0 +DENIGRATION,2009,0,0,0,0,0,0 +DEPENDABILITY,0,2009,0,0,0,0,0 +DEPENDANT,0,0,0,0,0,0,2011 +DEPENDENCY,0,0,2009,0,0,0,0 +DEPLETE,2009,0,0,0,0,0,0 +DEPLETION,2009,0,0,0,0,0,0 +DEPOSES,0,0,0,2009,0,0,0 +DEPOSITIONS,0,0,0,2009,0,0,0 +INTRUSION,2009,0,0,0,0,0,0 +INVALIDATES,2009,0,0,0,0,0,0 +INVENT,0,2009,0,0,0,0,0 +INVENTIONS,0,2009,0,0,0,0,0 +INVENTORS,0,2009,0,0,0,0,0 +INVESTIGATING,2009,0,0,0,0,0,0 +INVOLUNTARY,2009,0,0,0,0,0,0 +IRRECOVERABLY,2009,0,0,0,0,0,0 +IRREGULARLY,2009,0,0,0,0,0,0 +IRREVOCABILITY,0,0,0,2011,0,0,0 +JEOPARDIZED,2009,0,0,0,0,0,0 +JUDICIARIES,0,0,0,2009,0,0,0 +JURISDICTION,0,0,0,2009,0,0,0 +JURISPRUDENCE,0,0,0,2009,0,0,0 +JURORS,0,0,0,2009,0,0,0 +JUSTICES,0,0,0,2009,0,0,0 +KNOWINGLY,2009,0,0,0,0,0,0 +DILIGENT,0,2009,0,0,0,0,0 +DIMINISHES,2009,0,0,0,0,0,0 +DIRECTIVES,0,0,0,0,0,0,2009 +DISADVANTAGES,2009,0,0,0,0,0,0 +DISAFFIRMED,0,0,0,2011,0,0,0 +DISAGREED,2009,0,0,0,0,0,0 +DISAGREES,2009,0,0,0,0,0,0 +DISALLOWED,2009,0,0,0,0,0,0 +DISAPPEARANCE,2009,0,0,0,0,0,0 +DISAPPEARS,2009,0,0,0,0,0,0 +DISAPPOINTINGLY,2009,0,0,0,0,0,0 +DISAPPROVAL,2009,0,0,0,0,0,0 +DISAPPROVES,2009,0,0,0,0,0,0 +DISASSOCIATION,2009,0,0,0,0,0,0 +DISASTROUS,2009,0,0,0,0,0,0 +DISAVOWED,2009,0,0,0,0,0,0 +GREAT,0,-2020,0,0,0,0,0 +GREATNESS,0,2009,0,0,0,0,0 +GROUNDLESS,2009,0,0,0,0,0,0 +HAMPER,2009,0,0,0,0,0,0 +HAPPIEST,0,2009,0,0,0,0,0 +HARASS,2009,0,0,0,0,0,0 +HARDSHIP,2009,0,0,0,0,0,0 +HARMFUL,2009,0,0,0,0,0,0 +HARSH,2009,0,0,0,0,0,0 +HARSHNESS,2009,0,0,0,0,0,0 +NONJUDICIAL,0,0,0,2009,0,0,0 +NONPAYMENTS,2009,0,0,0,0,0,0 \ No newline at end of file diff --git a/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/java-solution/Task.java b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/java-solution/Task.java new file mode 100644 index 000000000000..2c94779c33e8 --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/java-solution/Task.java @@ -0,0 +1,167 @@ +/* + * 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. + */ + +// beam-playground: +// name: FinalSolution2 +// description: Final challenge solution 2. +// multifile: true +// files: +// - name: analysis.csv +// context_line: 98 +// categories: +// - Quickstart +// complexity: ADVANCED +// tags: +// - hellobeam + +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.coders.RowCoder; +import org.apache.beam.sdk.io.TextIO; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +import org.apache.beam.sdk.schemas.Schema; +import org.apache.beam.sdk.transforms.*; +import org.apache.beam.sdk.values.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; +import java.util.List; + +public class Task { + private static final Logger LOG = LoggerFactory.getLogger(Task.class); + private static final Schema schema = Schema.builder() + .addField("word", Schema.FieldType.STRING) + .addField("negative", Schema.FieldType.STRING) + .addField("positive", Schema.FieldType.STRING) + .addField("uncertainty", Schema.FieldType.STRING) + .addField("litigious", Schema.FieldType.STRING) + .addField("strong", Schema.FieldType.STRING) + .addField("weak", Schema.FieldType.STRING) + .addField("constraining", Schema.FieldType.STRING) + .build(); + + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.fromArgs(args).create(); + Pipeline pipeline = Pipeline.create(options); + + PCollection shakespeare = getPCollection(pipeline); + PCollection analysisPCollection = getAnalysisPCollection(pipeline); + + PCollectionView> viewAnalysisPCollection = analysisPCollection + .setCoder(RowCoder.of(schema)) + .apply(View.asList()); + + PCollection result = getAnalysis(shakespeare, viewAnalysisPCollection); + + PCollectionList pCollectionList = getPartitions(result); + + PCollection positivePCollection = pCollectionList.get(0).setCoder(RowCoder.of(schema)); + PCollection negativePCollection = pCollectionList.get(1).setCoder(RowCoder.of(schema)); + + positivePCollection + .apply(Combine.globally(Count.combineFn()).withoutDefaults()) + .apply(ParDo.of(new LogOutput<>("Positive word count"))); + + positivePCollection + .apply(Filter.by(it -> !it.getString("strong").equals("0") || !it.getString("weak").equals("0"))) + .apply(Combine.globally(Count.combineFn()).withoutDefaults()) + .apply(ParDo.of(new LogOutput<>("Positive words with enhanced effect count"))); + + negativePCollection + .apply(Combine.globally(Count.combineFn()).withoutDefaults()) + .apply(ParDo.of(new LogOutput<>("Negative word count"))); + + negativePCollection + .apply(Filter.by(it -> !it.getString("strong").equals("0") || !it.getString("weak").equals("0"))) + .apply(Combine.globally(Count.combineFn()).withoutDefaults()) + .apply(ParDo.of(new LogOutput<>("Negative words with enhanced effect count"))); + + pipeline.run().waitUntilFinish(); + } + + static PCollectionList getPartitions(PCollection input) { + return input + .apply(Partition.of(3, + (Partition.PartitionFn) (analysis, numPartitions) -> { + if (!analysis.getString("positive").equals("0")) { + return 0; + } + if (!analysis.getString("negative").equals("0")) { + return 1; + } + return 2; + })); + } + + static PCollection getAnalysis(PCollection pCollection, PCollectionView> viewAnalysisPCollection) { + return pCollection.apply(ParDo.of(new DoFn() { + @ProcessElement + public void processElement(@Element String word, OutputReceiver out, ProcessContext context) { + List analysisPCollection = context.sideInput(viewAnalysisPCollection); + analysisPCollection.forEach(it -> { + if (it.getString("word").equals(word)) { + out.output(it); + } + }); + } + }).withSideInputs(viewAnalysisPCollection)).setCoder(RowCoder.of(schema)); + } + + public static PCollection getPCollection(Pipeline pipeline) { + PCollection rides = pipeline.apply(TextIO.read().from("gs://apache-beam-samples/shakespeare/kinglear.txt")); + return rides.apply(FlatMapElements.into(TypeDescriptors.strings()).via(line -> Arrays.asList(line.toLowerCase().split(" ")))) + .apply(Filter.by((String word) -> !word.isEmpty())); + } + + public static PCollection getAnalysisPCollection(Pipeline pipeline) { + PCollection words = pipeline.apply(TextIO.read().from("analysis.csv")); + return words.apply(ParDo.of(new SentimentAnalysisExtractFn())); + } + + static class SentimentAnalysisExtractFn extends DoFn { + @ProcessElement + public void processElement(ProcessContext c) { + String[] items = c.element().split(","); + if (!items[1].equals("Negative")) { + c.output(Row.withSchema(schema) + .addValues(items[0].toLowerCase(), items[1], items[2], items[3], items[4], items[5], items[6], items[7]) + .build()); + } + } + } + + static class LogOutput extends DoFn { + + private final String prefix; + + LogOutput() { + this.prefix = "Processing element"; + } + + LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) { + LOG.info(prefix + ": " + c.element()); + c.output(c.element()); + } + } +} \ No newline at end of file diff --git a/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/java-solution/analysis.csv b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/java-solution/analysis.csv new file mode 100644 index 000000000000..5c4a1246021e --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/java-solution/analysis.csv @@ -0,0 +1,3877 @@ +Word,Negative,Positive,Uncertainty,Litigious,Strong_Modal,Weak_Modal,Constraining +NONSEVERABLE,0,0,0,2011,0,0,0 +DISFAVOR,2009,0,0,0,0,0,0 +DISGORGE,2009,0,0,0,0,0,0 +COMPLICATES,2009,0,0,0,0,0,0 +COMPLIMENT,0,2009,0,0,0,0,0 +COMPLIMENTS,0,2009,0,0,0,0,0 +MISSTATE,2009,0,0,0,0,0,0 +MISSTATES,2009,0,0,0,0,0,0 +MISTAKE,2009,0,0,0,0,0,0 +MISTAKING,2009,0,0,0,0,0,0 +MISUNDERSTANDING,2009,0,0,0,0,0,0 +MISUSED,2009,0,0,0,0,0,0 +MONOPOLISTS,2009,0,0,0,0,0,0 +MONOPOLIZES,2009,0,0,0,0,0,0 +MORATORIUM,2009,0,0,0,0,0,0 +MOTHBALLING,2009,0,0,0,0,0,0 +SLOW,2009,0,0,0,0,0,0 +SLOWER,2009,0,0,0,0,0,0 +SLOWNESS,2009,0,0,0,0,0,0 +SMOOTH,0,2009,0,0,0,0,0 +DEPRECATION,2009,0,0,0,0,0,0 +DEPRESSING,2009,0,0,0,0,0,0 +DEPRIVES,2009,0,0,0,0,0,0 +DEROGATE,0,0,0,2009,0,0,0 +DEROGATION,0,0,0,2009,0,0,0 +DESIRABLE,0,2009,0,0,0,0,0 +DESTABILIZATION,2009,0,0,0,0,0,0 +DESTINED,0,2009,0,0,0,0,0 +DESTROYS,2009,0,0,0,0,0,0 +DETAINED,2009,0,0,0,0,0,0 +DETER,2009,0,0,0,0,0,0 +DETERIORATING,2009,0,0,0,0,0,0 +DETERRENCE,2009,0,0,0,0,0,0 +DETERRING,2009,0,0,0,0,0,0 +DETRACTING,2009,0,0,0,0,0,0 +DETRIMENTS,2009,0,0,0,0,0,0 +DEVALUING,2009,0,0,0,0,0,0 +DEVASTATION,2009,0,0,0,0,0,0 +DEVIATING,2009,0,2009,0,0,0,0 +DEVOLVE,2009,0,0,0,0,0,0 +DICTATE,0,0,0,0,0,0,2009 +DIFFER,0,0,2009,0,0,0,0 +DIFFICULT,2009,0,0,0,0,0,0 +ASSAULT,2009,0,0,0,0,0,0 +ASSERTABLE,0,0,0,2011,0,0,0 +ASSUMABLE,0,0,0,2009,0,0,0 +ASSUMING,0,0,2009,0,0,0,0 +ASSURED,0,2009,0,0,0,0,0 +ATTAINED,0,2009,0,0,0,0,0 +ATTAINS,0,2009,0,0,0,0,0 +ATTESTED,0,0,0,2009,0,0,0 +ATTORNEYS,0,0,0,2009,0,0,0 +ATTRACTIVENESS,0,2009,0,0,0,0,0 +BAD,2009,0,0,0,0,0,0 +BAILEES,0,0,0,2011,0,0,0 +BAILOUT,2009,0,0,0,0,0,0 +BANKRUPTCIES,2009,0,0,0,0,0,0 +BANKRUPTS,2009,0,0,0,0,0,0 +CLAIM,0,0,0,2009,0,0,0 +CLAIMHOLDER,0,0,0,2014,0,0,0 +CLARIFICATIONS,0,0,2009,0,0,0,0 +CLOSED,-2020,0,0,0,0,0,0 +CLOSINGS,2009,0,0,0,0,0,0 +CODEFENDANTS,0,0,0,2011,0,0,0 +CODIFICATIONS,0,0,0,2009,0,0,0 +CODIFYING,0,0,0,2009,0,0,0 +COERCING,2009,0,0,0,0,0,0 +COLLABORATES,0,2009,0,0,0,0,0 +COLLABORATIVE,0,2009,0,0,0,0,0 +COLLAPSED,2009,0,0,0,0,0,0 +COLLISIONS,2009,0,0,0,0,0,0 +COLLUDING,2009,0,0,0,0,0,0 +POSES,2009,0,0,0,0,0,0 +POSSESSORY,0,0,0,2009,0,0,0 +POSSIBLY,0,0,2009,0,0,2009,0 +POSTJUDGMENT,0,0,0,2011,0,0,0 +POSTPONEMENTS,2009,0,0,0,0,0,0 +WRITEDOWNS,2009,0,0,0,0,0,0 +WRONG,2009,0,0,0,0,0,0 +WRONGFULLY,2009,0,0,0,0,0,0 +HONORABLE,0,-2020,0,0,0,0,0 +HOSTILE,2009,0,0,0,0,0,0 +REASSESS,0,0,2009,0,0,0,0 +REASSESSMENT,2009,0,2009,0,0,0,0 +REASSIGNING,2009,0,0,0,0,0,0 +REBOUND,0,2009,0,0,0,0,0 +REBUTS,0,0,0,2009,0,0,0 +REBUTTALS,0,0,0,2009,0,0,0 +RECALCULATED,0,0,2009,0,0,0,0 +RECALCULATIONS,0,0,2009,0,0,0,0 +RECALLS,2009,0,0,0,0,0,0 +RECESSIONS,2009,0,0,0,0,0,0 +RECONSIDER,0,0,2009,0,0,0,0 +RECORDATION,0,0,0,2009,0,0,0 +RECOURSE,0,0,0,2009,0,0,0 +RECUSAL,0,0,0,2011,0,0,0 +RECUSING,0,0,0,2011,0,0,0 +REDACTION,2009,0,0,2009,0,0,0 +REDEFAULTS,2014,0,0,0,0,0,0 +REDRESSING,2009,0,0,0,0,0,0 +REFERENDA,0,0,0,2009,0,0,0 +REFILED,0,0,0,2009,0,0,0 +REFRAINING,0,0,0,0,0,0,2009 +REFUSE,2009,0,0,0,0,0,0 +REGAIN,0,2009,0,0,0,0,0 +REGULATED,0,0,0,2009,0,0,0 +REGULATIONS,0,0,0,2009,0,0,0 +REGULATORY,0,0,0,2009,0,0,0 +REHEARINGS,0,0,0,2009,0,0,0 +VARIABILITY,0,0,2009,0,0,0,0 +VARIANCE,0,0,2009,0,0,0,0 +VARIATION,0,0,2009,0,0,0,0 +VARY,0,0,2009,0,0,0,0 +VERDICT,2009,0,0,2009,0,0,0 +VETOED,2009,0,0,0,0,0,0 +VICTIMS,2009,0,0,0,0,0,0 +VIOLATING,2009,0,0,0,0,0,0 +VIOLATOR,2009,0,0,0,0,0,0 +VIOLENTLY,2009,0,0,0,0,0,0 +VITIATING,2009,0,0,0,0,0,0 +VOIDING,2009,0,0,2009,0,0,0 +VULNERABILITIES,2009,0,0,0,0,0,0 +WARN,2009,0,0,0,0,0,0 +WARNS,2009,0,0,0,0,0,0 +WASTEFUL,2009,0,0,0,0,0,0 +WEAKENED,2009,0,0,0,0,0,0 +WEAKEST,2009,0,0,0,0,0,0 +DISHONESTLY,2009,0,0,0,0,0,0 +DISHONORABLY,2009,0,0,0,0,0,0 +DISINTERESTEDNESS,2009,0,0,0,0,0,0 +DISMAL,2009,0,0,0,0,0,0 +DISMISSALS,2009,0,0,0,0,0,0 +DISORDERLY,2009,0,0,0,0,0,0 +DISPARAGEMENTS,2009,0,0,0,0,0,0 +DISPARITIES,2009,0,0,0,0,0,0 +DISPLACEMENT,2009,0,0,0,0,0,0 +DISPOSE,2009,0,0,0,0,0,0 +DISPOSSESSES,2009,0,0,0,0,0,0 +DISPROPORTION,2009,0,0,0,0,0,0 +DISPUTE,2009,0,0,0,0,0,0 +DISQUALIFICATION,2009,0,0,0,0,0,0 +DISQUALIFY,2009,0,0,0,0,0,0 +DISREGARDING,2009,0,0,0,0,0,0 +DISRUPT,2009,0,0,0,0,0,0 +DISRUPTIONS,2009,0,0,0,0,0,0 +DISSATISFIED,2009,0,0,0,0,0,0 +DISSENTERS,2009,0,0,0,0,0,0 +DISSIDENTS,2009,0,0,0,0,0,0 +DISTINCTIONS,0,2009,0,0,0,0,0 +DISTORT,2009,0,0,0,0,0,0 +DISTORTIONS,2009,0,0,0,0,0,0 +DISTRACTING,2009,0,0,0,0,0,0 +DISTRAINT,0,0,0,2009,0,0,0 +DISTRIBUTEES,0,0,0,2009,0,0,0 +DISTURBED,2009,0,0,0,0,0,0 +DIVERT,2009,0,0,0,0,0,0 +DIVEST,2009,0,0,0,0,0,0 +DIVESTITURES,2009,0,0,0,0,0,0 +DIVORCE,2009,0,0,0,0,0,0 +DIVULGES,2009,0,0,0,0,0,0 +DOCKETING,0,0,0,2009,0,0,0 +DOUBTED,2009,0,2009,0,0,0,0 +DOWNGRADED,2009,0,0,0,0,0,0 +DOWNSIZED,2009,0,0,0,0,0,0 +DOWNTIME,2009,0,0,0,0,0,0 +DOWNWARD,2009,0,0,0,0,0,0 +DRASTICALLY,2009,0,0,0,0,0,0 +DROPPED,2009,0,0,0,0,0,0 +DURESS,2009,0,0,0,0,0,0 +EARMARK,0,0,0,0,0,0,2009 +EASIER,0,2009,0,0,0,0,0 +EFFECTIVE,0,-2020,0,0,0,0,0 +EFFICIENTLY,0,2009,0,0,0,0,0 +EMBARGO,2009,0,0,0,0,0,0 +EMBARRASS,2009,0,0,0,0,0,0 +EMBARRASSMENT,2009,0,0,0,0,0,0 +EMBEZZLEMENT,2009,0,0,0,0,0,0 +EMBEZZLING,2009,0,0,0,0,0,0 +EMPOWERS,0,2009,0,0,0,0,0 +ENABLING,0,2009,0,0,0,0,0 +ENCOURAGING,0,2009,0,0,0,0,0 +ENCROACHING,2009,0,0,0,0,0,0 +ENCUMBERED,2009,0,0,2009,0,0,2009 +ENCUMBRANCER,0,0,0,2009,0,0,0 +ENDANGERED,2009,0,0,0,0,0,0 +ENDORSEE,0,0,0,2011,0,0,0 +ENHANCE,0,2009,0,0,0,0,0 +ENHANCES,0,2009,0,0,0,0,0 +ENJOINING,2009,0,0,0,0,0,0 +ENJOYABLY,0,2009,0,0,0,0,0 +ENJOYS,0,2009,0,0,0,0,0 +ENTAILS,0,0,0,0,0,0,2009 +PATENTEE,0,0,0,2014,0,0,0 +PENALIZES,2009,0,0,0,0,0,0 +PENDING,0,0,2009,0,0,0,0 +PERFECTS,0,2009,0,0,0,0,0 +PERJURY,2009,0,0,2009,0,0,0 +PERMITTED,0,0,0,0,0,0,2009 +PERPETRATE,2009,0,0,2009,0,0,0 +PERPETRATION,2009,0,0,2009,0,0,0 +PERSISTENT,2009,0,0,0,0,0,0 +PERSONAM,0,0,0,2011,0,0,0 +PETITION,0,0,0,2009,0,0,0 +PETITIONING,0,0,0,2009,0,0,0 +PICKETED,2009,0,0,0,0,0,0 +HENCEFORTH,0,0,0,2009,0,0,0 +HEREDITAMENTS,0,0,0,2009,0,0,0 +HEREIN,0,0,0,2009,0,0,0 +HEREINBELOW,0,0,0,2009,0,0,0 +HERETOFORE,0,0,0,2009,0,0,0 +HEREWITH,0,0,0,2009,0,0,0 +HINDER,2009,0,0,0,0,0,0 +HINDRANCE,2009,0,0,0,0,0,0 +WHATSOEVER,0,0,0,2009,0,0,0 +WHEREAT,0,0,0,2009,0,0,0 +WHEREOF,0,0,0,2009,0,0,0 +WHEREUPON,0,0,0,2009,0,0,0 +WHOMSOEVER,0,0,0,2009,0,0,0 +WILLFUL,0,0,0,2009,0,0,0 +WINNER,0,2009,0,0,0,0,0 +WITNESSES,0,0,0,2009,0,0,0 +FLUCTUATES,0,0,2009,0,0,0,0 +FORBADE,0,0,0,2009,0,0,2011 +FORBEARING,0,0,0,2009,0,0,0 +FORBIDDING,2009,0,0,0,0,0,2009 +FORCING,2009,0,0,0,0,0,0 +FORECLOSE,2009,0,0,0,0,0,0 +FORECLOSURE,2009,0,0,0,0,0,0 +FOREGONE,2009,0,0,0,0,0,0 +FORESTALLS,2009,0,0,0,0,0,0 +FORFEITED,2009,0,0,0,0,0,0 +FORFEITURES,2009,0,0,0,0,0,0 +FORWHICH,0,0,0,2012,0,0,0 +FRAUDULENT,2009,0,0,0,0,0,0 +FRIVOLOUSLY,2009,0,0,0,0,0,0 +FRUSTRATING,2009,0,0,0,0,0,0 +FUGITIVE,-2020,0,0,2009,0,0,0 +GAINED,0,2009,0,0,0,0,0 +GRANTOR,0,0,0,2009,0,0,0 +DISGORGING,2009,0,0,0,0,0,0 +DISHONEST,2009,0,0,0,0,0,0 +LITIGANT,2009,0,0,2009,0,0,0 +LITIGATES,2009,0,0,2009,0,0,0 +LITIGATOR,0,0,0,2009,0,0,0 +LACKLUSTER,2009,0,0,0,0,0,0 +LAGGING,2009,0,0,0,0,0,0 +LAPSES,2009,0,0,0,0,0,0 +LAW,0,0,0,2009,0,0,0 +LAWMAKERS,0,0,0,2009,0,0,0 +LAWSUITS,0,0,0,2009,0,0,0 +LAYOFFS,2009,0,0,0,0,0,0 +LEGALESE,0,0,0,2009,0,0,0 +LEGALIZE,0,0,0,2009,0,0,0 +LEGALLY,0,0,0,2009,0,0,0 +NONPRODUCING,2009,0,0,0,0,0,0 +LIQUIDATE,2009,0,0,0,0,0,0 +LIQUIDATION,2009,0,0,0,0,0,0 +BENEFICIALLY,0,2009,0,0,0,0,0 +BENEFITED,0,2009,0,0,0,0,0 +BEST,0,2012,0,0,2009,0,0 +POPULAR,0,2009,0,0,0,0,0 +REINTERPRETED,0,0,2009,0,0,0,0 +REJECTED,2009,0,0,0,0,0,0 +REJECTS,2009,0,0,0,0,0,0 +RELINQUISHES,2009,0,0,0,0,0,0 +RELUCTANCE,2009,0,0,0,0,0,0 +REMANDING,0,0,0,2009,0,0,0 +REMEDIATING,0,0,0,2009,0,0,0 +REMISED,0,0,0,2011,0,0,0 +RENEGOTIATING,2009,0,0,0,0,0,0 +RENOUNCED,2009,0,0,0,0,0,0 +RENOUNCING,2009,0,0,0,0,0,0 +REPLEVIN,0,0,0,2009,0,0,0 +REPOSSESSION,2009,0,0,0,0,0,0 +TURBULENCE,2009,0,2009,0,0,0,0 +UNACCEPTABLY,2009,0,0,0,0,0,0 +UNANTICIPATED,2009,0,0,0,0,0,0 +UNATTRACTIVE,2009,0,0,0,0,0,0 +UNAVOIDABLE,2009,0,0,0,0,0,0 +UNCERTAINLY,0,0,2009,0,0,2009,0 +UNCOLLECTABLE,2009,0,0,0,0,0,0 +UNCOLLECTIBLES,2009,0,0,0,0,0,0 +UNCONFIRMED,0,0,2009,0,0,0,0 +UNCONSTITUTIONALITY,0,0,0,2009,0,0,0 +UNCONTROLLABLY,2009,0,0,0,0,0,0 +UNCOVERED,2009,0,0,0,0,0,0 +UNDEFEASED,0,0,0,2012,0,0,0 +UNDERCAPITALIZED,2009,0,0,0,0,0,0 +UNDERESTIMATE,2009,0,0,0,0,0,0 +UNDERESTIMATION,2009,0,0,0,0,0,0 +UNDERMINED,2009,0,0,0,0,0,0 +UNDERPAYMENT,2009,0,0,0,0,0,0 +UNDERPERFORMANCE,2009,0,0,0,0,0,0 +UNDERPRODUCED,2009,0,0,0,0,0,0 +UNDERSTATED,2009,0,0,0,0,0,0 +UNDERSTATING,2009,0,0,0,0,0,0 +UNDESIRABLE,2009,0,0,0,0,0,0 +UNDETERMINABLE,0,0,2009,0,0,0,0 +UNDISPUTED,0,0,0,0,2009,0,0 +UNDULY,2009,0,0,0,0,0,0 +UNEMPLOYED,2009,0,0,0,0,0,0 +UNENFORCEABILITY,0,0,0,2009,0,0,0 +UNETHICAL,2009,0,0,0,0,0,0 +UNEXPECTEDLY,2009,0,2009,0,0,0,0 +UNFAMILIARITY,0,0,2009,0,0,0,0 +UNFAVOURABLE,2011,0,0,0,0,0,0 +UNFORECASTED,0,0,2011,0,0,0,0 +UNFORTUNATE,2009,0,0,0,0,0,0 +UNFULFILLED,2009,0,0,0,0,0,0 +UNIDENTIFIABLE,0,0,2009,0,0,0,0 +UNINTENTIONAL,2009,0,0,0,0,0,0 +UNJUSTIFIABLY,2009,0,0,0,0,0,0 +UNKNOWINGLY,2009,0,0,0,0,0,0 +UNLAWFULLY,2009,0,0,2009,0,0,0 +UNMARKETABLE,2009,0,0,0,0,0,0 +UNNECESSARILY,2009,0,0,0,0,0,0 +UNOBTAINABLE,2009,0,0,0,0,0,0 +UNPERFORMED,2009,0,0,0,0,0,0 +UNPREDICTABLE,2009,0,2009,0,0,0,0 +UNPROFITABILITY,2011,0,0,0,0,0,0 +UNQUALIFIED,2009,0,0,0,0,0,0 +UNREASONABLE,2009,0,0,0,0,0,0 +UNRECONCILED,0,0,2011,0,0,0,0 +UNRELIABLE,2009,0,0,0,0,0,0 +UNRESOLVED,2009,0,0,0,0,0,0 +UNSALEABLE,2009,0,0,0,0,0,0 +UNSCHEDULED,2009,0,0,0,0,0,0 +UNSETTLED,0,0,2009,0,0,0,0 +UNSPECIFIED,0,0,2009,0,0,0,0 +UNSUBSTANTIATED,2009,0,0,0,0,0,0 +UNSUITABLE,2009,0,0,0,0,0,0 +UNSURPASSED,0,2009,0,0,2009,0,0 +UNTENABLE,2009,0,0,0,0,0,0 +UNTRUSTED,2014,0,0,0,0,0,0 +UNTRUTHFULNESS,2009,0,0,0,0,0,0 +UNUSUALLY,0,0,2009,0,0,0,0 +UNWILLING,2009,0,0,0,0,0,0 +UPTURN,0,2009,0,0,0,0,0 +USURIOUS,2009,0,0,2009,0,0,0 +USURPING,2009,0,0,2009,0,0,0 +VAGUE,0,0,2012,0,0,0,0 +VAGUER,0,0,2012,0,0,0,0 +PLAINTIFFS,2009,0,0,2009,0,0,0 +PLEADING,2009,0,0,2009,0,0,0 +PLEASANT,0,2009,0,0,0,0,0 +PLED,2009,0,0,0,0,0,0 +PLEDGEES,0,0,0,2011,0,0,0 +PLEDGORS,0,0,0,2012,0,0,0 +COMPELLING,0,0,0,0,0,0,2011 +COMPLAINANT,0,0,0,2009,0,0,0 +COMPLAINS,2009,0,0,0,0,0,0 +COMMITS,0,0,0,0,0,0,2009 +LIKELIHOOD,0,0,2009,0,0,0,0 +LIMITING,0,0,0,0,0,0,2009 +RESTRAIN,0,0,0,0,0,0,2009 +RESTRAINT,0,0,0,0,0,0,2009 +RESTRICTING,0,0,0,0,0,0,2009 +RESTRICTIVELY,0,0,0,0,0,0,2009 +RESTRUCTURED,2009,0,0,0,0,0,0 +RETALIATE,2009,0,0,0,0,0,0 +RETALIATION,2009,0,0,0,0,0,0 +PRECAUTION,0,0,2009,0,0,0,0 +PRECIPITOUS,2009,0,0,0,0,0,0 +PRECLUDES,2009,0,0,0,0,0,2009 +PREDATORY,2009,0,0,0,0,0,0 +PREDECEASING,0,0,0,2009,0,0,0 +PREDICTING,0,0,2009,0,0,0,0 +PREDICTOR,0,0,2009,0,0,0,0 +PREEMINENT,0,2009,0,0,0,0,0 +PREJUDICES,2009,0,0,2009,0,0,0 +PRELIMINARY,0,0,2009,0,0,0,0 +PREMIERE,0,2009,0,0,0,0,0 +PRESTIGE,0,2009,0,0,0,0,0 +PRESUMED,0,0,2009,0,0,0,0 +PRESUMPTIONS,0,0,2009,0,0,0,0 +PREVENTED,0,0,0,0,0,0,2009 +PRIMA,0,0,0,2009,0,0,0 +PROBABILISTIC,0,0,2009,0,0,0,0 +PROBABLY,0,0,2009,0,0,0,0 +PROBATING,0,0,0,2009,0,0,0 +PROBATIONER,0,0,0,2009,0,0,0 +PROBLEMATIC,2009,0,0,0,0,0,0 +PROFICIENT,0,2009,0,0,0,0,0 +PROFITABLY,0,2009,0,0,0,0,0 +PROGRESSING,0,2009,0,0,0,0,0 +PROHIBITION,0,0,0,0,0,0,2009 +PROHIBITORY,0,0,0,0,0,0,2009 +PROLONGATIONS,2009,0,0,0,0,0,0 +PROMULGATE,0,0,0,2009,0,0,0 +PROMULGATION,0,0,0,2009,0,0,0 +PRONE,2009,0,0,0,0,0,0 +PROSECUTED,2009,0,0,2009,0,0,0 +PROSECUTIONS,2009,0,0,2009,0,0,0 +PROSPERED,0,2009,0,0,0,0,0 +PROSPERS,0,2009,0,0,0,0,0 +PROTESTERS,2009,0,0,0,0,0,0 +PROTESTS,2009,0,0,0,0,0,0 +PROVISOES,0,0,0,2009,0,0,0 +PROVOKES,2009,0,0,0,0,0,0 +PUNISHES,2009,0,0,0,0,0,0 +PUNITIVE,2009,0,0,0,0,0,0 +PURPORTING,2009,0,0,0,0,0,0 +QUESTIONABLY,2009,0,0,0,0,0,0 +QUIT,2009,0,0,0,0,0,0 +RACKETEER,2009,0,0,0,0,0,0 +RANDOMIZED,0,0,2009,0,0,0,0 +RANDOMNESS,0,0,2009,0,0,0,0 +RATIONALIZATION,2009,0,0,0,0,0,0 +RATIONALIZES,2009,0,0,0,0,0,0 +ABANDONMENT,2009,0,0,0,0,0,0 +ABDICATES,2009,0,0,0,0,0,0 +ABERRANT,2009,0,0,0,0,0,0 +ABETTING,2009,0,0,0,0,0,0 +ABIDING,0,0,0,0,0,0,2009 +ABNORMALITY,2009,0,0,0,0,0,0 +ABOLISHES,2009,0,0,0,0,0,0 +ABROGATED,2009,0,0,2009,0,0,0 +ABROGATIONS,2009,0,0,2009,0,0,0 +ABSENCE,2009,0,0,0,0,0,0 +ABSOLVED,0,0,0,2009,0,0,0 +ABUNDANT,0,2009,0,0,0,0,0 +ABUSING,2009,0,0,0,0,0,0 +ACCESSION,0,0,0,2009,0,0,0 +ACCIDENTALLY,2009,0,0,0,0,0,0 +ACCOMPLISHED,0,2009,0,0,0,0,0 +ACCOMPLISHMENTS,0,2009,0,0,0,0,0 +ACCUSED,2009,0,0,0,0,0,0 +ACHIEVED,0,2009,0,0,0,0,0 +ACHIEVING,0,2009,0,0,0,0,0 +ACQUIESCING,2009,0,0,0,0,0,0 +ACQUITS,2009,0,0,2009,0,0,0 +ACQUITTANCES,0,0,0,2011,0,0,0 +ADEQUATELY,0,2009,0,0,0,0,0 +ADJOURNMENT,0,0,0,2009,0,0,0 +ADJUDGED,0,0,0,2009,0,0,0 +ADJUDICATED,0,0,0,2009,0,0,0 +ADJUDICATIONS,0,0,0,2009,0,0,0 +ADJUDICATORY,0,0,0,2009,0,0,0 +ADMISSION,0,0,0,2009,0,0,0 +ADULTERATING,2009,0,0,0,0,0,0 +ADVANCEMENTS,0,2009,0,0,0,0,0 +ADVANTAGED,0,2009,0,0,0,0,0 +ADVERSARIAL,2009,0,0,0,0,0,0 +ADVERSELY,2009,0,0,0,0,0,0 +AFFIDAVITS,0,0,0,2009,0,0,0 +AFOREMENTIONED,0,0,0,2009,0,0,0 +AFTERMATHS,2009,0,0,0,0,0,0 +AGGRAVATES,2009,0,0,0,0,0,0 +AGGRIEVED,0,0,0,2009,0,0,0 +ALIENATED,2009,0,0,0,0,0,0 +ALIENATIONS,2009,0,0,0,0,0,0 +ALLEGED,2009,0,0,2009,0,0,0 +ALLIANCE,0,2009,0,0,0,0,0 +ALTERATIONS,0,0,2009,0,0,0,0 +AMBIGUOUS,0,0,2009,0,0,0,0 +AMENDED,0,0,0,2009,0,0,0 +AMENDS,0,0,0,2009,0,0,0 +ANNOYED,2009,0,0,0,0,0,0 +ANNULLED,2009,0,0,0,0,0,0 +ANNULS,2009,0,0,0,0,0,0 +ANOMALY,2009,0,2009,0,0,0,0 +ANTICIPATED,0,0,2009,0,0,0,0 +ANTICIPATIONS,0,0,2009,0,0,0,0 +ANYWISE,0,0,0,2009,0,0,0 +APPEALABLE,0,0,0,2009,0,0,0 +APPEAR,0,0,2009,0,0,0,0 +APPELLANT,0,0,0,2009,0,0,0 +APPOINTOR,0,0,0,2011,0,0,0 +APPROXIMATES,0,0,2009,0,0,0,0 +APPURTENANCE,0,0,0,2009,0,0,0 +ARBITRAL,0,0,0,2009,0,0,0 +ARBITRATE,0,0,0,2009,0,0,0 +ARBITRATION,0,0,0,2009,0,0,0 +ARBITRATOR,0,0,0,2009,0,0,0 +ARGUING,2009,0,0,0,0,0,0 +ARREARAGE,2009,0,0,2009,0,0,0 +ARRESTED,2009,0,0,0,0,0,0 +RETROCEDE,0,0,0,2011,0,0,0 +BOLSTERED,0,2009,0,0,0,0,0 +BONAFIDE,0,0,0,2009,0,0,0 +BOOSTED,0,2009,0,0,0,0,0 +BOUNDED,0,0,0,0,0,0,2009 +BOYCOTTS,2009,0,0,0,0,0,0 +BREACHING,2009,0,0,2009,0,0,0 +BREAKDOWN,2009,0,0,0,0,0,0 +BREAKTHROUGH,0,2009,0,0,0,0,0 +BRIBERIES,2009,0,0,0,0,0,0 +BRIDGE,-2020,0,0,0,0,0,0 +BURDENED,2009,0,0,0,0,0,0 +BURNED,2009,0,0,0,0,0,0 +CANCEL,2009,0,0,0,0,0,0 +CANCELLATIONS,2009,0,0,0,0,0,0 +CARELESS,2009,0,0,0,0,0,0 +CATASTROPHE,2009,0,0,0,0,0,0 +CAUTION,2009,0,0,0,0,0,0 +CAUTIONS,2009,0,0,0,0,0,0 +CEASE,2009,0,0,0,0,0,0 +CEDANT,0,0,0,2012,0,0,0 +CENSURES,2009,0,0,0,0,0,0 +CHALLENGE,2009,0,0,0,0,0,0 +CHARGEOFFS,2009,0,0,0,0,0,0 +CHOATE,0,0,0,2011,0,0,0 +CIRCUMVENTION,2009,0,0,0,0,0,0 +SHOCKED,2009,0,0,0,0,0,0 +SHORTFALLS,2009,0,0,0,0,0,0 +SHUTDOWN,2009,0,0,0,0,0,0 +SLANDER,2009,0,0,0,0,0,0 +REPUDIATED,2009,0,0,0,0,0,0 +REPUDIATIONS,2009,0,0,0,0,0,0 +REQUIRED,0,0,0,0,0,0,2009 +REQUIRING,0,0,0,0,0,0,2009 +RESCINDING,0,0,0,2009,0,0,0 +RESIGN,2009,0,0,0,0,0,0 +RESIGNING,2009,0,0,0,0,0,0 +RESTATED,2009,0,0,0,0,0,0 +RESTATING,2009,0,0,0,0,0,0 +NONUSURIOUS,0,0,0,2011,0,0,0 +NOTARIZATIONS,0,0,0,2009,0,0,0 +NOTARY,0,0,0,2009,0,0,0 +NUISANCES,2009,0,0,0,0,0,0 +NULLIFIES,2009,0,0,2009,0,0,0 +NULLITY,0,0,0,2009,0,0,0 +OBJECTIONABLE,2009,0,0,0,0,0,0 +OBLIGATED,0,0,0,0,0,0,2009 +OBLIGATIONS,0,0,0,0,0,0,2009 +OBLIGEE,0,0,0,2009,0,0,0 +OBLIGORS,0,0,0,2009,0,0,0 +OBSOLETE,2009,0,0,0,0,0,0 +OBSTRUCTED,2009,0,0,0,0,0,0 +OCCASIONALLY,0,0,2009,0,0,2009,0 +OFFENDED,2009,0,0,0,0,0,0 +OFFENDS,2009,0,0,0,0,0,0 +OFFEROR,0,0,0,2009,0,0,0 +OMIT,2009,0,0,0,0,0,0 +ONEROUS,2009,0,0,0,0,0,0 +OPPORTUNITY,0,2009,0,0,0,0,0 +OPPOSING,2009,0,0,0,0,0,0 +OPTIONEE,0,0,0,2009,0,0,0 +OUTAGES,2009,0,0,0,0,0,0 +OUTPERFORMED,0,2009,0,0,0,0,0 +OVERAGES,2009,0,0,0,0,0,0 +OVERBUILT,2009,0,0,0,0,0,0 +OVERCAPACITIES,2009,0,0,0,0,0,0 +OVERCHARGES,2009,0,0,0,0,0,0 +OVERCOMING,2009,0,0,0,0,0,0 +OVERESTIMATES,2009,0,0,0,0,0,0 +OVERLOAD,2009,0,0,0,0,0,0 +OVERLOOK,2009,0,0,0,0,0,0 +OVERPAID,2009,0,0,0,0,0,0 +OVERPRODUCES,2009,0,0,0,0,0,0 +OVERRULED,0,0,0,2009,0,0,0 +OVERRUNNING,2009,0,0,0,0,0,0 +OVERSHADOWING,2009,0,0,0,0,0,0 +OVERSTATEMENT,2009,0,0,0,0,0,0 +OVERSUPPLIED,2009,0,0,0,0,0,0 +OVERTLY,2009,0,0,0,0,0,0 +OVERTURNS,2009,0,0,0,0,0,0 +PANIC,2009,0,0,0,0,0,0 +NEARLY,0,0,2009,0,0,2009,0 +NECESSITATING,0,0,0,0,0,0,2009 +NEGLECT,2009,0,0,0,0,0,0 +NEGLECTS,2009,0,0,0,0,0,0 +NEGLIGENTLY,2009,0,0,0,0,0,0 +BARRIER,2009,0,0,0,0,0,0 +BELIEVE,0,0,2009,0,0,0,0 +IDLED,2009,0,0,0,0,0,0 +IGNORES,2009,0,0,0,0,0,0 +ILLEGALITIES,2009,0,0,0,0,0,0 +ILLICIT,2009,0,0,0,0,0,0 +IMBALANCE,2009,0,0,0,0,0,0 +IMMORAL,2009,0,0,0,0,0,0 +IMPAIRMENT,2009,0,0,0,0,0,2011 +IMPASSES,2009,0,0,0,0,0,0 +IMPEDIMENT,2009,0,0,0,0,0,0 +IMPERATIVE,2009,0,0,0,0,0,0 +IMPERMISSIBLE,2009,0,0,0,0,0,0 +IMPLICATES,2009,0,0,0,0,0,0 +IMPOSES,0,0,0,0,0,0,2009 +IMPOSSIBILITY,2009,0,0,0,0,0,0 +IMPOUNDING,2009,0,0,0,0,0,0 +IMPRACTICALITIES,2009,0,0,0,0,0,0 +IMPRECISIONS,0,0,2009,0,0,0,0 +IMPRESSING,0,2009,0,0,0,0,0 +IMPROBABILITY,0,0,2009,0,0,0,0 +IMPROPRIETIES,2009,0,0,0,0,0,0 +IMPROVEMENT,0,2009,0,0,0,0,0 +IMPRUDENT,2009,0,0,0,0,0,0 +INACCURACIES,2009,0,0,0,0,0,0 +INACTION,2009,0,0,0,0,0,0 +INACTIVATES,2009,0,0,0,0,0,0 +INACTIVITY,2009,0,0,0,0,0,0 +INADEQUATELY,2009,0,0,0,0,0,0 +INADVISABLE,2009,0,0,0,0,0,0 +INATTENTION,2009,0,0,0,0,0,0 +INCARCERATE,2009,0,0,2009,0,0,0 +INCARCERATION,2009,0,0,2009,0,0,0 +INCIDENCES,2009,0,0,0,0,0,0 +INCOMPATIBILITY,2009,0,0,0,0,0,0 +INCOMPETENT,2009,0,0,0,0,0,0 +INCOMPLETELY,2009,0,0,0,0,0,0 +INCONSISTENCY,2009,0,0,0,0,0,0 +INCONTESTABLE,0,0,0,2009,0,0,0 +INCORRECT,2009,0,0,0,0,0,0 +INCREDIBLY,0,2009,0,0,0,0,0 +INDEFEASIBLE,2009,0,0,0,0,0,0 +INDEFINITENESS,0,0,2009,0,0,0,0 +INDEMNIFIED,0,0,0,2009,0,0,0 +INDEMNITEE,0,0,0,2009,0,0,0 +INDEMNITORS,0,0,0,2009,0,0,0 +INDICT,2009,0,0,2009,0,0,0 +INDICTMENT,2009,0,0,2009,0,0,0 +INEFFECTIVELY,2009,0,0,0,0,0,0 +INEFFICIENT,2009,0,0,0,0,0,0 +INEQUITABLE,2009,0,0,0,0,0,0 +INEVITABLE,2009,0,0,0,0,0,0 +INEXPERIENCED,2009,0,0,0,0,0,0 +INFORCE,0,0,0,2009,0,0,0 +INFRINGE,2009,0,0,0,0,0,0 +INFRINGER,0,0,0,2009,0,0,0 +INHIBIT,0,0,0,0,0,0,2011 +INIMICAL,2009,0,0,0,0,0,0 +INJURE,2009,0,0,0,0,0,0 +INJURING,2009,0,0,0,0,0,0 +INNOVATED,0,2009,0,0,0,0,0 +INNOVATIONS,0,2009,0,0,0,0,0 +INNOVATORS,0,2009,0,0,0,0,0 +INSECURE,2009,0,0,0,0,0,0 +INSISTED,0,0,0,0,0,0,2009 +INSOFAR,0,0,0,2009,0,0,0 +INSPIRATION,0,2009,0,0,0,0,0 +INSUBORDINATION,2009,0,0,0,0,0,0 +INSURRECTION,2009,0,0,0,0,0,0 +INTEGRITY,0,2009,0,0,0,0,0 +INTERFERENCE,2009,0,0,0,0,0,0 +INTERLOCUTORY,0,0,0,2009,0,0,0 +INTERPOSE,0,0,0,2009,0,0,0 +INTERPOSITION,0,0,0,2009,0,0,0 +INTERROGATES,0,0,0,2009,0,0,0 +INTERROGATOR,0,0,0,2009,0,0,0 +INTERRUPT,2009,0,0,0,0,0,0 +INTERRUPTIONS,2009,0,0,0,0,0,0 +INTIMIDATION,2009,0,0,0,0,0,0 +SPORADICALLY,0,0,2009,0,0,0,0 +STABILIZE,0,2009,0,0,0,0,0 +STABLE,0,2009,0,0,0,0,0 +STAGNATED,2009,0,0,0,0,0,0 +STANDSTILL,2009,0,0,0,0,0,0 +STATUTORILY,0,0,0,2009,0,0,0 +STIPULATES,0,0,0,0,0,0,2009 +STOLEN,2009,0,0,0,0,0,0 +STOPPING,2009,0,0,0,0,0,0 +STRAINING,2009,0,0,0,0,0,0 +STRENGTHENED,0,2009,0,0,0,0,0 +STRESS,2009,0,0,0,0,0,0 +STRESSING,2009,0,0,0,0,0,0 +STRICTLY,0,0,0,0,0,0,2009 +STRONGEST,0,2009,0,0,0,0,0 +SUBDOCKET,0,0,0,2012,0,0,0 +SUBLEASEE,0,0,0,2011,0,0,0 +SUBLICENSOR,0,0,0,2011,0,0,0 +SUBPOENAED,2009,0,0,2009,0,0,0 +SUBSTANDARD,2009,0,0,0,0,0,0 +SUCCEEDED,0,2009,0,0,0,0,0 +SUCCESSES,0,2009,0,0,0,0,0 +SUDDENLY,0,0,2009,0,0,0,0 +SUFFER,2009,0,0,0,0,0,0 +SUGGEST,0,0,2009,0,0,2009,0 +SUING,2009,0,0,2009,0,0,0 +SUMMONSES,2009,0,0,2009,0,0,0 +SUPERSEDED,0,0,0,2009,0,0,0 +SURETY,0,0,0,2009,0,0,0 +SURPASSING,0,2009,0,0,0,0,0 +SUSPECTED,2009,0,0,0,0,0,0 +SUSPENDING,2009,0,0,0,0,0,0 +SUSPICION,2009,0,0,0,0,0,0 +REVISED,0,0,2009,0,0,0,0 +REVOKE,2009,0,0,0,0,0,0 +REVOLUTIONIZE,0,2009,0,0,0,0,0 +REWARD,0,2009,0,0,0,0,0 +RIDICULE,2009,0,0,0,0,0,0 +RISK,0,0,2009,0,0,0,0 +RISKINESS,0,0,2009,0,0,0,0 +ROUGHLY,0,0,2009,0,0,0,0 +SABOTAGE,2009,0,0,0,0,0,0 +SACRIFICIAL,2009,0,0,0,0,0,0 +SATISFACTORY,0,2009,0,0,0,0,0 +SATISFYING,0,2009,0,0,0,0,0 +SCRUTINIZED,2009,0,0,0,0,0,0 +SECRECY,-2020,0,0,0,0,0,0 +SEIZES,2009,0,0,0,0,0,0 +SENTENCED,2009,0,0,2009,0,0,0 +SERIOUSLY,2009,0,0,0,0,0,0 +SETTLEMENT,0,0,0,2009,0,0,0 +SEVERABLE,0,0,0,2009,0,0,0 +SEVERE,2009,0,0,0,0,0,0 +SEVERITY,2009,0,0,0,0,0,0 +ENTHUSIASTIC,0,2009,0,0,0,0,0 +ERODE,2009,0,0,0,0,0,0 +EROSION,2009,0,0,0,0,0,0 +ERRING,2009,0,0,0,0,0,0 +ERRORS,2009,0,0,0,0,0,0 +ESCALATES,2009,0,0,0,0,0,0 +ESCHEATMENT,0,0,0,2011,0,0,0 +ESCROWS,0,0,0,0,0,0,2009 +EVADES,2009,0,0,0,0,0,0 +EVASIVE,2009,0,0,0,0,0,0 +EVICTION,2009,0,0,0,0,0,0 +EVIDENTIARY,0,0,0,2009,0,0,0 +EXACERBATING,2009,0,0,0,0,0,0 +EXAGGERATED,2009,0,0,0,0,0,0 +EXCEEDANCE,0,0,0,2011,0,0,0 +EXCELLENT,0,2009,0,0,0,0,0 +EXCEPTIONALLY,0,2009,0,0,0,0,0 +EXCITED,0,2009,0,0,0,0,0 +EXCLUSIVELY,0,2009,0,0,0,0,0 +EXCULPATE,2009,0,0,2009,0,0,0 +EXCULPATION,2009,0,0,2009,0,0,0 +EXECUTORS,0,0,0,2009,0,0,0 +EXECUTRIXES,0,0,0,2009,0,0,0 +EXONERATES,2009,0,0,0,0,0,0 +EXPLOIT,2009,0,0,0,0,0,0 +EXPLOITED,2009,0,0,0,0,0,0 +EXPOSED,2009,0,0,0,0,0,0 +EXPOSURES,0,0,2009,0,0,0,0 +EXPROPRIATING,2009,0,0,0,0,0,0 +EXPULSIONS,2009,0,0,0,0,0,0 +EXTRAJUDICIAL,0,0,0,2014,0,0,0 +SOLVES,0,2009,0,0,0,0,0 +SOMEWHAT,0,0,2009,0,0,2009,0 +SPAMMING,2014,0,0,0,0,0,0 +TREMENDOUSLY,0,2009,0,0,0,0,0 +LOCKOUTS,2009,0,0,0,0,0,0 +LOSS,2009,0,0,0,0,0,0 +LOYAL,0,2009,0,0,0,0,0 +MALFEASANCE,2009,0,0,0,0,0,0 +MALFUNCTIONS,2009,0,0,0,0,0,0 +MALPRACTICE,2009,0,0,0,0,0,0 +MANDATES,0,0,0,0,0,0,2009 +MANIPULATE,2009,0,0,0,0,0,0 +MANIPULATION,2009,0,0,0,0,0,0 +MARKDOWNS,2009,0,0,0,0,0,0 +MEDIATED,0,0,0,2009,0,0,0 +MEDIATIONS,0,0,0,2009,0,0,0 +MIGHT,0,0,2009,0,0,2009,0 +MISAPPLIES,2009,0,0,0,0,0,0 +MISAPPROPRIATED,2009,0,0,0,0,0,0 +MISAPPROPRIATIONS,2009,0,0,0,0,0,0 +MISCALCULATES,2009,0,0,0,0,0,0 +MISCHARACTERIZATION,2014,0,0,0,0,0,0 +MISCLASSIFIED,2011,0,0,0,0,0,0 +MISDATED,2011,0,0,0,0,0,0 +MISFEASANCE,0,0,0,2009,0,0,0 +MISHANDLING,2009,0,0,0,0,0,0 +MISINFORMING,2009,0,0,0,0,0,0 +MISINTERPRETATIONS,2009,0,0,0,0,0,0 +MISJUDGE,2009,0,0,0,0,0,0 +MISJUDGMENT,2009,0,0,0,0,0,0 +MISLABELING,2009,0,0,0,0,0,0 +MISLEADING,2009,0,0,0,0,0,0 +MISMANAGE,2009,0,0,0,0,0,0 +MISMANAGING,2009,0,0,0,0,0,0 +MISMATCHING,2009,0,0,0,0,0,0 +MISPRICINGS,2014,0,0,0,0,0,0 +MISREPRESENTED,2009,0,0,0,0,0,0 +MISSED,2009,0,0,0,0,0,0 +WORRIES,2009,0,0,0,0,0,0 +WORSEN,2009,0,0,0,0,0,0 +WORST,2009,0,0,0,0,0,0 +TIGHTENING,2009,0,0,0,0,0,0 +TOLERATING,2009,0,0,0,0,0,0 +TORTIOUSLY,0,0,0,2009,0,0,0 +FINES,2009,0,0,0,0,0,0 +NONASSESSABLE,0,0,2009,0,0,0,0 +NONCANCELLABLE,0,0,0,0,0,0,2009 +NONCOMPLIANT,2009,0,0,0,0,0,0 +NONCONFORMITY,2009,0,0,0,0,0,0 +NONCONTRIBUTORY,0,0,0,2009,0,0,0 +NONFORFEITABILITY,0,0,0,2011,0,0,0 +NONGUARANTOR,0,0,0,2011,0,0,0 +DISCIPLINARY,2009,0,0,0,0,0,0 +DISCLAIMERS,2009,0,0,0,0,0,0 +DISCLOSED,2009,0,0,0,0,0,0 +DISCONTINUANCES,2009,0,0,0,0,0,0 +DISCONTINUED,2009,0,0,0,0,0,0 +DISCOURAGED,2009,0,0,0,0,0,0 +DISCREDITED,2009,0,0,0,0,0,0 +DISCREPANCY,2009,0,0,0,0,0,0 +SPECULATED,0,0,2009,0,0,0,0 +SPECULATIONS,0,0,2009,0,0,0,0 +TRAGICALLY,2009,0,0,0,0,0,0 +LEGISLATED,0,0,0,2009,0,0,0 +LEGISLATIONS,0,0,0,2009,0,0,0 +LEGISLATORS,0,0,0,2009,0,0,0 +LIBELED,0,0,0,2009,0,0,0 +LIE,2009,0,0,0,0,0,0 +COMPULSION,2009,0,0,0,0,0,2009 +CONCEDE,2009,0,0,0,0,0,0 +CONCEIVABLE,0,0,2009,0,0,2009,0 +CONCERNS,2009,0,0,0,0,0,0 +CONCLUSIVE,0,2009,0,0,0,0,0 +CONDEMNATIONS,2009,0,0,0,0,0,0 +CONDEMNS,2009,0,0,0,0,0,0 +CONDONED,2009,0,0,0,0,0,0 +CONFESSES,2009,0,0,0,0,0,0 +CONFINE,2009,0,0,0,0,0,2009 +CONFINES,2009,0,0,0,0,0,2009 +CONFISCATES,2009,0,0,0,0,0,0 +CONFISCATORY,0,0,0,2009,0,0,0 +CONFLICTS,2009,0,0,0,0,0,0 +CONFRONTATIONS,2009,0,0,0,0,0,0 +CONFUSE,2009,0,0,0,0,0,0 +CONFUSINGLY,2009,0,2009,0,0,0,0 +CONSENTING,0,0,0,2009,0,0,0 +CONSPIRACY,2009,0,0,0,0,0,0 +CONSPIRE,2009,0,0,0,0,0,0 +CONSTITUTION,0,0,0,2009,0,0,0 +CONSTITUTIONS,0,0,0,2009,0,0,0 +CONSTRAINING,0,0,0,0,0,0,2009 +CONSTRUCTIVE,0,2009,0,0,0,0,0 +CONSTRUES,0,0,0,2012,0,0,0 +CONTENDED,2009,0,0,0,0,0,0 +CONTENTIONS,2009,0,0,0,0,0,0 +CONTESTATION,0,0,0,2011,0,0,0 +CONTINGENCY,0,0,2009,0,0,0,0 +CONTRACT,0,0,0,2009,0,0,0 +CONTRACTIBLE,0,0,0,2009,0,0,0 +CONTRACTIONS,2009,0,0,0,0,0,0 +CONTRADICT,2009,0,0,0,0,0,0 +CONTRADICTIONS,2009,0,0,0,0,0,0 +CONTRAVENE,0,0,0,2009,0,0,0 +CONTRAVENTION,0,0,0,2009,0,0,0 +CONTROVERSY,2009,0,0,0,0,0,0 +CONVENIENS,0,0,0,2012,0,0,0 +CONVICTED,2009,0,0,2009,0,0,0 +CORRECTED,2009,0,0,0,0,0,0 +CORRECTS,2009,0,0,0,0,0,0 +CORRUPTION,2009,0,0,0,0,0,0 +COSTLY,2009,0,0,0,0,0,0 +COUNSELED,0,0,0,2009,0,0,0 +COUNTERCLAIMED,2009,0,0,0,0,0,0 +COUNTERFEITED,2009,0,0,0,0,0,0 +COUNTERFEITS,2009,0,0,0,0,0,0 +COUNTERSUED,0,0,0,2011,0,0,0 +COURTEOUS,0,2009,0,0,0,0,0 +COVENANTED,0,0,0,0,0,0,2011 +CREATIVELY,0,2009,0,0,0,0,0 +CRIMES,2009,0,0,2009,0,0,0 +CRIMINALIZING,0,0,0,2014,0,0,0 +CRISIS,2009,0,0,0,0,0,0 +CRITICISMS,2009,0,0,0,0,0,0 +CRITICIZING,2009,0,0,0,0,0,0 +CROSSROADS,0,0,2009,0,0,0,0 +CULPABLE,2009,0,0,0,0,0,0 +CURTAILED,2009,0,0,0,0,0,0 +CURTAILS,2009,0,0,0,0,0,0 +CYBERATTACK,2014,0,0,0,0,0,0 +CYBERCRIMES,2014,0,0,0,0,0,0 +TAINTS,2009,0,0,0,0,0,0 +TENSE,2009,0,0,0,0,0,0 +TERMINATE,2009,0,0,0,0,0,0 +TERMINATION,2009,0,0,0,0,0,0 +TESTIFY,2009,0,0,2009,0,0,0 +THENCEFORTH,0,0,0,2009,0,0,0 +THEREFROM,0,0,0,2009,0,0,0 +THEREON,0,0,0,2009,0,0,0 +THERETOFORE,0,0,0,2009,0,0,0 +THEREWITH,0,0,0,2009,0,0,0 +THREATENING,2009,0,0,0,0,0,0 +FACIE,0,0,0,2009,0,0,0 +FAILING,2009,0,0,0,0,0,0 +FAILURES,2009,0,0,0,0,0,0 +FALSIFICATION,2009,0,0,0,0,0,0 +FALSIFY,2009,0,0,0,0,0,0 +FATALITIES,2009,0,0,0,0,0,0 +FAULTED,2009,0,0,0,0,0,0 +FAVORABLY,0,2009,0,0,0,0,0 +FAVORITES,0,2009,0,0,0,0,0 +FELONIOUS,2009,0,0,2009,0,0,0 +DAMAGES,2009,0,0,0,0,0,0 +DANGER,2009,0,0,0,0,0,0 +DEADLOCK,2009,0,0,0,0,0,0 +DEADWEIGHT,2009,0,0,0,0,0,0 +DEBARRED,2009,0,0,0,0,0,0 +DECEIT,2009,0,0,0,0,0,0 +DECEIVED,2009,0,0,0,0,0,0 +DECEPTIONS,2009,0,0,0,0,0,0 +DECLINE,2009,0,0,0,0,0,0 +DECREE,0,0,0,2009,0,0,0 +DEFACE,2009,0,0,0,0,0,0 +DEFALCATIONS,0,0,0,2009,0,0,0 +DEFAME,2009,0,0,0,0,0,0 +DEFAULT,2009,0,0,0,0,0,0 +DEFEASANCE,0,0,0,2009,0,0,0 +DEFEASEMENT,0,0,0,2014,0,0,0 +DEFEATED,2009,0,0,0,0,0,0 +DEFECTIVE,2009,0,0,0,0,0,0 +DEFENDABLE,0,0,0,2014,0,0,0 +DEFENDING,2009,0,0,0,0,0,0 +DEFERENCE,0,0,0,2009,0,0,0 +DEFICIT,2009,0,0,0,0,0,0 +DEFRAUD,2009,0,0,0,0,0,0 +DEFUNCT,2009,0,0,0,0,0,0 +DEGRADED,2009,0,0,0,0,0,0 +DELAYED,2009,0,0,0,0,0,0 +DELEGATABLE,0,0,0,2011,0,0,0 +DELIBERATE,2009,0,0,0,0,0,0 +DELIGHTED,0,2009,0,0,0,0,0 +DELIGHTS,0,2009,0,0,0,0,0 +DELINQUENTLY,2009,0,0,0,0,0,0 +DELISTING,2009,0,0,0,0,0,0 +DEMISES,2009,0,0,0,0,0,0 +DEMOLISHES,2009,0,0,0,0,0,0 +DEMOTE,2009,0,0,0,0,0,0 +DEMOTION,2009,0,0,0,0,0,0 +DEMURRERS,0,0,0,2009,0,0,0 +DENIALS,2009,0,0,0,0,0,0 +DENIGRATED,2009,0,0,0,0,0,0 +DENY,2009,0,0,0,0,0,0 +DEPENDABLE,0,2009,0,0,0,0,0 +DEPENDED,0,0,2009,0,0,2009,0 +DEPENDENT,0,0,2009,0,0,0,2011 +DEPLETED,2009,0,0,0,0,0,0 +DEPLETIONS,2009,0,0,0,0,0,0 +DEPOSING,0,0,0,2009,0,0,0 +INVALID,2009,0,0,0,0,0,0 +INVALIDATING,2009,0,0,0,0,0,0 +INVENTED,0,2009,0,0,0,0,0 +INVENTIVE,0,2009,0,0,0,0,0 +INVESTIGATE,2009,0,0,0,0,0,0 +INVESTIGATION,2009,0,0,0,0,0,0 +IRRECONCILABLE,2009,0,0,0,0,0,0 +IRREGULAR,2009,0,0,0,0,0,0 +IRREPARABLE,2009,0,0,0,0,0,0 +IRREVOCABLE,0,0,0,2009,0,0,2009 +JOINDER,0,0,0,2009,0,0,0 +JUDICIARY,0,0,0,2009,0,0,0 +JURISDICTIONAL,0,0,0,2009,0,0,0 +JURIST,0,0,0,2009,0,0,0 +JURY,0,0,0,2009,0,0,0 +JUSTIFIABLE,2009,0,0,0,0,0,0 +DILIGENTLY,0,2009,0,0,0,0,0 +DIMINISHING,2009,0,0,0,0,0,0 +DISADVANTAGE,2009,0,0,0,0,0,0 +DISAFFILIATION,2009,0,0,2009,0,0,0 +DISAFFIRMS,0,0,0,2011,0,0,0 +DISAGREEING,2009,0,0,0,0,0,0 +DISALLOW,2009,0,0,0,0,0,0 +DISALLOWING,2009,0,0,0,0,0,0 +DISAPPEARANCES,2009,0,0,0,0,0,0 +DISAPPOINT,2009,0,0,0,0,0,0 +DISAPPOINTMENT,2009,0,0,0,0,0,0 +DISAPPROVALS,2009,0,0,0,0,0,0 +DISAPPROVING,2009,0,0,0,0,0,0 +DISASSOCIATIONS,2009,0,0,0,0,0,0 +DISASTROUSLY,2009,0,0,0,0,0,0 +DISAVOWING,2009,0,0,0,0,0,0 +GREATER,0,-2020,0,0,0,0,0 +GRIEVANCE,2009,0,0,0,0,0,0 +GUILTY,2009,0,0,0,0,0,0 +HAMPERED,2009,0,0,0,0,0,0 +HAPPILY,0,2009,0,0,0,0,0 +HARASSED,2009,0,0,0,0,0,0 +HARDSHIPS,2009,0,0,0,0,0,0 +HARMFULLY,2009,0,0,0,0,0,0 +HARSHER,2009,0,0,0,0,0,0 +HAZARD,2009,0,0,0,0,0,0 +NONJUDICIALLY,0,0,0,2011,0,0,0 +NONPERFORMANCE,2009,0,0,0,0,0,0 +HURT,2009,0,0,0,0,0,0 +DISFAVORED,2009,0,0,0,0,0,0 +DISGORGED,2009,0,0,0,0,0,0 +COMPLICATING,2009,0,0,0,0,0,0 +COMPLIMENTARY,0,2009,0,0,0,0,0 +COMPLY,0,0,0,0,0,0,2009 +MISSTATED,2009,0,0,0,0,0,0 +MISSTATING,2009,0,0,0,0,0,0 +MISTAKEN,2009,0,0,0,0,0,0 +MISTRIAL,2009,0,0,2009,0,0,0 +MISUNDERSTANDINGS,2009,0,0,0,0,0,0 +MISUSES,2009,0,0,0,0,0,0 +MONOPOLIZATION,2009,0,0,0,0,0,0 +MONOPOLIZING,2009,0,0,0,0,0,0 +MORATORIUMS,2009,0,0,0,0,0,0 +MOTIONS,0,0,0,2009,0,0,0 +SLOWDOWN,2009,0,0,0,0,0,0 +SLOWEST,2009,0,0,0,0,0,0 +SLUGGISH,2009,0,0,0,0,0,0 +SMOOTHING,0,2009,0,0,0,0,0 +DEPRESS,2009,0,0,0,0,0,0 +DEPRIVATION,2009,0,0,0,0,0,0 +DEPRIVING,2009,0,0,0,0,0,0 +DEROGATED,0,0,0,2009,0,0,0 +DEROGATIONS,0,0,0,2009,0,0,0 +DESIRED,0,2009,0,0,0,0,0 +DESTABILIZE,2009,0,0,0,0,0,0 +DESTROY,2009,0,0,0,0,0,0 +DESTRUCTION,2009,0,0,0,0,0,0 +DETAINER,0,0,0,2009,0,0,0 +DETERIORATE,2009,0,0,0,0,0,0 +DETERIORATION,2009,0,0,0,0,0,0 +DETERRENCES,2009,0,0,0,0,0,0 +DETERS,2009,0,0,0,0,0,0 +DETRIMENT,2009,0,0,0,0,0,0 +DEVALUE,2009,0,0,0,0,0,0 +DEVASTATE,2009,0,0,0,0,0,0 +DEVIATE,2009,0,2009,0,0,0,0 +DEVIATION,2009,0,2009,0,0,0,0 +DEVOLVED,2009,0,0,0,0,0,0 +DICTATED,0,0,0,0,0,0,2009 +DIFFERED,0,0,2009,0,0,0,0 +DIFFICULTIES,2009,0,0,0,0,0,0 +ASCENDANCY,0,0,0,2009,0,0,0 +ASSAULTED,2009,0,0,0,0,0,0 +ASSERTIONS,2009,0,0,0,0,0,0 +ASSUME,0,0,2009,0,0,0,0 +ASSUMPTION,0,0,2009,0,0,0,0 +ASSURES,0,2009,0,0,0,0,0 +ATTAINING,0,2009,0,0,0,0,0 +ATTEST,0,0,0,2009,0,0,0 +ATTESTING,0,0,0,2009,0,0,0 +ATTORNMENT,0,0,0,2009,0,0,0 +ATTRITION,2009,0,0,0,0,0,0 +BAIL,2009,0,0,2009,0,0,0 +BAILIFF,0,0,0,2009,0,0,0 +BALK,2009,0,0,0,0,0,0 +BANKRUPTCY,2009,0,0,0,0,0,0 +BANS,2009,0,0,0,0,0,0 +CLAIMABLE,0,0,0,2009,0,0,0 +CLAIMING,2009,0,0,0,0,0,0 +CLAWBACK,2009,0,0,0,0,0,0 +CLOSEOUT,2009,0,0,0,0,0,0 +CLOSURE,2009,0,0,0,0,0,0 +CODICIL,0,0,0,2009,0,0,0 +CODIFIED,0,0,0,2009,0,0,0 +COERCE,2009,0,0,0,0,0,0 +COERCION,2009,0,0,0,0,0,0 +COLLABORATING,0,2009,0,0,0,0,0 +COLLABORATOR,0,2009,0,0,0,0,0 +COLLAPSES,2009,0,0,0,0,0,0 +COLLUDE,2009,0,0,0,0,0,0 +COLLUSION,2009,0,0,2009,0,0,0 +POSING,2009,0,0,0,0,0,0 +POSSIBILITIES,0,0,2009,0,0,0,0 +POSTCLOSING,0,0,0,2011,0,0,0 +POSTPONE,2009,0,0,0,0,0,0 +POSTPONES,2009,0,0,0,0,0,0 +WRITEOFF,2009,0,0,0,0,0,0 +WRONGDOING,2009,0,0,0,0,0,0 +WRONGLY,2009,0,0,0,0,0,0 +HONORED,0,2009,0,0,0,0,0 +HOSTILITY,2009,0,0,0,0,0,0 +REASSESSED,0,0,2009,0,0,0,0 +REASSESSMENTS,2009,0,2009,0,0,0,0 +REASSIGNMENT,2009,0,0,0,0,0,0 +REBOUNDED,0,2009,0,0,0,0,0 +REBUTTABLE,0,0,0,2009,0,0,0 +REBUTTED,0,0,0,2009,0,0,0 +RECALCULATES,0,0,2009,0,0,0,0 +RECALL,2009,0,0,0,0,0,0 +RECEPTIVE,0,2009,0,0,0,0,0 +RECKLESS,2009,0,0,0,0,0,0 +RECONSIDERED,0,0,2009,0,0,0,0 +RECOUPABLE,0,0,0,2009,0,0,0 +RECOURSES,0,0,0,2009,0,0,0 +RECUSE,0,0,0,2011,0,0,0 +REDACT,2009,0,0,2009,0,0,0 +REDACTIONS,2009,0,0,2009,0,0,0 +REDRESS,2009,0,0,0,0,0,0 +REEXAMINATION,0,0,2009,0,0,0,0 +REFERENDUM,0,0,0,2009,0,0,0 +REFILES,0,0,0,2009,0,0,0 +REFRAINS,0,0,0,0,0,0,2009 +REFUSED,2009,0,0,0,0,0,0 +REGAINED,0,2009,0,0,0,0,0 +REGULATES,0,0,0,2009,0,0,0 +REGULATIVE,0,0,0,2009,0,0,0 +REHEAR,0,0,0,2009,0,0,0 +VARIABLE,0,0,2009,0,0,0,0 +VARIANCES,0,0,2009,0,0,0,0 +VARIATIONS,0,0,2009,0,0,0,0 +VARYING,0,0,2009,0,0,0,0 +VERDICTS,2009,0,0,2009,0,0,0 +VIATICAL,0,0,0,2011,0,0,0 +VIOLATE,2009,0,0,0,0,0,0 +VIOLATION,2009,0,0,0,0,0,0 +VIOLATORS,2009,0,0,0,0,0,0 +VITIATE,2009,0,0,0,0,0,0 +VITIATION,2009,0,0,0,0,0,0 +VOLATILE,2009,0,2009,0,0,0,0 +VULNERABILITY,2009,0,0,0,0,0,0 +WARNED,2009,0,0,0,0,0,0 +WARRANTEES,0,0,0,2011,0,0,0 +WASTING,2009,0,0,0,0,0,0 +WEAKENING,2009,0,0,0,0,0,0 +WEAKLY,2009,0,0,0,0,0,0 +DISHONESTY,2009,0,0,0,0,0,0 +DISHONORED,2009,0,0,0,0,0,0 +DISLOYAL,2009,0,0,0,0,0,0 +DISMALLY,2009,0,0,0,0,0,0 +DISMISSED,2009,0,0,0,0,0,0 +DISPARAGE,2009,0,0,0,0,0,0 +DISPARAGES,2009,0,0,0,0,0,0 +DISPARITY,2009,0,0,0,0,0,0 +DISPLACEMENTS,2009,0,0,0,0,0,0 +DISPOSITIVE,0,0,0,2009,0,0,0 +DISPOSSESSING,2009,0,0,0,0,0,0 +DISPROPORTIONAL,2009,0,0,0,0,0,0 +DISPUTED,2009,0,0,0,0,0,0 +DISQUALIFICATIONS,2009,0,0,0,0,0,0 +DISQUALIFYING,2009,0,0,0,0,0,0 +DISREGARDS,2009,0,0,0,0,0,0 +DISRUPTED,2009,0,0,0,0,0,0 +DISRUPTIVE,2009,0,0,0,0,0,0 +DISSENT,2009,0,0,0,0,0,0 +DISSENTING,2009,0,0,0,0,0,0 +DISSOLUTION,2009,0,0,0,0,0,0 +DISTINCTIVE,0,2009,0,0,0,0,0 +DISTORTED,2009,0,0,0,0,0,0 +DISTORTS,2009,0,0,0,0,0,0 +DISTRACTION,2009,0,0,0,0,0,0 +DISTRESS,2009,0,0,0,0,0,0 +DISTURB,2009,0,0,0,0,0,0 +DISTURBING,2009,0,0,0,0,0,0 +DIVERTED,2009,0,0,0,0,0,0 +DIVESTED,2009,0,0,0,0,0,0 +DIVESTMENT,2009,0,0,0,0,0,0 +DIVORCED,2009,0,0,0,0,0,0 +DIVULGING,2009,0,0,0,0,0,0 +DOCKETS,0,0,0,2009,0,0,0 +DOUBTFUL,2009,0,2009,0,0,0,0 +DOWNGRADES,2009,0,0,0,0,0,0 +DOWNSIZES,2009,0,0,0,0,0,0 +DOWNTIMES,2009,0,0,0,0,0,0 +DOWNWARDS,2009,0,0,0,0,0,0 +DRAWBACK,2009,0,0,0,0,0,0 +DROUGHT,2009,0,0,0,0,0,0 +DYSFUNCTION,2009,0,0,0,0,0,0 +EARMARKED,0,0,0,0,0,0,2009 +EASILY,0,2009,0,0,0,0,0 +EFFICIENCIES,0,2009,0,0,0,0,0 +EGREGIOUS,2009,0,0,0,0,0,0 +EMBARGOED,2009,0,0,0,0,0,0 +EMBARRASSED,2009,0,0,0,0,0,0 +EMBARRASSMENTS,2009,0,0,0,0,0,0 +EMBEZZLEMENTS,2009,0,0,0,0,0,0 +EMPOWER,0,2009,0,0,0,0,0 +ENABLE,0,2009,0,0,0,0,0 +ENCOURAGED,0,2009,0,0,0,0,0 +ENCROACH,2009,0,0,0,0,0,0 +ENCROACHMENT,2009,0,0,0,0,0,0 +ENCUMBERING,2009,0,0,2009,0,0,2009 +ENCUMBRANCERS,0,0,0,2011,0,0,0 +ENDANGERING,2009,0,0,0,0,0,0 +ENFORCEABILITY,0,0,0,2009,0,0,0 +ENHANCED,0,2009,0,0,0,0,0 +ENHANCING,0,2009,0,0,0,0,0 +ENJOINS,2009,0,0,0,0,0,0 +ENJOYED,0,2009,0,0,0,0,0 +ENTAIL,0,0,0,0,0,0,2009 +PECUNIARILY,0,0,0,2009,0,0,0 +PENALIZING,2009,0,0,0,0,0,0 +PERFECT,0,2009,0,0,0,0,0 +PERHAPS,0,0,2009,0,0,2009,0 +PERMISSIBLE,0,0,0,0,0,0,2009 +PERMITTEE,0,0,0,2011,0,0,0 +PERPETRATED,2009,0,0,2009,0,0,0 +PERSIST,2009,0,0,0,0,0,0 +PERSISTENTLY,2009,0,0,0,0,0,0 +PERVASIVE,2009,0,0,0,0,0,0 +PETITIONED,0,0,0,2009,0,0,0 +PETITIONS,0,0,0,2009,0,0,0 +PICKETING,2009,0,0,0,0,0,0 +HENCEFORWARD,0,0,0,2009,0,0,0 +HEREFOR,0,0,0,2009,0,0,0 +HEREINABOVE,0,0,0,2009,0,0,0 +HEREOF,0,0,0,2009,0,0,0 +HEREUNDER,0,0,0,2009,0,0,0 +HEREWITHIN,0,0,0,2014,0,0,0 +HINDERED,2009,0,0,0,0,0,0 +HINDRANCES,2009,0,0,0,0,0,0 +WHENSOEVER,0,0,0,2009,0,0,0 +WHEREBY,0,0,0,2009,0,0,0 +WHEREON,0,0,0,2009,0,0,0 +WHEREWITH,0,0,0,2009,0,0,0 +WHOSOEVER,0,0,0,2009,0,0,0 +WILLFULLY,2009,0,0,2009,0,0,0 +WINNERS,0,2009,0,0,0,0,0 +FLUCTUATING,0,0,2009,0,0,0,0 +FORBEAR,0,0,0,2009,0,0,0 +FORBEARS,0,0,0,2009,0,0,0 +FORBIDS,2009,0,0,0,0,0,2009 +FOREBEAR,0,0,0,2009,0,0,0 +FORECLOSED,2009,0,0,0,0,0,0 +FORECLOSURES,2009,0,0,0,0,0,0 +FORESTALL,2009,0,0,0,0,0,0 +FORFEIT,2009,0,0,0,0,0,0 +FORFEITING,2009,0,0,0,0,0,0 +FORGERS,2009,0,0,0,0,0,0 +FRAUD,2009,0,0,0,0,0,0 +FRAUDULENTLY,2009,0,0,0,0,0,0 +FRUSTRATE,2009,0,0,0,0,0,0 +FRUSTRATINGLY,2009,0,0,0,0,0,0 +FUGITIVES,2009,0,0,2009,0,0,0 +GAINING,0,2009,0,0,0,0,0 +GRANTORS,0,0,0,2009,0,0,0 +DISGRACE,2009,0,0,0,0,0,0 +LITIGANTS,2009,0,0,2009,0,0,0 +LITIGATING,2009,0,0,2009,0,0,0 +LITIGATORS,0,0,0,2009,0,0,0 +LACK,2009,0,0,0,0,0,0 +LACKS,2009,0,0,0,0,0,0 +LAGS,2009,0,0,0,0,0,0 +LAPSING,2009,0,0,0,0,0,0 +LAWFUL,0,0,0,2009,0,0,0 +LAWMAKING,0,0,0,2009,0,0,0 +LAWYER,0,0,0,2009,0,0,0 +LEADERSHIP,0,2009,0,0,0,0,0 +LEGALITY,0,0,0,2009,0,0,0 +LEGALIZED,0,0,0,2009,0,0,0 +LEGALS,0,0,0,2009,0,0,0 +FLAW,2009,0,0,0,0,0,0 +NONPRODUCTIVE,2009,0,0,0,0,0,0 +LIQUIDATED,2009,0,0,0,0,0,0 +LIQUIDATIONS,2009,0,0,0,0,0,0 +BENEFICIATED,0,0,0,2014,0,0,0 +BENEFITING,0,2009,0,0,0,0,0 +BETTER,0,2009,0,0,0,0,0 +POPULARITY,0,2009,0,0,0,0,0 +REINTERPRET,0,0,2009,0,0,0,0 +REINTERPRETING,0,0,2009,0,0,0,0 +REJECTING,2009,0,0,0,0,0,0 +RELEASEES,0,0,0,2011,0,0,0 +RELINQUISHING,2009,0,0,0,0,0,0 +RELUCTANT,2009,0,0,0,0,0,0 +REMANDS,0,0,0,2009,0,0,0 +REMEDIATION,0,0,0,2009,0,0,0 +RENEGOTIATE,2009,0,0,0,0,0,0 +RENEGOTIATION,2009,0,0,0,0,0,0 +RENOUNCEMENT,2009,0,0,0,0,0,0 +REPARATION,2009,0,0,0,0,0,0 +REPOSSESSED,2009,0,0,0,0,0,0 +REPOSSESSIONS,2009,0,0,0,0,0,0 +TROUBLE,2009,0,0,0,0,0,0 +TURMOIL,2009,0,0,0,0,0,0 +UNACCOUNTED,2009,0,0,0,0,0,0 +UNAPPEALABLE,0,0,0,2009,0,0,0 +UNAUTHORIZED,2009,0,0,0,0,0,0 +UNAVOIDABLY,2009,0,0,0,0,0,0 +UNCERTAINTIES,0,0,2009,0,0,0,0 +UNCOLLECTED,2009,0,0,0,0,0,0 +UNCOMPETITIVE,2009,0,0,0,0,0,0 +UNCONSCIONABLE,2009,0,0,0,0,0,0 +UNCONSTITUTIONALLY,0,0,0,2009,0,0,0 +UNCONTROLLED,2009,0,0,0,0,0,0 +UNCOVERING,2009,0,0,0,0,0,0 +UNDEFINED,0,0,2009,0,0,0,0 +UNDERCUT,2009,0,0,0,0,0,0 +UNDERESTIMATED,2009,0,0,0,0,0,0 +UNDERFUNDED,2009,0,0,0,0,0,0 +UNDERMINES,2009,0,0,0,0,0,0 +UNDERPAYMENTS,2009,0,0,0,0,0,0 +UNDERPERFORMED,2011,0,0,0,0,0,0 +UNDERPRODUCTION,2009,0,0,0,0,0,0 +UNDERSTATEMENT,2009,0,0,0,0,0,0 +UNDERUTILIZATION,2009,0,0,0,0,0,0 +UNDESIRED,2009,0,0,0,0,0,0 +UNDETERMINED,2009,0,2009,0,0,0,0 +UNDOCUMENTED,2009,0,2009,0,0,0,0 +UNECONOMIC,2009,0,0,0,0,0,0 +UNEMPLOYMENT,2009,0,0,0,0,0,0 +UNENFORCEABLE,0,0,0,2009,0,0,0 +UNETHICALLY,2009,0,0,0,0,0,0 +UNFAIR,2009,0,0,0,0,0,0 +UNFAVORABILITY,2014,0,0,0,0,0,0 +UNFEASIBLE,2009,0,0,0,0,0,0 +UNFORESEEABLE,2009,0,0,0,0,0,0 +UNFORTUNATELY,2009,0,0,0,0,0,0 +UNFUNDED,2009,0,0,0,0,0,0 +UNIDENTIFIED,0,0,2009,0,0,0,0 +UNINTENTIONALLY,2009,0,0,0,0,0,0 +UNJUSTIFIED,2009,0,0,0,0,0,0 +UNKNOWN,0,0,2009,0,0,0,0 +UNLAWFULNESS,0,0,0,2009,0,0,0 +UNMATCHED,0,2009,0,0,0,0,0 +UNNECESSARY,2009,0,0,0,0,0,0 +UNOCCUPIED,2009,0,0,0,0,0,0 +UNPLANNED,2009,0,2009,0,0,0,0 +UNPREDICTABLY,2009,0,2009,0,0,0,0 +UNPROFITABLE,2009,0,0,0,0,0,0 +UNQUANTIFIABLE,0,0,2011,0,0,0,0 +UNREASONABLENESS,2009,0,0,0,0,0,0 +UNRECOVERABLE,2009,0,0,0,0,0,0 +UNREMEDIATED,0,0,0,2011,0,0,0 +UNREST,2009,0,0,0,0,0,0 +UNSATISFACTORY,2009,0,0,0,0,0,0 +UNSEASONABLE,0,0,2009,0,0,0,0 +UNSOLD,2009,0,0,0,0,0,0 +UNSTABILIZED,2014,0,0,0,0,0,0 +UNSUCCESSFUL,2009,0,0,0,0,0,0 +UNSUITABLY,2009,0,0,0,0,0,0 +UNSUSPECTED,2009,0,0,0,0,0,0 +UNTESTED,0,0,2009,0,0,0,0 +UNTRUTH,2009,0,0,0,0,0,0 +UNTRUTHS,2009,0,0,0,0,0,0 +UNWANTED,2009,0,0,0,0,0,0 +UNWILLINGNESS,2009,0,0,0,0,0,0 +UPTURNS,0,2009,0,0,0,0,0 +USURP,2009,0,0,2009,0,0,0 +USURPS,2009,0,0,2009,0,0,0 +VAGUELY,0,0,2012,0,0,0,0 +VAGUEST,0,0,2012,0,0,0,0 +PLEA,2009,0,0,0,0,0,0 +PLEADINGS,2009,0,0,2009,0,0,0 +PLEASANTLY,0,2009,0,0,0,0,0 +PLEDGE,0,0,0,0,0,0,2009 +PLEDGES,0,0,0,0,0,0,2009 +PLENTIFUL,0,2009,0,0,0,0,0 +COMPELS,0,0,0,0,0,0,2009 +COMPLAINANTS,0,0,0,2009,0,0,0 +COMPLAINT,2009,0,0,0,0,0,0 +COMMIT,0,0,0,0,0,0,2009 +COMMITTED,0,0,0,0,0,0,2009 +LIMIT,0,0,0,0,0,0,2009 +LIMITS,0,0,0,0,0,0,2009 +RESTRAINED,0,0,0,0,0,0,2009 +RESTRAINTS,0,0,0,0,0,0,2009 +RESTRICTION,0,0,0,0,0,0,2009 +RESTRICTIVENESS,0,0,0,0,0,0,2009 +RESTRUCTURES,2009,0,0,0,0,0,0 +RETALIATED,2009,0,0,0,0,0,0 +RETALIATIONS,2009,0,0,0,0,0,0 +PRECAUTIONARY,0,0,2009,0,0,0,0 +PRECIPITOUSLY,2009,0,0,0,0,0,0 +PRECLUDING,2009,0,0,0,0,0,2009 +PREDECEASE,0,0,0,2009,0,0,0 +PREDICT,0,0,2009,0,0,0,0 +PREDICTION,0,0,2009,0,0,0,0 +PREDICTORS,0,0,2009,0,0,0,0 +PREHEARING,0,0,0,2011,0,0,0 +PREJUDICIAL,2009,0,0,2009,0,0,0 +PREMATURE,2009,0,0,0,0,0,0 +PREPETITION,0,0,0,2009,0,0,0 +PRESTIGIOUS,0,2009,0,0,0,0,0 +PRESUMES,0,0,2009,0,0,0,0 +PRESUMPTIVELY,0,0,0,2009,0,0,0 +PREVENTING,2009,0,0,0,0,0,2009 +PRIVITY,0,0,0,2011,0,0,0 +PROBABILITIES,0,0,2009,0,0,0,0 +PROBATE,0,0,0,2009,0,0,0 +PROBATION,0,0,0,2009,0,0,0 +PROBATIONERS,0,0,0,2009,0,0,0 +PROBLEMATICAL,2009,0,0,0,0,0,0 +PROFICIENTLY,0,2009,0,0,0,0,0 +PROGRESS,0,2009,0,0,0,0,0 +PROHIBIT,0,0,0,0,0,0,2009 +PROHIBITIONS,0,0,0,0,0,0,2009 +PROHIBITS,0,0,0,0,0,0,2009 +PROLONGED,2009,0,0,0,0,0,0 +PROMULGATED,0,0,0,2009,0,0,0 +PROMULGATIONS,0,0,0,2009,0,0,0 +PRORATA,0,0,0,2009,0,0,0 +PROSECUTES,2009,0,0,2009,0,0,0 +PROSECUTOR,0,0,0,2009,0,0,0 +PROSPERING,0,2009,0,0,0,0,0 +PROTEST,2009,0,0,0,0,0,0 +PROTESTING,2009,0,0,0,0,0,0 +PROTRACTED,2009,0,0,0,0,0,0 +PROVISOS,0,0,0,2009,0,0,0 +PROVOKING,2009,0,0,0,0,0,0 +PUNISHING,2009,0,0,0,0,0,0 +PURPORT,2009,0,0,0,0,0,0 +PURPORTS,2009,0,0,0,0,0,0 +QUESTIONED,2009,0,0,0,0,0,0 +QUITCLAIM,0,0,0,2009,0,0,0 +RACKETEERING,2009,0,0,0,0,0,0 +RANDOMIZES,0,0,2009,0,0,0,0 +RATA,0,0,0,2009,0,0,0 +RATIONALIZATIONS,2009,0,0,0,0,0,0 +RATIONALIZING,2009,0,0,0,0,0,0 +ABANDON,2009,0,0,0,0,0,0 +ABANDONMENTS,2009,0,0,0,0,0,0 +ABDICATING,2009,0,0,0,0,0,0 +ABERRATION,2009,0,0,0,0,0,0 +ABEYANCE,0,0,2009,0,0,0,0 +ABLE,0,2009,0,0,0,0,0 +ABNORMALLY,2009,0,0,0,0,0,0 +ABOLISHING,2009,0,0,0,0,0,0 +ABROGATES,2009,0,0,2009,0,0,0 +ABRUPT,2009,0,0,0,0,0,0 +ABSENCES,2009,0,0,0,0,0,0 +ABSOLVES,0,0,0,2009,0,0,0 +ABUSE,2009,0,0,0,0,0,0 +ABUSIVE,2009,0,0,0,0,0,0 +ACCESSIONS,0,0,0,2009,0,0,0 +ACCIDENTS,2009,0,0,0,0,0,0 +ACCOMPLISHES,0,2009,0,0,0,0,0 +ACCUSATION,2009,0,0,0,0,0,0 +ACCUSES,2009,0,0,0,0,0,0 +ACHIEVEMENT,0,2009,0,0,0,0,0 +ACQUIESCE,2009,0,0,0,0,0,0 +ACQUIREES,0,0,0,2011,0,0,0 +ACQUITTAL,2009,0,0,2009,0,0,0 +ACQUITTED,2009,0,0,2009,0,0,0 +ADJOURN,0,0,0,2009,0,0,0 +ADJOURNMENTS,0,0,0,2009,0,0,0 +ADJUDGES,0,0,0,2009,0,0,0 +ADJUDICATES,0,0,0,2009,0,0,0 +ADJUDICATIVE,0,0,0,2009,0,0,0 +ADMISSIBILITY,0,0,0,2009,0,0,0 +ADMISSIONS,0,0,0,2009,0,0,0 +ADULTERATION,2009,0,0,0,0,0,0 +ADVANCES,0,2009,0,0,0,0,0 +ADVANTAGEOUS,0,2009,0,0,0,0,0 +ADVERSARIES,2009,0,0,0,0,0,0 +ADVERSITIES,2009,0,0,0,0,0,0 +AFFIRMANCE,0,0,0,2011,0,0,0 +AFORESAID,0,0,0,2009,0,0,0 +AGAINST,2009,0,0,0,0,0,0 +AGGRAVATING,2009,0,0,0,0,0,0 +ALERTED,2009,0,0,0,0,0,0 +ALIENATES,2009,0,0,0,0,0,0 +ALLEGATION,2009,0,0,2009,0,0,0 +ALLEGEDLY,2009,0,0,2009,0,0,0 +ALLIANCES,0,2009,0,0,0,0,0 +ALWAYS,0,0,0,0,2009,0,0 +AMEND,0,0,0,2009,0,0,0 +AMENDING,0,0,0,2009,0,0,0 +ANNOY,2009,0,0,0,0,0,0 +ANNOYING,2009,0,0,0,0,0,0 +ANNULLING,2009,0,0,0,0,0,0 +ANOMALIES,2009,0,2009,0,0,0,0 +ANTECEDENT,0,0,0,2009,0,0,0 +ANTICIPATES,0,0,2009,0,0,0,0 +ANTICOMPETITIVE,2009,0,0,0,0,0,0 +APPARENT,0,0,2009,0,0,0,0 +APPEALED,0,0,0,2009,0,0,0 +APPEARED,0,0,2009,0,0,2009,0 +APPELLANTS,0,0,0,2009,0,0,0 +APPROXIMATE,0,0,2009,0,0,0,0 +APPROXIMATING,0,0,2009,0,0,0,0 +APPURTENANCES,0,0,0,2009,0,0,0 +ARBITRARILY,0,0,2009,0,0,0,0 +ARBITRATED,0,0,0,2009,0,0,0 +ARBITRATIONAL,0,0,0,2011,0,0,0 +ARBITRATORS,0,0,0,2009,0,0,0 +ARGUMENT,2009,0,0,0,0,0,0 +ARREARAGES,2009,0,0,2009,0,0,0 +ARRESTS,2009,0,0,0,0,0,0 +RETROCEDED,0,0,0,2011,0,0,0 +BOLSTERING,0,2009,0,0,0,0,0 +BOOM,0,2009,0,0,0,0,0 +BOTTLENECK,2009,0,0,0,0,0,0 +BOYCOTT,2009,0,0,0,0,0,0 +BREACH,2009,0,0,2009,0,0,0 +BREAK,2009,0,0,0,0,0,0 +BREAKDOWNS,2009,0,0,0,0,0,0 +BREAKTHROUGHS,0,2009,0,0,0,0,0 +BRIBERY,2009,0,0,0,0,0,0 +BRILLIANT,0,2009,0,0,0,0,0 +BURDENING,2009,0,0,0,0,0,0 +CALAMITIES,2009,0,0,0,0,0,0 +CANCELED,2009,0,0,0,0,0,0 +CANCELLED,2009,0,0,0,0,0,0 +CARELESSLY,2009,0,0,0,0,0,0 +CATASTROPHES,2009,0,0,0,0,0,0 +CAUTIONARY,2009,0,0,0,0,0,0 +CAUTIOUS,0,0,2009,0,0,0,0 +CEASED,2009,0,0,0,0,0,0 +CEDANTS,0,0,0,2012,0,0,0 +CENSURING,2009,0,0,0,0,0,0 +CHALLENGED,2009,0,0,0,0,0,0 +CHARITABLE,0,2009,0,0,0,0,0 +CIRCUMVENT,2009,0,0,0,0,0,0 +CIRCUMVENTIONS,2009,0,0,0,0,0,0 +SHORTAGE,2009,0,0,0,0,0,0 +SHRINKAGE,2009,0,0,0,0,0,0 +SHUTDOWNS,2009,0,0,0,0,0,0 +SLANDERED,2009,0,0,0,0,0,0 +REPUDIATES,2009,0,0,0,0,0,0 +REQUESTER,0,0,0,2011,0,0,0 +REQUIREMENT,0,0,0,0,0,0,2009 +REREGULATION,0,0,0,2011,0,0,0 +RESCINDS,0,0,0,2009,0,0,0 +RESIGNATION,2009,0,0,0,0,0,0 +RESIGNS,2009,0,0,0,0,0,0 +RESTATEMENT,2009,0,0,0,0,0,0 +RESTITUTIONARY,0,0,0,2011,0,0,0 +NOTARIAL,0,0,0,2009,0,0,0 +NOTARIZE,0,0,0,2009,0,0,0 +NOTWITHSTANDING,0,0,0,2009,0,0,0 +NULLIFICATION,2009,0,0,2009,0,0,0 +NULLIFY,2009,0,0,2009,0,0,0 +OBJECTED,2009,0,0,0,0,0,0 +OBJECTIONABLY,2009,0,0,0,0,0,0 +OBLIGATES,0,0,0,0,0,0,2009 +OBLIGATORY,0,0,0,0,0,0,2009 +OBLIGEES,0,0,0,2011,0,0,0 +OBSCENE,2009,0,0,0,0,0,0 +OBSTACLE,2009,0,0,0,0,0,0 +OBSTRUCTING,2009,0,0,0,0,0,0 +OFFENCE,2009,0,0,0,0,0,0 +OFFENDER,2009,0,0,0,0,0,0 +OFFENSE,0,0,0,2009,0,0,0 +OFFERORS,0,0,0,2011,0,0,0 +OMITS,2009,0,0,0,0,0,0 +OPPORTUNISTIC,2009,0,0,0,0,0,0 +OPPOSE,2009,0,0,0,0,0,0 +OPPOSITION,2009,0,0,0,0,0,0 +OPTIONEES,0,0,0,2009,0,0,0 +OUTDATED,2009,0,0,0,0,0,0 +OUTPERFORMING,0,2009,0,0,0,0,0 +OVERBUILD,2009,0,0,0,0,0,0 +OVERBURDEN,2009,0,0,0,0,0,0 +OVERCAPACITY,2009,0,0,0,0,0,0 +OVERCHARGING,2009,0,0,0,0,0,0 +OVERDUE,2009,0,0,0,0,0,0 +OVERESTIMATING,2009,0,0,0,0,0,0 +OVERLOADED,2009,0,0,0,0,0,0 +OVERLOOKED,2009,0,0,0,0,0,0 +OVERPAYMENT,2009,0,0,0,0,0,0 +OVERPRODUCING,2009,0,0,0,0,0,0 +OVERRULES,0,0,0,2009,0,0,0 +OVERRUNS,2009,0,0,0,0,0,0 +OVERSHADOWS,2009,0,0,0,0,0,0 +OVERSTATEMENTS,2009,0,0,0,0,0,0 +OVERSUPPLIES,2009,0,0,0,0,0,0 +OVERTURN,2009,0,0,0,0,0,0 +OVERVALUE,2009,0,0,0,0,0,0 +PANICS,2009,0,0,0,0,0,0 +NECESSITATE,0,0,0,0,0,0,2009 +NEGATIVE,2009,0,0,0,0,0,0 +NEGLECTED,2009,0,0,0,0,0,0 +NEGLIGENCE,2009,0,0,0,0,0,0 +NEVER,0,0,0,0,2009,0,0 +BARRIERS,2009,0,0,0,0,0,0 +BELIEVED,0,0,2009,0,0,0,0 +IDLING,2009,0,0,0,0,0,0 +IGNORING,2009,0,0,0,0,0,0 +ILLEGALITY,2009,0,0,0,0,0,0 +ILLICITLY,2009,0,0,0,0,0,0 +IMBALANCES,2009,0,0,0,0,0,0 +IMPAIR,2009,0,0,0,0,0,2011 +IMPAIRMENTS,2009,0,0,0,0,0,2011 +IMPEDE,2009,0,0,0,0,0,0 +IMPEDIMENTS,2009,0,0,0,0,0,0 +IMPERFECTION,2009,0,0,0,0,0,0 +IMPLEADED,0,0,0,2009,0,0,0 +IMPLICATING,2009,0,0,0,0,0,0 +IMPOSING,0,0,0,0,0,0,2009 +IMPOSSIBLE,2009,0,0,0,0,0,0 +IMPOUNDS,2009,0,0,0,0,0,0 +IMPRACTICALITY,2009,0,0,0,0,0,0 +IMPRESS,0,2009,0,0,0,0,0 +IMPRESSIVE,0,2009,0,0,0,0,0 +IMPROBABLE,0,0,2009,0,0,0,0 +IMPROPRIETY,2009,0,0,0,0,0,0 +IMPROVEMENTS,0,2009,0,0,0,0,0 +IMPRUDENTLY,2009,0,0,0,0,0,0 +INACCURACY,2009,0,0,0,0,0,0 +INACTIONS,2009,0,0,0,0,0,0 +INACTIVATING,2009,0,0,0,0,0,0 +INADEQUACIES,2009,0,0,0,0,0,0 +INADVERTENT,2009,0,0,0,0,0,0 +INAPPROPRIATE,2009,0,0,0,0,0,0 +INCAPABLE,2009,0,0,0,0,0,0 +INCARCERATED,2009,0,0,2009,0,0,0 +INCARCERATIONS,2009,0,0,2009,0,0,0 +INCIDENT,2009,0,0,0,0,0,0 +INCOMPATIBLE,2009,0,0,0,0,0,0 +INCOMPETENTLY,2009,0,0,0,0,0,0 +INCOMPLETENESS,2009,0,2009,0,0,0,0 +INCONSISTENT,2009,0,0,0,0,0,0 +INCONVENIENCE,2009,0,0,0,0,0,0 +INCORRECTLY,2009,0,0,0,0,0,0 +INDEBTED,0,0,0,0,0,0,2009 +INDEFEASIBLY,2009,0,0,0,0,0,0 +INDEMNIFIABLE,0,0,0,2009,0,0,0 +INDEMNIFIES,0,0,0,2009,0,0,0 +INDEMNITEES,0,0,0,2009,0,0,0 +INDEMNITY,0,0,0,2009,0,0,0 +INDICTABLE,2009,0,0,2009,0,0,0 +INDICTMENTS,2009,0,0,2009,0,0,0 +INEFFECTIVENESS,2009,0,0,0,0,0,0 +INEFFICIENTLY,2009,0,0,0,0,0,0 +INEQUITABLY,2009,0,0,0,0,0,0 +INEXACT,0,0,2009,0,0,0,0 +INFERIOR,2009,0,0,0,0,0,0 +INFORMATIVE,0,2009,0,0,0,0,0 +INFRINGED,2009,0,0,0,0,0,0 +INFRINGES,2009,0,0,0,0,0,0 +INHIBITED,2009,0,0,0,0,0,2009 +INJUNCTION,2009,0,0,2009,0,0,0 +INJURED,2009,0,0,0,0,0,0 +INJURIOUS,2009,0,0,0,0,0,0 +INNOVATES,0,2009,0,0,0,0,0 +INNOVATIVE,0,2009,0,0,0,0,0 +INORDINATE,2009,0,0,0,0,0,0 +INSENSITIVE,2009,0,0,0,0,0,0 +INSISTENCE,0,0,0,0,0,0,2009 +INSOLVENCIES,2009,0,0,0,0,0,0 +INSPIRATIONAL,0,2009,0,0,0,0,0 +INSUFFICIENCY,2009,0,0,0,0,0,0 +INSURRECTIONS,2009,0,0,0,0,0,0 +INTENTIONAL,2009,0,0,0,0,0,0 +INTERFERENCES,2009,0,0,0,0,0,0 +INTERMITTENT,2009,0,0,0,0,0,0 +INTERPOSED,0,0,0,2009,0,0,0 +INTERPOSITIONS,0,0,0,2009,0,0,0 +INTERROGATING,0,0,0,2009,0,0,0 +INTERROGATORIES,0,0,0,2009,0,0,0 +INTERRUPTED,2009,0,0,0,0,0,0 +INTERRUPTS,2009,0,0,0,0,0,0 +STABILITY,0,2009,0,0,0,0,0 +STABILIZED,0,2009,0,0,0,0,0 +STAGGERING,2009,0,0,0,0,0,0 +STAGNATES,2009,0,0,0,0,0,0 +STANDSTILLS,2009,0,0,0,0,0,0 +STATUTORY,0,0,0,2009,0,0,0 +STIPULATING,0,0,0,0,0,0,2009 +STOPPAGE,2009,0,0,0,0,0,0 +STOPS,2009,0,0,0,0,0,0 +STRAINS,2009,0,0,0,0,0,0 +STRENGTHENING,0,2009,0,0,0,0,0 +STRESSED,2009,0,0,0,0,0,0 +STRICT,0,0,0,0,0,0,2009 +STRINGENT,2009,0,0,0,0,0,0 +STRONGLY,0,0,0,0,2009,0,0 +SUBJECTED,2009,0,0,0,0,0,0 +SUBLEASEHOLD,0,0,0,2011,0,0,0 +SUBPARAGRAPH,0,0,0,2009,0,0,0 +SUBPOENAS,2009,0,0,2009,0,0,0 +SUBTRUST,0,0,0,2011,0,0,0 +SUCCEEDING,0,2009,0,0,0,0,0 +SUCCESSFUL,0,2009,0,0,0,0,0 +SUE,2009,0,0,2009,0,0,0 +SUFFERED,2009,0,0,0,0,0,0 +SUGGESTED,0,0,2009,0,0,0,0 +SUMMONED,2009,0,0,2009,0,0,0 +SUPERIOR,0,2009,0,0,0,0,0 +SUPERSEDES,0,0,0,2009,0,0,0 +SURPASS,0,2009,0,0,0,0,0 +SUSCEPTIBILITY,2009,0,2009,0,0,0,0 +SUSPECTS,2009,0,0,0,0,0,0 +SUSPENDS,2009,0,0,0,0,0,0 +SUSPICIONS,2009,0,0,0,0,0,0 +REVOCABILITY,0,0,0,2011,0,0,0 +REVOKED,2009,0,0,0,0,0,0 +REVOLUTIONIZED,0,2009,0,0,0,0,0 +REWARDED,0,2009,0,0,0,0,0 +RIDICULED,2009,0,0,0,0,0,0 +RISKED,0,0,2009,0,0,0,0 +RISKING,0,0,2009,0,0,0,0 +RULING,0,0,0,2009,0,0,0 +SACRIFICE,2009,0,0,0,0,0,0 +SACRIFICING,2009,0,0,0,0,0,0 +SATISFIED,0,2009,0,0,0,0,0 +SCANDALOUS,2009,0,0,0,0,0,0 +SCRUTINIZES,2009,0,0,0,0,0,0 +SEEMS,0,0,2009,0,0,0,0 +SEIZING,2009,0,0,0,0,0,0 +SENTENCING,2009,0,0,2009,0,0,0 +SERIOUSNESS,2009,0,0,0,0,0,0 +SETTLEMENTS,0,0,0,2009,0,0,0 +SEVERALLY,0,0,0,2009,0,0,0 +SEVERED,2009,0,0,0,0,0,0 +ENTHUSIASTICALLY,0,2009,0,0,0,0,0 +ERODED,2009,0,0,0,0,0,0 +ERRATIC,2009,0,0,0,0,0,0 +ERRONEOUS,2009,0,0,0,0,0,0 +ERRS,2009,0,0,0,0,0,0 +ESCALATING,2009,0,0,0,0,0,0 +ESCROW,0,0,0,0,0,0,2009 +ESTOPPEL,0,0,0,2011,0,0,0 +EVADING,2009,0,0,0,0,0,0 +EVICT,2009,0,0,0,0,0,0 +EVICTIONS,2009,0,0,0,0,0,0 +EXACERBATE,2009,0,0,0,0,0,0 +EXACERBATION,2009,0,0,0,0,0,0 +EXAGGERATES,2009,0,0,0,0,0,0 +EXCEEDANCES,0,0,0,2011,0,0,0 +EXCELLING,0,2009,0,0,0,0,0 +EXCESSIVE,2009,0,0,0,0,0,0 +EXCITEMENT,0,2009,0,0,0,0,0 +EXCLUSIVENESS,0,2009,0,0,0,0,0 +EXCULPATED,2009,0,0,2009,0,0,0 +EXCULPATIONS,2009,0,0,2009,0,0,0 +EXECUTORY,0,0,0,2009,0,0,0 +EXEMPLARY,0,2009,0,0,0,0,0 +EXONERATING,2009,0,0,0,0,0,0 +EXPLOITATION,2009,0,0,0,0,0,0 +EXPLOITING,2009,0,0,0,0,0,0 +EXPOSES,2009,0,0,0,0,0,0 +EXPROPRIATE,2009,0,0,0,0,0,0 +EXPROPRIATION,2009,0,0,0,0,0,0 +EXTENUATING,2009,0,0,0,0,0,0 +SOLVING,0,2009,0,0,0,0,0 +SOMEWHERE,0,0,2009,0,0,0,0 +LOSE,2009,0,0,0,0,0,0 +LOSSES,2009,0,0,0,0,0,0 +LUCRATIVE,0,2009,0,0,0,0,0 +MALFUNCTION,2009,0,0,0,0,0,0 +MALICE,2009,0,0,0,0,0,0 +MANDAMUS,0,0,0,2009,0,0,0 +MANDATING,0,0,0,0,0,0,2009 +MANIPULATED,2009,0,0,0,0,0,0 +MANIPULATIONS,2009,0,0,0,0,0,0 +MAY,0,0,2009,0,0,2009,0 +MEDIATES,0,0,0,2009,0,0,0 +MEDIATOR,0,0,0,2009,0,0,0 +MISAPPLICATION,2009,0,0,0,0,0,0 +MISAPPLY,2009,0,0,0,0,0,0 +MISAPPROPRIATES,2009,0,0,0,0,0,0 +MISBRANDED,2009,0,0,0,0,0,0 +MISCALCULATING,2009,0,0,0,0,0,0 +MISCHIEF,2009,0,0,0,0,0,0 +MISCLASSIFY,2014,0,0,0,0,0,0 +MISDEMEANOR,2009,0,0,2009,0,0,0 +MISHANDLE,2009,0,0,0,0,0,0 +MISINFORM,2009,0,0,0,0,0,0 +MISINFORMS,2009,0,0,0,0,0,0 +MISINTERPRETED,2009,0,0,0,0,0,0 +MISJUDGED,2009,0,0,0,0,0,0 +MISJUDGMENTS,2009,0,0,0,0,0,0 +MISLABELLED,2009,0,0,0,0,0,0 +MISLEADINGLY,2009,0,0,0,0,0,0 +MISMANAGED,2009,0,0,0,0,0,0 +MISMATCH,2009,0,0,0,0,0,0 +MISPLACED,2009,0,0,0,0,0,0 +MISREPRESENT,2009,0,0,0,0,0,0 +MISREPRESENTING,2009,0,0,0,0,0,0 +MISSES,2009,0,0,0,0,0,0 +WORRY,2009,0,0,0,0,0,0 +WORSENED,2009,0,0,0,0,0,0 +WORTHLESS,2009,0,0,0,0,0,0 +TOLERATE,2009,0,0,0,0,0,0 +TOLERATION,2009,0,0,0,0,0,0 +TORTS,0,0,0,2009,0,0,0 +FICTITIOUS,2009,0,0,0,0,0,0 +FIRED,2009,0,0,0,0,0,0 +NONATTAINMENT,2009,0,0,0,0,0,0 +NONCOMPETITIVE,2009,0,0,0,0,0,0 +NONCOMPLYING,2009,0,0,0,0,0,0 +NONCONTINGENT,0,0,0,2011,0,0,0 +NONDISCLOSURE,2009,0,0,0,0,0,0 +NONFORFEITABLE,0,0,0,2009,0,0,0 +DISCLAIM,2009,0,0,0,0,0,0 +DISCLAIMING,2009,0,0,0,0,0,0 +DISCLOSES,2009,0,0,0,0,0,0 +DISCONTINUATION,2009,0,0,0,0,0,0 +DISCONTINUES,2009,0,0,0,0,0,0 +DISCOURAGES,2009,0,0,0,0,0,0 +DISCREDITING,2009,0,0,0,0,0,0 +SPECTACULAR,0,2009,0,0,0,0,0 +SPECULATES,0,0,2009,0,0,0,0 +SPECULATIVE,0,0,2009,0,0,0,0 +TRAGEDIES,2009,0,0,0,0,0,0 +TRANSFEROR,0,0,0,2009,0,0,0 +LEGISLATES,0,0,0,2009,0,0,0 +LEGISLATIVE,0,0,0,2009,0,0,0 +LEGISLATURE,0,0,0,2009,0,0,0 +LIBELOUS,0,0,0,2009,0,0,0 +LIENHOLDERS,0,0,0,2011,0,0,0 +COMPULSORY,0,0,0,0,0,0,2009 +CONCEDED,2009,0,0,0,0,0,0 +CONCEIVABLY,0,0,2009,0,0,0,0 +CONCILIATING,2009,0,0,0,0,0,0 +CONCLUSIVELY,0,2009,0,0,0,0,0 +CONDEMNED,2009,0,0,0,0,0,0 +CONDITIONAL,0,0,2009,0,0,0,0 +CONDUCIVE,0,2009,0,0,0,0,0 +CONFESSING,2009,0,0,0,0,0,0 +CONFINED,2009,0,0,0,0,0,2009 +CONFINING,2009,0,0,0,0,0,2009 +CONFISCATING,2009,0,0,0,0,0,0 +CONFLICT,2009,0,0,0,0,0,0 +CONFRONT,2009,0,0,0,0,0,0 +CONFRONTED,2009,0,0,0,0,0,0 +CONFUSED,2009,0,0,0,0,0,0 +CONFUSION,2009,0,2009,0,0,0,0 +CONSENTS,0,0,0,2009,0,0,0 +CONSPIRATOR,2009,0,0,0,0,0,0 +CONSPIRED,2009,0,0,0,0,0,0 +CONSTITUTIONAL,0,0,0,2009,0,0,0 +CONSTITUTIVE,0,0,0,2009,0,0,0 +CONSTRAINS,0,0,0,0,0,0,2009 +CONSTRUCTIVELY,0,2009,0,0,0,0,0 +CONSTRUING,0,0,0,2012,0,0,0 +CONTENDING,2009,0,0,0,0,0,0 +CONTENTIOUS,2009,0,0,0,0,0,0 +CONTESTED,2009,0,0,0,0,0,0 +CONTINGENT,0,0,2009,0,0,0,0 +CONTRACTED,0,0,0,2009,0,0,0 +CONTRACTILE,0,0,0,2009,0,0,0 +CONTRACTS,0,0,0,2009,0,0,0 +CONTRADICTED,2009,0,0,0,0,0,0 +CONTRADICTORY,2009,0,0,0,0,0,0 +CONTRAVENED,0,0,0,2009,0,0,0 +CONTRAVENTIONS,0,0,0,2009,0,0,0 +CONTROVERT,0,0,0,2009,0,0,0 +CONVEYANCE,0,0,0,2009,0,0,0 +CONVICTING,2009,0,0,2009,0,0,0 +CORRECTING,2009,0,0,0,0,0,0 +CORRUPT,2009,0,0,0,0,0,0 +CORRUPTIONS,2009,0,0,0,0,0,0 +COTERMINOUS,0,0,0,2009,0,0,0 +COUNSELLED,0,0,0,2009,0,0,0 +COUNTERCLAIMING,2009,0,0,0,0,0,0 +COUNTERFEITER,2009,0,0,0,0,0,0 +COUNTERMEASURE,2009,0,0,0,0,0,0 +COUNTERSUIT,0,0,0,2011,0,0,0 +COURTROOM,0,0,0,2009,0,0,0 +COVENANTING,0,0,0,0,0,0,2011 +CREATIVENESS,0,2009,0,0,0,0,0 +CRIMINAL,2009,0,0,2009,0,0,0 +CRIMINALLY,2009,0,0,2009,0,0,0 +CRITICAL,-2020,0,0,0,0,0,0 +CRITICIZE,2009,0,0,0,0,0,0 +CROSSCLAIM,0,0,0,2011,0,0,0 +CRUCIAL,2009,0,0,0,0,0,0 +CULPABLY,2009,0,0,0,0,0,0 +CURTAILING,2009,0,0,0,0,0,0 +CUT,2009,0,0,0,0,0,0 +CYBERATTACKS,2014,0,0,0,0,0,0 +CYBERCRIMINAL,2014,0,0,0,0,0,0 +TAINT,2009,0,0,0,0,0,0 +TAMPERED,2009,0,0,0,0,0,0 +TENTATIVE,0,0,2009,0,0,0,0 +TERMINATED,2009,0,0,0,0,0,0 +TERMINATIONS,2009,0,0,0,0,0,0 +TESTIFYING,2009,0,0,2009,0,0,0 +THENCEFORWARD,0,0,0,2009,0,0,0 +THEREIN,0,0,0,2009,0,0,0 +THEREOVER,0,0,0,2011,0,0,0 +THEREUNDER,0,0,0,2009,0,0,0 +THREAT,2009,0,0,0,0,0,0 +THREATENS,2009,0,0,0,0,0,0 +FACTO,0,0,0,2011,0,0,0 +FAILINGS,2009,0,0,0,0,0,0 +FALLOUT,2009,0,0,0,0,0,0 +FALSIFICATIONS,2009,0,0,0,0,0,0 +FALSIFYING,2009,0,0,0,0,0,0 +FATALITY,2009,0,0,0,0,0,0 +FAULTS,2009,0,0,0,0,0,0 +FAVORED,0,2009,0,0,0,0,0 +FEAR,2009,0,0,0,0,0,0 +FELONY,2009,0,0,2009,0,0,0 +DAMAGING,2009,0,0,0,0,0,0 +DANGEROUS,2009,0,0,0,0,0,0 +DEADLOCKED,2009,0,0,0,0,0,0 +DEADWEIGHTS,2009,0,0,0,0,0,0 +DECEASED,2009,0,0,0,0,0,0 +DECEITFUL,2009,0,0,0,0,0,0 +DECEIVES,2009,0,0,0,0,0,0 +DECEPTIVE,2009,0,0,0,0,0,0 +DECLINED,2009,0,0,0,0,0,0 +DECREED,0,0,0,2009,0,0,0 +DEFACED,2009,0,0,0,0,0,0 +DEFAMATION,2009,0,0,0,0,0,0 +DEFAMED,2009,0,0,0,0,0,0 +DEFAULTED,2009,0,0,0,0,0,0 +DEFEASANCES,0,0,0,2011,0,0,0 +DEFEASES,0,0,0,2014,0,0,0 +DEFEATING,2009,0,0,0,0,0,0 +DEFECTIVELY,0,0,0,2009,0,0,0 +DEFENDANT,2009,0,0,2009,0,0,0 +DEFENDS,2009,0,0,0,0,0,0 +DEFICIENCIES,2009,0,0,0,0,0,0 +DEFICITS,2009,0,0,0,0,0,0 +DEFRAUDED,2009,0,0,0,0,0,0 +DEGRADATION,2009,0,0,0,0,0,0 +DEGRADES,2009,0,0,0,0,0,0 +DELAYING,2009,0,0,0,0,0,0 +DELEGATEE,0,0,0,2011,0,0,0 +DELIBERATED,2009,0,0,0,0,0,0 +DELIGHTFUL,0,2009,0,0,0,0,0 +DELINQUENCIES,2009,0,0,0,0,0,0 +DELINQUENTS,2009,0,0,0,0,0,0 +DELISTS,2011,0,0,0,0,0,0 +DEMISING,2009,0,0,0,0,0,0 +DEMOLISHING,2009,0,0,0,0,0,0 +DEMOTED,2009,0,0,0,0,0,0 +DEMOTIONS,2009,0,0,0,0,0,0 +DEMURRING,0,0,0,2009,0,0,0 +DENIED,2009,0,0,0,0,0,0 +DENIGRATES,2009,0,0,0,0,0,0 +DENYING,2009,0,0,0,0,0,0 +DEPENDANCE,0,0,0,0,0,0,2011 +DEPENDENCE,0,0,2009,0,0,0,0 +DEPENDING,0,0,2009,0,0,2009,2011 +DEPLETES,2009,0,0,0,0,0,0 +DEPOSE,0,0,0,2009,0,0,0 +DEPOSITION,0,0,0,2009,0,0,0 +INVALIDATE,2009,0,0,0,0,0,0 +INVALIDATION,2009,0,0,0,0,0,0 +INVENTING,0,2009,0,0,0,0,0 +INVENTIVENESS,0,2009,0,0,0,0,0 +INVESTIGATED,2009,0,0,0,0,0,0 +INVESTIGATIONS,2009,0,0,0,0,0,0 +IRRECONCILABLY,2009,0,0,0,0,0,0 +IRREGULARITIES,2009,0,0,0,0,0,0 +IRREPARABLY,2009,0,0,0,0,0,0 +IRREVOCABLY,0,0,0,2009,0,0,2009 +JUDICIAL,0,0,0,2009,0,0,0 +JURIES,0,0,0,2009,0,0,0 +JURISDICTIONALLY,0,0,0,2011,0,0,0 +JURISTS,0,0,0,2009,0,0,0 +JURYMAN,0,0,0,2009,0,0,0 +KICKBACK,2009,0,0,0,0,0,0 +DIMINISH,2009,0,0,0,0,0,0 +DIMINUTION,2009,0,0,0,0,0,0 +DISADVANTAGED,2009,0,0,0,0,0,0 +DISAFFIRM,0,0,0,2009,0,0,0 +DISAGREE,2009,0,0,0,0,0,0 +DISAGREEMENT,2009,0,0,0,0,0,0 +DISALLOWANCE,2009,0,0,0,0,0,0 +DISALLOWS,2009,0,0,0,0,0,0 +DISAPPEARED,2009,0,0,0,0,0,0 +DISAPPOINTED,2009,0,0,0,0,0,0 +DISAPPOINTMENTS,2009,0,0,0,0,0,0 +DISAPPROVE,2009,0,0,0,0,0,0 +DISASSOCIATES,2009,0,0,0,0,0,0 +DISASTER,2009,0,0,0,0,0,0 +DISAVOW,2009,0,0,0,0,0,0 +DISAVOWS,2009,0,0,0,0,0,0 +GRATUITOUS,2009,0,0,0,0,0,0 +GREATEST,0,2009,0,0,0,0,0 +GRIEVANCES,2009,0,0,0,0,0,0 +HALT,2009,0,0,0,0,0,0 +HAMPERING,2009,0,0,0,0,0,0 +HAPPINESS,0,2009,0,0,0,0,0 +HARASSING,2009,0,0,0,0,0,0 +HARM,2009,0,0,0,0,0,0 +HARMING,2009,0,0,0,0,0,0 +HARSHEST,2009,0,0,0,0,0,0 +HAZARDOUS,2009,0,0,0,0,0,0 +NONINFRINGEMENT,0,0,0,2011,0,0,0 +NONJURISDICTIONAL,0,0,0,2011,0,0,0 +NONPERFORMANCES,2009,0,0,0,0,0,0 +HURTING,2009,0,0,0,0,0,0 +DISFAVORING,2009,0,0,0,0,0,0 +DISGORGEMENT,2009,0,0,0,0,0,0 +COMPLICATE,2009,0,0,0,0,0,0 +COMPLICATION,2009,0,0,0,0,0,0 +COMPLIMENTED,0,2009,0,0,0,0,0 +MISSTATEMENT,2009,0,0,0,0,0,0 +MISSTEP,2009,0,0,0,0,0,0 +MISTAKENLY,2009,0,0,0,0,0,0 +MISTRIALS,2009,0,0,2009,0,0,0 +MISUNDERSTOOD,2009,0,0,0,0,0,0 +MISUSING,2009,0,0,0,0,0,0 +MONOPOLIZE,2009,0,0,0,0,0,0 +MONOPOLY,2009,0,0,0,0,0,0 +MOREOVER,0,0,0,2009,0,0,0 +MUST,0,0,0,0,2009,0,0 +SLIPPAGE,2009,0,0,0,0,0,0 +SLOWDOWNS,2009,0,0,0,0,0,0 +SLOWING,2009,0,0,0,0,0,0 +SLUGGISHLY,2009,0,0,0,0,0,0 +SMOOTHLY,0,2009,0,0,0,0,0 +DEPRESSED,2009,0,0,0,0,0,0 +DEPRIVE,2009,0,0,0,0,0,0 +DERELICT,2009,0,0,0,0,0,0 +DEROGATES,0,0,0,2009,0,0,0 +DEROGATORY,2009,0,0,0,0,0,0 +DESIST,0,0,0,2009,0,0,0 +DESTABILIZED,2009,0,0,0,0,0,0 +DESTROYED,2009,0,0,0,0,0,0 +DESTRUCTIVE,2009,0,0,0,0,0,0 +DETENTION,2009,0,0,0,0,0,0 +DETERIORATED,2009,0,0,0,0,0,0 +DETERIORATIONS,2009,0,0,0,0,0,0 +DETERRENT,2009,0,0,0,0,0,0 +DETRACT,2009,0,0,0,0,0,0 +DETRIMENTAL,2009,0,0,0,0,0,0 +DEVALUED,2009,0,0,0,0,0,0 +DEVASTATED,2009,0,0,0,0,0,0 +DEVIATED,2009,0,2009,0,0,0,0 +DEVIATIONS,2009,0,2009,0,0,0,0 +DEVOLVES,2009,0,0,0,0,0,0 +DICTATES,0,0,0,0,0,0,2009 +DIFFERING,0,0,2009,0,0,0,0 +DIFFICULTLY,2009,0,0,0,0,0,0 +ASCENDANT,0,0,0,2009,0,0,0 +ASSAULTING,2009,0,0,0,0,0,0 +ASSIGNATION,0,0,0,2009,0,0,0 +ASSUMED,0,0,2009,0,0,0,0 +ASSUMPTIONS,0,0,2009,0,0,0,0 +ASSURING,0,2009,0,0,0,0,0 +ATTAINMENT,0,2009,0,0,0,0,0 +ATTESTATION,0,0,0,2009,0,0,0 +ATTORN,0,0,0,2011,0,0,0 +ATTORNS,0,0,0,2011,0,0,0 +AVERSELY,2011,0,0,0,0,0,0 +BAILED,0,0,0,2009,0,0,0 +BAILIFFS,0,0,0,2009,0,0,0 +BALKED,2009,0,0,0,0,0,0 +BANKRUPTED,2009,0,0,0,0,0,0 +CLAIMANT,0,0,0,2009,0,0,0 +CLAIMS,2009,0,0,2009,0,0,0 +CLAWBACKS,0,0,0,2014,0,0,0 +CLOSEOUTS,2009,0,0,0,0,0,0 +CLOSURES,2009,0,0,0,0,0,0 +CODICILS,0,0,0,2009,0,0,0 +CODIFIES,0,0,0,2009,0,0,0 +COERCED,2009,0,0,0,0,0,0 +COERCIVE,2009,0,0,0,0,0,0 +DISINCENTIVES,2009,0,0,0,0,0,0 +COLLABORATE,0,2009,0,0,0,0,0 +COLLABORATION,0,2009,0,0,0,0,0 +COLLABORATORS,0,2009,0,0,0,0,0 +COLLAPSING,2009,0,0,0,0,0,0 +COLLUDED,2009,0,0,0,0,0,0 +COLLUSIONS,2009,0,0,0,0,0,0 +POSITIVE,0,2009,0,0,0,0,0 +POSSIBILITY,0,0,2009,0,0,0,0 +POSTCLOSURE,0,0,0,2011,0,0,0 +POSTPONED,2009,0,0,0,0,0,0 +POSTPONING,2009,0,0,0,0,0,0 +WRIT,0,0,0,2009,0,0,0 +WRITEOFFS,2009,0,0,0,0,0,0 +WRONGDOINGS,2009,0,0,0,0,0,0 +HONORING,0,2009,0,0,0,0,0 +REASSESSES,0,0,2009,0,0,0,0 +REASSIGN,2009,0,0,0,0,0,0 +REASSIGNMENTS,2009,0,0,0,0,0,0 +REBOUNDING,0,2009,0,0,0,0,0 +REBUTTABLY,0,0,0,2011,0,0,0 +REBUTTING,0,0,0,2009,0,0,0 +RECALCULATING,0,0,2009,0,0,0,0 +RECALLED,2009,0,0,0,0,0,0 +RECESSION,2009,0,0,0,0,0,0 +RECKLESSLY,2009,0,0,0,0,0,0 +RECONSIDERING,0,0,2009,0,0,0,0 +RECOUPMENT,0,0,0,2009,0,0,0 +RECTIFICATION,0,0,0,2009,0,0,0 +RECUSED,0,0,0,2011,0,0,0 +REDACTED,2009,0,0,2009,0,0,0 +REDEFAULT,2014,0,0,0,0,0,0 +REDRESSED,2009,0,0,0,0,0,0 +REEXAMINE,0,0,2009,0,0,0,0 +REFERENDUMS,0,0,0,2009,0,0,0 +REFILING,0,0,0,2009,0,0,0 +REFUSAL,2009,0,0,0,0,0,0 +REFUSES,2009,0,0,0,0,0,0 +REGAINING,0,2009,0,0,0,0,0 +REGULATING,0,0,0,2009,0,0,0 +REGULATOR,0,0,0,2009,0,0,0 +REHEARD,0,0,0,2009,0,0,0 +VARIABLES,0,0,2009,0,0,0,0 +VARIANT,0,0,2009,0,0,0,0 +VARIED,0,0,2009,0,0,0,0 +VENDEE,0,0,0,2011,0,0,0 +VERSATILE,0,2009,0,0,0,0,0 +VIBRANCY,0,2009,0,0,0,0,0 +VIOLATED,2009,0,0,0,0,0,0 +VIOLATIONS,2009,0,0,0,0,0,0 +VIOLENCE,2009,0,0,0,0,0,0 +VITIATED,2009,0,0,0,0,0,0 +VOIDABLE,0,0,0,2009,0,0,0 +VOLATILITIES,0,0,2009,0,0,0,0 +VULNERABLE,2009,0,0,0,0,0,0 +WARNING,2009,0,0,0,0,0,0 +WARRANTOR,0,0,0,2011,0,0,0 +WEAK,2009,0,0,0,0,0,0 +WEAKENS,2009,0,0,0,0,0,0 +WEAKNESS,2009,0,0,0,0,0,0 +DISHONOR,2009,0,0,0,0,0,0 +DISHONORING,2009,0,0,0,0,0,0 +DISINTERESTED,2009,0,0,0,0,0,0 +DISLOYALLY,2009,0,0,0,0,0,0 +DISMISS,2009,0,0,0,0,0,0 +DISMISSES,2009,0,0,0,0,0,0 +DISPARAGED,2009,0,0,0,0,0,0 +DISPARAGING,2009,0,0,0,0,0,0 +DISPLACE,2009,0,0,0,0,0,0 +DISPLACES,2009,0,0,0,0,0,0 +DISPOSSESS,2009,0,0,0,0,0,0 +DISPOSSESSION,0,0,0,2009,0,0,0 +DISPROPORTIONATE,2009,0,0,0,0,0,0 +DISPUTES,2009,0,0,0,0,0,0 +DISQUALIFIED,2009,0,0,0,0,0,0 +DISREGARD,2009,0,0,0,0,0,0 +DISREPUTABLE,2009,0,0,0,0,0,0 +DISRUPTING,2009,0,0,0,0,0,0 +DISRUPTS,2009,0,0,0,0,0,0 +DISSENTED,2009,0,0,0,0,0,0 +DISSENTS,2009,0,0,0,0,0,0 +DISSOLUTIONS,2009,0,0,0,0,0,0 +DISTINCTIVELY,0,2009,0,0,0,0,0 +DISTORTING,2009,0,0,0,0,0,0 +DISTRACT,2009,0,0,0,0,0,0 +DISTRACTIONS,2009,0,0,0,0,0,0 +DISTRESSED,2009,0,0,0,0,0,0 +DISTURBANCE,2009,0,0,0,0,0,0 +DISTURBS,2009,0,0,0,0,0,0 +DIVERTING,2009,0,0,0,0,0,0 +DIVESTING,2009,0,0,0,0,0,0 +DIVESTMENTS,2009,0,0,0,0,0,0 +DIVULGE,2009,0,0,0,0,0,0 +DOCKET,0,0,0,2009,0,0,0 +DONEES,0,0,0,2011,0,0,0 +DOUBTS,2009,0,2009,0,0,0,0 +DOWNGRADING,2009,0,0,0,0,0,0 +DOWNSIZING,2009,0,0,0,0,0,0 +DOWNTURN,2009,0,0,0,0,0,0 +DRAG,2009,0,0,0,0,0,0 +DRAWBACKS,2009,0,0,0,0,0,0 +DROUGHTS,2009,0,0,0,0,0,0 +DYSFUNCTIONAL,2009,0,0,0,0,0,0 +EARMARKING,0,0,0,0,0,0,2009 +EASING,2009,0,0,0,0,0,0 +EFFICIENCY,0,2009,0,0,0,0,0 +EGREGIOUSLY,2009,0,0,0,0,0,0 +EMBARGOES,2009,0,0,0,0,0,0 +EMBARRASSES,2009,0,0,0,0,0,0 +EMBEZZLE,2009,0,0,0,0,0,0 +EMBEZZLER,2009,0,0,0,0,0,0 +EMPOWERED,0,2009,0,0,0,0,0 +ENABLED,0,2009,0,0,0,0,0 +ENCOURAGEMENT,0,2009,0,0,0,0,0 +ENCROACHED,2009,0,0,0,0,0,0 +ENCROACHMENTS,2009,0,0,0,0,0,0 +ENCUMBERS,2009,0,0,2009,0,0,2009 +ENCUMBRANCES,2009,0,0,2009,0,0,2009 +ENDANGERMENT,2009,0,0,0,0,0,0 +ENFORCEABLE,0,0,0,2009,0,0,0 +ENHANCEMENT,0,2009,0,0,0,0,0 +ENJOIN,2009,0,0,0,0,0,0 +ENJOY,0,2009,0,0,0,0,0 +ENJOYING,0,2009,0,0,0,0,0 +ENTAILED,0,0,0,0,0,0,2009 +PENALIZE,2009,0,0,0,0,0,0 +PENALTIES,2009,0,0,0,0,0,0 +PERFECTED,0,2009,0,0,0,0,0 +PERIL,2009,0,0,0,0,0,0 +PERMISSION,0,0,0,0,0,0,2009 +PERMITTEES,0,0,0,2011,0,0,0 +PERPETRATES,2009,0,0,2009,0,0,0 +PERSISTED,2009,0,0,0,0,0,0 +PERSISTING,2009,0,0,0,0,0,0 +PERVASIVELY,2009,0,0,0,0,0,0 +PETITIONER,0,0,0,2009,0,0,0 +PETTY,2009,0,0,0,0,0,0 +HEREAFTER,0,0,0,2009,0,0,0 +HEREFORE,0,0,0,2014,0,0,0 +HEREINAFTER,0,0,0,2009,0,0,0 +HEREON,0,0,0,2009,0,0,0 +HEREUNTO,0,0,0,2009,0,0,0 +HIDDEN,0,0,2009,0,0,0,0 +HINDERING,2009,0,0,0,0,0,0 +HINGES,0,0,2009,0,0,0,0 +WHEREABOUTS,0,0,0,2009,0,0,0 +WHEREFORE,0,0,0,2009,0,0,0 +WHERETO,0,0,0,2009,0,0,0 +WHISTLEBLOWERS,0,0,0,2011,0,0,0 +WILFUL,0,0,0,2009,0,0,0 +WILLFULNESS,0,0,0,2009,0,0,0 +WINNING,0,2009,0,0,0,0,0 +FLUCTUATE,0,0,2009,0,0,0,0 +FLUCTUATION,0,0,2009,0,0,0,0 +FORBEARANCE,0,0,0,2009,0,0,0 +FORBID,2009,0,0,0,0,0,2009 +FORCE,-2020,0,0,0,0,0,0 +FOREBEARANCE,0,0,0,2011,0,0,0 +FORECLOSES,2009,0,0,0,0,0,0 +FOREGO,2009,0,0,0,0,0,0 +FORESTALLED,2009,0,0,0,0,0,0 +FORFEITABILITY,0,0,0,2011,0,0,0 +FORFEITS,2009,0,0,0,0,0,0 +FORGERY,2009,0,0,0,0,0,0 +FRAUDS,2009,0,0,0,0,0,0 +FRIENDLY,0,2009,0,0,0,0,0 +FRUSTRATED,2009,0,0,0,0,0,0 +FRUSTRATION,2009,0,0,0,0,0,0 +FURTHERANCE,0,0,0,2009,0,0,0 +GAINS,0,2009,0,0,0,0,0 +DISGORGEMENTS,2009,0,0,0,0,0,0 +DISGRACEFUL,2009,0,0,0,0,0,0 +LITIGATE,2009,0,0,2009,0,0,0 +LITIGATION,2009,0,0,2009,0,0,0 +LITIGIOUS,0,0,0,2009,0,0,0 +LACKED,2009,0,0,0,0,0,0 +LAG,2009,0,0,0,0,0,0 +LAPSE,2009,0,0,0,0,0,0 +LATE,-2020,0,0,0,0,0,0 +LAWFULLY,0,0,0,2009,0,0,0 +LAWS,0,0,0,2009,0,0,0 +LAWYERS,0,0,0,2009,0,0,0 +LEADING,0,2009,0,0,0,0,0 +LEGALIZATION,0,0,0,2009,0,0,0 +LEGALIZES,0,0,0,2009,0,0,0 +LEGATEE,0,0,0,2009,0,0,0 +FLAWED,2009,0,0,0,0,0,0 +NONRECOVERABLE,2009,0,0,0,0,0,0 +LIQUIDATES,2009,0,0,0,0,0,0 +LIQUIDATOR,2009,0,0,0,0,0,0 +BENEFICIATION,0,0,0,2011,0,0,0 +BENEFITTED,0,2009,0,0,0,0,0 +POOR,2009,0,0,0,0,0,0 +REINTERPRETATION,0,0,2009,0,0,0,0 +REINTERPRETS,0,0,2009,0,0,0,0 +REJECTION,2009,0,0,0,0,0,0 +RELINQUISH,2009,0,0,0,0,0,0 +RELINQUISHMENT,2009,0,0,0,0,0,0 +REMAND,0,0,0,2009,0,0,0 +REMEDIATE,0,0,0,2009,0,0,0 +REMEDIATIONS,0,0,0,2009,0,0,0 +RENEGOTIATED,2009,0,0,0,0,0,0 +RENEGOTIATIONS,2009,0,0,0,0,0,0 +RENOUNCEMENTS,2009,0,0,0,0,0,0 +REPARATIONS,2009,0,0,0,0,0,0 +REPOSSESSES,2009,0,0,0,0,0,0 +REPRORATED,0,0,0,2018,0,0,0 +TROUBLED,2009,0,0,0,0,0,0 +UNABLE,2009,0,0,0,0,0,0 +UNAMBIGUOUSLY,0,0,0,0,2009,0,0 +UNAPPEALED,0,0,0,2011,0,0,0 +UNAVAILABILITY,2009,0,0,0,0,0,2011 +UNAWARE,2009,0,0,0,0,0,0 +UNCERTAINTY,0,0,2009,0,0,0,0 +UNCOLLECTIBILITY,2009,0,0,0,0,0,0 +UNCOMPLETED,2009,0,0,0,0,0,0 +UNCONSCIONABLY,2009,0,0,0,0,0,0 +UNCONTRACTED,0,0,0,2011,0,0,0 +UNCORRECTED,2009,0,0,0,0,0,0 +UNCOVERS,2009,0,0,0,0,0,0 +UNDELIVERABLE,2009,0,0,0,0,0,0 +UNDERCUTS,2009,0,0,0,0,0,0 +UNDERESTIMATES,2009,0,0,0,0,0,0 +UNDERINSURED,2009,0,0,0,0,0,0 +UNDERMINING,2009,0,0,0,0,0,0 +UNDERPAYS,2009,0,0,0,0,0,0 +UNDERPERFORMING,2009,0,0,0,0,0,0 +UNDERREPORTING,2011,0,0,0,0,0,0 +UNDERSTATEMENTS,2009,0,0,0,0,0,0 +UNDERUTILIZED,2009,0,0,0,0,0,0 +UNDETECTABLE,0,0,2009,0,0,0,0 +UNDISCHARGED,0,0,0,2009,0,0,0 +UNDOUBTEDLY,0,0,0,0,2009,0,0 +UNECONOMICAL,2009,0,0,0,0,0,0 +UNENCUMBER,0,0,0,2014,0,0,0 +UNEQUIVOCAL,0,0,0,0,2009,0,0 +UNEXCUSED,2009,0,0,0,0,0,0 +UNFAIRLY,2009,0,0,0,0,0,0 +UNFAVORABLE,2009,0,0,0,0,0,0 +UNFIT,2009,0,0,0,0,0,0 +UNFORESEEN,2009,0,0,0,0,0,0 +UNFOUNDED,2009,0,0,0,0,0,0 +UNGUARANTEED,0,0,2009,0,0,0,0 +UNINSURED,2009,0,0,0,0,0,0 +UNJUST,2009,0,0,0,0,0,0 +UNJUSTLY,2009,0,0,0,0,0,0 +UNKNOWNS,0,0,2009,0,0,0,0 +UNLICENSED,2009,0,0,0,0,0,0 +UNMERCHANTABLE,2011,0,0,0,0,0,0 +UNNEEDED,2009,0,0,0,0,0,0 +UNPAID,2009,0,0,0,0,0,0 +UNPOPULAR,2009,0,0,0,0,0,0 +UNPREDICTED,2011,0,2011,0,0,0,0 +UNPROVED,0,0,2009,0,0,0,0 +UNQUANTIFIED,0,0,2011,0,0,0,0 +UNREASONABLY,2009,0,0,0,0,0,0 +UNRECOVERED,2009,0,0,0,0,0,0 +UNREMEDIED,2009,0,0,0,0,0,0 +UNSAFE,2009,0,0,0,0,0,0 +UNSATISFIED,2009,0,0,0,0,0,0 +UNSEASONABLY,0,0,2009,0,0,0,0 +UNSOUND,2009,0,0,0,0,0,0 +UNSTABLE,2009,0,0,0,0,0,0 +UNSUCCESSFULLY,2009,0,0,0,0,0,0 +UNSUITED,2009,0,0,0,0,0,0 +UNSUSPECTING,2009,0,0,0,0,0,0 +UNTIMELY,2009,0,0,0,0,0,0 +UNTRUTHFUL,2009,0,0,0,0,0,0 +UNUSABLE,2009,0,0,0,0,0,0 +UNWARRANTED,2009,0,0,0,0,0,0 +UNWRITTEN,0,0,2009,0,0,0,0 +URGENCY,2009,0,0,0,0,0,0 +USURPATION,0,0,0,2009,0,0,0 +USURY,2009,0,0,2009,0,0,0 +VAGUENESS,0,0,2012,0,0,0,0 +VALUABLE,0,2009,0,0,0,0,0 +PLEAD,2009,0,0,0,0,0,0 +PLEADS,2009,0,0,2009,0,0,0 +PLEASED,0,2009,0,0,0,0,0 +PLEDGED,0,0,0,0,0,0,2009 +PLEDGING,0,0,0,0,0,0,2009 +COMPEL,0,0,0,0,0,0,2011 +COMPENSATORY,0,0,0,2009,0,0,0 +COMPLAINED,2009,0,0,0,0,0,0 +COMPLAINTS,2009,0,0,0,0,0,0 +COMMITMENT,0,0,0,0,0,0,2009 +COMMITTING,0,0,0,0,0,0,2009 +LIMITATION,2009,0,0,0,0,0,0 +LINGERING,2009,0,0,0,0,0,0 +RESTRAINING,0,0,0,0,0,0,2009 +RESTRICT,0,0,0,0,0,0,2009 +RESTRICTIONS,0,0,0,0,0,0,2009 +RESTRICTS,0,0,0,0,0,0,2009 +RESTRUCTURING,2009,0,0,0,0,0,0 +RETALIATES,2009,0,0,0,0,0,0 +RETALIATORY,2009,0,0,0,0,0,0 +PRECAUTIONS,0,0,2009,0,0,0,0 +PRECLUDE,2009,0,0,0,0,0,2009 +PRECONDITION,0,0,0,0,0,0,2009 +PREDECEASED,0,0,0,2009,0,0,0 +PREDICTABILITY,0,0,2009,0,0,0,0 +PREDICTIONS,0,0,2009,0,0,0,0 +PREDICTS,0,0,2009,0,0,0,0 +PREJUDICE,2009,0,0,2009,0,0,0 +PREJUDICING,2009,0,0,2009,0,0,0 +PREMATURELY,2009,0,0,0,0,0,0 +PRESET,0,0,0,0,0,0,2009 +PRESUMABLY,0,0,2009,0,0,0,0 +PRESUMING,0,0,2009,0,0,0,0 +PRETRIAL,2009,0,0,2009,0,0,0 +PREVENTION,2009,0,0,0,0,0,0 +PROACTIVE,0,2009,0,0,0,0,0 +PROBABILITY,0,0,2009,0,0,0,0 +PROBATED,0,0,0,2009,0,0,0 +PROBATIONAL,0,0,0,2009,0,0,0 +PROBATIONS,0,0,0,2009,0,0,0 +PROBLEMS,2009,0,0,0,0,0,0 +PROFITABILITY,0,2009,0,0,0,0,0 +PROGRESSED,0,2009,0,0,0,0,0 +PROHIBITED,0,0,0,0,0,0,2009 +PROHIBITIVE,0,0,0,0,0,0,2009 +PROLONG,2009,0,0,0,0,0,0 +PROLONGING,2009,0,0,0,0,0,0 +PROMULGATES,0,0,0,2009,0,0,0 +PROMULGATOR,0,0,0,2009,0,0,0 +PRORATION,0,0,0,2009,0,0,0 +PROSECUTING,2009,0,0,2009,0,0,0 +PROSECUTORIAL,0,0,0,2011,0,0,0 +PROSPERITY,0,2009,0,0,0,0,0 +PROTESTED,2009,0,0,0,0,0,0 +PROTESTOR,2009,0,0,0,0,0,0 +PROTRACTION,2009,0,0,0,0,0,0 +PROVOKE,2009,0,0,0,0,0,0 +PUNISHABLE,0,0,0,2009,0,0,0 +PUNISHMENT,2009,0,0,0,0,0,0 +PURPORTED,2009,0,0,0,0,0,0 +QUESTION,2009,0,0,0,0,0,0 +QUESTIONING,2009,0,0,0,0,0,0 +QUITCLAIMS,0,0,0,2009,0,0,0 +RANDOM,0,0,2009,0,0,0,0 +RANDOMIZING,0,0,2009,0,0,0,0 +RATABLE,0,0,0,2009,0,0,0 +RATIONALIZE,2009,0,0,0,0,0,0 +ABANDONED,2009,0,0,0,0,0,0 +ABANDONS,2009,0,0,0,0,0,0 +ABDICATION,2009,0,0,0,0,0,0 +ABERRATIONAL,2009,0,0,0,0,0,0 +ABEYANCES,0,0,2009,0,0,0,0 +ABNORMAL,2009,0,0,0,0,0,0 +ABOLISH,2009,0,0,0,0,0,0 +ABOVEMENTIONED,0,0,0,2011,0,0,0 +ABROGATING,2009,0,0,2009,0,0,0 +ABRUPTLY,2009,0,0,0,0,0,0 +ABSENTEEISM,2009,0,0,0,0,0,0 +ABSOLVING,0,0,0,2009,0,0,0 +ABUSED,2009,0,0,0,0,0,0 +ABUSIVELY,2009,0,0,0,0,0,0 +ACCIDENT,2009,0,0,0,0,0,0 +ACCLAIMED,0,2009,0,0,0,0,0 +ACCOMPLISHING,0,2009,0,0,0,0,0 +ACCUSATIONS,2009,0,0,0,0,0,0 +ACCUSING,2009,0,0,0,0,0,0 +ACHIEVEMENTS,0,2009,0,0,0,0,0 +ACQUIESCED,2009,0,0,0,0,0,0 +ACQUIRORS,0,0,0,2011,0,0,0 +ACQUITTALS,2009,0,0,2009,0,0,0 +ACQUITTING,2009,0,0,2009,0,0,0 +ADJOURNED,0,0,0,2009,0,0,0 +ADJOURNS,0,0,0,2009,0,0,0 +ADJUDGING,0,0,0,2009,0,0,0 +ADJUDICATING,0,0,0,2009,0,0,0 +ADJUDICATOR,0,0,0,2009,0,0,0 +ADMISSIBLE,0,0,0,2009,0,0,0 +ADULTERATE,2009,0,0,0,0,0,0 +ADULTERATIONS,2009,0,0,0,0,0,0 +ADVANCING,0,2009,0,0,0,0,0 +ADVANTAGEOUSLY,0,2009,0,0,0,0,0 +ADVERSARY,2009,0,0,0,0,0,0 +ADVERSITY,2009,0,0,0,0,0,0 +AFFREIGHTMENT,0,0,0,2012,0,0,0 +AFORESTATED,0,0,0,2011,0,0,0 +AGGRAVATE,2009,0,0,0,0,0,0 +AGGRAVATION,2009,0,0,0,0,0,0 +ALERTING,2009,0,0,0,0,0,0 +ALIENATING,2009,0,0,0,0,0,0 +ALLEGATIONS,2009,0,0,2009,0,0,0 +ALLEGES,2009,0,0,2009,0,0,0 +ALMOST,0,0,2009,0,0,2009,0 +AMBIGUITIES,0,0,2009,0,0,0,0 +AMENDABLE,0,0,0,2009,0,0,0 +AMENDMENT,0,0,0,2009,0,0,0 +ANNOYANCE,2009,0,0,0,0,0,0 +ANNOYS,2009,0,0,0,0,0,0 +ANNULMENT,2009,0,0,0,0,0,0 +ANOMALOUS,2009,0,2009,0,0,0,0 +ANTECEDENTS,0,0,0,2009,0,0,0 +ANTICIPATING,0,0,2009,0,0,0,0 +ANTICORRUPTION,0,0,0,2014,0,0,0 +APPARENTLY,0,0,2009,0,0,2009,0 +APPEALING,0,0,0,2009,0,0,0 +APPEARING,0,0,2009,0,0,2009,0 +APPELLATE,0,0,0,2009,0,0,0 +APPROXIMATED,0,0,2009,0,0,0,0 +APPROXIMATION,0,0,2009,0,0,0,0 +APPURTENANT,0,0,0,2009,0,0,0 +ARBITRARINESS,0,0,2009,0,0,0,0 +ARBITRATES,0,0,0,2009,0,0,0 +ARBITRATIONS,0,0,0,2009,0,0,0 +ARGUE,2009,0,0,0,0,0,0 +ARGUMENTATIVE,2009,0,0,0,0,0,0 +ARREARS,2009,0,0,0,0,0,0 +ARTIFICIALLY,2009,0,0,0,0,0,0 +RETRIBUTION,2009,0,0,0,0,0,0 +RETROCESSIONAIRES,0,0,0,2011,0,0,0 +BOLSTERS,0,2009,0,0,0,0,0 +BOOMING,0,2009,0,0,0,0,0 +BOTTLENECKS,2009,0,0,0,0,0,0 +BOYCOTTED,2009,0,0,0,0,0,0 +BREACHED,2009,0,0,2009,0,0,0 +BREAKAGE,2009,0,0,0,0,0,0 +BREAKING,-2020,0,0,0,0,0,0 +BRIBE,2009,0,0,0,0,0,0 +BRIBES,2009,0,0,0,0,0,0 +BROKEN,-2020,0,0,0,0,0,0 +BURDENS,2009,0,0,0,0,0,0 +CALAMITOUS,2009,0,0,0,0,0,0 +CANCELING,2009,0,0,0,0,0,0 +CANCELLING,2009,0,0,0,0,0,0 +CARELESSNESS,2009,0,0,0,0,0,0 +CATASTROPHIC,2009,0,0,0,0,0,0 +CAUTIONED,2009,0,0,0,0,0,0 +CAUTIOUSLY,0,0,2009,0,0,0,0 +CEASES,2009,0,0,0,0,0,0 +CENSURE,2009,0,0,0,0,0,0 +CERTIORARI,0,0,0,2011,0,0,0 +CHALLENGES,2009,0,0,0,0,0,0 +CHATTEL,0,0,0,2009,0,0,0 +CIRCUMVENTED,2009,0,0,0,0,0,0 +CIRCUMVENTS,2009,0,0,0,0,0,0 +SHALL,0,0,0,2009,0,0,0 +SHORTAGES,2009,0,0,0,0,0,0 +SHRINKAGES,2009,0,0,0,0,0,0 +SHUTS,2009,0,0,0,0,0,0 +SLANDEROUS,2009,0,0,0,0,0,0 +REPUDIATING,2009,0,0,0,0,0,0 +REQUESTOR,0,0,0,2011,0,0,0 +REQUIREMENTS,0,0,0,0,0,0,2009 +RESCIND,0,0,0,2009,0,0,0 +RESCISSION,0,0,0,2009,0,0,0 +RESIGNATIONS,2009,0,0,0,0,0,0 +RESOLVE,0,2009,0,0,0,0,0 +RESTATEMENTS,2009,0,0,0,0,0,0 +NOTARIES,0,0,0,2009,0,0,0 +NOTARIZED,0,0,0,2009,0,0,0 +NOVO,0,0,0,2011,0,0,0 +NULLIFICATIONS,2009,0,0,2009,0,0,0 +NULLIFYING,2009,0,0,2009,0,0,0 +OBJECTING,2009,0,0,0,0,0,0 +OBJECTIONS,2009,0,0,0,0,0,0 +OBLIGATING,0,0,0,0,0,0,2009 +OBLIGE,0,0,0,0,0,0,2009 +OBLIGES,0,0,0,0,0,0,2009 +OBSCENITY,2009,0,0,0,0,0,0 +OBSTACLES,2009,0,0,0,0,0,0 +OBSTRUCTION,2009,0,0,0,0,0,0 +OFFENCES,2009,0,0,0,0,0,0 +OFFENDERS,2009,0,0,0,0,0,0 +OFFEREE,0,0,0,2009,0,0,0 +OMISSION,2009,0,0,0,0,0,0 +OMITTED,2009,0,0,0,0,0,0 +OPPORTUNISTICALLY,2009,0,0,0,0,0,0 +OPPOSED,2009,0,0,0,0,0,0 +OPPOSITIONS,2009,0,0,0,0,0,0 +ORDINARILY,0,0,2009,0,0,0,0 +OUTMODED,2009,0,0,0,0,0,0 +OUTPERFORMS,0,2009,0,0,0,0,0 +OVERBUILDING,2009,0,0,0,0,0,0 +OVERBURDENED,2009,0,0,0,0,0,0 +OVERCHARGE,2009,0,0,0,0,0,0 +OVERCOME,2009,0,0,0,0,0,0 +OVERESTIMATE,2009,0,0,0,0,0,0 +OVERESTIMATION,2009,0,0,0,0,0,0 +OVERLOADING,2009,0,0,0,0,0,0 +OVERLOOKING,2009,0,0,0,0,0,0 +OVERPAYMENTS,2009,0,0,0,0,0,0 +OVERPRODUCTION,2009,0,0,0,0,0,0 +OVERRULING,0,0,0,2009,0,0,0 +OVERSHADOW,2009,0,0,0,0,0,0 +OVERSTATE,2009,0,0,0,0,0,0 +OVERSTATES,2009,0,0,0,0,0,0 +OVERSUPPLY,2009,0,0,0,0,0,0 +OVERTURNED,2009,0,0,0,0,0,0 +OVERVALUED,2009,0,0,0,0,0,0 +PARA,0,0,0,-2020,0,0,0 +NECESSITATED,0,0,0,0,0,0,2009 +NEGATIVELY,2009,0,0,0,0,0,0 +NEGLECTFUL,2009,0,0,0,0,0,0 +NEGLIGENCES,2009,0,0,0,0,0,0 +NOLO,0,0,0,2011,0,0,0 +BEAUTIFUL,0,2009,0,0,0,0,0 +BELIEVES,0,0,2009,0,0,0,0 +IDEAL,0,2009,0,0,0,0,0 +IGNORE,2009,0,0,0,0,0,0 +ILL,2009,0,0,0,0,0,0 +ILLEGALLY,2009,0,0,0,0,0,0 +ILLIQUID,2009,0,0,0,0,0,0 +IMMATERIALITY,0,0,0,2009,0,0,0 +IMPAIRED,2009,0,0,0,0,0,2011 +IMPAIRS,2009,0,0,0,0,0,2011 +IMPEDED,2009,0,0,0,0,0,0 +IMPEDING,2009,0,0,0,0,0,0 +IMPERFECTIONS,2009,0,0,0,0,0,0 +IMPLICATE,2009,0,0,0,0,0,0 +IMPOSE,0,0,0,0,0,0,2009 +IMPOSITION,0,0,0,0,0,0,2009 +IMPOUND,2009,0,0,0,0,0,0 +IMPRACTICABLE,2009,0,0,0,0,0,0 +IMPRECISE,0,0,2009,0,0,0,0 +IMPRESSED,0,2009,0,0,0,0,0 +IMPRESSIVELY,0,2009,0,0,0,0,0 +IMPROPER,2009,0,0,0,0,0,0 +IMPROVE,0,2009,0,0,0,0,0 +IMPROVES,0,2009,0,0,0,0,0 +INABILITY,2009,0,0,0,0,0,0 +INACCURATE,2009,0,0,0,0,0,0 +INACTIVATE,2009,0,0,0,0,0,0 +INACTIVATION,2009,0,0,0,0,0,0 +INADEQUACY,2009,0,0,0,0,0,0 +INADVERTENTLY,2009,0,0,0,0,0,0 +INAPPROPRIATELY,2009,0,0,0,0,0,0 +INCAPACITATED,2009,0,0,0,0,0,0 +INCARCERATES,2009,0,0,2009,0,0,0 +INCHOATE,0,0,0,2009,0,0,0 +INCIDENTS,2009,0,0,0,0,0,0 +INCOMPETENCE,2009,0,0,0,0,0,0 +INCOMPETENTS,2009,0,0,0,0,0,0 +INCONCLUSIVE,2009,0,0,0,0,0,0 +INCONSISTENTLY,2009,0,0,0,0,0,0 +INCONVENIENCES,2009,0,0,0,0,0,0 +INCORRECTNESS,2009,0,0,0,0,0,0 +INDECENCY,2009,0,0,0,0,0,0 +INDEFINITE,0,0,2009,0,0,0,0 +INDEMNIFICATION,0,0,0,2009,0,0,0 +INDEMNIFY,0,0,0,2009,0,0,0 +INDEMNITIES,0,0,0,2009,0,0,0 +INDETERMINABLE,0,0,2009,0,0,0,0 +INDICTED,2009,0,0,2009,0,0,0 +INDORSEES,0,0,0,2011,0,0,0 +INEFFICIENCIES,2009,0,0,0,0,0,0 +INELIGIBILITY,2009,0,0,0,0,0,0 +INEQUITIES,2009,0,0,0,0,0,0 +INEXACTNESS,0,0,2009,0,0,0,0 +INFLICTED,2009,0,0,0,0,0,0 +INFRACTION,2009,0,0,2009,0,0,0 +INFRINGEMENT,2009,0,0,0,0,0,0 +INFRINGING,2009,0,0,0,0,0,0 +INHIBITING,0,0,0,0,0,0,2011 +INJUNCTIONS,2009,0,0,2009,0,0,0 +INJURES,2009,0,0,0,0,0,0 +INJURY,2009,0,0,0,0,0,0 +INNOVATING,0,2009,0,0,0,0,0 +INNOVATIVENESS,0,2011,0,0,0,0,0 +INORDINATELY,2009,0,0,0,0,0,0 +INSIGHTFUL,0,2009,0,0,0,0,0 +INSISTING,0,0,0,0,0,0,2009 +INSOLVENCY,2009,0,0,0,0,0,0 +INSTABILITIES,0,0,2009,0,0,0,0 +INSUFFICIENT,2009,0,0,0,0,0,0 +INTANGIBLE,0,0,2009,0,0,0,0 +INTERFERE,2009,0,0,0,0,0,0 +INTERFERES,2009,0,0,0,0,0,0 +INTERMITTENTLY,2009,0,0,0,0,0,0 +INTERPOSES,0,0,0,2009,0,0,0 +INTERROGATE,0,0,0,2009,0,0,0 +INTERROGATION,0,0,0,2009,0,0,0 +INTERROGATORS,0,0,0,2009,0,0,0 +INTERRUPTING,2009,0,0,0,0,0,0 +INTESTACY,0,0,0,2009,0,0,0 +STABILIZATION,0,2009,0,0,0,0,0 +STABILIZES,0,2009,0,0,0,0,0 +STAGNANT,2009,0,0,0,0,0,0 +STAGNATING,2009,0,0,0,0,0,0 +STATUTE,0,0,0,2009,0,0,0 +STIPULATE,0,0,0,0,0,0,2009 +STIPULATION,0,0,0,0,0,0,2009 +STOPPAGES,2009,0,0,0,0,0,0 +STRAIN,2009,0,0,0,0,0,0 +STRENGTH,0,2009,0,0,0,0,0 +STRENGTHENS,0,2009,0,0,0,0,0 +STRESSES,2009,0,0,0,0,0,0 +STRICTER,0,0,0,0,0,0,2009 +STRONG,0,2009,0,0,0,0,0 +SUBCLAUSE,0,0,0,2009,0,0,0 +SUBJECTING,2009,0,0,0,0,0,0 +SUBLESSORS,0,0,0,2011,0,0,0 +SUBPARAGRAPHS,0,0,0,2009,0,0,0 +SUBROGATED,0,0,0,2009,0,0,0 +SUBTRUSTS,0,0,0,2011,0,0,0 +SUCCEEDS,0,2009,0,0,0,0,0 +SUCCESSFULLY,0,2009,0,0,0,0,0 +SUED,2009,0,0,2009,0,0,0 +SUFFERING,2009,0,0,0,0,0,0 +SUGGESTING,0,0,2009,0,0,0,0 +SUMMONING,2009,0,0,2009,0,0,0 +SUPERSEDE,0,0,0,2009,0,0,0 +SUPERSEDING,0,0,0,2009,0,0,0 +SURPASSED,0,2009,0,0,0,0,0 +SUSCEPTIBLE,2009,0,0,0,0,0,0 +SUSPEND,2009,0,0,0,0,0,0 +SUSPENSION,2009,0,0,0,0,0,0 +SUSPICIOUS,2009,0,0,0,0,0,0 +REVOCATION,2009,0,0,2009,0,0,0 +REVOKES,2009,0,0,0,0,0,0 +REVOLUTIONIZES,0,2009,0,0,0,0,0 +REWARDING,0,2009,0,0,0,0,0 +RIDICULES,2009,0,0,0,0,0,0 +RISKIER,2009,0,2009,0,0,0,0 +RISKS,0,0,2009,0,0,0,0 +RULINGS,0,0,0,2009,0,0,0 +SACRIFICED,2009,0,0,0,0,0,0 +SATISFACTION,0,2009,0,0,0,0,0 +SATISFIES,0,2009,0,0,0,0,0 +SCANDALS,2009,0,0,0,0,0,0 +SCRUTINIZING,2009,0,0,0,0,0,0 +SEIZE,2009,0,0,0,0,0,0 +SELDOM,0,0,2009,0,0,2009,0 +SEQUESTRATOR,0,0,0,2009,0,0,0 +SETBACK,2009,0,0,0,0,0,0 +SEVER,2009,0,0,0,0,0,0 +SEVERANCE,0,0,0,2009,0,0,0 +SEVERELY,2009,0,0,0,0,0,0 +ENTRENCH,0,0,0,0,0,0,2009 +ERODES,2009,0,0,0,0,0,0 +ERRATICALLY,2009,0,0,0,0,0,0 +ERRONEOUSLY,2009,0,0,0,0,0,0 +ESCALATE,2009,0,0,0,0,0,0 +ESCHEAT,0,0,0,2011,0,0,0 +ESCROWED,0,0,0,0,0,0,2009 +EVADE,2009,0,0,0,0,0,0 +EVASION,2009,0,0,0,0,0,0 +EVICTED,2009,0,0,0,0,0,0 +EVICTS,2009,0,0,0,0,0,0 +EXACERBATED,2009,0,0,0,0,0,0 +EXACERBATIONS,2009,0,0,0,0,0,0 +EXAGGERATING,2009,0,0,0,0,0,0 +EXCEEDENCES,0,0,0,2011,0,0,0 +EXCELS,0,2009,0,0,0,0,0 +EXCESSIVELY,2009,0,0,0,0,0,0 +EXCITING,0,2009,0,0,0,0,0 +EXCLUSIVES,0,2009,0,0,0,0,0 +EXCULPATES,2009,0,0,2009,0,0,0 +EXCULPATORY,2009,0,0,2009,0,0,0 +EXECUTRICES,0,0,0,2009,0,0,0 +EXONERATE,2009,0,0,0,0,0,0 +EXONERATION,2009,0,0,0,0,0,0 +EXPLOITATIONS,2009,0,0,0,0,0,0 +EXPLOITS,2009,0,0,0,0,0,0 +EXPOSING,2009,0,0,0,0,0,0 +EXPROPRIATED,2009,0,0,0,0,0,0 +EXPROPRIATIONS,2009,0,0,0,0,0,0 +EXTRACONTRACTUAL,0,0,0,2011,0,0,0 +SOLVENCIES,2009,0,0,0,0,0,0 +SOMETIME,0,0,2009,0,0,0,0 +SPAM,2014,0,0,0,0,0,0 +TRAUMATIC,2009,0,0,0,0,0,0 +LOSES,2009,0,0,0,0,0,0 +LOST,2009,0,0,0,0,0,0 +LYING,2009,0,0,0,0,0,0 +MALFUNCTIONED,2009,0,0,0,0,0,0 +MALICIOUS,2009,0,0,0,0,0,0 +MANDATE,0,0,0,0,0,0,2009 +MANDATORY,0,0,0,0,0,0,2009 +MANIPULATES,2009,0,0,0,0,0,0 +MANIPULATIVE,2009,0,0,0,0,0,0 +MAYBE,0,0,2009,0,0,2009,0 +MEDIATING,0,0,0,2009,0,0,0 +MEDIATORS,0,0,0,2009,0,0,0 +MISAPPLICATIONS,2009,0,0,0,0,0,0 +MISAPPLYING,2009,0,0,0,0,0,0 +MISAPPROPRIATING,2009,0,0,0,0,0,0 +MISCALCULATE,2009,0,0,0,0,0,0 +MISCALCULATION,2009,0,0,0,0,0,0 +MISCLASSIFICATION,2011,0,0,0,0,0,0 +MISCOMMUNICATION,2014,0,0,0,0,0,0 +MISDEMEANORS,2009,0,0,0,0,0,0 +MISHANDLED,2009,0,0,0,0,0,0 +MISINFORMATION,2009,0,0,0,0,0,0 +MISINTERPRET,2009,0,0,0,0,0,0 +MISINTERPRETING,2009,0,0,0,0,0,0 +MISJUDGES,2009,0,0,0,0,0,0 +MISLABEL,2009,0,0,0,0,0,0 +MISLABELS,2009,0,0,0,0,0,0 +MISLEADS,2009,0,0,0,0,0,0 +MISMANAGEMENT,2009,0,0,0,0,0,0 +MISMATCHED,2009,0,0,0,0,0,0 +MISPRICE,2014,0,0,0,0,0,0 +MISREPRESENTATION,2009,0,0,0,0,0,0 +MISREPRESENTS,2009,0,0,0,0,0,0 +WORRYING,2009,0,0,0,0,0,0 +WORSENING,2009,0,0,0,0,0,0 +WORTHY,0,2009,0,0,0,0,0 +TOLERATED,2009,0,0,0,0,0,0 +TORT,0,0,0,2009,0,0,0 +TORTUOUS,2009,0,0,0,0,0,0 +FIDE,0,0,0,2009,0,0,0 +FIRING,2009,0,0,0,0,0,0 +NONBREACHING,0,0,0,2011,0,0,0 +NONCOMPLIANCE,2009,0,0,0,0,0,0 +NONCONFORMING,2009,0,0,0,0,0,0 +NONCONTRACT,0,0,0,2012,0,0,0 +NONFEASANCE,0,0,0,2011,0,0,0 +NONFORFEITURE,0,0,0,2011,0,0,0 +DISCLAIMED,2009,0,0,0,0,0,0 +DISCLAIMS,2009,0,0,0,0,0,0 +DISCLOSING,2009,0,0,0,0,0,0 +DISCONTINUATIONS,2009,0,0,0,0,0,0 +DISCONTINUING,2009,0,0,0,0,0,0 +DISCOURAGING,2009,0,0,0,0,0,0 +DISCREDITS,2009,0,0,0,0,0,0 +SPECTACULARLY,0,2009,0,0,0,0,0 +SPECULATING,0,0,2009,0,0,0,0 +SPECULATIVELY,0,0,2009,0,0,0,0 +TRAGEDY,2009,0,0,0,0,0,0 +TRANSFERORS,0,0,0,2012,0,0,0 +LEGISLATING,0,0,0,2009,0,0,0 +LEGISLATIVELY,0,0,0,2009,0,0,0 +LEGISLATURES,0,0,0,2009,0,0,0 +LIBELS,0,0,0,2009,0,0,0 +CONCEALED,2009,0,0,0,0,0,0 +CONCEDES,2009,0,0,0,0,0,0 +CONCERN,2009,0,0,0,0,0,0 +CONCILIATION,2009,0,0,0,0,0,0 +CONDEMN,2009,0,0,0,0,0,0 +CONDEMNING,2009,0,0,0,0,0,0 +CONDITIONALLY,0,0,2009,0,0,0,0 +CONFESS,2009,0,0,0,0,0,0 +CONFESSION,2009,0,0,0,0,0,0 +CONFINEMENT,2009,0,0,0,0,0,2009 +CONFISCATE,2009,0,0,0,0,0,0 +CONFISCATION,2009,0,0,0,0,0,0 +CONFLICTED,2009,0,0,0,0,0,0 +CONFRONTATION,2009,0,0,0,0,0,0 +CONFRONTING,2009,0,0,0,0,0,0 +CONFUSES,2009,0,2009,0,0,0,0 +CONSENT,0,0,0,2009,0,0,0 +CONSERVATORSHIPS,0,0,0,2011,0,0,0 +CONSPIRATORIAL,2009,0,0,0,0,0,0 +CONSPIRES,2009,0,0,0,0,0,0 +CONSTITUTIONALITY,0,0,0,2009,0,0,0 +CONSTRAIN,0,0,0,0,0,0,2009 +CONSTRAINT,0,0,0,0,0,0,2009 +CONSTRUE,0,0,0,2012,0,0,0 +CONTEMPT,2009,0,0,0,0,0,0 +CONTENDS,2009,0,0,0,0,0,0 +CONTENTIOUSLY,2009,0,0,0,0,0,0 +CONTESTING,2009,0,0,0,0,0,0 +CONTINGENTLY,0,0,2009,0,0,0,0 +CONTRACTHOLDER,0,0,0,2009,0,0,0 +CONTRACTING,0,0,0,2009,0,0,0 +CONTRACTUAL,0,0,0,2009,0,0,0 +CONTRADICTING,2009,0,0,0,0,0,0 +CONTRADICTS,2009,0,0,0,0,0,0 +CONTRAVENES,0,0,0,2009,0,0,0 +CONTROVERSIAL,2009,0,0,0,0,0,0 +CONTROVERTED,0,0,0,2009,0,0,0 +CONVEYANCES,0,0,0,2009,0,0,0 +CONVICTION,2009,0,0,2009,0,0,0 +CORRECTION,2009,0,0,0,0,0,0 +CORRUPTED,2009,0,0,0,0,0,0 +CORRUPTLY,2009,0,0,0,0,0,0 +COULD,0,0,2009,0,0,2009,0 +COUNSELS,0,0,0,2009,0,0,0 +COUNTERCLAIMS,2009,0,0,0,0,0,0 +COUNTERFEITERS,2009,0,0,0,0,0,0 +COUNTERMEASURES,2009,0,0,0,0,0,0 +COUNTERSUITS,0,0,0,2014,0,0,0 +COURTS,0,0,0,2009,0,0,0 +COVENANTS,0,0,0,0,0,0,2011 +CREATIVITY,0,2009,0,0,0,0,0 +CRIMINALITY,0,0,0,2009,0,0,0 +CRIMINALS,2009,0,0,2009,0,0,0 +CRITICALLY,2009,0,0,0,0,0,0 +CRITICIZED,2009,0,0,0,0,0,0 +CROSSCLAIMS,0,0,0,2011,0,0,0 +CRUCIALLY,2009,0,0,0,0,0,0 +CUMBERSOME,2009,0,0,0,0,0,0 +CURTAILMENT,2009,0,0,0,0,0,0 +CUTBACK,2009,0,0,0,0,0,0 +CYBERBULLYING,2014,0,0,0,0,0,0 +CYBERCRIMINALS,2014,0,0,0,0,0,0 +TAINTED,2009,0,0,0,0,0,0 +TENANTABILITY,0,0,0,2011,0,0,0 +TENTATIVELY,0,0,2009,0,0,0,0 +TERMINATES,2009,0,0,0,0,0,0 +TERMINUS,0,0,0,-2020,0,0,0 +TESTIMONY,0,0,0,2009,0,0,0 +THEREAFTER,0,0,0,2009,0,0,0 +THEREINAFTER,0,0,0,2011,0,0,0 +THERETO,0,0,0,2009,0,0,0 +THEREUNTO,0,0,0,2009,0,0,0 +THREATEN,2009,0,0,0,0,0,0 +THREATS,2009,0,0,0,0,0,0 +FAIL,2009,0,0,0,0,0,0 +FAILS,2009,0,0,0,0,0,0 +FALSE,2009,0,0,0,0,0,0 +FALSIFIED,2009,0,0,0,0,0,0 +FALSITY,2009,0,0,0,0,0,0 +FATALLY,2009,0,0,0,0,0,0 +FAULTY,2009,0,0,0,0,0,0 +FAVORING,0,2009,0,0,0,0,0 +FEARS,2009,0,0,0,0,0,0 +DAMAGE,2009,0,0,0,0,0,0 +DAMPEN,2009,0,0,0,0,0,0 +DANGEROUSLY,2009,0,0,0,0,0,0 +DEADLOCKING,2009,0,0,0,0,0,0 +DEBARMENT,2009,0,0,0,0,0,0 +DECEDENT,0,0,0,2009,0,0,0 +DECEITFULNESS,2009,0,0,0,0,0,0 +DECEIVING,2009,0,0,0,0,0,0 +DECEPTIVELY,2009,0,0,0,0,0,0 +DECLINES,2009,0,0,0,0,0,0 +DECREEING,0,0,0,2009,0,0,0 +DEFACEMENT,2009,0,0,0,0,0,0 +DEFAMATIONS,2009,0,0,0,0,0,0 +DEFAMES,2009,0,0,0,0,0,0 +DEFAULTING,2009,0,0,0,0,0,0 +DEFEASE,0,0,0,2009,0,0,0 +DEFEASING,0,0,0,2011,0,0,0 +DEFEATS,2009,0,0,0,0,0,0 +DEFECTS,2009,0,0,0,0,0,0 +DEFENDANTS,2009,0,0,2009,0,0,0 +DEFENSIVE,2009,0,0,0,0,0,0 +DEFICIENCY,2009,0,0,0,0,0,0 +DEFINITELY,0,0,0,0,2009,0,0 +DEFRAUDING,2009,0,0,0,0,0,0 +DEGRADATIONS,2009,0,0,0,0,0,0 +DEGRADING,2009,0,0,0,0,0,0 +DELAYS,2009,0,0,0,0,0,0 +DELEGEES,0,0,0,2011,0,0,0 +DELIBERATELY,2009,0,0,0,0,0,0 +DELIGHTFULLY,0,2009,0,0,0,0,0 +DELINQUENCY,2009,0,0,0,0,0,0 +DELIST,2009,0,0,0,0,0,0 +DEMISE,2009,0,0,0,0,0,0 +DEMOLISH,2009,0,0,0,0,0,0 +DEMOLITION,2009,0,0,0,0,0,0 +DEMOTES,2009,0,0,0,0,0,0 +DEMURRED,0,0,0,2009,0,0,0 +DEMURS,0,0,0,2009,0,0,0 +DENIES,2009,0,0,0,0,0,0 +DENIGRATING,2009,0,0,0,0,0,0 +DEPEND,0,0,2009,0,0,2009,2011 +DEPENDANCES,0,0,0,0,0,0,2011 +DEPENDENCIES,0,0,2009,0,0,0,2011 +DEPENDS,0,0,2009,0,0,2009,2011 +DEPLETING,2009,0,0,0,0,0,0 +DEPOSED,0,0,0,2009,0,0,0 +DEPOSITIONAL,0,0,0,2011,0,0,0 +INVALIDATED,2009,0,0,0,0,0,0 +INVALIDITY,2009,0,0,0,0,0,0 +INVENTION,0,2009,0,0,0,0,0 +INVENTOR,0,2009,0,0,0,0,0 +INVESTIGATES,2009,0,0,0,0,0,0 +INVOLUNTARILY,2009,0,0,0,0,0,0 +IRRECOVERABLE,2009,0,0,0,0,0,0 +IRREGULARITY,2009,0,0,0,0,0,0 +IRREVERSIBLE,2009,0,0,0,0,0,0 +JEOPARDIZE,2009,0,0,0,0,0,0 +JUDICIALLY,0,0,0,2009,0,0,0 +JURIS,0,0,0,2011,0,0,0 +JURISDICTIONS,0,0,0,2009,0,0,0 +JUROR,0,0,0,2009,0,0,0 +JUSTICE,0,0,0,2009,0,0,0 +KICKBACKS,2009,0,0,0,0,0,0 +DIMINISHED,2009,0,0,0,0,0,0 +DIRECTIVE,0,0,0,0,0,0,2009 +DISADVANTAGEOUS,2009,0,0,0,0,0,0 +DISAFFIRMANCE,0,0,0,2009,0,0,0 +DISAGREEABLE,2009,0,0,0,0,0,0 +DISAGREEMENTS,2009,0,0,0,0,0,0 +DISALLOWANCES,2009,0,0,0,0,0,0 +DISAPPEAR,2009,0,0,0,0,0,0 +DISAPPEARING,2009,0,0,0,0,0,0 +DISAPPOINTING,2009,0,0,0,0,0,0 +DISAPPOINTS,2009,0,0,0,0,0,0 +DISAPPROVED,2009,0,0,0,0,0,0 +DISASSOCIATING,2009,0,0,0,0,0,0 +DISASTERS,2009,0,0,0,0,0,0 +DISAVOWAL,2009,0,0,0,0,0,0 +GRATUITOUSLY,2009,0,0,0,0,0,0 +GREATLY,0,2009,0,0,0,0,0 +GROSSLY,2009,0,0,0,0,0,0 +HALTED,2009,0,0,0,0,0,0 +HAMPERS,2009,0,0,0,0,0,0 +HAPPY,0,2009,0,0,0,0,0 +HARASSMENT,2009,0,0,0,0,0,0 +HARMED,2009,0,0,0,0,0,0 +HARMS,2009,0,0,0,0,0,0 +HARSHLY,2009,0,0,0,0,0,0 +HAZARDS,2009,0,0,0,0,0,0 +NONINFRINGING,0,0,0,2011,0,0,0 +NONPAYMENT,2009,0,0,0,0,0,0 +NONPERFORMING,2009,0,0,0,0,0,0 +DISFAVORS,2009,0,0,0,0,0,0 +PREAMENDMENT,0,0,0,2011,0,0,0 +COMPLICATED,2009,0,0,0,0,0,0 +COMPLICATIONS,2009,0,0,0,0,0,0 +COMPLIMENTING,0,2009,0,0,0,0,0 +MISSTATEMENTS,2009,0,0,0,0,0,0 +MISSTEPS,2009,0,0,0,0,0,0 +MISTAKES,2009,0,0,0,0,0,0 +MISUNDERSTAND,2009,0,0,0,0,0,0 +MISUSE,2009,0,0,0,0,0,0 +MONOPOLISTIC,2009,0,0,0,0,0,0 +MONOPOLIZED,2009,0,0,0,0,0,0 +MORATORIA,2009,0,0,0,0,0,0 +MOTHBALLED,2009,0,0,0,0,0,0 +MUTANDIS,0,0,0,2011,0,0,0 +SLIPPAGES,2009,0,0,0,0,0,0 +SLOWED,2009,0,0,0,0,0,0 +SLOWLY,2009,0,0,0,0,0,0 +SLUGGISHNESS,2009,0,0,0,0,0,0 +SMOOTHS,0,2009,0,0,0,0,0 +DEPRESSES,2009,0,0,0,0,0,0 +DEPRIVED,2009,0,0,0,0,0,0 +DERELICTION,2009,0,0,0,0,0,0 +DEROGATING,0,0,0,2009,0,0,0 +DESIGNATOR,0,0,0,2011,0,0,0 +DESPITE,0,2009,0,0,0,0,0 +DESTABILIZING,2009,0,2009,0,0,0,0 +DESTROYING,2009,0,0,0,0,0,0 +DETAIN,2009,0,0,0,0,0,0 +DETENTIONS,2009,0,0,0,0,0,0 +DETERIORATES,2009,0,0,0,0,0,0 +DETERRED,2009,0,0,0,0,0,0 +DETERRENTS,2009,0,0,0,0,0,0 +DETRACTED,2009,0,0,0,0,0,0 +DETRIMENTALLY,2009,0,0,0,0,0,0 +DEVALUES,2009,0,0,0,0,0,0 +DEVASTATING,2009,0,0,0,0,0,0 +DEVIATES,2009,0,2009,0,0,0,0 +DEVISEES,0,0,0,2011,0,0,0 +DEVOLVING,2009,0,0,0,0,0,0 +DICTATING,0,0,0,0,0,0,2009 +DIFFERS,0,0,2009,0,0,0,0 +DIFFICULTY,2009,0,0,0,0,0,0 +ASCENDANTS,0,0,0,2009,0,0,0 +ASSAULTS,2009,0,0,0,0,0,0 +ASSIGNATIONS,0,0,0,2009,0,0,0 +ASSUMES,0,0,2009,0,0,0,0 +ASSURE,0,2009,0,0,0,0,0 +ATTAIN,0,2009,0,0,0,0,0 +ATTAINMENTS,0,2009,0,0,0,0,0 +ATTESTATIONS,0,0,0,2009,0,0,0 +ATTORNEY,0,0,0,2009,0,0,0 +ATTRACTIVE,0,2009,0,0,0,0,0 +BACKDATING,2009,0,0,0,0,0,0 +BAILEE,0,0,0,2009,0,0,0 +BAILMENT,0,0,0,2011,0,0,0 +BANKRUPT,2009,0,0,0,0,0,0 +BANKRUPTING,2009,0,0,0,0,0,0 +CLAIMANTS,0,0,0,2009,0,0,0 +CLARIFICATION,0,0,2009,0,0,0,0 +CLEARLY,0,0,0,0,2009,0,0 +CLOSING,-2020,0,0,0,0,0,0 +CODEFENDANT,0,0,0,2011,0,0,0 +CODIFICATION,0,0,0,2009,0,0,0 +CODIFY,0,0,0,2009,0,0,0 +COERCES,2009,0,0,0,0,0,0 +COLLABORATED,0,2009,0,0,0,0,0 +COLLABORATIONS,0,2009,0,0,0,0,0 +COLLAPSE,2009,0,0,0,0,0,0 +COLLISION,2009,0,0,0,0,0,0 +COLLUDES,2009,0,0,0,0,0,0 +COLLUSIVE,2009,0,0,0,0,0,0 +POSITIVELY,0,2009,0,0,0,0,0 +POSSIBLE,0,0,2009,0,0,2009,0 +POSTCONTRACT,0,0,0,2011,0,0,0 +POSTPONEMENT,2009,0,0,0,0,0,0 +WRITEDOWN,2009,0,0,0,0,0,0 +WRITS,0,0,0,2009,0,0,0 +WRONGFUL,2009,0,0,0,0,0,0 +HONOR,0,2009,0,0,0,0,0 +HONORS,0,2009,0,0,0,0,0 +REARGUMENT,0,0,0,2011,0,0,0 +REASSESSING,0,0,2009,0,0,0,0 +REASSIGNED,2009,0,0,0,0,0,0 +REASSIGNS,2009,0,0,0,0,0,0 +REBUT,0,0,0,2009,0,0,0 +REBUTTAL,0,0,0,2009,0,0,0 +RECALCULATE,0,0,2009,0,0,0,0 +RECALCULATION,0,0,2009,0,0,0,0 +RECALLING,2009,0,0,0,0,0,0 +RECESSIONARY,2009,0,0,0,0,0,0 +RECKLESSNESS,2009,0,0,0,0,0,0 +RECONSIDERS,0,0,2009,0,0,0,0 +RECOUPMENTS,0,0,0,2009,0,0,0 +RECTIFICATIONS,0,0,0,2009,0,0,0 +RECUSES,0,0,0,2014,0,0,0 +REDACTING,2009,0,0,2009,0,0,0 +REDEFAULTED,2012,0,0,0,0,0,0 +REDRESSES,2009,0,0,0,0,0,0 +REEXAMINING,0,0,2009,0,0,0,0 +REFILE,0,0,0,2009,0,0,0 +REFRAIN,0,0,0,0,0,0,2009 +REFUSALS,2009,0,0,0,0,0,0 +REFUSING,2009,0,0,0,0,0,0 +REGULATE,0,0,0,2009,0,0,0 +REGULATION,0,0,0,2009,0,0,0 +REGULATORS,0,0,0,2009,0,0,0 +REHEARING,0,0,0,2009,0,0,0 +VARIABLY,0,0,2009,0,0,0,0 +VARIANTS,0,0,2009,0,0,0,0 +VARIES,0,0,2009,0,0,0,0 +VENDEES,0,0,0,2011,0,0,0 +VERSATILITY,0,2009,0,0,0,0,0 +VIBRANT,0,2009,0,0,0,0,0 +VIOLATES,2009,0,0,0,0,0,0 +VIOLATIVE,2009,0,0,2009,0,0,0 +VIOLENT,2009,0,0,0,0,0,0 +VITIATES,2009,0,0,0,0,0,0 +VOIDED,2009,0,0,2009,0,0,0 +VOLATILITY,2009,0,2009,0,0,0,0 +VULNERABLY,2009,0,0,0,0,0,0 +WARNINGS,2009,0,0,0,0,0,0 +WASTED,2009,0,0,0,0,0,0 +WEAKEN,2009,0,0,0,0,0,0 +WEAKER,2009,0,0,0,0,0,0 +WEAKNESSES,2009,0,0,0,0,0,0 +DISHONORABLE,2009,0,0,0,0,0,0 +DISHONORS,2009,0,0,0,0,0,0 +DISINTERESTEDLY,2009,0,0,0,0,0,0 +DISLOYALTY,2009,0,0,0,0,0,0 +DISMISSAL,2009,0,0,0,0,0,0 +DISMISSING,2009,0,0,0,0,0,0 +DISPARAGEMENT,2009,0,0,0,0,0,0 +DISPARAGINGLY,2009,0,0,0,0,0,0 +DISPLACED,2009,0,0,0,0,0,0 +DISPLACING,2009,0,0,0,0,0,0 +DISPOSSESSED,2009,0,0,0,0,0,0 +DISPOSSESSORY,0,0,0,2011,0,0,0 +DISPROPORTIONATELY,2009,0,0,0,0,0,0 +DISPUTING,2009,0,0,0,0,0,0 +DISQUALIFIES,2009,0,0,0,0,0,0 +DISREGARDED,2009,0,0,0,0,0,0 +DISREPUTE,2009,0,0,0,0,0,0 +DISRUPTION,2009,0,0,0,0,0,0 +DISSATISFACTION,2009,0,0,0,0,0,0 +DISSENTER,2009,0,0,0,0,0,0 +DISSIDENT,2009,0,0,0,0,0,0 +DISTINCTION,0,2009,0,0,0,0,0 +DISTINCTIVENESS,0,2009,0,0,0,0,0 +DISTORTION,2009,0,0,0,0,0,0 +DISTRACTED,2009,0,0,0,0,0,0 +DISTRACTS,2009,0,0,0,0,0,0 +DISTRIBUTEE,0,0,0,2009,0,0,0 +DISTURBANCES,2009,0,0,0,0,0,0 +DIVERSION,2009,0,0,0,0,0,0 +DIVERTS,2009,0,0,0,0,0,0 +DIVESTITURE,2009,0,0,0,0,0,0 +DIVESTS,2009,0,0,0,0,0,0 +DIVULGED,2009,0,0,0,0,0,0 +DOCKETED,0,0,0,2009,0,0,0 +DOUBT,2009,0,2009,0,0,0,0 +DOWNGRADE,2009,0,0,0,0,0,0 +DOWNSIZE,2009,0,0,0,0,0,0 +DOWNSIZINGS,2009,0,0,0,0,0,0 +DOWNTURNS,2009,0,0,0,0,0,0 +DRASTIC,2009,0,0,0,0,0,0 +DREAM,0,2009,0,0,0,0,0 +DULY,0,0,0,2009,0,0,0 +DYSFUNCTIONS,2009,0,0,0,0,0,0 +EARMARKS,0,0,0,0,0,0,2009 +EASY,0,2009,0,0,0,0,0 +EFFICIENT,0,2009,0,0,0,0,0 +EJECTMENT,0,0,0,2011,0,0,0 +EMBARGOING,2009,0,0,0,0,0,0 +EMBARRASSING,2009,0,0,0,0,0,0 +EMBEZZLED,2009,0,0,0,0,0,0 +EMBEZZLES,2009,0,0,0,0,0,0 +EMPOWERING,0,2009,0,0,0,0,0 +ENABLES,0,2009,0,0,0,0,0 +ENCOURAGES,0,2009,0,0,0,0,0 +ENCROACHES,2009,0,0,0,0,0,0 +ENCUMBER,2009,0,0,2009,0,0,2009 +ENCUMBRANCE,2009,0,0,2009,0,0,2009 +ENDANGER,2009,0,0,0,0,0,0 +ENDANGERS,2009,0,0,0,0,0,0 +ENFORCEABLY,0,0,0,2011,0,0,0 +ENHANCEMENTS,0,2009,0,0,0,0,0 +ENJOINED,2009,0,0,0,0,0,0 +ENJOYABLE,0,2009,0,0,0,0,0 +ENJOYMENT,0,2009,0,0,0,0,0 +ENTAILING,0,0,0,0,0,0,2009 +PASSU,0,0,0,2009,0,0,0 +PENALIZED,2009,0,0,0,0,0,0 +PENALTY,2009,0,0,0,0,0,0 +PERFECTLY,0,2009,0,0,0,0,0 +PERILS,2009,0,0,0,0,0,0 +PERMISSIONS,0,0,0,0,0,0,2009 +PERMITTING,0,0,0,0,0,0,2009 +PERPETRATING,2009,0,0,2009,0,0,0 +PERSISTENCE,2009,0,0,0,0,0,0 +PERSISTS,2009,0,0,0,0,0,0 +PERVASIVENESS,2009,0,0,0,0,0,0 +PETITIONERS,0,0,0,2009,0,0,0 +PICKET,2009,0,0,0,0,0,0 +HEREBY,0,0,0,2009,0,0,0 +HEREFROM,0,0,0,2009,0,0,0 +HEREINBEFORE,0,0,0,2009,0,0,0 +HERETO,0,0,0,2009,0,0,0 +HEREUPON,0,0,0,2009,0,0,0 +HIGHEST,0,2009,0,0,2009,0,0 +HINDERS,2009,0,0,0,0,0,0 +WHATEVER,0,0,0,2009,0,0,0 +WHEREAS,0,0,0,2009,0,0,0 +WHEREIN,0,0,0,2009,0,0,0 +WHEREUNDER,0,0,0,2011,0,0,0 +WHOMEVER,0,0,0,2009,0,0,0 +WILL,0,0,0,0,2009,0,0 +WIN,0,2009,0,0,0,0,0 +WITNESS,0,0,0,2009,0,0,0 +FLUCTUATED,0,0,2009,0,0,0,0 +FLUCTUATIONS,0,0,2009,0,0,0,0 +FORBEARANCES,0,0,0,2009,0,0,0 +FORBIDDEN,2009,0,0,0,0,0,2009 +FORCED,2009,0,0,0,0,0,0 +FOREBEARS,0,0,0,2009,0,0,0 +FORECLOSING,2009,0,0,0,0,0,0 +FOREGOES,2009,0,0,0,0,0,0 +FORESTALLING,2009,0,0,0,0,0,0 +FORFEITABLE,0,0,0,2009,0,0,0 +FORFEITURE,2009,0,0,0,0,0,0 +FORTHWITH,0,0,0,2009,0,0,0 +FRAUDULENCE,2009,0,0,0,0,0,0 +FRIVOLOUS,2009,0,0,0,0,0,0 +FRUSTRATES,2009,0,0,0,0,0,0 +FRUSTRATIONS,2009,0,0,0,0,0,0 +GAIN,0,2009,0,0,0,0,0 +GOOD,0,2009,0,0,0,0,0 +DISGORGES,2009,0,0,0,0,0,0 +DISGRACEFULLY,2009,0,0,0,0,0,0 +LITIGATED,2009,0,0,2009,0,0,0 +LITIGATIONS,2009,0,0,2009,0,0,0 +LITIGIOUSNESS,0,0,0,2009,0,0,0 +LACKING,2009,0,0,0,0,0,0 +LAGGED,2009,0,0,0,0,0,0 +LAPSED,2009,0,0,0,0,0,0 +LAUNDERING,2009,0,0,0,0,0,0 +LAWFULNESS,0,0,0,2009,0,0,0 +LAWSUIT,0,0,0,2009,0,0,0 +LAYOFF,2009,0,0,0,0,0,0 +LEGAL,0,0,0,2009,0,0,0 +LEGALIZATIONS,0,0,0,2009,0,0,0 +LEGALIZING,0,0,0,2009,0,0,0 +LEGATEES,0,0,0,2009,0,0,0 +FLAWS,2009,0,0,0,0,0,0 +NONRENEWAL,2009,0,0,0,0,0,0 +LIQUIDATING,2009,0,0,0,0,0,0 +LIQUIDATORS,2009,0,0,0,0,0,0 +BENEFICIAL,0,-2020,0,2020,0,0,0 +BENEFIT,0,-2020,0,0,0,0,0 +BENEFITTING,0,2009,0,0,0,0,0 +POORLY,2009,0,0,0,0,0,0 +REINTERPRETATIONS,0,0,2009,0,0,0,0 +REJECT,2009,0,0,0,0,0,0 +REJECTIONS,2009,0,0,0,0,0,0 +RELINQUISHED,2009,0,0,0,0,0,0 +RELINQUISHMENTS,2009,0,0,0,0,0,0 +REMANDED,0,0,0,2009,0,0,0 +REMEDIATED,0,0,0,2009,0,0,0 +REMEDIED,0,0,0,2009,0,0,0 +RENEGOTIATES,2009,0,0,0,0,0,0 +RENOUNCE,2009,0,0,0,0,0,0 +RENOUNCES,2009,0,0,0,0,0,0 +REPLEDGED,0,0,0,2012,0,0,0 +REPOSSESSING,2009,0,0,0,0,0,0 +TROUBLES,2009,0,0,0,0,0,0 +UNACCEPTABLE,2009,0,0,0,0,0,0 +UNANNOUNCED,2009,0,0,0,0,0,0 +UNAPPROVED,2009,0,0,0,0,0,0 +UNAVAILABLE,2009,0,0,0,0,0,2011 +UNCERTAIN,0,0,2009,0,0,2009,0 +UNCLEAR,0,0,2009,0,0,0,0 +UNCOLLECTIBLE,2009,0,0,0,0,0,0 +UNCOMPROMISING,0,0,0,0,2009,0,0 +UNCONSTITUTIONAL,0,0,0,2009,0,0,0 +UNCONTROLLABLE,2009,0,0,0,0,0,0 +UNCOVER,2009,0,0,0,0,0,0 +UNDECIDED,0,0,2009,0,0,0,0 +UNDELIVERED,2009,0,0,0,0,0,0 +UNDERCUTTING,2009,0,0,0,0,0,0 +UNDERESTIMATING,2009,0,0,0,0,0,0 +UNDERMINE,2009,0,0,0,0,0,0 +UNDERPAID,2009,0,0,0,0,0,0 +UNDERPERFORM,2011,0,0,0,0,0,0 +UNDERPERFORMS,2014,0,0,0,0,0,0 +UNDERSTATE,2009,0,0,0,0,0,0 +UNDERSTATES,2009,0,0,0,0,0,0 +UNDESIGNATED,0,0,2009,0,0,0,0 +UNDETECTED,2009,0,0,0,0,0,0 +UNDISCLOSED,2009,0,0,0,0,0,0 +UNDUE,2009,0,0,0,0,0,0 +UNECONOMICALLY,2009,0,0,0,0,0,0 +UNENCUMBERED,0,0,0,2009,0,0,0 +UNEQUIVOCALLY,0,0,0,0,2009,0,0 +UNEXPECTED,2009,0,2009,0,0,0,0 +UNFAMILIAR,0,0,2009,0,0,0,0 +UNFAVORABLY,2009,0,0,0,0,0,0 +UNFITNESS,2009,0,0,0,0,0,0 +UNFORSEEN,2011,0,2011,0,0,0,0 +UNFRIENDLY,2009,0,0,0,0,0,0 +UNHEDGED,0,0,2009,0,0,0,0 +UNINTENDED,2009,0,0,0,0,0,0 +UNJUSTIFIABLE,2009,0,0,0,0,0,0 +UNKNOWING,2009,0,0,0,0,0,0 +UNLAWFUL,2009,0,0,2009,0,0,0 +UNLIQUIDATED,2009,0,0,0,0,0,0 +UNMERITORIOUS,2014,0,0,0,0,0,0 +UNOBSERVABLE,0,0,2009,0,0,0,0 +UNPARALLELED,0,2009,0,0,2009,0,0 +UNPREDICTABILITY,2009,0,2009,0,0,0,0 +UNPRODUCTIVE,2009,0,0,0,0,0,0 +UNPROVEN,0,0,2009,0,0,0,0 +UNREALISTIC,2009,0,0,0,0,0,0 +UNRECEPTIVE,2014,0,0,0,0,0,0 +UNREIMBURSED,2009,0,0,0,0,0,0 +UNREPORTED,2009,0,0,0,0,0,0 +UNSALABLE,2009,0,0,0,0,0,0 +UNSAVORY,2009,0,0,0,0,0,0 +UNSELLABLE,2014,0,0,0,0,0,0 +UNSPECIFIC,0,0,2009,0,0,0,0 +UNSTAYED,0,0,0,2009,0,0,0 +UNSUITABILITY,2009,0,0,0,0,0,0 +UNSURE,2009,0,0,0,0,0,0 +UNSUSTAINABLE,2009,0,0,0,0,0,0 +UNTO,0,0,0,2009,0,0,0 +UNTRUTHFULLY,2009,0,0,0,0,0,0 +UNUSUAL,0,0,2009,0,0,0,0 +UNWELCOME,2009,0,0,0,0,0,0 +UPSET,2009,0,0,0,0,0,0 +URGENT,2009,0,0,0,0,0,0 +USURPED,2009,0,0,2009,0,0,0 +VAGARIES,0,0,2009,0,0,0,0 +VAGUENESSES,0,0,2012,0,0,0,0 +VANDALISM,2009,0,0,0,0,0,0 +PLAINTIFF,2009,0,0,2009,0,0,0 +PLEADED,2009,0,0,0,0,0,0 +PLEAS,2009,0,0,2009,0,0,0 +PLEASURE,0,2009,0,0,0,0,0 +PLEDGEE,0,0,0,2009,0,0,0 +PLEDGOR,0,0,0,2009,0,0,0 +COMPELLED,0,0,0,0,0,0,2009 +COMPLAIN,2009,0,0,0,0,0,0 +COMPLAINING,2009,0,0,0,0,0,0 +COMMITMENTS,0,0,0,0,0,0,2009 +LIMITATIONS,2009,0,0,0,0,0,0 +RESTRAINS,0,0,0,0,0,0,2009 +RESTRICTED,0,0,0,0,0,0,2009 +RESTRICTIVE,0,0,0,0,0,0,2009 +RESTRUCTURE,2009,0,0,0,0,0,0 +RESTRUCTURINGS,2009,0,0,0,0,0,0 +RETALIATING,2009,0,0,0,0,0,0 +RETENDERING,0,0,0,2011,0,0,0 +PRECIPITATED,2009,0,0,0,0,0,0 +PRECLUDED,2009,0,0,0,0,0,2009 +PRECONDITIONS,0,0,0,0,0,0,2009 +PREDECEASES,0,0,0,2009,0,0,0 +PREDICTED,0,0,2009,0,0,0,0 +PREDICTIVE,0,0,2009,0,0,0,0 +PREEMINENCE,0,2009,0,0,0,0,0 +PREJUDICED,2009,0,0,2009,0,0,0 +PRELIMINARILY,0,0,2009,0,0,0,0 +PREMIER,0,2009,0,0,0,0,0 +PRESSING,2009,0,0,0,0,0,0 +PRESUME,0,0,2009,0,0,0,0 +PRESUMPTION,0,0,2009,0,0,0,0 +PREVENT,0,0,0,0,0,0,2009 +PREVENTS,2009,0,0,0,0,0,2009 +PROACTIVELY,0,2009,0,0,0,0,0 +PROBABLE,0,0,2009,0,0,0,0 +PROBATES,0,0,0,2009,0,0,0 +PROBATIONARY,0,0,0,2009,0,0,0 +PROBLEM,2009,0,0,0,0,0,0 +PROFICIENCY,0,2009,0,0,0,0,0 +PROFITABLE,0,2009,0,0,0,0,0 +PROGRESSES,0,2009,0,0,0,0,0 +PROHIBITING,0,0,0,0,0,0,2009 +PROHIBITIVELY,0,0,0,0,0,0,2009 +PROLONGATION,2009,0,0,0,0,0,0 +PROLONGS,2009,0,0,0,0,0,0 +PROMULGATING,0,0,0,2009,0,0,0 +PROMULGATORS,0,0,0,2009,0,0,0 +PROSECUTE,2009,0,0,2009,0,0,0 +PROSECUTION,2009,0,0,2009,0,0,0 +PROSECUTORS,0,0,0,2009,0,0,0 +PROSPEROUS,0,2009,0,0,0,0,0 +PROTESTER,2009,0,0,0,0,0,0 +PROTESTORS,2009,0,0,0,0,0,0 +PROVISO,0,0,0,2009,0,0,0 +PROVOKED,2009,0,0,0,0,0,0 +PUNISHED,2009,0,0,0,0,0,0 +PUNISHMENTS,2009,0,0,0,0,0,0 +PURPORTEDLY,2009,0,0,0,0,0,0 +QUESTIONABLE,2009,0,0,0,0,0,0 +QUESTIONS,2009,0,0,0,0,0,0 +QUITTING,2009,0,0,0,0,0,0 +RANDOMIZE,0,0,2009,0,0,0,0 +RANDOMLY,0,0,2009,0,0,0,0 +RATABLY,0,0,0,2009,0,0,0 +RATIONALIZED,2009,0,0,0,0,0,0 +ABANDONING,2009,0,0,0,0,0,0 +ABDICATED,2009,0,0,0,0,0,0 +ABDICATIONS,2009,0,0,0,0,0,0 +ABERRATIONS,2009,0,0,0,0,0,0 +ABIDE,0,0,0,0,0,0,2009 +ABNORMALITIES,2009,0,0,0,0,0,0 +ABOLISHED,2009,0,0,0,0,0,0 +ABROGATE,2009,0,0,2009,0,0,0 +ABROGATION,2009,0,0,2009,0,0,0 +ABRUPTNESS,2009,0,0,0,0,0,0 +ABSOLVE,0,0,0,2009,0,0,0 +ABUNDANCE,0,2009,0,0,0,0,0 +ABUSES,2009,0,0,0,0,0,0 +ABUSIVENESS,2009,0,0,0,0,0,0 +ACCIDENTAL,2009,0,0,0,0,0,0 +ACCOMPLISH,0,2009,0,0,0,0,0 +ACCOMPLISHMENT,0,2009,0,0,0,0,0 +ACCUSE,2009,0,0,0,0,0,0 +ACHIEVE,0,2009,0,0,0,0,0 +ACHIEVES,0,2009,0,0,0,0,0 +ACQUIESCES,2009,0,0,0,0,0,0 +ACQUIT,2009,0,0,2009,0,0,0 +ACQUITTANCE,0,0,0,2009,0,0,0 +ADDENDUMS,0,0,0,2011,0,0,0 +ADJOURNING,0,0,0,2009,0,0,0 +ADJUDGE,0,0,0,2009,0,0,0 +ADJUDICATE,0,0,0,2009,0,0,0 +ADJUDICATION,0,0,0,2009,0,0,0 +ADJUDICATORS,0,0,0,2009,0,0,0 +ADMISSIBLY,0,0,0,2009,0,0,0 +ADULTERATED,2009,0,0,0,0,0,0 +ADVANCEMENT,0,2009,0,0,0,0,0 +ADVANTAGE,0,2009,0,0,0,0,0 +ADVANTAGES,0,2009,0,0,0,0,0 +ADVERSE,2009,0,0,0,0,0,0 +AFFIDAVIT,0,0,0,2009,0,0,0 +AFOREDESCRIBED,0,0,0,2011,0,0,0 +AFTERMATH,2009,0,0,0,0,0,0 +AGGRAVATED,2009,0,0,0,0,0,0 +AGGRAVATIONS,2009,0,0,0,0,0,0 +ALIENATE,2009,0,0,0,0,0,0 +ALIENATION,2009,0,0,0,0,0,0 +ALLEGE,2009,0,0,2009,0,0,0 +ALLEGING,2009,0,0,2009,0,0,0 +ALTERATION,0,0,2009,0,0,0,0 +AMBIGUITY,0,0,2009,0,0,0,0 +AMENDATORY,0,0,0,2009,0,0,0 +AMENDMENTS,0,0,0,2009,0,0,0 +ANNOYANCES,2009,0,0,0,0,0,0 +ANNUL,2009,0,0,0,0,0,0 +ANNULMENTS,2009,0,0,0,0,0,0 +ANOMALOUSLY,2009,0,2009,0,0,0,0 +ANTICIPATE,0,0,2009,0,0,0,0 +ANTICIPATION,0,0,2009,0,0,0,0 +ANTITRUST,2009,0,0,2009,0,0,0 +APPEAL,0,0,0,2009,0,0,0 +APPEALS,0,0,0,2009,0,0,0 +APPEARS,0,0,2009,0,0,2009,0 +APPELLEES,0,0,0,2011,0,0,0 +APPROXIMATELY,0,0,2009,0,0,0,0 +APPROXIMATIONS,0,0,2009,0,0,0,0 +ARBITRABILITY,0,0,0,2011,0,0,0 +ARBITRARY,0,0,2009,0,0,0,0 +ARBITRATING,0,0,0,2009,0,0,0 +ARBITRATIVE,0,0,0,2011,0,0,0 +ARGUED,2009,0,0,0,0,0,0 +ARGUMENTS,2009,0,0,0,0,0,0 +ARREST,2009,0,0,0,0,0,0 +RETRIBUTIONS,2009,0,0,0,0,0,0 +BONA,0,0,0,2009,0,0,0 +BOOST,0,2009,0,0,0,0,0 +BOUND,0,0,0,0,0,0,2011 +BOYCOTTING,2009,0,0,0,0,0,0 +BREACHES,2009,0,0,2009,0,0,0 +BREAKAGES,2009,0,0,0,0,0,0 +BREAKS,2009,0,0,0,0,0,0 +BRIBED,2009,0,0,0,0,0,0 +BRIBING,2009,0,0,0,0,0,0 +BURDEN,2009,0,0,0,0,0,0 +BURDENSOME,2009,0,0,0,0,0,0 +CALAMITY,2009,0,0,0,0,0,0 +CANCELLATION,2009,0,0,0,0,0,0 +CANCELS,2009,0,0,0,0,0,0 +CATASTROPHICALLY,2009,0,0,0,0,0,0 +CAUTIONING,2009,0,0,0,0,0,0 +CAUTIOUSNESS,0,0,2009,0,0,0,0 +CEASING,2009,0,0,0,0,0,0 +CENSURED,2009,0,0,0,0,0,0 +CESSION,0,0,0,2009,0,0,0 +CHALLENGING,2009,0,0,0,0,0,0 +CHATTELS,0,0,0,2009,0,0,0 +CIRCUMVENTING,2009,0,0,0,0,0,0 +SHARPLY,2009,0,0,0,0,0,0 +SHORTFALL,2009,0,0,0,0,0,0 +SHUT,2009,0,0,0,0,0,0 +SHUTTING,2009,0,0,0,0,0,0 +SLANDERS,2009,0,0,0,0,0,0 +REPUDIATE,2009,0,0,0,0,0,0 +REPUDIATION,2009,0,0,0,0,0,0 +REQUIRE,0,0,0,0,0,0,2009 +REQUIRES,0,0,0,0,0,0,2009 +RESCINDED,0,0,0,2009,0,0,0 +RESCISSIONS,0,0,0,2009,0,0,0 +RESIGNED,2009,0,0,0,0,0,0 +RESTATE,2009,0,0,0,0,0,0 +RESTATES,2009,0,0,0,0,0,0 +NONTERMINABLE,0,0,0,2011,0,0,0 +NOTARIZATION,0,0,0,2009,0,0,0 +NOTARIZING,0,0,0,2009,0,0,0 +NUISANCE,2009,0,0,0,0,0,0 +NULLIFIED,2009,0,0,2009,0,0,0 +NULLITIES,0,0,0,2009,0,0,0 +OBJECTION,2009,0,0,0,0,0,0 +OBLIGATE,0,0,0,0,0,0,2009 +OBLIGATION,0,0,0,0,0,0,2009 +OBLIGED,0,0,0,0,0,0,2009 +OBLIGOR,0,0,0,2009,0,0,0 +OBSOLESCENCE,2009,0,0,0,0,0,0 +OBSTRUCT,2009,0,0,0,0,0,0 +OBSTRUCTIONS,2009,0,0,0,0,0,0 +OFFEND,2009,0,0,0,0,0,0 +OFFENDING,2009,0,0,0,0,0,0 +OFFEREES,0,0,0,2011,0,0,0 +OMISSIONS,2009,0,0,0,0,0,0 +OMITTING,2009,0,0,0,0,0,0 +OPPORTUNITIES,0,2009,0,0,0,0,0 +OPPOSES,2009,0,0,0,0,0,0 +OPTIMISTIC,0,2009,0,0,0,0,0 +OUTAGE,2009,0,0,0,0,0,0 +OUTPERFORM,0,2009,0,0,0,0,0 +OVERAGE,2009,0,0,0,0,0,0 +OVERBUILDS,2009,0,0,0,0,0,0 +OVERBURDENING,2009,0,0,0,0,0,0 +OVERCHARGED,2009,0,0,0,0,0,0 +OVERCOMES,2009,0,0,0,0,0,0 +OVERESTIMATED,2009,0,0,0,0,0,0 +OVERESTIMATIONS,2009,0,0,0,0,0,0 +OVERLOADS,2009,0,0,0,0,0,0 +OVERLOOKS,2009,0,0,0,0,0,0 +OVERPRODUCED,2009,0,0,0,0,0,0 +OVERRULE,0,0,0,2009,0,0,0 +OVERRUN,2009,0,0,0,0,0,0 +OVERSHADOWED,2009,0,0,0,0,0,0 +OVERSTATED,2009,0,0,0,0,0,0 +OVERSTATING,2009,0,0,0,0,0,0 +OVERSUPPLYING,2009,0,0,0,0,0,0 +OVERTURNING,2009,0,0,0,0,0,0 +OVERVALUING,2009,0,0,0,0,0,0 +PARI,0,0,0,2009,0,0,0 +NECESSITATES,0,0,0,0,0,0,2009 +NEGATIVES,2009,0,0,0,0,0,0 +NEGLECTING,2009,0,0,0,0,0,0 +NEGLIGENT,2009,0,0,0,0,0,0 +BARRED,2009,0,0,0,0,0,0 +BEAUTIFULLY,0,2009,0,0,0,0,0 +BELIEVING,0,0,2009,0,0,0,0 +IDLE,2009,0,0,0,0,0,0 +IGNORED,2009,0,0,0,0,0,0 +ILLEGAL,2009,0,0,0,0,0,0 +ILLEGIBLE,2009,0,0,0,0,0,0 +ILLIQUIDITY,2009,0,0,0,0,0,0 +IMMATURE,2009,0,0,0,0,0,0 +IMPAIRING,2009,0,0,0,0,0,2011 +IMPASSE,2009,0,0,0,0,0,0 +IMPEDES,2009,0,0,0,0,0,0 +IMPENDING,2009,0,0,0,0,0,0 +IMPERIL,2009,0,0,0,0,0,0 +IMPLICATED,2009,0,0,0,0,0,0 +IMPOSED,0,0,0,0,0,0,2009 +IMPOSITIONS,0,0,0,0,0,0,2009 +IMPOUNDED,2009,0,0,0,0,0,0 +IMPRACTICAL,2009,0,0,0,0,0,0 +IMPRECISION,0,0,2009,0,0,0,0 +IMPRESSES,0,2009,0,0,0,0,0 +IMPRISONMENT,2009,0,0,0,0,0,0 +IMPROPERLY,2009,0,0,0,0,0,0 +IMPROVED,0,2009,0,0,0,0,0 +IMPROVING,0,2009,0,0,0,0,0 +INACCESSIBLE,2009,0,0,0,0,0,0 +INACCURATELY,2009,0,0,0,0,0,0 +INACTIVATED,2009,0,0,0,0,0,0 +INACTIVATIONS,2009,0,0,0,0,0,0 +INADEQUATE,2009,0,0,0,0,0,0 +INADVISABILITY,2009,0,0,0,0,0,0 +INASMUCH,0,0,0,2009,0,0,0 +INCAPACITY,2009,0,0,2009,0,0,0 +INCARCERATING,2009,0,0,2009,0,0,0 +INCIDENCE,2009,0,0,0,0,0,0 +INCOMPATIBILITIES,2009,0,0,0,0,0,0 +INCOMPETENCY,2009,0,0,0,0,0,0 +INCOMPLETE,2009,0,0,0,0,0,0 +INCONSISTENCIES,2009,0,0,0,0,0,0 +INCONTESTABILITY,0,0,0,2009,0,0,0 +INCONVENIENT,2009,0,0,0,0,0,0 +INCREDIBLE,0,2009,0,0,0,0,0 +INDECENT,2009,0,0,0,0,0,0 +INDEFINITELY,0,0,2009,0,0,0,0 +INDEMNIFICATIONS,0,0,0,2009,0,0,0 +INDEMNIFYING,0,0,0,2009,0,0,0 +INDEMNITOR,0,0,0,2009,0,0,0 +INDETERMINATE,0,0,2009,0,0,0,0 +INDICTING,2009,0,0,2009,0,0,0 +INEFFECTIVE,2009,0,0,0,0,0,0 +INEFFICIENCY,2009,0,0,0,0,0,0 +INELIGIBLE,2009,0,0,0,0,0,0 +INEQUITY,2009,0,0,0,0,0,0 +INEXPERIENCE,2009,0,0,0,0,0,0 +INFLUENTIAL,0,2009,0,0,0,0,0 +INFRACTIONS,2009,0,0,2009,0,0,0 +INFRINGEMENTS,2009,0,0,0,0,0,0 +INGENUITY,0,2009,0,0,0,0,0 +INHIBITS,0,0,0,0,0,0,2011 +INJUNCTIVE,0,0,0,2009,0,0,0 +INJURIES,2009,0,0,0,0,0,0 +INNOVATE,0,2009,0,0,0,0,0 +INNOVATION,0,2009,0,0,0,0,0 +INNOVATOR,0,2009,0,0,0,0,0 +INQUIRY,2009,0,0,0,0,0,0 +INSIST,0,0,0,0,0,0,2009 +INSISTS,0,0,0,0,0,0,2009 +INSOLVENT,2009,0,0,0,0,0,0 +INSTABILITY,2009,0,2009,0,0,0,0 +INSUFFICIENTLY,2009,0,0,0,0,0,0 +INTANGIBLES,0,0,2009,0,0,0,0 +INTERFERED,2009,0,0,0,0,0,0 +INTERFERING,2009,0,0,0,0,0,0 +INTERPLEADER,0,0,0,2009,0,0,0 +INTERPOSING,0,0,0,2009,0,0,0 +INTERROGATED,0,0,0,2009,0,0,0 +INTERROGATIONS,0,0,0,2009,0,0,0 +INTERROGATORY,0,0,0,2009,0,0,0 +INTERRUPTION,2009,0,0,0,0,0,0 +INTESTATE,0,0,0,2009,0,0,0 +SPORADIC,0,0,2009,0,0,0,0 +STABILIZATIONS,0,2009,0,0,0,0,0 +STABILIZING,0,2009,0,0,0,0,0 +STAGNATE,2009,0,0,0,0,0,0 +STAGNATION,2009,0,0,0,0,0,0 +STATUTES,0,0,0,2009,0,0,0 +STIPULATED,0,0,0,0,0,0,2009 +STIPULATIONS,0,0,0,0,0,0,2009 +STOPPED,2009,0,0,0,0,0,0 +STRAINED,2009,0,0,0,0,0,0 +STRENGTHEN,0,2009,0,0,0,0,0 +STRENGTHS,0,2009,0,0,0,0,0 +STRESSFUL,2009,0,0,0,0,0,0 +STRICTEST,0,0,0,0,0,0,2009 +STRONGER,0,2009,0,0,0,0,0 +SUBCLAUSES,0,0,0,2009,0,0,0 +SUBJECTION,2009,0,0,0,0,0,0 +SUBLICENSEE,0,0,0,2009,0,0,0 +SUBPOENA,2009,0,0,2009,0,0,0 +SUBROGATION,0,0,0,2009,0,0,0 +SUCCEED,0,2009,0,0,0,0,0 +SUCCESS,0,2009,0,0,0,0,0 +SUDDEN,0,0,2009,0,0,0,0 +SUES,2009,0,0,2009,0,0,0 +SUFFERS,2009,0,0,0,0,0,0 +SUGGESTS,0,0,2009,0,0,2009,0 +SUMMONS,2009,0,0,2009,0,0,0 +SUPERSEDEAS,0,0,0,2011,0,0,0 +SURETIES,0,0,0,2009,0,0,0 +SURPASSES,0,2009,0,0,0,0,0 +SUSPECT,2009,0,0,0,0,0,0 +SUSPENDED,2009,0,0,0,0,0,0 +SUSPENSIONS,2009,0,0,0,0,0,0 +SUSPICIOUSLY,2009,0,0,0,0,0,0 +REVISE,0,0,2009,0,0,0,0 +REVOCATIONS,2009,0,0,2009,0,0,0 +REVOKING,2009,0,0,0,0,0,0 +REVOLUTIONIZING,0,2009,0,0,0,0,0 +REWARDS,0,-2020,0,0,0,0,0 +RIDICULING,2009,0,0,0,0,0,0 +RISKIEST,2009,0,2009,0,0,0,0 +RISKY,2009,0,2009,0,0,0,0 +RUMORS,0,0,2009,0,0,0,0 +SACRIFICES,2009,0,0,0,0,0,0 +SATISFACTORILY,0,2009,0,0,0,0,0 +SATISFY,0,2009,0,0,0,0,0 +SCRUTINIZE,2009,0,0,0,0,0,0 +SCRUTINY,2009,0,0,0,0,0,0 +SEIZED,2009,0,0,0,0,0,0 +SELDOMLY,0,0,2009,0,0,2009,0 +SERIOUS,2009,0,0,0,0,0,0 +SETBACKS,2009,0,0,0,0,0,0 +SEVERABILITY,0,0,0,2009,0,0,0 +SEVERANCES,0,0,0,2009,0,0,0 +SEVERITIES,2009,0,0,0,0,0,0 +ENTHUSIASM,0,2009,0,0,0,0,0 +ENTRENCHED,0,0,0,0,0,0,2009 +ERODING,2009,0,0,0,0,0,0 +ERRED,2009,0,0,0,0,0,0 +ERROR,2009,0,0,0,0,0,0 +ESCALATED,2009,0,0,0,0,0,0 +ESCHEATED,0,0,0,2011,0,0,0 +ESCROWING,0,0,0,2011,0,0,0 +EVADED,2009,0,0,0,0,0,0 +EVASIONS,2009,0,0,0,0,0,0 +EVICTING,2009,0,0,0,0,0,0 +EVIDENTIAL,0,0,0,2011,0,0,0 +EXACERBATES,2009,0,0,0,0,0,0 +EXAGGERATE,2009,0,0,0,0,0,0 +EXAGGERATION,2009,0,0,0,0,0,0 +EXCELLENCE,0,2009,0,0,0,0,0 +EXCEPTIONAL,0,2009,0,0,0,0,0 +EXCISED,0,0,0,2009,0,0,0 +EXCLUSIVE,0,2009,0,0,0,0,0 +EXCLUSIVITY,0,2009,0,0,0,0,0 +EXCULPATING,2009,0,0,2009,0,0,0 +EXECUTOR,0,0,0,2009,0,0,0 +EXECUTRIX,0,0,0,2009,0,0,0 +EXONERATED,2009,0,0,0,0,0,0 +EXONERATIONS,2009,0,0,0,0,0,0 +EXPLOITATIVE,2009,0,0,0,0,0,0 +EXPOSE,2009,0,0,0,0,0,0 +EXPOSURE,0,0,2009,0,0,0,0 +EXPROPRIATES,2009,0,0,0,0,0,0 +EXPULSION,2009,0,0,0,0,0,0 +EXTRACORPOREAL,0,0,0,2011,0,0,0 +SOLVENCY,2009,0,0,0,0,0,0 +SOMETIMES,0,0,2009,0,0,2009,0 +SPAMMERS,2014,0,0,0,0,0,0 +TREMENDOUS,0,2009,0,0,0,0,0 +LOCKOUT,2009,0,0,0,0,0,0 +LOSING,2009,0,0,0,0,0,0 +LOWEST,0,0,0,0,2009,0,0 +MAJEURE,0,0,0,2011,0,0,0 +MALFUNCTIONING,2009,0,0,0,0,0,0 +MALICIOUSLY,2009,0,0,0,0,0,0 +MANDATED,0,0,0,0,0,0,2009 +MANDITORILY,0,0,0,0,0,0,2011 +MANIPULATING,2009,0,0,0,0,0,0 +MARKDOWN,2009,0,0,0,0,0,0 +MEDIATE,0,0,0,2009,0,0,0 +MEDIATION,0,0,0,2009,0,0,0 +MERITORIOUS,0,2009,0,0,0,0,0 +MISAPPLIED,2009,0,0,0,0,0,0 +MISAPPROPRIATE,2009,0,0,0,0,0,0 +MISAPPROPRIATION,2009,0,0,0,0,0,0 +MISCALCULATED,2009,0,0,0,0,0,0 +MISCALCULATIONS,2009,0,0,0,0,0,0 +MISCLASSIFICATIONS,2014,0,0,0,0,0,0 +MISCONDUCT,2009,0,0,0,0,0,0 +MISDIRECTED,2009,0,0,0,0,0,0 +MISHANDLES,2009,0,0,0,0,0,0 +MISINFORMED,2009,0,0,0,0,0,0 +MISINTERPRETATION,2009,0,0,0,0,0,0 +MISINTERPRETS,2009,0,0,0,0,0,0 +MISJUDGING,2009,0,0,0,0,0,0 +MISLABELED,2009,0,0,0,0,0,0 +MISLEAD,2009,0,0,0,0,0,0 +MISLED,2009,0,0,0,0,0,0 +MISMANAGES,2009,0,0,0,0,0,0 +MISMATCHES,2009,0,0,0,0,0,0 +MISPRICING,2014,0,0,0,0,0,0 +MISREPRESENTATIONS,2009,0,0,0,0,0,0 +MISS,2009,0,0,0,0,0,0 +WORSE,2009,0,0,0,0,0,0 +WORSENS,2009,0,0,0,0,0,0 +TOLERATES,2009,0,0,0,0,0,0 +TORTIOUS,0,0,0,2009,0,0,0 +TORTUOUSLY,2009,0,0,0,0,0,0 +FINED,2009,0,0,0,0,0,0 +NONAPPEALABLE,0,0,0,2009,0,0,0 +NONCANCELABLE,0,0,0,0,0,0,2009 +NONCOMPLIANCES,2009,0,0,0,0,0,0 +NONCONFORMITIES,2009,0,0,0,0,0,0 +NONCONTRACTUAL,0,0,0,2011,0,0,0 +NONFIDUCIARY,0,0,0,2011,0,0,0 +NONFUNCTIONAL,2009,0,0,0,0,0,0 +DISCLAIMER,2009,0,0,0,0,0,0 +DISCLOSE,2009,0,0,0,0,0,0 +DISCONTINUANCE,2009,0,0,0,0,0,0 +DISCONTINUE,2009,0,0,0,0,0,0 +DISCOURAGE,2009,0,0,0,0,0,0 +DISCREDIT,2009,0,0,0,0,0,0 +DISCREPANCIES,2009,0,0,0,0,0,0 +SPECULATE,0,0,2009,0,0,0,0 +SPECULATION,0,0,2009,0,0,0,0 +TRAGIC,2009,0,0,0,0,0,0 +TRANSPARENCY,0,2009,0,0,0,0,0 +LEGISLATE,0,0,0,2009,0,0,0 +LEGISLATION,0,0,0,2009,0,0,0 +LEGISLATOR,0,0,0,2009,0,0,0 +LIBEL,0,0,0,2009,0,0,0 +LICENSABLE,0,0,0,2011,0,0,0 +CONCEALING,2009,0,0,0,0,0,0 +CONCEDING,2009,0,0,0,0,0,0 +CONCERNED,2009,0,0,0,0,0,0 +CONCILIATIONS,2009,0,0,0,0,0,0 +CONDEMNATION,2009,0,0,0,0,0,0 +CONDEMNOR,0,0,0,2011,0,0,0 +CONDONE,2009,0,0,0,0,0,0 +CONFESSED,2009,0,0,0,0,0,0 +CONFIDENT,0,2009,0,0,0,0,0 +CONFINEMENTS,2009,0,0,0,0,0,0 +CONFISCATED,2009,0,0,0,0,0,0 +CONFISCATIONS,2009,0,0,0,0,0,0 +CONFLICTING,2009,0,0,0,0,0,0 +CONFRONTATIONAL,2009,0,0,0,0,0,0 +CONFRONTS,2009,0,0,0,0,0,0 +CONFUSING,2009,0,2009,0,0,0,0 +CONSENTED,0,0,0,2009,0,0,0 +CONSPIRACIES,2009,0,0,0,0,0,0 +CONSPIRATORS,2009,0,0,0,0,0,0 +CONSPIRING,2009,0,0,0,0,0,0 +CONSTITUTIONALLY,0,0,0,2009,0,0,0 +CONSTRAINED,0,0,0,0,0,0,2009 +CONSTRAINTS,0,0,0,0,0,0,2009 +CONSTRUED,0,0,0,2012,0,0,0 +CONTEND,2009,0,0,0,0,0,0 +CONTENTION,2009,0,0,0,0,0,0 +CONTESTABILITY,0,0,0,2014,0,0,0 +CONTINGENCIES,0,0,2009,0,0,0,0 +CONTINGENTS,0,0,2009,0,0,0,0 +CONTRACTHOLDERS,0,0,0,2009,0,0,0 +CONTRACTION,2009,0,0,0,0,0,0 +CONTRACTUALLY,0,0,0,2009,0,0,0 +CONTRADICTION,2009,0,0,0,0,0,0 +CONTRARY,2009,0,0,0,0,0,0 +CONTRAVENING,0,0,0,2009,0,0,0 +CONTROVERSIES,2009,0,0,0,0,0,0 +CONTROVERTING,0,0,0,2009,0,0,0 +CONVICT,2009,0,0,2009,0,0,0 +CONVICTIONS,2009,0,0,2009,0,0,0 +CORRECTIONS,2009,0,0,0,0,0,0 +CORRUPTING,2009,0,0,0,0,0,0 +CORRUPTNESS,2009,0,0,0,0,0,0 +COUNSEL,0,0,0,2009,0,0,0 +COUNTERCLAIM,2009,0,0,0,0,0,0 +COUNTERFEIT,2009,0,0,0,0,0,0 +COUNTERFEITING,2009,0,0,0,0,0,0 +COUNTERSIGNOR,0,0,0,2011,0,0,0 +COURT,0,0,0,2009,0,0,0 +COVENANT,0,0,0,0,0,0,2011 +CREATIVE,0,2009,0,0,0,0,0 +CRIME,2009,0,0,2009,0,0,0 +CRIMINALIZE,0,0,0,2014,0,0,0 +CRISES,2009,0,0,0,0,0,0 +CRITICISM,2009,0,0,0,0,0,0 +CRITICIZES,2009,0,0,0,0,0,0 +CROSSROAD,0,0,2009,0,0,0,0 +CULPABILITY,2009,0,0,0,0,0,0 +CURTAIL,2009,0,0,0,0,0,0 +CURTAILMENTS,2009,0,0,0,0,0,0 +CUTBACKS,2009,0,0,0,0,0,0 +CYBERCRIME,2014,0,0,0,0,0,0 +TAINTING,2009,0,0,0,0,0,0 +TENDING,0,0,2009,0,0,0,0 +TERMINABLE,0,0,0,2009,0,0,0 +TERMINATING,2009,0,0,0,0,0,0 +TESTAMENTARY,0,0,0,2009,0,0,0 +THENCE,0,0,0,2009,0,0,0 +THEREAT,0,0,0,2009,0,0,0 +THEREOF,0,0,0,2009,0,0,0 +THERETOFOR,0,0,0,2011,0,0,0 +THEREUPON,0,0,0,2009,0,0,0 +THREATENED,2009,0,0,0,0,0,0 +FAILED,2009,0,0,0,0,0,0 +FAILURE,2009,0,0,0,0,0,0 +FALSELY,2009,0,0,0,0,0,0 +FALSIFIES,2009,0,0,0,0,0,0 +FANTASTIC,0,2009,0,0,0,0,0 +FAULT,2009,0,0,0,0,0,0 +FAVORABLE,0,2009,0,0,0,0,0 +FAVORITE,0,2009,0,0,0,0,0 +FELONIES,2009,0,0,2009,0,0,0 +DAMAGED,2009,0,0,0,0,0,0 +DAMPENED,2009,0,0,0,0,0,0 +DANGERS,2009,0,0,0,0,0,0 +DEADLOCKS,2009,0,0,0,0,0,0 +DEBARMENTS,2009,0,0,0,0,0,0 +DECEDENTS,0,0,0,2009,0,0,0 +DECEIVE,2009,0,0,0,0,0,0 +DECEPTION,2009,0,0,0,0,0,0 +DECLARANT,0,0,0,2011,0,0,0 +DECLINING,2009,0,0,0,0,0,0 +DECREES,0,0,0,2009,0,0,0 +DEFALCATION,0,0,0,2009,0,0,0 +DEFAMATORY,2009,0,0,0,0,0,0 +DEFAMING,2009,0,0,0,0,0,0 +DEFAULTS,2009,0,0,0,0,0,0 +DEFEASED,0,0,0,2009,0,0,0 +DEFEAT,2009,0,0,0,0,0,0 +DEFECT,2009,0,0,0,0,0,0 +DEFEND,2009,0,0,0,0,0,0 +DEFENDED,2009,0,0,0,0,0,0 +DEFER,2009,0,0,0,0,0,0 +DEFICIENT,2009,0,0,0,0,0,0 +DEFINITIVELY,0,0,0,0,2009,0,0 +DEFRAUDS,2009,0,0,0,0,0,0 +DEGRADE,2009,0,0,0,0,0,0 +DELAY,2009,0,0,0,0,0,0 +DELEGABLE,0,0,0,2009,0,0,0 +DELETERIOUS,2009,0,0,0,0,0,0 +DELIGHT,0,2009,0,0,0,0,0 +DELIGHTING,0,2009,0,0,0,0,0 +DELINQUENT,2009,0,0,0,0,0,0 +DELISTED,2009,0,0,0,0,0,0 +DEMISED,2009,0,0,0,0,0,0 +DEMOLISHED,2009,0,0,0,0,0,0 +DEMOLITIONS,2009,0,0,0,0,0,0 +DEMOTING,2009,0,0,0,0,0,0 +DEMURRER,0,0,0,2009,0,0,0 +DENIAL,2009,0,0,0,0,0,0 +DENIGRATE,2009,0,0,0,0,0,0 +DENIGRATION,2009,0,0,0,0,0,0 +DEPENDABILITY,0,2009,0,0,0,0,0 +DEPENDANT,0,0,0,0,0,0,2011 +DEPENDENCY,0,0,2009,0,0,0,0 +DEPLETE,2009,0,0,0,0,0,0 +DEPLETION,2009,0,0,0,0,0,0 +DEPOSES,0,0,0,2009,0,0,0 +DEPOSITIONS,0,0,0,2009,0,0,0 +INTRUSION,2009,0,0,0,0,0,0 +INVALIDATES,2009,0,0,0,0,0,0 +INVENT,0,2009,0,0,0,0,0 +INVENTIONS,0,2009,0,0,0,0,0 +INVENTORS,0,2009,0,0,0,0,0 +INVESTIGATING,2009,0,0,0,0,0,0 +INVOLUNTARY,2009,0,0,0,0,0,0 +IRRECOVERABLY,2009,0,0,0,0,0,0 +IRREGULARLY,2009,0,0,0,0,0,0 +IRREVOCABILITY,0,0,0,2011,0,0,0 +JEOPARDIZED,2009,0,0,0,0,0,0 +JUDICIARIES,0,0,0,2009,0,0,0 +JURISDICTION,0,0,0,2009,0,0,0 +JURISPRUDENCE,0,0,0,2009,0,0,0 +JURORS,0,0,0,2009,0,0,0 +JUSTICES,0,0,0,2009,0,0,0 +KNOWINGLY,2009,0,0,0,0,0,0 +DILIGENT,0,2009,0,0,0,0,0 +DIMINISHES,2009,0,0,0,0,0,0 +DIRECTIVES,0,0,0,0,0,0,2009 +DISADVANTAGES,2009,0,0,0,0,0,0 +DISAFFIRMED,0,0,0,2011,0,0,0 +DISAGREED,2009,0,0,0,0,0,0 +DISAGREES,2009,0,0,0,0,0,0 +DISALLOWED,2009,0,0,0,0,0,0 +DISAPPEARANCE,2009,0,0,0,0,0,0 +DISAPPEARS,2009,0,0,0,0,0,0 +DISAPPOINTINGLY,2009,0,0,0,0,0,0 +DISAPPROVAL,2009,0,0,0,0,0,0 +DISAPPROVES,2009,0,0,0,0,0,0 +DISASSOCIATION,2009,0,0,0,0,0,0 +DISASTROUS,2009,0,0,0,0,0,0 +DISAVOWED,2009,0,0,0,0,0,0 +GREAT,0,-2020,0,0,0,0,0 +GREATNESS,0,2009,0,0,0,0,0 +GROUNDLESS,2009,0,0,0,0,0,0 +HAMPER,2009,0,0,0,0,0,0 +HAPPIEST,0,2009,0,0,0,0,0 +HARASS,2009,0,0,0,0,0,0 +HARDSHIP,2009,0,0,0,0,0,0 +HARMFUL,2009,0,0,0,0,0,0 +HARSH,2009,0,0,0,0,0,0 +HARSHNESS,2009,0,0,0,0,0,0 +NONJUDICIAL,0,0,0,2009,0,0,0 +NONPAYMENTS,2009,0,0,0,0,0,0 \ No newline at end of file diff --git a/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/python-challenge/analysis.csv b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/python-challenge/analysis.csv new file mode 100644 index 000000000000..5c4a1246021e --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/python-challenge/analysis.csv @@ -0,0 +1,3877 @@ +Word,Negative,Positive,Uncertainty,Litigious,Strong_Modal,Weak_Modal,Constraining +NONSEVERABLE,0,0,0,2011,0,0,0 +DISFAVOR,2009,0,0,0,0,0,0 +DISGORGE,2009,0,0,0,0,0,0 +COMPLICATES,2009,0,0,0,0,0,0 +COMPLIMENT,0,2009,0,0,0,0,0 +COMPLIMENTS,0,2009,0,0,0,0,0 +MISSTATE,2009,0,0,0,0,0,0 +MISSTATES,2009,0,0,0,0,0,0 +MISTAKE,2009,0,0,0,0,0,0 +MISTAKING,2009,0,0,0,0,0,0 +MISUNDERSTANDING,2009,0,0,0,0,0,0 +MISUSED,2009,0,0,0,0,0,0 +MONOPOLISTS,2009,0,0,0,0,0,0 +MONOPOLIZES,2009,0,0,0,0,0,0 +MORATORIUM,2009,0,0,0,0,0,0 +MOTHBALLING,2009,0,0,0,0,0,0 +SLOW,2009,0,0,0,0,0,0 +SLOWER,2009,0,0,0,0,0,0 +SLOWNESS,2009,0,0,0,0,0,0 +SMOOTH,0,2009,0,0,0,0,0 +DEPRECATION,2009,0,0,0,0,0,0 +DEPRESSING,2009,0,0,0,0,0,0 +DEPRIVES,2009,0,0,0,0,0,0 +DEROGATE,0,0,0,2009,0,0,0 +DEROGATION,0,0,0,2009,0,0,0 +DESIRABLE,0,2009,0,0,0,0,0 +DESTABILIZATION,2009,0,0,0,0,0,0 +DESTINED,0,2009,0,0,0,0,0 +DESTROYS,2009,0,0,0,0,0,0 +DETAINED,2009,0,0,0,0,0,0 +DETER,2009,0,0,0,0,0,0 +DETERIORATING,2009,0,0,0,0,0,0 +DETERRENCE,2009,0,0,0,0,0,0 +DETERRING,2009,0,0,0,0,0,0 +DETRACTING,2009,0,0,0,0,0,0 +DETRIMENTS,2009,0,0,0,0,0,0 +DEVALUING,2009,0,0,0,0,0,0 +DEVASTATION,2009,0,0,0,0,0,0 +DEVIATING,2009,0,2009,0,0,0,0 +DEVOLVE,2009,0,0,0,0,0,0 +DICTATE,0,0,0,0,0,0,2009 +DIFFER,0,0,2009,0,0,0,0 +DIFFICULT,2009,0,0,0,0,0,0 +ASSAULT,2009,0,0,0,0,0,0 +ASSERTABLE,0,0,0,2011,0,0,0 +ASSUMABLE,0,0,0,2009,0,0,0 +ASSUMING,0,0,2009,0,0,0,0 +ASSURED,0,2009,0,0,0,0,0 +ATTAINED,0,2009,0,0,0,0,0 +ATTAINS,0,2009,0,0,0,0,0 +ATTESTED,0,0,0,2009,0,0,0 +ATTORNEYS,0,0,0,2009,0,0,0 +ATTRACTIVENESS,0,2009,0,0,0,0,0 +BAD,2009,0,0,0,0,0,0 +BAILEES,0,0,0,2011,0,0,0 +BAILOUT,2009,0,0,0,0,0,0 +BANKRUPTCIES,2009,0,0,0,0,0,0 +BANKRUPTS,2009,0,0,0,0,0,0 +CLAIM,0,0,0,2009,0,0,0 +CLAIMHOLDER,0,0,0,2014,0,0,0 +CLARIFICATIONS,0,0,2009,0,0,0,0 +CLOSED,-2020,0,0,0,0,0,0 +CLOSINGS,2009,0,0,0,0,0,0 +CODEFENDANTS,0,0,0,2011,0,0,0 +CODIFICATIONS,0,0,0,2009,0,0,0 +CODIFYING,0,0,0,2009,0,0,0 +COERCING,2009,0,0,0,0,0,0 +COLLABORATES,0,2009,0,0,0,0,0 +COLLABORATIVE,0,2009,0,0,0,0,0 +COLLAPSED,2009,0,0,0,0,0,0 +COLLISIONS,2009,0,0,0,0,0,0 +COLLUDING,2009,0,0,0,0,0,0 +POSES,2009,0,0,0,0,0,0 +POSSESSORY,0,0,0,2009,0,0,0 +POSSIBLY,0,0,2009,0,0,2009,0 +POSTJUDGMENT,0,0,0,2011,0,0,0 +POSTPONEMENTS,2009,0,0,0,0,0,0 +WRITEDOWNS,2009,0,0,0,0,0,0 +WRONG,2009,0,0,0,0,0,0 +WRONGFULLY,2009,0,0,0,0,0,0 +HONORABLE,0,-2020,0,0,0,0,0 +HOSTILE,2009,0,0,0,0,0,0 +REASSESS,0,0,2009,0,0,0,0 +REASSESSMENT,2009,0,2009,0,0,0,0 +REASSIGNING,2009,0,0,0,0,0,0 +REBOUND,0,2009,0,0,0,0,0 +REBUTS,0,0,0,2009,0,0,0 +REBUTTALS,0,0,0,2009,0,0,0 +RECALCULATED,0,0,2009,0,0,0,0 +RECALCULATIONS,0,0,2009,0,0,0,0 +RECALLS,2009,0,0,0,0,0,0 +RECESSIONS,2009,0,0,0,0,0,0 +RECONSIDER,0,0,2009,0,0,0,0 +RECORDATION,0,0,0,2009,0,0,0 +RECOURSE,0,0,0,2009,0,0,0 +RECUSAL,0,0,0,2011,0,0,0 +RECUSING,0,0,0,2011,0,0,0 +REDACTION,2009,0,0,2009,0,0,0 +REDEFAULTS,2014,0,0,0,0,0,0 +REDRESSING,2009,0,0,0,0,0,0 +REFERENDA,0,0,0,2009,0,0,0 +REFILED,0,0,0,2009,0,0,0 +REFRAINING,0,0,0,0,0,0,2009 +REFUSE,2009,0,0,0,0,0,0 +REGAIN,0,2009,0,0,0,0,0 +REGULATED,0,0,0,2009,0,0,0 +REGULATIONS,0,0,0,2009,0,0,0 +REGULATORY,0,0,0,2009,0,0,0 +REHEARINGS,0,0,0,2009,0,0,0 +VARIABILITY,0,0,2009,0,0,0,0 +VARIANCE,0,0,2009,0,0,0,0 +VARIATION,0,0,2009,0,0,0,0 +VARY,0,0,2009,0,0,0,0 +VERDICT,2009,0,0,2009,0,0,0 +VETOED,2009,0,0,0,0,0,0 +VICTIMS,2009,0,0,0,0,0,0 +VIOLATING,2009,0,0,0,0,0,0 +VIOLATOR,2009,0,0,0,0,0,0 +VIOLENTLY,2009,0,0,0,0,0,0 +VITIATING,2009,0,0,0,0,0,0 +VOIDING,2009,0,0,2009,0,0,0 +VULNERABILITIES,2009,0,0,0,0,0,0 +WARN,2009,0,0,0,0,0,0 +WARNS,2009,0,0,0,0,0,0 +WASTEFUL,2009,0,0,0,0,0,0 +WEAKENED,2009,0,0,0,0,0,0 +WEAKEST,2009,0,0,0,0,0,0 +DISHONESTLY,2009,0,0,0,0,0,0 +DISHONORABLY,2009,0,0,0,0,0,0 +DISINTERESTEDNESS,2009,0,0,0,0,0,0 +DISMAL,2009,0,0,0,0,0,0 +DISMISSALS,2009,0,0,0,0,0,0 +DISORDERLY,2009,0,0,0,0,0,0 +DISPARAGEMENTS,2009,0,0,0,0,0,0 +DISPARITIES,2009,0,0,0,0,0,0 +DISPLACEMENT,2009,0,0,0,0,0,0 +DISPOSE,2009,0,0,0,0,0,0 +DISPOSSESSES,2009,0,0,0,0,0,0 +DISPROPORTION,2009,0,0,0,0,0,0 +DISPUTE,2009,0,0,0,0,0,0 +DISQUALIFICATION,2009,0,0,0,0,0,0 +DISQUALIFY,2009,0,0,0,0,0,0 +DISREGARDING,2009,0,0,0,0,0,0 +DISRUPT,2009,0,0,0,0,0,0 +DISRUPTIONS,2009,0,0,0,0,0,0 +DISSATISFIED,2009,0,0,0,0,0,0 +DISSENTERS,2009,0,0,0,0,0,0 +DISSIDENTS,2009,0,0,0,0,0,0 +DISTINCTIONS,0,2009,0,0,0,0,0 +DISTORT,2009,0,0,0,0,0,0 +DISTORTIONS,2009,0,0,0,0,0,0 +DISTRACTING,2009,0,0,0,0,0,0 +DISTRAINT,0,0,0,2009,0,0,0 +DISTRIBUTEES,0,0,0,2009,0,0,0 +DISTURBED,2009,0,0,0,0,0,0 +DIVERT,2009,0,0,0,0,0,0 +DIVEST,2009,0,0,0,0,0,0 +DIVESTITURES,2009,0,0,0,0,0,0 +DIVORCE,2009,0,0,0,0,0,0 +DIVULGES,2009,0,0,0,0,0,0 +DOCKETING,0,0,0,2009,0,0,0 +DOUBTED,2009,0,2009,0,0,0,0 +DOWNGRADED,2009,0,0,0,0,0,0 +DOWNSIZED,2009,0,0,0,0,0,0 +DOWNTIME,2009,0,0,0,0,0,0 +DOWNWARD,2009,0,0,0,0,0,0 +DRASTICALLY,2009,0,0,0,0,0,0 +DROPPED,2009,0,0,0,0,0,0 +DURESS,2009,0,0,0,0,0,0 +EARMARK,0,0,0,0,0,0,2009 +EASIER,0,2009,0,0,0,0,0 +EFFECTIVE,0,-2020,0,0,0,0,0 +EFFICIENTLY,0,2009,0,0,0,0,0 +EMBARGO,2009,0,0,0,0,0,0 +EMBARRASS,2009,0,0,0,0,0,0 +EMBARRASSMENT,2009,0,0,0,0,0,0 +EMBEZZLEMENT,2009,0,0,0,0,0,0 +EMBEZZLING,2009,0,0,0,0,0,0 +EMPOWERS,0,2009,0,0,0,0,0 +ENABLING,0,2009,0,0,0,0,0 +ENCOURAGING,0,2009,0,0,0,0,0 +ENCROACHING,2009,0,0,0,0,0,0 +ENCUMBERED,2009,0,0,2009,0,0,2009 +ENCUMBRANCER,0,0,0,2009,0,0,0 +ENDANGERED,2009,0,0,0,0,0,0 +ENDORSEE,0,0,0,2011,0,0,0 +ENHANCE,0,2009,0,0,0,0,0 +ENHANCES,0,2009,0,0,0,0,0 +ENJOINING,2009,0,0,0,0,0,0 +ENJOYABLY,0,2009,0,0,0,0,0 +ENJOYS,0,2009,0,0,0,0,0 +ENTAILS,0,0,0,0,0,0,2009 +PATENTEE,0,0,0,2014,0,0,0 +PENALIZES,2009,0,0,0,0,0,0 +PENDING,0,0,2009,0,0,0,0 +PERFECTS,0,2009,0,0,0,0,0 +PERJURY,2009,0,0,2009,0,0,0 +PERMITTED,0,0,0,0,0,0,2009 +PERPETRATE,2009,0,0,2009,0,0,0 +PERPETRATION,2009,0,0,2009,0,0,0 +PERSISTENT,2009,0,0,0,0,0,0 +PERSONAM,0,0,0,2011,0,0,0 +PETITION,0,0,0,2009,0,0,0 +PETITIONING,0,0,0,2009,0,0,0 +PICKETED,2009,0,0,0,0,0,0 +HENCEFORTH,0,0,0,2009,0,0,0 +HEREDITAMENTS,0,0,0,2009,0,0,0 +HEREIN,0,0,0,2009,0,0,0 +HEREINBELOW,0,0,0,2009,0,0,0 +HERETOFORE,0,0,0,2009,0,0,0 +HEREWITH,0,0,0,2009,0,0,0 +HINDER,2009,0,0,0,0,0,0 +HINDRANCE,2009,0,0,0,0,0,0 +WHATSOEVER,0,0,0,2009,0,0,0 +WHEREAT,0,0,0,2009,0,0,0 +WHEREOF,0,0,0,2009,0,0,0 +WHEREUPON,0,0,0,2009,0,0,0 +WHOMSOEVER,0,0,0,2009,0,0,0 +WILLFUL,0,0,0,2009,0,0,0 +WINNER,0,2009,0,0,0,0,0 +WITNESSES,0,0,0,2009,0,0,0 +FLUCTUATES,0,0,2009,0,0,0,0 +FORBADE,0,0,0,2009,0,0,2011 +FORBEARING,0,0,0,2009,0,0,0 +FORBIDDING,2009,0,0,0,0,0,2009 +FORCING,2009,0,0,0,0,0,0 +FORECLOSE,2009,0,0,0,0,0,0 +FORECLOSURE,2009,0,0,0,0,0,0 +FOREGONE,2009,0,0,0,0,0,0 +FORESTALLS,2009,0,0,0,0,0,0 +FORFEITED,2009,0,0,0,0,0,0 +FORFEITURES,2009,0,0,0,0,0,0 +FORWHICH,0,0,0,2012,0,0,0 +FRAUDULENT,2009,0,0,0,0,0,0 +FRIVOLOUSLY,2009,0,0,0,0,0,0 +FRUSTRATING,2009,0,0,0,0,0,0 +FUGITIVE,-2020,0,0,2009,0,0,0 +GAINED,0,2009,0,0,0,0,0 +GRANTOR,0,0,0,2009,0,0,0 +DISGORGING,2009,0,0,0,0,0,0 +DISHONEST,2009,0,0,0,0,0,0 +LITIGANT,2009,0,0,2009,0,0,0 +LITIGATES,2009,0,0,2009,0,0,0 +LITIGATOR,0,0,0,2009,0,0,0 +LACKLUSTER,2009,0,0,0,0,0,0 +LAGGING,2009,0,0,0,0,0,0 +LAPSES,2009,0,0,0,0,0,0 +LAW,0,0,0,2009,0,0,0 +LAWMAKERS,0,0,0,2009,0,0,0 +LAWSUITS,0,0,0,2009,0,0,0 +LAYOFFS,2009,0,0,0,0,0,0 +LEGALESE,0,0,0,2009,0,0,0 +LEGALIZE,0,0,0,2009,0,0,0 +LEGALLY,0,0,0,2009,0,0,0 +NONPRODUCING,2009,0,0,0,0,0,0 +LIQUIDATE,2009,0,0,0,0,0,0 +LIQUIDATION,2009,0,0,0,0,0,0 +BENEFICIALLY,0,2009,0,0,0,0,0 +BENEFITED,0,2009,0,0,0,0,0 +BEST,0,2012,0,0,2009,0,0 +POPULAR,0,2009,0,0,0,0,0 +REINTERPRETED,0,0,2009,0,0,0,0 +REJECTED,2009,0,0,0,0,0,0 +REJECTS,2009,0,0,0,0,0,0 +RELINQUISHES,2009,0,0,0,0,0,0 +RELUCTANCE,2009,0,0,0,0,0,0 +REMANDING,0,0,0,2009,0,0,0 +REMEDIATING,0,0,0,2009,0,0,0 +REMISED,0,0,0,2011,0,0,0 +RENEGOTIATING,2009,0,0,0,0,0,0 +RENOUNCED,2009,0,0,0,0,0,0 +RENOUNCING,2009,0,0,0,0,0,0 +REPLEVIN,0,0,0,2009,0,0,0 +REPOSSESSION,2009,0,0,0,0,0,0 +TURBULENCE,2009,0,2009,0,0,0,0 +UNACCEPTABLY,2009,0,0,0,0,0,0 +UNANTICIPATED,2009,0,0,0,0,0,0 +UNATTRACTIVE,2009,0,0,0,0,0,0 +UNAVOIDABLE,2009,0,0,0,0,0,0 +UNCERTAINLY,0,0,2009,0,0,2009,0 +UNCOLLECTABLE,2009,0,0,0,0,0,0 +UNCOLLECTIBLES,2009,0,0,0,0,0,0 +UNCONFIRMED,0,0,2009,0,0,0,0 +UNCONSTITUTIONALITY,0,0,0,2009,0,0,0 +UNCONTROLLABLY,2009,0,0,0,0,0,0 +UNCOVERED,2009,0,0,0,0,0,0 +UNDEFEASED,0,0,0,2012,0,0,0 +UNDERCAPITALIZED,2009,0,0,0,0,0,0 +UNDERESTIMATE,2009,0,0,0,0,0,0 +UNDERESTIMATION,2009,0,0,0,0,0,0 +UNDERMINED,2009,0,0,0,0,0,0 +UNDERPAYMENT,2009,0,0,0,0,0,0 +UNDERPERFORMANCE,2009,0,0,0,0,0,0 +UNDERPRODUCED,2009,0,0,0,0,0,0 +UNDERSTATED,2009,0,0,0,0,0,0 +UNDERSTATING,2009,0,0,0,0,0,0 +UNDESIRABLE,2009,0,0,0,0,0,0 +UNDETERMINABLE,0,0,2009,0,0,0,0 +UNDISPUTED,0,0,0,0,2009,0,0 +UNDULY,2009,0,0,0,0,0,0 +UNEMPLOYED,2009,0,0,0,0,0,0 +UNENFORCEABILITY,0,0,0,2009,0,0,0 +UNETHICAL,2009,0,0,0,0,0,0 +UNEXPECTEDLY,2009,0,2009,0,0,0,0 +UNFAMILIARITY,0,0,2009,0,0,0,0 +UNFAVOURABLE,2011,0,0,0,0,0,0 +UNFORECASTED,0,0,2011,0,0,0,0 +UNFORTUNATE,2009,0,0,0,0,0,0 +UNFULFILLED,2009,0,0,0,0,0,0 +UNIDENTIFIABLE,0,0,2009,0,0,0,0 +UNINTENTIONAL,2009,0,0,0,0,0,0 +UNJUSTIFIABLY,2009,0,0,0,0,0,0 +UNKNOWINGLY,2009,0,0,0,0,0,0 +UNLAWFULLY,2009,0,0,2009,0,0,0 +UNMARKETABLE,2009,0,0,0,0,0,0 +UNNECESSARILY,2009,0,0,0,0,0,0 +UNOBTAINABLE,2009,0,0,0,0,0,0 +UNPERFORMED,2009,0,0,0,0,0,0 +UNPREDICTABLE,2009,0,2009,0,0,0,0 +UNPROFITABILITY,2011,0,0,0,0,0,0 +UNQUALIFIED,2009,0,0,0,0,0,0 +UNREASONABLE,2009,0,0,0,0,0,0 +UNRECONCILED,0,0,2011,0,0,0,0 +UNRELIABLE,2009,0,0,0,0,0,0 +UNRESOLVED,2009,0,0,0,0,0,0 +UNSALEABLE,2009,0,0,0,0,0,0 +UNSCHEDULED,2009,0,0,0,0,0,0 +UNSETTLED,0,0,2009,0,0,0,0 +UNSPECIFIED,0,0,2009,0,0,0,0 +UNSUBSTANTIATED,2009,0,0,0,0,0,0 +UNSUITABLE,2009,0,0,0,0,0,0 +UNSURPASSED,0,2009,0,0,2009,0,0 +UNTENABLE,2009,0,0,0,0,0,0 +UNTRUSTED,2014,0,0,0,0,0,0 +UNTRUTHFULNESS,2009,0,0,0,0,0,0 +UNUSUALLY,0,0,2009,0,0,0,0 +UNWILLING,2009,0,0,0,0,0,0 +UPTURN,0,2009,0,0,0,0,0 +USURIOUS,2009,0,0,2009,0,0,0 +USURPING,2009,0,0,2009,0,0,0 +VAGUE,0,0,2012,0,0,0,0 +VAGUER,0,0,2012,0,0,0,0 +PLAINTIFFS,2009,0,0,2009,0,0,0 +PLEADING,2009,0,0,2009,0,0,0 +PLEASANT,0,2009,0,0,0,0,0 +PLED,2009,0,0,0,0,0,0 +PLEDGEES,0,0,0,2011,0,0,0 +PLEDGORS,0,0,0,2012,0,0,0 +COMPELLING,0,0,0,0,0,0,2011 +COMPLAINANT,0,0,0,2009,0,0,0 +COMPLAINS,2009,0,0,0,0,0,0 +COMMITS,0,0,0,0,0,0,2009 +LIKELIHOOD,0,0,2009,0,0,0,0 +LIMITING,0,0,0,0,0,0,2009 +RESTRAIN,0,0,0,0,0,0,2009 +RESTRAINT,0,0,0,0,0,0,2009 +RESTRICTING,0,0,0,0,0,0,2009 +RESTRICTIVELY,0,0,0,0,0,0,2009 +RESTRUCTURED,2009,0,0,0,0,0,0 +RETALIATE,2009,0,0,0,0,0,0 +RETALIATION,2009,0,0,0,0,0,0 +PRECAUTION,0,0,2009,0,0,0,0 +PRECIPITOUS,2009,0,0,0,0,0,0 +PRECLUDES,2009,0,0,0,0,0,2009 +PREDATORY,2009,0,0,0,0,0,0 +PREDECEASING,0,0,0,2009,0,0,0 +PREDICTING,0,0,2009,0,0,0,0 +PREDICTOR,0,0,2009,0,0,0,0 +PREEMINENT,0,2009,0,0,0,0,0 +PREJUDICES,2009,0,0,2009,0,0,0 +PRELIMINARY,0,0,2009,0,0,0,0 +PREMIERE,0,2009,0,0,0,0,0 +PRESTIGE,0,2009,0,0,0,0,0 +PRESUMED,0,0,2009,0,0,0,0 +PRESUMPTIONS,0,0,2009,0,0,0,0 +PREVENTED,0,0,0,0,0,0,2009 +PRIMA,0,0,0,2009,0,0,0 +PROBABILISTIC,0,0,2009,0,0,0,0 +PROBABLY,0,0,2009,0,0,0,0 +PROBATING,0,0,0,2009,0,0,0 +PROBATIONER,0,0,0,2009,0,0,0 +PROBLEMATIC,2009,0,0,0,0,0,0 +PROFICIENT,0,2009,0,0,0,0,0 +PROFITABLY,0,2009,0,0,0,0,0 +PROGRESSING,0,2009,0,0,0,0,0 +PROHIBITION,0,0,0,0,0,0,2009 +PROHIBITORY,0,0,0,0,0,0,2009 +PROLONGATIONS,2009,0,0,0,0,0,0 +PROMULGATE,0,0,0,2009,0,0,0 +PROMULGATION,0,0,0,2009,0,0,0 +PRONE,2009,0,0,0,0,0,0 +PROSECUTED,2009,0,0,2009,0,0,0 +PROSECUTIONS,2009,0,0,2009,0,0,0 +PROSPERED,0,2009,0,0,0,0,0 +PROSPERS,0,2009,0,0,0,0,0 +PROTESTERS,2009,0,0,0,0,0,0 +PROTESTS,2009,0,0,0,0,0,0 +PROVISOES,0,0,0,2009,0,0,0 +PROVOKES,2009,0,0,0,0,0,0 +PUNISHES,2009,0,0,0,0,0,0 +PUNITIVE,2009,0,0,0,0,0,0 +PURPORTING,2009,0,0,0,0,0,0 +QUESTIONABLY,2009,0,0,0,0,0,0 +QUIT,2009,0,0,0,0,0,0 +RACKETEER,2009,0,0,0,0,0,0 +RANDOMIZED,0,0,2009,0,0,0,0 +RANDOMNESS,0,0,2009,0,0,0,0 +RATIONALIZATION,2009,0,0,0,0,0,0 +RATIONALIZES,2009,0,0,0,0,0,0 +ABANDONMENT,2009,0,0,0,0,0,0 +ABDICATES,2009,0,0,0,0,0,0 +ABERRANT,2009,0,0,0,0,0,0 +ABETTING,2009,0,0,0,0,0,0 +ABIDING,0,0,0,0,0,0,2009 +ABNORMALITY,2009,0,0,0,0,0,0 +ABOLISHES,2009,0,0,0,0,0,0 +ABROGATED,2009,0,0,2009,0,0,0 +ABROGATIONS,2009,0,0,2009,0,0,0 +ABSENCE,2009,0,0,0,0,0,0 +ABSOLVED,0,0,0,2009,0,0,0 +ABUNDANT,0,2009,0,0,0,0,0 +ABUSING,2009,0,0,0,0,0,0 +ACCESSION,0,0,0,2009,0,0,0 +ACCIDENTALLY,2009,0,0,0,0,0,0 +ACCOMPLISHED,0,2009,0,0,0,0,0 +ACCOMPLISHMENTS,0,2009,0,0,0,0,0 +ACCUSED,2009,0,0,0,0,0,0 +ACHIEVED,0,2009,0,0,0,0,0 +ACHIEVING,0,2009,0,0,0,0,0 +ACQUIESCING,2009,0,0,0,0,0,0 +ACQUITS,2009,0,0,2009,0,0,0 +ACQUITTANCES,0,0,0,2011,0,0,0 +ADEQUATELY,0,2009,0,0,0,0,0 +ADJOURNMENT,0,0,0,2009,0,0,0 +ADJUDGED,0,0,0,2009,0,0,0 +ADJUDICATED,0,0,0,2009,0,0,0 +ADJUDICATIONS,0,0,0,2009,0,0,0 +ADJUDICATORY,0,0,0,2009,0,0,0 +ADMISSION,0,0,0,2009,0,0,0 +ADULTERATING,2009,0,0,0,0,0,0 +ADVANCEMENTS,0,2009,0,0,0,0,0 +ADVANTAGED,0,2009,0,0,0,0,0 +ADVERSARIAL,2009,0,0,0,0,0,0 +ADVERSELY,2009,0,0,0,0,0,0 +AFFIDAVITS,0,0,0,2009,0,0,0 +AFOREMENTIONED,0,0,0,2009,0,0,0 +AFTERMATHS,2009,0,0,0,0,0,0 +AGGRAVATES,2009,0,0,0,0,0,0 +AGGRIEVED,0,0,0,2009,0,0,0 +ALIENATED,2009,0,0,0,0,0,0 +ALIENATIONS,2009,0,0,0,0,0,0 +ALLEGED,2009,0,0,2009,0,0,0 +ALLIANCE,0,2009,0,0,0,0,0 +ALTERATIONS,0,0,2009,0,0,0,0 +AMBIGUOUS,0,0,2009,0,0,0,0 +AMENDED,0,0,0,2009,0,0,0 +AMENDS,0,0,0,2009,0,0,0 +ANNOYED,2009,0,0,0,0,0,0 +ANNULLED,2009,0,0,0,0,0,0 +ANNULS,2009,0,0,0,0,0,0 +ANOMALY,2009,0,2009,0,0,0,0 +ANTICIPATED,0,0,2009,0,0,0,0 +ANTICIPATIONS,0,0,2009,0,0,0,0 +ANYWISE,0,0,0,2009,0,0,0 +APPEALABLE,0,0,0,2009,0,0,0 +APPEAR,0,0,2009,0,0,0,0 +APPELLANT,0,0,0,2009,0,0,0 +APPOINTOR,0,0,0,2011,0,0,0 +APPROXIMATES,0,0,2009,0,0,0,0 +APPURTENANCE,0,0,0,2009,0,0,0 +ARBITRAL,0,0,0,2009,0,0,0 +ARBITRATE,0,0,0,2009,0,0,0 +ARBITRATION,0,0,0,2009,0,0,0 +ARBITRATOR,0,0,0,2009,0,0,0 +ARGUING,2009,0,0,0,0,0,0 +ARREARAGE,2009,0,0,2009,0,0,0 +ARRESTED,2009,0,0,0,0,0,0 +RETROCEDE,0,0,0,2011,0,0,0 +BOLSTERED,0,2009,0,0,0,0,0 +BONAFIDE,0,0,0,2009,0,0,0 +BOOSTED,0,2009,0,0,0,0,0 +BOUNDED,0,0,0,0,0,0,2009 +BOYCOTTS,2009,0,0,0,0,0,0 +BREACHING,2009,0,0,2009,0,0,0 +BREAKDOWN,2009,0,0,0,0,0,0 +BREAKTHROUGH,0,2009,0,0,0,0,0 +BRIBERIES,2009,0,0,0,0,0,0 +BRIDGE,-2020,0,0,0,0,0,0 +BURDENED,2009,0,0,0,0,0,0 +BURNED,2009,0,0,0,0,0,0 +CANCEL,2009,0,0,0,0,0,0 +CANCELLATIONS,2009,0,0,0,0,0,0 +CARELESS,2009,0,0,0,0,0,0 +CATASTROPHE,2009,0,0,0,0,0,0 +CAUTION,2009,0,0,0,0,0,0 +CAUTIONS,2009,0,0,0,0,0,0 +CEASE,2009,0,0,0,0,0,0 +CEDANT,0,0,0,2012,0,0,0 +CENSURES,2009,0,0,0,0,0,0 +CHALLENGE,2009,0,0,0,0,0,0 +CHARGEOFFS,2009,0,0,0,0,0,0 +CHOATE,0,0,0,2011,0,0,0 +CIRCUMVENTION,2009,0,0,0,0,0,0 +SHOCKED,2009,0,0,0,0,0,0 +SHORTFALLS,2009,0,0,0,0,0,0 +SHUTDOWN,2009,0,0,0,0,0,0 +SLANDER,2009,0,0,0,0,0,0 +REPUDIATED,2009,0,0,0,0,0,0 +REPUDIATIONS,2009,0,0,0,0,0,0 +REQUIRED,0,0,0,0,0,0,2009 +REQUIRING,0,0,0,0,0,0,2009 +RESCINDING,0,0,0,2009,0,0,0 +RESIGN,2009,0,0,0,0,0,0 +RESIGNING,2009,0,0,0,0,0,0 +RESTATED,2009,0,0,0,0,0,0 +RESTATING,2009,0,0,0,0,0,0 +NONUSURIOUS,0,0,0,2011,0,0,0 +NOTARIZATIONS,0,0,0,2009,0,0,0 +NOTARY,0,0,0,2009,0,0,0 +NUISANCES,2009,0,0,0,0,0,0 +NULLIFIES,2009,0,0,2009,0,0,0 +NULLITY,0,0,0,2009,0,0,0 +OBJECTIONABLE,2009,0,0,0,0,0,0 +OBLIGATED,0,0,0,0,0,0,2009 +OBLIGATIONS,0,0,0,0,0,0,2009 +OBLIGEE,0,0,0,2009,0,0,0 +OBLIGORS,0,0,0,2009,0,0,0 +OBSOLETE,2009,0,0,0,0,0,0 +OBSTRUCTED,2009,0,0,0,0,0,0 +OCCASIONALLY,0,0,2009,0,0,2009,0 +OFFENDED,2009,0,0,0,0,0,0 +OFFENDS,2009,0,0,0,0,0,0 +OFFEROR,0,0,0,2009,0,0,0 +OMIT,2009,0,0,0,0,0,0 +ONEROUS,2009,0,0,0,0,0,0 +OPPORTUNITY,0,2009,0,0,0,0,0 +OPPOSING,2009,0,0,0,0,0,0 +OPTIONEE,0,0,0,2009,0,0,0 +OUTAGES,2009,0,0,0,0,0,0 +OUTPERFORMED,0,2009,0,0,0,0,0 +OVERAGES,2009,0,0,0,0,0,0 +OVERBUILT,2009,0,0,0,0,0,0 +OVERCAPACITIES,2009,0,0,0,0,0,0 +OVERCHARGES,2009,0,0,0,0,0,0 +OVERCOMING,2009,0,0,0,0,0,0 +OVERESTIMATES,2009,0,0,0,0,0,0 +OVERLOAD,2009,0,0,0,0,0,0 +OVERLOOK,2009,0,0,0,0,0,0 +OVERPAID,2009,0,0,0,0,0,0 +OVERPRODUCES,2009,0,0,0,0,0,0 +OVERRULED,0,0,0,2009,0,0,0 +OVERRUNNING,2009,0,0,0,0,0,0 +OVERSHADOWING,2009,0,0,0,0,0,0 +OVERSTATEMENT,2009,0,0,0,0,0,0 +OVERSUPPLIED,2009,0,0,0,0,0,0 +OVERTLY,2009,0,0,0,0,0,0 +OVERTURNS,2009,0,0,0,0,0,0 +PANIC,2009,0,0,0,0,0,0 +NEARLY,0,0,2009,0,0,2009,0 +NECESSITATING,0,0,0,0,0,0,2009 +NEGLECT,2009,0,0,0,0,0,0 +NEGLECTS,2009,0,0,0,0,0,0 +NEGLIGENTLY,2009,0,0,0,0,0,0 +BARRIER,2009,0,0,0,0,0,0 +BELIEVE,0,0,2009,0,0,0,0 +IDLED,2009,0,0,0,0,0,0 +IGNORES,2009,0,0,0,0,0,0 +ILLEGALITIES,2009,0,0,0,0,0,0 +ILLICIT,2009,0,0,0,0,0,0 +IMBALANCE,2009,0,0,0,0,0,0 +IMMORAL,2009,0,0,0,0,0,0 +IMPAIRMENT,2009,0,0,0,0,0,2011 +IMPASSES,2009,0,0,0,0,0,0 +IMPEDIMENT,2009,0,0,0,0,0,0 +IMPERATIVE,2009,0,0,0,0,0,0 +IMPERMISSIBLE,2009,0,0,0,0,0,0 +IMPLICATES,2009,0,0,0,0,0,0 +IMPOSES,0,0,0,0,0,0,2009 +IMPOSSIBILITY,2009,0,0,0,0,0,0 +IMPOUNDING,2009,0,0,0,0,0,0 +IMPRACTICALITIES,2009,0,0,0,0,0,0 +IMPRECISIONS,0,0,2009,0,0,0,0 +IMPRESSING,0,2009,0,0,0,0,0 +IMPROBABILITY,0,0,2009,0,0,0,0 +IMPROPRIETIES,2009,0,0,0,0,0,0 +IMPROVEMENT,0,2009,0,0,0,0,0 +IMPRUDENT,2009,0,0,0,0,0,0 +INACCURACIES,2009,0,0,0,0,0,0 +INACTION,2009,0,0,0,0,0,0 +INACTIVATES,2009,0,0,0,0,0,0 +INACTIVITY,2009,0,0,0,0,0,0 +INADEQUATELY,2009,0,0,0,0,0,0 +INADVISABLE,2009,0,0,0,0,0,0 +INATTENTION,2009,0,0,0,0,0,0 +INCARCERATE,2009,0,0,2009,0,0,0 +INCARCERATION,2009,0,0,2009,0,0,0 +INCIDENCES,2009,0,0,0,0,0,0 +INCOMPATIBILITY,2009,0,0,0,0,0,0 +INCOMPETENT,2009,0,0,0,0,0,0 +INCOMPLETELY,2009,0,0,0,0,0,0 +INCONSISTENCY,2009,0,0,0,0,0,0 +INCONTESTABLE,0,0,0,2009,0,0,0 +INCORRECT,2009,0,0,0,0,0,0 +INCREDIBLY,0,2009,0,0,0,0,0 +INDEFEASIBLE,2009,0,0,0,0,0,0 +INDEFINITENESS,0,0,2009,0,0,0,0 +INDEMNIFIED,0,0,0,2009,0,0,0 +INDEMNITEE,0,0,0,2009,0,0,0 +INDEMNITORS,0,0,0,2009,0,0,0 +INDICT,2009,0,0,2009,0,0,0 +INDICTMENT,2009,0,0,2009,0,0,0 +INEFFECTIVELY,2009,0,0,0,0,0,0 +INEFFICIENT,2009,0,0,0,0,0,0 +INEQUITABLE,2009,0,0,0,0,0,0 +INEVITABLE,2009,0,0,0,0,0,0 +INEXPERIENCED,2009,0,0,0,0,0,0 +INFORCE,0,0,0,2009,0,0,0 +INFRINGE,2009,0,0,0,0,0,0 +INFRINGER,0,0,0,2009,0,0,0 +INHIBIT,0,0,0,0,0,0,2011 +INIMICAL,2009,0,0,0,0,0,0 +INJURE,2009,0,0,0,0,0,0 +INJURING,2009,0,0,0,0,0,0 +INNOVATED,0,2009,0,0,0,0,0 +INNOVATIONS,0,2009,0,0,0,0,0 +INNOVATORS,0,2009,0,0,0,0,0 +INSECURE,2009,0,0,0,0,0,0 +INSISTED,0,0,0,0,0,0,2009 +INSOFAR,0,0,0,2009,0,0,0 +INSPIRATION,0,2009,0,0,0,0,0 +INSUBORDINATION,2009,0,0,0,0,0,0 +INSURRECTION,2009,0,0,0,0,0,0 +INTEGRITY,0,2009,0,0,0,0,0 +INTERFERENCE,2009,0,0,0,0,0,0 +INTERLOCUTORY,0,0,0,2009,0,0,0 +INTERPOSE,0,0,0,2009,0,0,0 +INTERPOSITION,0,0,0,2009,0,0,0 +INTERROGATES,0,0,0,2009,0,0,0 +INTERROGATOR,0,0,0,2009,0,0,0 +INTERRUPT,2009,0,0,0,0,0,0 +INTERRUPTIONS,2009,0,0,0,0,0,0 +INTIMIDATION,2009,0,0,0,0,0,0 +SPORADICALLY,0,0,2009,0,0,0,0 +STABILIZE,0,2009,0,0,0,0,0 +STABLE,0,2009,0,0,0,0,0 +STAGNATED,2009,0,0,0,0,0,0 +STANDSTILL,2009,0,0,0,0,0,0 +STATUTORILY,0,0,0,2009,0,0,0 +STIPULATES,0,0,0,0,0,0,2009 +STOLEN,2009,0,0,0,0,0,0 +STOPPING,2009,0,0,0,0,0,0 +STRAINING,2009,0,0,0,0,0,0 +STRENGTHENED,0,2009,0,0,0,0,0 +STRESS,2009,0,0,0,0,0,0 +STRESSING,2009,0,0,0,0,0,0 +STRICTLY,0,0,0,0,0,0,2009 +STRONGEST,0,2009,0,0,0,0,0 +SUBDOCKET,0,0,0,2012,0,0,0 +SUBLEASEE,0,0,0,2011,0,0,0 +SUBLICENSOR,0,0,0,2011,0,0,0 +SUBPOENAED,2009,0,0,2009,0,0,0 +SUBSTANDARD,2009,0,0,0,0,0,0 +SUCCEEDED,0,2009,0,0,0,0,0 +SUCCESSES,0,2009,0,0,0,0,0 +SUDDENLY,0,0,2009,0,0,0,0 +SUFFER,2009,0,0,0,0,0,0 +SUGGEST,0,0,2009,0,0,2009,0 +SUING,2009,0,0,2009,0,0,0 +SUMMONSES,2009,0,0,2009,0,0,0 +SUPERSEDED,0,0,0,2009,0,0,0 +SURETY,0,0,0,2009,0,0,0 +SURPASSING,0,2009,0,0,0,0,0 +SUSPECTED,2009,0,0,0,0,0,0 +SUSPENDING,2009,0,0,0,0,0,0 +SUSPICION,2009,0,0,0,0,0,0 +REVISED,0,0,2009,0,0,0,0 +REVOKE,2009,0,0,0,0,0,0 +REVOLUTIONIZE,0,2009,0,0,0,0,0 +REWARD,0,2009,0,0,0,0,0 +RIDICULE,2009,0,0,0,0,0,0 +RISK,0,0,2009,0,0,0,0 +RISKINESS,0,0,2009,0,0,0,0 +ROUGHLY,0,0,2009,0,0,0,0 +SABOTAGE,2009,0,0,0,0,0,0 +SACRIFICIAL,2009,0,0,0,0,0,0 +SATISFACTORY,0,2009,0,0,0,0,0 +SATISFYING,0,2009,0,0,0,0,0 +SCRUTINIZED,2009,0,0,0,0,0,0 +SECRECY,-2020,0,0,0,0,0,0 +SEIZES,2009,0,0,0,0,0,0 +SENTENCED,2009,0,0,2009,0,0,0 +SERIOUSLY,2009,0,0,0,0,0,0 +SETTLEMENT,0,0,0,2009,0,0,0 +SEVERABLE,0,0,0,2009,0,0,0 +SEVERE,2009,0,0,0,0,0,0 +SEVERITY,2009,0,0,0,0,0,0 +ENTHUSIASTIC,0,2009,0,0,0,0,0 +ERODE,2009,0,0,0,0,0,0 +EROSION,2009,0,0,0,0,0,0 +ERRING,2009,0,0,0,0,0,0 +ERRORS,2009,0,0,0,0,0,0 +ESCALATES,2009,0,0,0,0,0,0 +ESCHEATMENT,0,0,0,2011,0,0,0 +ESCROWS,0,0,0,0,0,0,2009 +EVADES,2009,0,0,0,0,0,0 +EVASIVE,2009,0,0,0,0,0,0 +EVICTION,2009,0,0,0,0,0,0 +EVIDENTIARY,0,0,0,2009,0,0,0 +EXACERBATING,2009,0,0,0,0,0,0 +EXAGGERATED,2009,0,0,0,0,0,0 +EXCEEDANCE,0,0,0,2011,0,0,0 +EXCELLENT,0,2009,0,0,0,0,0 +EXCEPTIONALLY,0,2009,0,0,0,0,0 +EXCITED,0,2009,0,0,0,0,0 +EXCLUSIVELY,0,2009,0,0,0,0,0 +EXCULPATE,2009,0,0,2009,0,0,0 +EXCULPATION,2009,0,0,2009,0,0,0 +EXECUTORS,0,0,0,2009,0,0,0 +EXECUTRIXES,0,0,0,2009,0,0,0 +EXONERATES,2009,0,0,0,0,0,0 +EXPLOIT,2009,0,0,0,0,0,0 +EXPLOITED,2009,0,0,0,0,0,0 +EXPOSED,2009,0,0,0,0,0,0 +EXPOSURES,0,0,2009,0,0,0,0 +EXPROPRIATING,2009,0,0,0,0,0,0 +EXPULSIONS,2009,0,0,0,0,0,0 +EXTRAJUDICIAL,0,0,0,2014,0,0,0 +SOLVES,0,2009,0,0,0,0,0 +SOMEWHAT,0,0,2009,0,0,2009,0 +SPAMMING,2014,0,0,0,0,0,0 +TREMENDOUSLY,0,2009,0,0,0,0,0 +LOCKOUTS,2009,0,0,0,0,0,0 +LOSS,2009,0,0,0,0,0,0 +LOYAL,0,2009,0,0,0,0,0 +MALFEASANCE,2009,0,0,0,0,0,0 +MALFUNCTIONS,2009,0,0,0,0,0,0 +MALPRACTICE,2009,0,0,0,0,0,0 +MANDATES,0,0,0,0,0,0,2009 +MANIPULATE,2009,0,0,0,0,0,0 +MANIPULATION,2009,0,0,0,0,0,0 +MARKDOWNS,2009,0,0,0,0,0,0 +MEDIATED,0,0,0,2009,0,0,0 +MEDIATIONS,0,0,0,2009,0,0,0 +MIGHT,0,0,2009,0,0,2009,0 +MISAPPLIES,2009,0,0,0,0,0,0 +MISAPPROPRIATED,2009,0,0,0,0,0,0 +MISAPPROPRIATIONS,2009,0,0,0,0,0,0 +MISCALCULATES,2009,0,0,0,0,0,0 +MISCHARACTERIZATION,2014,0,0,0,0,0,0 +MISCLASSIFIED,2011,0,0,0,0,0,0 +MISDATED,2011,0,0,0,0,0,0 +MISFEASANCE,0,0,0,2009,0,0,0 +MISHANDLING,2009,0,0,0,0,0,0 +MISINFORMING,2009,0,0,0,0,0,0 +MISINTERPRETATIONS,2009,0,0,0,0,0,0 +MISJUDGE,2009,0,0,0,0,0,0 +MISJUDGMENT,2009,0,0,0,0,0,0 +MISLABELING,2009,0,0,0,0,0,0 +MISLEADING,2009,0,0,0,0,0,0 +MISMANAGE,2009,0,0,0,0,0,0 +MISMANAGING,2009,0,0,0,0,0,0 +MISMATCHING,2009,0,0,0,0,0,0 +MISPRICINGS,2014,0,0,0,0,0,0 +MISREPRESENTED,2009,0,0,0,0,0,0 +MISSED,2009,0,0,0,0,0,0 +WORRIES,2009,0,0,0,0,0,0 +WORSEN,2009,0,0,0,0,0,0 +WORST,2009,0,0,0,0,0,0 +TIGHTENING,2009,0,0,0,0,0,0 +TOLERATING,2009,0,0,0,0,0,0 +TORTIOUSLY,0,0,0,2009,0,0,0 +FINES,2009,0,0,0,0,0,0 +NONASSESSABLE,0,0,2009,0,0,0,0 +NONCANCELLABLE,0,0,0,0,0,0,2009 +NONCOMPLIANT,2009,0,0,0,0,0,0 +NONCONFORMITY,2009,0,0,0,0,0,0 +NONCONTRIBUTORY,0,0,0,2009,0,0,0 +NONFORFEITABILITY,0,0,0,2011,0,0,0 +NONGUARANTOR,0,0,0,2011,0,0,0 +DISCIPLINARY,2009,0,0,0,0,0,0 +DISCLAIMERS,2009,0,0,0,0,0,0 +DISCLOSED,2009,0,0,0,0,0,0 +DISCONTINUANCES,2009,0,0,0,0,0,0 +DISCONTINUED,2009,0,0,0,0,0,0 +DISCOURAGED,2009,0,0,0,0,0,0 +DISCREDITED,2009,0,0,0,0,0,0 +DISCREPANCY,2009,0,0,0,0,0,0 +SPECULATED,0,0,2009,0,0,0,0 +SPECULATIONS,0,0,2009,0,0,0,0 +TRAGICALLY,2009,0,0,0,0,0,0 +LEGISLATED,0,0,0,2009,0,0,0 +LEGISLATIONS,0,0,0,2009,0,0,0 +LEGISLATORS,0,0,0,2009,0,0,0 +LIBELED,0,0,0,2009,0,0,0 +LIE,2009,0,0,0,0,0,0 +COMPULSION,2009,0,0,0,0,0,2009 +CONCEDE,2009,0,0,0,0,0,0 +CONCEIVABLE,0,0,2009,0,0,2009,0 +CONCERNS,2009,0,0,0,0,0,0 +CONCLUSIVE,0,2009,0,0,0,0,0 +CONDEMNATIONS,2009,0,0,0,0,0,0 +CONDEMNS,2009,0,0,0,0,0,0 +CONDONED,2009,0,0,0,0,0,0 +CONFESSES,2009,0,0,0,0,0,0 +CONFINE,2009,0,0,0,0,0,2009 +CONFINES,2009,0,0,0,0,0,2009 +CONFISCATES,2009,0,0,0,0,0,0 +CONFISCATORY,0,0,0,2009,0,0,0 +CONFLICTS,2009,0,0,0,0,0,0 +CONFRONTATIONS,2009,0,0,0,0,0,0 +CONFUSE,2009,0,0,0,0,0,0 +CONFUSINGLY,2009,0,2009,0,0,0,0 +CONSENTING,0,0,0,2009,0,0,0 +CONSPIRACY,2009,0,0,0,0,0,0 +CONSPIRE,2009,0,0,0,0,0,0 +CONSTITUTION,0,0,0,2009,0,0,0 +CONSTITUTIONS,0,0,0,2009,0,0,0 +CONSTRAINING,0,0,0,0,0,0,2009 +CONSTRUCTIVE,0,2009,0,0,0,0,0 +CONSTRUES,0,0,0,2012,0,0,0 +CONTENDED,2009,0,0,0,0,0,0 +CONTENTIONS,2009,0,0,0,0,0,0 +CONTESTATION,0,0,0,2011,0,0,0 +CONTINGENCY,0,0,2009,0,0,0,0 +CONTRACT,0,0,0,2009,0,0,0 +CONTRACTIBLE,0,0,0,2009,0,0,0 +CONTRACTIONS,2009,0,0,0,0,0,0 +CONTRADICT,2009,0,0,0,0,0,0 +CONTRADICTIONS,2009,0,0,0,0,0,0 +CONTRAVENE,0,0,0,2009,0,0,0 +CONTRAVENTION,0,0,0,2009,0,0,0 +CONTROVERSY,2009,0,0,0,0,0,0 +CONVENIENS,0,0,0,2012,0,0,0 +CONVICTED,2009,0,0,2009,0,0,0 +CORRECTED,2009,0,0,0,0,0,0 +CORRECTS,2009,0,0,0,0,0,0 +CORRUPTION,2009,0,0,0,0,0,0 +COSTLY,2009,0,0,0,0,0,0 +COUNSELED,0,0,0,2009,0,0,0 +COUNTERCLAIMED,2009,0,0,0,0,0,0 +COUNTERFEITED,2009,0,0,0,0,0,0 +COUNTERFEITS,2009,0,0,0,0,0,0 +COUNTERSUED,0,0,0,2011,0,0,0 +COURTEOUS,0,2009,0,0,0,0,0 +COVENANTED,0,0,0,0,0,0,2011 +CREATIVELY,0,2009,0,0,0,0,0 +CRIMES,2009,0,0,2009,0,0,0 +CRIMINALIZING,0,0,0,2014,0,0,0 +CRISIS,2009,0,0,0,0,0,0 +CRITICISMS,2009,0,0,0,0,0,0 +CRITICIZING,2009,0,0,0,0,0,0 +CROSSROADS,0,0,2009,0,0,0,0 +CULPABLE,2009,0,0,0,0,0,0 +CURTAILED,2009,0,0,0,0,0,0 +CURTAILS,2009,0,0,0,0,0,0 +CYBERATTACK,2014,0,0,0,0,0,0 +CYBERCRIMES,2014,0,0,0,0,0,0 +TAINTS,2009,0,0,0,0,0,0 +TENSE,2009,0,0,0,0,0,0 +TERMINATE,2009,0,0,0,0,0,0 +TERMINATION,2009,0,0,0,0,0,0 +TESTIFY,2009,0,0,2009,0,0,0 +THENCEFORTH,0,0,0,2009,0,0,0 +THEREFROM,0,0,0,2009,0,0,0 +THEREON,0,0,0,2009,0,0,0 +THERETOFORE,0,0,0,2009,0,0,0 +THEREWITH,0,0,0,2009,0,0,0 +THREATENING,2009,0,0,0,0,0,0 +FACIE,0,0,0,2009,0,0,0 +FAILING,2009,0,0,0,0,0,0 +FAILURES,2009,0,0,0,0,0,0 +FALSIFICATION,2009,0,0,0,0,0,0 +FALSIFY,2009,0,0,0,0,0,0 +FATALITIES,2009,0,0,0,0,0,0 +FAULTED,2009,0,0,0,0,0,0 +FAVORABLY,0,2009,0,0,0,0,0 +FAVORITES,0,2009,0,0,0,0,0 +FELONIOUS,2009,0,0,2009,0,0,0 +DAMAGES,2009,0,0,0,0,0,0 +DANGER,2009,0,0,0,0,0,0 +DEADLOCK,2009,0,0,0,0,0,0 +DEADWEIGHT,2009,0,0,0,0,0,0 +DEBARRED,2009,0,0,0,0,0,0 +DECEIT,2009,0,0,0,0,0,0 +DECEIVED,2009,0,0,0,0,0,0 +DECEPTIONS,2009,0,0,0,0,0,0 +DECLINE,2009,0,0,0,0,0,0 +DECREE,0,0,0,2009,0,0,0 +DEFACE,2009,0,0,0,0,0,0 +DEFALCATIONS,0,0,0,2009,0,0,0 +DEFAME,2009,0,0,0,0,0,0 +DEFAULT,2009,0,0,0,0,0,0 +DEFEASANCE,0,0,0,2009,0,0,0 +DEFEASEMENT,0,0,0,2014,0,0,0 +DEFEATED,2009,0,0,0,0,0,0 +DEFECTIVE,2009,0,0,0,0,0,0 +DEFENDABLE,0,0,0,2014,0,0,0 +DEFENDING,2009,0,0,0,0,0,0 +DEFERENCE,0,0,0,2009,0,0,0 +DEFICIT,2009,0,0,0,0,0,0 +DEFRAUD,2009,0,0,0,0,0,0 +DEFUNCT,2009,0,0,0,0,0,0 +DEGRADED,2009,0,0,0,0,0,0 +DELAYED,2009,0,0,0,0,0,0 +DELEGATABLE,0,0,0,2011,0,0,0 +DELIBERATE,2009,0,0,0,0,0,0 +DELIGHTED,0,2009,0,0,0,0,0 +DELIGHTS,0,2009,0,0,0,0,0 +DELINQUENTLY,2009,0,0,0,0,0,0 +DELISTING,2009,0,0,0,0,0,0 +DEMISES,2009,0,0,0,0,0,0 +DEMOLISHES,2009,0,0,0,0,0,0 +DEMOTE,2009,0,0,0,0,0,0 +DEMOTION,2009,0,0,0,0,0,0 +DEMURRERS,0,0,0,2009,0,0,0 +DENIALS,2009,0,0,0,0,0,0 +DENIGRATED,2009,0,0,0,0,0,0 +DENY,2009,0,0,0,0,0,0 +DEPENDABLE,0,2009,0,0,0,0,0 +DEPENDED,0,0,2009,0,0,2009,0 +DEPENDENT,0,0,2009,0,0,0,2011 +DEPLETED,2009,0,0,0,0,0,0 +DEPLETIONS,2009,0,0,0,0,0,0 +DEPOSING,0,0,0,2009,0,0,0 +INVALID,2009,0,0,0,0,0,0 +INVALIDATING,2009,0,0,0,0,0,0 +INVENTED,0,2009,0,0,0,0,0 +INVENTIVE,0,2009,0,0,0,0,0 +INVESTIGATE,2009,0,0,0,0,0,0 +INVESTIGATION,2009,0,0,0,0,0,0 +IRRECONCILABLE,2009,0,0,0,0,0,0 +IRREGULAR,2009,0,0,0,0,0,0 +IRREPARABLE,2009,0,0,0,0,0,0 +IRREVOCABLE,0,0,0,2009,0,0,2009 +JOINDER,0,0,0,2009,0,0,0 +JUDICIARY,0,0,0,2009,0,0,0 +JURISDICTIONAL,0,0,0,2009,0,0,0 +JURIST,0,0,0,2009,0,0,0 +JURY,0,0,0,2009,0,0,0 +JUSTIFIABLE,2009,0,0,0,0,0,0 +DILIGENTLY,0,2009,0,0,0,0,0 +DIMINISHING,2009,0,0,0,0,0,0 +DISADVANTAGE,2009,0,0,0,0,0,0 +DISAFFILIATION,2009,0,0,2009,0,0,0 +DISAFFIRMS,0,0,0,2011,0,0,0 +DISAGREEING,2009,0,0,0,0,0,0 +DISALLOW,2009,0,0,0,0,0,0 +DISALLOWING,2009,0,0,0,0,0,0 +DISAPPEARANCES,2009,0,0,0,0,0,0 +DISAPPOINT,2009,0,0,0,0,0,0 +DISAPPOINTMENT,2009,0,0,0,0,0,0 +DISAPPROVALS,2009,0,0,0,0,0,0 +DISAPPROVING,2009,0,0,0,0,0,0 +DISASSOCIATIONS,2009,0,0,0,0,0,0 +DISASTROUSLY,2009,0,0,0,0,0,0 +DISAVOWING,2009,0,0,0,0,0,0 +GREATER,0,-2020,0,0,0,0,0 +GRIEVANCE,2009,0,0,0,0,0,0 +GUILTY,2009,0,0,0,0,0,0 +HAMPERED,2009,0,0,0,0,0,0 +HAPPILY,0,2009,0,0,0,0,0 +HARASSED,2009,0,0,0,0,0,0 +HARDSHIPS,2009,0,0,0,0,0,0 +HARMFULLY,2009,0,0,0,0,0,0 +HARSHER,2009,0,0,0,0,0,0 +HAZARD,2009,0,0,0,0,0,0 +NONJUDICIALLY,0,0,0,2011,0,0,0 +NONPERFORMANCE,2009,0,0,0,0,0,0 +HURT,2009,0,0,0,0,0,0 +DISFAVORED,2009,0,0,0,0,0,0 +DISGORGED,2009,0,0,0,0,0,0 +COMPLICATING,2009,0,0,0,0,0,0 +COMPLIMENTARY,0,2009,0,0,0,0,0 +COMPLY,0,0,0,0,0,0,2009 +MISSTATED,2009,0,0,0,0,0,0 +MISSTATING,2009,0,0,0,0,0,0 +MISTAKEN,2009,0,0,0,0,0,0 +MISTRIAL,2009,0,0,2009,0,0,0 +MISUNDERSTANDINGS,2009,0,0,0,0,0,0 +MISUSES,2009,0,0,0,0,0,0 +MONOPOLIZATION,2009,0,0,0,0,0,0 +MONOPOLIZING,2009,0,0,0,0,0,0 +MORATORIUMS,2009,0,0,0,0,0,0 +MOTIONS,0,0,0,2009,0,0,0 +SLOWDOWN,2009,0,0,0,0,0,0 +SLOWEST,2009,0,0,0,0,0,0 +SLUGGISH,2009,0,0,0,0,0,0 +SMOOTHING,0,2009,0,0,0,0,0 +DEPRESS,2009,0,0,0,0,0,0 +DEPRIVATION,2009,0,0,0,0,0,0 +DEPRIVING,2009,0,0,0,0,0,0 +DEROGATED,0,0,0,2009,0,0,0 +DEROGATIONS,0,0,0,2009,0,0,0 +DESIRED,0,2009,0,0,0,0,0 +DESTABILIZE,2009,0,0,0,0,0,0 +DESTROY,2009,0,0,0,0,0,0 +DESTRUCTION,2009,0,0,0,0,0,0 +DETAINER,0,0,0,2009,0,0,0 +DETERIORATE,2009,0,0,0,0,0,0 +DETERIORATION,2009,0,0,0,0,0,0 +DETERRENCES,2009,0,0,0,0,0,0 +DETERS,2009,0,0,0,0,0,0 +DETRIMENT,2009,0,0,0,0,0,0 +DEVALUE,2009,0,0,0,0,0,0 +DEVASTATE,2009,0,0,0,0,0,0 +DEVIATE,2009,0,2009,0,0,0,0 +DEVIATION,2009,0,2009,0,0,0,0 +DEVOLVED,2009,0,0,0,0,0,0 +DICTATED,0,0,0,0,0,0,2009 +DIFFERED,0,0,2009,0,0,0,0 +DIFFICULTIES,2009,0,0,0,0,0,0 +ASCENDANCY,0,0,0,2009,0,0,0 +ASSAULTED,2009,0,0,0,0,0,0 +ASSERTIONS,2009,0,0,0,0,0,0 +ASSUME,0,0,2009,0,0,0,0 +ASSUMPTION,0,0,2009,0,0,0,0 +ASSURES,0,2009,0,0,0,0,0 +ATTAINING,0,2009,0,0,0,0,0 +ATTEST,0,0,0,2009,0,0,0 +ATTESTING,0,0,0,2009,0,0,0 +ATTORNMENT,0,0,0,2009,0,0,0 +ATTRITION,2009,0,0,0,0,0,0 +BAIL,2009,0,0,2009,0,0,0 +BAILIFF,0,0,0,2009,0,0,0 +BALK,2009,0,0,0,0,0,0 +BANKRUPTCY,2009,0,0,0,0,0,0 +BANS,2009,0,0,0,0,0,0 +CLAIMABLE,0,0,0,2009,0,0,0 +CLAIMING,2009,0,0,0,0,0,0 +CLAWBACK,2009,0,0,0,0,0,0 +CLOSEOUT,2009,0,0,0,0,0,0 +CLOSURE,2009,0,0,0,0,0,0 +CODICIL,0,0,0,2009,0,0,0 +CODIFIED,0,0,0,2009,0,0,0 +COERCE,2009,0,0,0,0,0,0 +COERCION,2009,0,0,0,0,0,0 +COLLABORATING,0,2009,0,0,0,0,0 +COLLABORATOR,0,2009,0,0,0,0,0 +COLLAPSES,2009,0,0,0,0,0,0 +COLLUDE,2009,0,0,0,0,0,0 +COLLUSION,2009,0,0,2009,0,0,0 +POSING,2009,0,0,0,0,0,0 +POSSIBILITIES,0,0,2009,0,0,0,0 +POSTCLOSING,0,0,0,2011,0,0,0 +POSTPONE,2009,0,0,0,0,0,0 +POSTPONES,2009,0,0,0,0,0,0 +WRITEOFF,2009,0,0,0,0,0,0 +WRONGDOING,2009,0,0,0,0,0,0 +WRONGLY,2009,0,0,0,0,0,0 +HONORED,0,2009,0,0,0,0,0 +HOSTILITY,2009,0,0,0,0,0,0 +REASSESSED,0,0,2009,0,0,0,0 +REASSESSMENTS,2009,0,2009,0,0,0,0 +REASSIGNMENT,2009,0,0,0,0,0,0 +REBOUNDED,0,2009,0,0,0,0,0 +REBUTTABLE,0,0,0,2009,0,0,0 +REBUTTED,0,0,0,2009,0,0,0 +RECALCULATES,0,0,2009,0,0,0,0 +RECALL,2009,0,0,0,0,0,0 +RECEPTIVE,0,2009,0,0,0,0,0 +RECKLESS,2009,0,0,0,0,0,0 +RECONSIDERED,0,0,2009,0,0,0,0 +RECOUPABLE,0,0,0,2009,0,0,0 +RECOURSES,0,0,0,2009,0,0,0 +RECUSE,0,0,0,2011,0,0,0 +REDACT,2009,0,0,2009,0,0,0 +REDACTIONS,2009,0,0,2009,0,0,0 +REDRESS,2009,0,0,0,0,0,0 +REEXAMINATION,0,0,2009,0,0,0,0 +REFERENDUM,0,0,0,2009,0,0,0 +REFILES,0,0,0,2009,0,0,0 +REFRAINS,0,0,0,0,0,0,2009 +REFUSED,2009,0,0,0,0,0,0 +REGAINED,0,2009,0,0,0,0,0 +REGULATES,0,0,0,2009,0,0,0 +REGULATIVE,0,0,0,2009,0,0,0 +REHEAR,0,0,0,2009,0,0,0 +VARIABLE,0,0,2009,0,0,0,0 +VARIANCES,0,0,2009,0,0,0,0 +VARIATIONS,0,0,2009,0,0,0,0 +VARYING,0,0,2009,0,0,0,0 +VERDICTS,2009,0,0,2009,0,0,0 +VIATICAL,0,0,0,2011,0,0,0 +VIOLATE,2009,0,0,0,0,0,0 +VIOLATION,2009,0,0,0,0,0,0 +VIOLATORS,2009,0,0,0,0,0,0 +VITIATE,2009,0,0,0,0,0,0 +VITIATION,2009,0,0,0,0,0,0 +VOLATILE,2009,0,2009,0,0,0,0 +VULNERABILITY,2009,0,0,0,0,0,0 +WARNED,2009,0,0,0,0,0,0 +WARRANTEES,0,0,0,2011,0,0,0 +WASTING,2009,0,0,0,0,0,0 +WEAKENING,2009,0,0,0,0,0,0 +WEAKLY,2009,0,0,0,0,0,0 +DISHONESTY,2009,0,0,0,0,0,0 +DISHONORED,2009,0,0,0,0,0,0 +DISLOYAL,2009,0,0,0,0,0,0 +DISMALLY,2009,0,0,0,0,0,0 +DISMISSED,2009,0,0,0,0,0,0 +DISPARAGE,2009,0,0,0,0,0,0 +DISPARAGES,2009,0,0,0,0,0,0 +DISPARITY,2009,0,0,0,0,0,0 +DISPLACEMENTS,2009,0,0,0,0,0,0 +DISPOSITIVE,0,0,0,2009,0,0,0 +DISPOSSESSING,2009,0,0,0,0,0,0 +DISPROPORTIONAL,2009,0,0,0,0,0,0 +DISPUTED,2009,0,0,0,0,0,0 +DISQUALIFICATIONS,2009,0,0,0,0,0,0 +DISQUALIFYING,2009,0,0,0,0,0,0 +DISREGARDS,2009,0,0,0,0,0,0 +DISRUPTED,2009,0,0,0,0,0,0 +DISRUPTIVE,2009,0,0,0,0,0,0 +DISSENT,2009,0,0,0,0,0,0 +DISSENTING,2009,0,0,0,0,0,0 +DISSOLUTION,2009,0,0,0,0,0,0 +DISTINCTIVE,0,2009,0,0,0,0,0 +DISTORTED,2009,0,0,0,0,0,0 +DISTORTS,2009,0,0,0,0,0,0 +DISTRACTION,2009,0,0,0,0,0,0 +DISTRESS,2009,0,0,0,0,0,0 +DISTURB,2009,0,0,0,0,0,0 +DISTURBING,2009,0,0,0,0,0,0 +DIVERTED,2009,0,0,0,0,0,0 +DIVESTED,2009,0,0,0,0,0,0 +DIVESTMENT,2009,0,0,0,0,0,0 +DIVORCED,2009,0,0,0,0,0,0 +DIVULGING,2009,0,0,0,0,0,0 +DOCKETS,0,0,0,2009,0,0,0 +DOUBTFUL,2009,0,2009,0,0,0,0 +DOWNGRADES,2009,0,0,0,0,0,0 +DOWNSIZES,2009,0,0,0,0,0,0 +DOWNTIMES,2009,0,0,0,0,0,0 +DOWNWARDS,2009,0,0,0,0,0,0 +DRAWBACK,2009,0,0,0,0,0,0 +DROUGHT,2009,0,0,0,0,0,0 +DYSFUNCTION,2009,0,0,0,0,0,0 +EARMARKED,0,0,0,0,0,0,2009 +EASILY,0,2009,0,0,0,0,0 +EFFICIENCIES,0,2009,0,0,0,0,0 +EGREGIOUS,2009,0,0,0,0,0,0 +EMBARGOED,2009,0,0,0,0,0,0 +EMBARRASSED,2009,0,0,0,0,0,0 +EMBARRASSMENTS,2009,0,0,0,0,0,0 +EMBEZZLEMENTS,2009,0,0,0,0,0,0 +EMPOWER,0,2009,0,0,0,0,0 +ENABLE,0,2009,0,0,0,0,0 +ENCOURAGED,0,2009,0,0,0,0,0 +ENCROACH,2009,0,0,0,0,0,0 +ENCROACHMENT,2009,0,0,0,0,0,0 +ENCUMBERING,2009,0,0,2009,0,0,2009 +ENCUMBRANCERS,0,0,0,2011,0,0,0 +ENDANGERING,2009,0,0,0,0,0,0 +ENFORCEABILITY,0,0,0,2009,0,0,0 +ENHANCED,0,2009,0,0,0,0,0 +ENHANCING,0,2009,0,0,0,0,0 +ENJOINS,2009,0,0,0,0,0,0 +ENJOYED,0,2009,0,0,0,0,0 +ENTAIL,0,0,0,0,0,0,2009 +PECUNIARILY,0,0,0,2009,0,0,0 +PENALIZING,2009,0,0,0,0,0,0 +PERFECT,0,2009,0,0,0,0,0 +PERHAPS,0,0,2009,0,0,2009,0 +PERMISSIBLE,0,0,0,0,0,0,2009 +PERMITTEE,0,0,0,2011,0,0,0 +PERPETRATED,2009,0,0,2009,0,0,0 +PERSIST,2009,0,0,0,0,0,0 +PERSISTENTLY,2009,0,0,0,0,0,0 +PERVASIVE,2009,0,0,0,0,0,0 +PETITIONED,0,0,0,2009,0,0,0 +PETITIONS,0,0,0,2009,0,0,0 +PICKETING,2009,0,0,0,0,0,0 +HENCEFORWARD,0,0,0,2009,0,0,0 +HEREFOR,0,0,0,2009,0,0,0 +HEREINABOVE,0,0,0,2009,0,0,0 +HEREOF,0,0,0,2009,0,0,0 +HEREUNDER,0,0,0,2009,0,0,0 +HEREWITHIN,0,0,0,2014,0,0,0 +HINDERED,2009,0,0,0,0,0,0 +HINDRANCES,2009,0,0,0,0,0,0 +WHENSOEVER,0,0,0,2009,0,0,0 +WHEREBY,0,0,0,2009,0,0,0 +WHEREON,0,0,0,2009,0,0,0 +WHEREWITH,0,0,0,2009,0,0,0 +WHOSOEVER,0,0,0,2009,0,0,0 +WILLFULLY,2009,0,0,2009,0,0,0 +WINNERS,0,2009,0,0,0,0,0 +FLUCTUATING,0,0,2009,0,0,0,0 +FORBEAR,0,0,0,2009,0,0,0 +FORBEARS,0,0,0,2009,0,0,0 +FORBIDS,2009,0,0,0,0,0,2009 +FOREBEAR,0,0,0,2009,0,0,0 +FORECLOSED,2009,0,0,0,0,0,0 +FORECLOSURES,2009,0,0,0,0,0,0 +FORESTALL,2009,0,0,0,0,0,0 +FORFEIT,2009,0,0,0,0,0,0 +FORFEITING,2009,0,0,0,0,0,0 +FORGERS,2009,0,0,0,0,0,0 +FRAUD,2009,0,0,0,0,0,0 +FRAUDULENTLY,2009,0,0,0,0,0,0 +FRUSTRATE,2009,0,0,0,0,0,0 +FRUSTRATINGLY,2009,0,0,0,0,0,0 +FUGITIVES,2009,0,0,2009,0,0,0 +GAINING,0,2009,0,0,0,0,0 +GRANTORS,0,0,0,2009,0,0,0 +DISGRACE,2009,0,0,0,0,0,0 +LITIGANTS,2009,0,0,2009,0,0,0 +LITIGATING,2009,0,0,2009,0,0,0 +LITIGATORS,0,0,0,2009,0,0,0 +LACK,2009,0,0,0,0,0,0 +LACKS,2009,0,0,0,0,0,0 +LAGS,2009,0,0,0,0,0,0 +LAPSING,2009,0,0,0,0,0,0 +LAWFUL,0,0,0,2009,0,0,0 +LAWMAKING,0,0,0,2009,0,0,0 +LAWYER,0,0,0,2009,0,0,0 +LEADERSHIP,0,2009,0,0,0,0,0 +LEGALITY,0,0,0,2009,0,0,0 +LEGALIZED,0,0,0,2009,0,0,0 +LEGALS,0,0,0,2009,0,0,0 +FLAW,2009,0,0,0,0,0,0 +NONPRODUCTIVE,2009,0,0,0,0,0,0 +LIQUIDATED,2009,0,0,0,0,0,0 +LIQUIDATIONS,2009,0,0,0,0,0,0 +BENEFICIATED,0,0,0,2014,0,0,0 +BENEFITING,0,2009,0,0,0,0,0 +BETTER,0,2009,0,0,0,0,0 +POPULARITY,0,2009,0,0,0,0,0 +REINTERPRET,0,0,2009,0,0,0,0 +REINTERPRETING,0,0,2009,0,0,0,0 +REJECTING,2009,0,0,0,0,0,0 +RELEASEES,0,0,0,2011,0,0,0 +RELINQUISHING,2009,0,0,0,0,0,0 +RELUCTANT,2009,0,0,0,0,0,0 +REMANDS,0,0,0,2009,0,0,0 +REMEDIATION,0,0,0,2009,0,0,0 +RENEGOTIATE,2009,0,0,0,0,0,0 +RENEGOTIATION,2009,0,0,0,0,0,0 +RENOUNCEMENT,2009,0,0,0,0,0,0 +REPARATION,2009,0,0,0,0,0,0 +REPOSSESSED,2009,0,0,0,0,0,0 +REPOSSESSIONS,2009,0,0,0,0,0,0 +TROUBLE,2009,0,0,0,0,0,0 +TURMOIL,2009,0,0,0,0,0,0 +UNACCOUNTED,2009,0,0,0,0,0,0 +UNAPPEALABLE,0,0,0,2009,0,0,0 +UNAUTHORIZED,2009,0,0,0,0,0,0 +UNAVOIDABLY,2009,0,0,0,0,0,0 +UNCERTAINTIES,0,0,2009,0,0,0,0 +UNCOLLECTED,2009,0,0,0,0,0,0 +UNCOMPETITIVE,2009,0,0,0,0,0,0 +UNCONSCIONABLE,2009,0,0,0,0,0,0 +UNCONSTITUTIONALLY,0,0,0,2009,0,0,0 +UNCONTROLLED,2009,0,0,0,0,0,0 +UNCOVERING,2009,0,0,0,0,0,0 +UNDEFINED,0,0,2009,0,0,0,0 +UNDERCUT,2009,0,0,0,0,0,0 +UNDERESTIMATED,2009,0,0,0,0,0,0 +UNDERFUNDED,2009,0,0,0,0,0,0 +UNDERMINES,2009,0,0,0,0,0,0 +UNDERPAYMENTS,2009,0,0,0,0,0,0 +UNDERPERFORMED,2011,0,0,0,0,0,0 +UNDERPRODUCTION,2009,0,0,0,0,0,0 +UNDERSTATEMENT,2009,0,0,0,0,0,0 +UNDERUTILIZATION,2009,0,0,0,0,0,0 +UNDESIRED,2009,0,0,0,0,0,0 +UNDETERMINED,2009,0,2009,0,0,0,0 +UNDOCUMENTED,2009,0,2009,0,0,0,0 +UNECONOMIC,2009,0,0,0,0,0,0 +UNEMPLOYMENT,2009,0,0,0,0,0,0 +UNENFORCEABLE,0,0,0,2009,0,0,0 +UNETHICALLY,2009,0,0,0,0,0,0 +UNFAIR,2009,0,0,0,0,0,0 +UNFAVORABILITY,2014,0,0,0,0,0,0 +UNFEASIBLE,2009,0,0,0,0,0,0 +UNFORESEEABLE,2009,0,0,0,0,0,0 +UNFORTUNATELY,2009,0,0,0,0,0,0 +UNFUNDED,2009,0,0,0,0,0,0 +UNIDENTIFIED,0,0,2009,0,0,0,0 +UNINTENTIONALLY,2009,0,0,0,0,0,0 +UNJUSTIFIED,2009,0,0,0,0,0,0 +UNKNOWN,0,0,2009,0,0,0,0 +UNLAWFULNESS,0,0,0,2009,0,0,0 +UNMATCHED,0,2009,0,0,0,0,0 +UNNECESSARY,2009,0,0,0,0,0,0 +UNOCCUPIED,2009,0,0,0,0,0,0 +UNPLANNED,2009,0,2009,0,0,0,0 +UNPREDICTABLY,2009,0,2009,0,0,0,0 +UNPROFITABLE,2009,0,0,0,0,0,0 +UNQUANTIFIABLE,0,0,2011,0,0,0,0 +UNREASONABLENESS,2009,0,0,0,0,0,0 +UNRECOVERABLE,2009,0,0,0,0,0,0 +UNREMEDIATED,0,0,0,2011,0,0,0 +UNREST,2009,0,0,0,0,0,0 +UNSATISFACTORY,2009,0,0,0,0,0,0 +UNSEASONABLE,0,0,2009,0,0,0,0 +UNSOLD,2009,0,0,0,0,0,0 +UNSTABILIZED,2014,0,0,0,0,0,0 +UNSUCCESSFUL,2009,0,0,0,0,0,0 +UNSUITABLY,2009,0,0,0,0,0,0 +UNSUSPECTED,2009,0,0,0,0,0,0 +UNTESTED,0,0,2009,0,0,0,0 +UNTRUTH,2009,0,0,0,0,0,0 +UNTRUTHS,2009,0,0,0,0,0,0 +UNWANTED,2009,0,0,0,0,0,0 +UNWILLINGNESS,2009,0,0,0,0,0,0 +UPTURNS,0,2009,0,0,0,0,0 +USURP,2009,0,0,2009,0,0,0 +USURPS,2009,0,0,2009,0,0,0 +VAGUELY,0,0,2012,0,0,0,0 +VAGUEST,0,0,2012,0,0,0,0 +PLEA,2009,0,0,0,0,0,0 +PLEADINGS,2009,0,0,2009,0,0,0 +PLEASANTLY,0,2009,0,0,0,0,0 +PLEDGE,0,0,0,0,0,0,2009 +PLEDGES,0,0,0,0,0,0,2009 +PLENTIFUL,0,2009,0,0,0,0,0 +COMPELS,0,0,0,0,0,0,2009 +COMPLAINANTS,0,0,0,2009,0,0,0 +COMPLAINT,2009,0,0,0,0,0,0 +COMMIT,0,0,0,0,0,0,2009 +COMMITTED,0,0,0,0,0,0,2009 +LIMIT,0,0,0,0,0,0,2009 +LIMITS,0,0,0,0,0,0,2009 +RESTRAINED,0,0,0,0,0,0,2009 +RESTRAINTS,0,0,0,0,0,0,2009 +RESTRICTION,0,0,0,0,0,0,2009 +RESTRICTIVENESS,0,0,0,0,0,0,2009 +RESTRUCTURES,2009,0,0,0,0,0,0 +RETALIATED,2009,0,0,0,0,0,0 +RETALIATIONS,2009,0,0,0,0,0,0 +PRECAUTIONARY,0,0,2009,0,0,0,0 +PRECIPITOUSLY,2009,0,0,0,0,0,0 +PRECLUDING,2009,0,0,0,0,0,2009 +PREDECEASE,0,0,0,2009,0,0,0 +PREDICT,0,0,2009,0,0,0,0 +PREDICTION,0,0,2009,0,0,0,0 +PREDICTORS,0,0,2009,0,0,0,0 +PREHEARING,0,0,0,2011,0,0,0 +PREJUDICIAL,2009,0,0,2009,0,0,0 +PREMATURE,2009,0,0,0,0,0,0 +PREPETITION,0,0,0,2009,0,0,0 +PRESTIGIOUS,0,2009,0,0,0,0,0 +PRESUMES,0,0,2009,0,0,0,0 +PRESUMPTIVELY,0,0,0,2009,0,0,0 +PREVENTING,2009,0,0,0,0,0,2009 +PRIVITY,0,0,0,2011,0,0,0 +PROBABILITIES,0,0,2009,0,0,0,0 +PROBATE,0,0,0,2009,0,0,0 +PROBATION,0,0,0,2009,0,0,0 +PROBATIONERS,0,0,0,2009,0,0,0 +PROBLEMATICAL,2009,0,0,0,0,0,0 +PROFICIENTLY,0,2009,0,0,0,0,0 +PROGRESS,0,2009,0,0,0,0,0 +PROHIBIT,0,0,0,0,0,0,2009 +PROHIBITIONS,0,0,0,0,0,0,2009 +PROHIBITS,0,0,0,0,0,0,2009 +PROLONGED,2009,0,0,0,0,0,0 +PROMULGATED,0,0,0,2009,0,0,0 +PROMULGATIONS,0,0,0,2009,0,0,0 +PRORATA,0,0,0,2009,0,0,0 +PROSECUTES,2009,0,0,2009,0,0,0 +PROSECUTOR,0,0,0,2009,0,0,0 +PROSPERING,0,2009,0,0,0,0,0 +PROTEST,2009,0,0,0,0,0,0 +PROTESTING,2009,0,0,0,0,0,0 +PROTRACTED,2009,0,0,0,0,0,0 +PROVISOS,0,0,0,2009,0,0,0 +PROVOKING,2009,0,0,0,0,0,0 +PUNISHING,2009,0,0,0,0,0,0 +PURPORT,2009,0,0,0,0,0,0 +PURPORTS,2009,0,0,0,0,0,0 +QUESTIONED,2009,0,0,0,0,0,0 +QUITCLAIM,0,0,0,2009,0,0,0 +RACKETEERING,2009,0,0,0,0,0,0 +RANDOMIZES,0,0,2009,0,0,0,0 +RATA,0,0,0,2009,0,0,0 +RATIONALIZATIONS,2009,0,0,0,0,0,0 +RATIONALIZING,2009,0,0,0,0,0,0 +ABANDON,2009,0,0,0,0,0,0 +ABANDONMENTS,2009,0,0,0,0,0,0 +ABDICATING,2009,0,0,0,0,0,0 +ABERRATION,2009,0,0,0,0,0,0 +ABEYANCE,0,0,2009,0,0,0,0 +ABLE,0,2009,0,0,0,0,0 +ABNORMALLY,2009,0,0,0,0,0,0 +ABOLISHING,2009,0,0,0,0,0,0 +ABROGATES,2009,0,0,2009,0,0,0 +ABRUPT,2009,0,0,0,0,0,0 +ABSENCES,2009,0,0,0,0,0,0 +ABSOLVES,0,0,0,2009,0,0,0 +ABUSE,2009,0,0,0,0,0,0 +ABUSIVE,2009,0,0,0,0,0,0 +ACCESSIONS,0,0,0,2009,0,0,0 +ACCIDENTS,2009,0,0,0,0,0,0 +ACCOMPLISHES,0,2009,0,0,0,0,0 +ACCUSATION,2009,0,0,0,0,0,0 +ACCUSES,2009,0,0,0,0,0,0 +ACHIEVEMENT,0,2009,0,0,0,0,0 +ACQUIESCE,2009,0,0,0,0,0,0 +ACQUIREES,0,0,0,2011,0,0,0 +ACQUITTAL,2009,0,0,2009,0,0,0 +ACQUITTED,2009,0,0,2009,0,0,0 +ADJOURN,0,0,0,2009,0,0,0 +ADJOURNMENTS,0,0,0,2009,0,0,0 +ADJUDGES,0,0,0,2009,0,0,0 +ADJUDICATES,0,0,0,2009,0,0,0 +ADJUDICATIVE,0,0,0,2009,0,0,0 +ADMISSIBILITY,0,0,0,2009,0,0,0 +ADMISSIONS,0,0,0,2009,0,0,0 +ADULTERATION,2009,0,0,0,0,0,0 +ADVANCES,0,2009,0,0,0,0,0 +ADVANTAGEOUS,0,2009,0,0,0,0,0 +ADVERSARIES,2009,0,0,0,0,0,0 +ADVERSITIES,2009,0,0,0,0,0,0 +AFFIRMANCE,0,0,0,2011,0,0,0 +AFORESAID,0,0,0,2009,0,0,0 +AGAINST,2009,0,0,0,0,0,0 +AGGRAVATING,2009,0,0,0,0,0,0 +ALERTED,2009,0,0,0,0,0,0 +ALIENATES,2009,0,0,0,0,0,0 +ALLEGATION,2009,0,0,2009,0,0,0 +ALLEGEDLY,2009,0,0,2009,0,0,0 +ALLIANCES,0,2009,0,0,0,0,0 +ALWAYS,0,0,0,0,2009,0,0 +AMEND,0,0,0,2009,0,0,0 +AMENDING,0,0,0,2009,0,0,0 +ANNOY,2009,0,0,0,0,0,0 +ANNOYING,2009,0,0,0,0,0,0 +ANNULLING,2009,0,0,0,0,0,0 +ANOMALIES,2009,0,2009,0,0,0,0 +ANTECEDENT,0,0,0,2009,0,0,0 +ANTICIPATES,0,0,2009,0,0,0,0 +ANTICOMPETITIVE,2009,0,0,0,0,0,0 +APPARENT,0,0,2009,0,0,0,0 +APPEALED,0,0,0,2009,0,0,0 +APPEARED,0,0,2009,0,0,2009,0 +APPELLANTS,0,0,0,2009,0,0,0 +APPROXIMATE,0,0,2009,0,0,0,0 +APPROXIMATING,0,0,2009,0,0,0,0 +APPURTENANCES,0,0,0,2009,0,0,0 +ARBITRARILY,0,0,2009,0,0,0,0 +ARBITRATED,0,0,0,2009,0,0,0 +ARBITRATIONAL,0,0,0,2011,0,0,0 +ARBITRATORS,0,0,0,2009,0,0,0 +ARGUMENT,2009,0,0,0,0,0,0 +ARREARAGES,2009,0,0,2009,0,0,0 +ARRESTS,2009,0,0,0,0,0,0 +RETROCEDED,0,0,0,2011,0,0,0 +BOLSTERING,0,2009,0,0,0,0,0 +BOOM,0,2009,0,0,0,0,0 +BOTTLENECK,2009,0,0,0,0,0,0 +BOYCOTT,2009,0,0,0,0,0,0 +BREACH,2009,0,0,2009,0,0,0 +BREAK,2009,0,0,0,0,0,0 +BREAKDOWNS,2009,0,0,0,0,0,0 +BREAKTHROUGHS,0,2009,0,0,0,0,0 +BRIBERY,2009,0,0,0,0,0,0 +BRILLIANT,0,2009,0,0,0,0,0 +BURDENING,2009,0,0,0,0,0,0 +CALAMITIES,2009,0,0,0,0,0,0 +CANCELED,2009,0,0,0,0,0,0 +CANCELLED,2009,0,0,0,0,0,0 +CARELESSLY,2009,0,0,0,0,0,0 +CATASTROPHES,2009,0,0,0,0,0,0 +CAUTIONARY,2009,0,0,0,0,0,0 +CAUTIOUS,0,0,2009,0,0,0,0 +CEASED,2009,0,0,0,0,0,0 +CEDANTS,0,0,0,2012,0,0,0 +CENSURING,2009,0,0,0,0,0,0 +CHALLENGED,2009,0,0,0,0,0,0 +CHARITABLE,0,2009,0,0,0,0,0 +CIRCUMVENT,2009,0,0,0,0,0,0 +CIRCUMVENTIONS,2009,0,0,0,0,0,0 +SHORTAGE,2009,0,0,0,0,0,0 +SHRINKAGE,2009,0,0,0,0,0,0 +SHUTDOWNS,2009,0,0,0,0,0,0 +SLANDERED,2009,0,0,0,0,0,0 +REPUDIATES,2009,0,0,0,0,0,0 +REQUESTER,0,0,0,2011,0,0,0 +REQUIREMENT,0,0,0,0,0,0,2009 +REREGULATION,0,0,0,2011,0,0,0 +RESCINDS,0,0,0,2009,0,0,0 +RESIGNATION,2009,0,0,0,0,0,0 +RESIGNS,2009,0,0,0,0,0,0 +RESTATEMENT,2009,0,0,0,0,0,0 +RESTITUTIONARY,0,0,0,2011,0,0,0 +NOTARIAL,0,0,0,2009,0,0,0 +NOTARIZE,0,0,0,2009,0,0,0 +NOTWITHSTANDING,0,0,0,2009,0,0,0 +NULLIFICATION,2009,0,0,2009,0,0,0 +NULLIFY,2009,0,0,2009,0,0,0 +OBJECTED,2009,0,0,0,0,0,0 +OBJECTIONABLY,2009,0,0,0,0,0,0 +OBLIGATES,0,0,0,0,0,0,2009 +OBLIGATORY,0,0,0,0,0,0,2009 +OBLIGEES,0,0,0,2011,0,0,0 +OBSCENE,2009,0,0,0,0,0,0 +OBSTACLE,2009,0,0,0,0,0,0 +OBSTRUCTING,2009,0,0,0,0,0,0 +OFFENCE,2009,0,0,0,0,0,0 +OFFENDER,2009,0,0,0,0,0,0 +OFFENSE,0,0,0,2009,0,0,0 +OFFERORS,0,0,0,2011,0,0,0 +OMITS,2009,0,0,0,0,0,0 +OPPORTUNISTIC,2009,0,0,0,0,0,0 +OPPOSE,2009,0,0,0,0,0,0 +OPPOSITION,2009,0,0,0,0,0,0 +OPTIONEES,0,0,0,2009,0,0,0 +OUTDATED,2009,0,0,0,0,0,0 +OUTPERFORMING,0,2009,0,0,0,0,0 +OVERBUILD,2009,0,0,0,0,0,0 +OVERBURDEN,2009,0,0,0,0,0,0 +OVERCAPACITY,2009,0,0,0,0,0,0 +OVERCHARGING,2009,0,0,0,0,0,0 +OVERDUE,2009,0,0,0,0,0,0 +OVERESTIMATING,2009,0,0,0,0,0,0 +OVERLOADED,2009,0,0,0,0,0,0 +OVERLOOKED,2009,0,0,0,0,0,0 +OVERPAYMENT,2009,0,0,0,0,0,0 +OVERPRODUCING,2009,0,0,0,0,0,0 +OVERRULES,0,0,0,2009,0,0,0 +OVERRUNS,2009,0,0,0,0,0,0 +OVERSHADOWS,2009,0,0,0,0,0,0 +OVERSTATEMENTS,2009,0,0,0,0,0,0 +OVERSUPPLIES,2009,0,0,0,0,0,0 +OVERTURN,2009,0,0,0,0,0,0 +OVERVALUE,2009,0,0,0,0,0,0 +PANICS,2009,0,0,0,0,0,0 +NECESSITATE,0,0,0,0,0,0,2009 +NEGATIVE,2009,0,0,0,0,0,0 +NEGLECTED,2009,0,0,0,0,0,0 +NEGLIGENCE,2009,0,0,0,0,0,0 +NEVER,0,0,0,0,2009,0,0 +BARRIERS,2009,0,0,0,0,0,0 +BELIEVED,0,0,2009,0,0,0,0 +IDLING,2009,0,0,0,0,0,0 +IGNORING,2009,0,0,0,0,0,0 +ILLEGALITY,2009,0,0,0,0,0,0 +ILLICITLY,2009,0,0,0,0,0,0 +IMBALANCES,2009,0,0,0,0,0,0 +IMPAIR,2009,0,0,0,0,0,2011 +IMPAIRMENTS,2009,0,0,0,0,0,2011 +IMPEDE,2009,0,0,0,0,0,0 +IMPEDIMENTS,2009,0,0,0,0,0,0 +IMPERFECTION,2009,0,0,0,0,0,0 +IMPLEADED,0,0,0,2009,0,0,0 +IMPLICATING,2009,0,0,0,0,0,0 +IMPOSING,0,0,0,0,0,0,2009 +IMPOSSIBLE,2009,0,0,0,0,0,0 +IMPOUNDS,2009,0,0,0,0,0,0 +IMPRACTICALITY,2009,0,0,0,0,0,0 +IMPRESS,0,2009,0,0,0,0,0 +IMPRESSIVE,0,2009,0,0,0,0,0 +IMPROBABLE,0,0,2009,0,0,0,0 +IMPROPRIETY,2009,0,0,0,0,0,0 +IMPROVEMENTS,0,2009,0,0,0,0,0 +IMPRUDENTLY,2009,0,0,0,0,0,0 +INACCURACY,2009,0,0,0,0,0,0 +INACTIONS,2009,0,0,0,0,0,0 +INACTIVATING,2009,0,0,0,0,0,0 +INADEQUACIES,2009,0,0,0,0,0,0 +INADVERTENT,2009,0,0,0,0,0,0 +INAPPROPRIATE,2009,0,0,0,0,0,0 +INCAPABLE,2009,0,0,0,0,0,0 +INCARCERATED,2009,0,0,2009,0,0,0 +INCARCERATIONS,2009,0,0,2009,0,0,0 +INCIDENT,2009,0,0,0,0,0,0 +INCOMPATIBLE,2009,0,0,0,0,0,0 +INCOMPETENTLY,2009,0,0,0,0,0,0 +INCOMPLETENESS,2009,0,2009,0,0,0,0 +INCONSISTENT,2009,0,0,0,0,0,0 +INCONVENIENCE,2009,0,0,0,0,0,0 +INCORRECTLY,2009,0,0,0,0,0,0 +INDEBTED,0,0,0,0,0,0,2009 +INDEFEASIBLY,2009,0,0,0,0,0,0 +INDEMNIFIABLE,0,0,0,2009,0,0,0 +INDEMNIFIES,0,0,0,2009,0,0,0 +INDEMNITEES,0,0,0,2009,0,0,0 +INDEMNITY,0,0,0,2009,0,0,0 +INDICTABLE,2009,0,0,2009,0,0,0 +INDICTMENTS,2009,0,0,2009,0,0,0 +INEFFECTIVENESS,2009,0,0,0,0,0,0 +INEFFICIENTLY,2009,0,0,0,0,0,0 +INEQUITABLY,2009,0,0,0,0,0,0 +INEXACT,0,0,2009,0,0,0,0 +INFERIOR,2009,0,0,0,0,0,0 +INFORMATIVE,0,2009,0,0,0,0,0 +INFRINGED,2009,0,0,0,0,0,0 +INFRINGES,2009,0,0,0,0,0,0 +INHIBITED,2009,0,0,0,0,0,2009 +INJUNCTION,2009,0,0,2009,0,0,0 +INJURED,2009,0,0,0,0,0,0 +INJURIOUS,2009,0,0,0,0,0,0 +INNOVATES,0,2009,0,0,0,0,0 +INNOVATIVE,0,2009,0,0,0,0,0 +INORDINATE,2009,0,0,0,0,0,0 +INSENSITIVE,2009,0,0,0,0,0,0 +INSISTENCE,0,0,0,0,0,0,2009 +INSOLVENCIES,2009,0,0,0,0,0,0 +INSPIRATIONAL,0,2009,0,0,0,0,0 +INSUFFICIENCY,2009,0,0,0,0,0,0 +INSURRECTIONS,2009,0,0,0,0,0,0 +INTENTIONAL,2009,0,0,0,0,0,0 +INTERFERENCES,2009,0,0,0,0,0,0 +INTERMITTENT,2009,0,0,0,0,0,0 +INTERPOSED,0,0,0,2009,0,0,0 +INTERPOSITIONS,0,0,0,2009,0,0,0 +INTERROGATING,0,0,0,2009,0,0,0 +INTERROGATORIES,0,0,0,2009,0,0,0 +INTERRUPTED,2009,0,0,0,0,0,0 +INTERRUPTS,2009,0,0,0,0,0,0 +STABILITY,0,2009,0,0,0,0,0 +STABILIZED,0,2009,0,0,0,0,0 +STAGGERING,2009,0,0,0,0,0,0 +STAGNATES,2009,0,0,0,0,0,0 +STANDSTILLS,2009,0,0,0,0,0,0 +STATUTORY,0,0,0,2009,0,0,0 +STIPULATING,0,0,0,0,0,0,2009 +STOPPAGE,2009,0,0,0,0,0,0 +STOPS,2009,0,0,0,0,0,0 +STRAINS,2009,0,0,0,0,0,0 +STRENGTHENING,0,2009,0,0,0,0,0 +STRESSED,2009,0,0,0,0,0,0 +STRICT,0,0,0,0,0,0,2009 +STRINGENT,2009,0,0,0,0,0,0 +STRONGLY,0,0,0,0,2009,0,0 +SUBJECTED,2009,0,0,0,0,0,0 +SUBLEASEHOLD,0,0,0,2011,0,0,0 +SUBPARAGRAPH,0,0,0,2009,0,0,0 +SUBPOENAS,2009,0,0,2009,0,0,0 +SUBTRUST,0,0,0,2011,0,0,0 +SUCCEEDING,0,2009,0,0,0,0,0 +SUCCESSFUL,0,2009,0,0,0,0,0 +SUE,2009,0,0,2009,0,0,0 +SUFFERED,2009,0,0,0,0,0,0 +SUGGESTED,0,0,2009,0,0,0,0 +SUMMONED,2009,0,0,2009,0,0,0 +SUPERIOR,0,2009,0,0,0,0,0 +SUPERSEDES,0,0,0,2009,0,0,0 +SURPASS,0,2009,0,0,0,0,0 +SUSCEPTIBILITY,2009,0,2009,0,0,0,0 +SUSPECTS,2009,0,0,0,0,0,0 +SUSPENDS,2009,0,0,0,0,0,0 +SUSPICIONS,2009,0,0,0,0,0,0 +REVOCABILITY,0,0,0,2011,0,0,0 +REVOKED,2009,0,0,0,0,0,0 +REVOLUTIONIZED,0,2009,0,0,0,0,0 +REWARDED,0,2009,0,0,0,0,0 +RIDICULED,2009,0,0,0,0,0,0 +RISKED,0,0,2009,0,0,0,0 +RISKING,0,0,2009,0,0,0,0 +RULING,0,0,0,2009,0,0,0 +SACRIFICE,2009,0,0,0,0,0,0 +SACRIFICING,2009,0,0,0,0,0,0 +SATISFIED,0,2009,0,0,0,0,0 +SCANDALOUS,2009,0,0,0,0,0,0 +SCRUTINIZES,2009,0,0,0,0,0,0 +SEEMS,0,0,2009,0,0,0,0 +SEIZING,2009,0,0,0,0,0,0 +SENTENCING,2009,0,0,2009,0,0,0 +SERIOUSNESS,2009,0,0,0,0,0,0 +SETTLEMENTS,0,0,0,2009,0,0,0 +SEVERALLY,0,0,0,2009,0,0,0 +SEVERED,2009,0,0,0,0,0,0 +ENTHUSIASTICALLY,0,2009,0,0,0,0,0 +ERODED,2009,0,0,0,0,0,0 +ERRATIC,2009,0,0,0,0,0,0 +ERRONEOUS,2009,0,0,0,0,0,0 +ERRS,2009,0,0,0,0,0,0 +ESCALATING,2009,0,0,0,0,0,0 +ESCROW,0,0,0,0,0,0,2009 +ESTOPPEL,0,0,0,2011,0,0,0 +EVADING,2009,0,0,0,0,0,0 +EVICT,2009,0,0,0,0,0,0 +EVICTIONS,2009,0,0,0,0,0,0 +EXACERBATE,2009,0,0,0,0,0,0 +EXACERBATION,2009,0,0,0,0,0,0 +EXAGGERATES,2009,0,0,0,0,0,0 +EXCEEDANCES,0,0,0,2011,0,0,0 +EXCELLING,0,2009,0,0,0,0,0 +EXCESSIVE,2009,0,0,0,0,0,0 +EXCITEMENT,0,2009,0,0,0,0,0 +EXCLUSIVENESS,0,2009,0,0,0,0,0 +EXCULPATED,2009,0,0,2009,0,0,0 +EXCULPATIONS,2009,0,0,2009,0,0,0 +EXECUTORY,0,0,0,2009,0,0,0 +EXEMPLARY,0,2009,0,0,0,0,0 +EXONERATING,2009,0,0,0,0,0,0 +EXPLOITATION,2009,0,0,0,0,0,0 +EXPLOITING,2009,0,0,0,0,0,0 +EXPOSES,2009,0,0,0,0,0,0 +EXPROPRIATE,2009,0,0,0,0,0,0 +EXPROPRIATION,2009,0,0,0,0,0,0 +EXTENUATING,2009,0,0,0,0,0,0 +SOLVING,0,2009,0,0,0,0,0 +SOMEWHERE,0,0,2009,0,0,0,0 +LOSE,2009,0,0,0,0,0,0 +LOSSES,2009,0,0,0,0,0,0 +LUCRATIVE,0,2009,0,0,0,0,0 +MALFUNCTION,2009,0,0,0,0,0,0 +MALICE,2009,0,0,0,0,0,0 +MANDAMUS,0,0,0,2009,0,0,0 +MANDATING,0,0,0,0,0,0,2009 +MANIPULATED,2009,0,0,0,0,0,0 +MANIPULATIONS,2009,0,0,0,0,0,0 +MAY,0,0,2009,0,0,2009,0 +MEDIATES,0,0,0,2009,0,0,0 +MEDIATOR,0,0,0,2009,0,0,0 +MISAPPLICATION,2009,0,0,0,0,0,0 +MISAPPLY,2009,0,0,0,0,0,0 +MISAPPROPRIATES,2009,0,0,0,0,0,0 +MISBRANDED,2009,0,0,0,0,0,0 +MISCALCULATING,2009,0,0,0,0,0,0 +MISCHIEF,2009,0,0,0,0,0,0 +MISCLASSIFY,2014,0,0,0,0,0,0 +MISDEMEANOR,2009,0,0,2009,0,0,0 +MISHANDLE,2009,0,0,0,0,0,0 +MISINFORM,2009,0,0,0,0,0,0 +MISINFORMS,2009,0,0,0,0,0,0 +MISINTERPRETED,2009,0,0,0,0,0,0 +MISJUDGED,2009,0,0,0,0,0,0 +MISJUDGMENTS,2009,0,0,0,0,0,0 +MISLABELLED,2009,0,0,0,0,0,0 +MISLEADINGLY,2009,0,0,0,0,0,0 +MISMANAGED,2009,0,0,0,0,0,0 +MISMATCH,2009,0,0,0,0,0,0 +MISPLACED,2009,0,0,0,0,0,0 +MISREPRESENT,2009,0,0,0,0,0,0 +MISREPRESENTING,2009,0,0,0,0,0,0 +MISSES,2009,0,0,0,0,0,0 +WORRY,2009,0,0,0,0,0,0 +WORSENED,2009,0,0,0,0,0,0 +WORTHLESS,2009,0,0,0,0,0,0 +TOLERATE,2009,0,0,0,0,0,0 +TOLERATION,2009,0,0,0,0,0,0 +TORTS,0,0,0,2009,0,0,0 +FICTITIOUS,2009,0,0,0,0,0,0 +FIRED,2009,0,0,0,0,0,0 +NONATTAINMENT,2009,0,0,0,0,0,0 +NONCOMPETITIVE,2009,0,0,0,0,0,0 +NONCOMPLYING,2009,0,0,0,0,0,0 +NONCONTINGENT,0,0,0,2011,0,0,0 +NONDISCLOSURE,2009,0,0,0,0,0,0 +NONFORFEITABLE,0,0,0,2009,0,0,0 +DISCLAIM,2009,0,0,0,0,0,0 +DISCLAIMING,2009,0,0,0,0,0,0 +DISCLOSES,2009,0,0,0,0,0,0 +DISCONTINUATION,2009,0,0,0,0,0,0 +DISCONTINUES,2009,0,0,0,0,0,0 +DISCOURAGES,2009,0,0,0,0,0,0 +DISCREDITING,2009,0,0,0,0,0,0 +SPECTACULAR,0,2009,0,0,0,0,0 +SPECULATES,0,0,2009,0,0,0,0 +SPECULATIVE,0,0,2009,0,0,0,0 +TRAGEDIES,2009,0,0,0,0,0,0 +TRANSFEROR,0,0,0,2009,0,0,0 +LEGISLATES,0,0,0,2009,0,0,0 +LEGISLATIVE,0,0,0,2009,0,0,0 +LEGISLATURE,0,0,0,2009,0,0,0 +LIBELOUS,0,0,0,2009,0,0,0 +LIENHOLDERS,0,0,0,2011,0,0,0 +COMPULSORY,0,0,0,0,0,0,2009 +CONCEDED,2009,0,0,0,0,0,0 +CONCEIVABLY,0,0,2009,0,0,0,0 +CONCILIATING,2009,0,0,0,0,0,0 +CONCLUSIVELY,0,2009,0,0,0,0,0 +CONDEMNED,2009,0,0,0,0,0,0 +CONDITIONAL,0,0,2009,0,0,0,0 +CONDUCIVE,0,2009,0,0,0,0,0 +CONFESSING,2009,0,0,0,0,0,0 +CONFINED,2009,0,0,0,0,0,2009 +CONFINING,2009,0,0,0,0,0,2009 +CONFISCATING,2009,0,0,0,0,0,0 +CONFLICT,2009,0,0,0,0,0,0 +CONFRONT,2009,0,0,0,0,0,0 +CONFRONTED,2009,0,0,0,0,0,0 +CONFUSED,2009,0,0,0,0,0,0 +CONFUSION,2009,0,2009,0,0,0,0 +CONSENTS,0,0,0,2009,0,0,0 +CONSPIRATOR,2009,0,0,0,0,0,0 +CONSPIRED,2009,0,0,0,0,0,0 +CONSTITUTIONAL,0,0,0,2009,0,0,0 +CONSTITUTIVE,0,0,0,2009,0,0,0 +CONSTRAINS,0,0,0,0,0,0,2009 +CONSTRUCTIVELY,0,2009,0,0,0,0,0 +CONSTRUING,0,0,0,2012,0,0,0 +CONTENDING,2009,0,0,0,0,0,0 +CONTENTIOUS,2009,0,0,0,0,0,0 +CONTESTED,2009,0,0,0,0,0,0 +CONTINGENT,0,0,2009,0,0,0,0 +CONTRACTED,0,0,0,2009,0,0,0 +CONTRACTILE,0,0,0,2009,0,0,0 +CONTRACTS,0,0,0,2009,0,0,0 +CONTRADICTED,2009,0,0,0,0,0,0 +CONTRADICTORY,2009,0,0,0,0,0,0 +CONTRAVENED,0,0,0,2009,0,0,0 +CONTRAVENTIONS,0,0,0,2009,0,0,0 +CONTROVERT,0,0,0,2009,0,0,0 +CONVEYANCE,0,0,0,2009,0,0,0 +CONVICTING,2009,0,0,2009,0,0,0 +CORRECTING,2009,0,0,0,0,0,0 +CORRUPT,2009,0,0,0,0,0,0 +CORRUPTIONS,2009,0,0,0,0,0,0 +COTERMINOUS,0,0,0,2009,0,0,0 +COUNSELLED,0,0,0,2009,0,0,0 +COUNTERCLAIMING,2009,0,0,0,0,0,0 +COUNTERFEITER,2009,0,0,0,0,0,0 +COUNTERMEASURE,2009,0,0,0,0,0,0 +COUNTERSUIT,0,0,0,2011,0,0,0 +COURTROOM,0,0,0,2009,0,0,0 +COVENANTING,0,0,0,0,0,0,2011 +CREATIVENESS,0,2009,0,0,0,0,0 +CRIMINAL,2009,0,0,2009,0,0,0 +CRIMINALLY,2009,0,0,2009,0,0,0 +CRITICAL,-2020,0,0,0,0,0,0 +CRITICIZE,2009,0,0,0,0,0,0 +CROSSCLAIM,0,0,0,2011,0,0,0 +CRUCIAL,2009,0,0,0,0,0,0 +CULPABLY,2009,0,0,0,0,0,0 +CURTAILING,2009,0,0,0,0,0,0 +CUT,2009,0,0,0,0,0,0 +CYBERATTACKS,2014,0,0,0,0,0,0 +CYBERCRIMINAL,2014,0,0,0,0,0,0 +TAINT,2009,0,0,0,0,0,0 +TAMPERED,2009,0,0,0,0,0,0 +TENTATIVE,0,0,2009,0,0,0,0 +TERMINATED,2009,0,0,0,0,0,0 +TERMINATIONS,2009,0,0,0,0,0,0 +TESTIFYING,2009,0,0,2009,0,0,0 +THENCEFORWARD,0,0,0,2009,0,0,0 +THEREIN,0,0,0,2009,0,0,0 +THEREOVER,0,0,0,2011,0,0,0 +THEREUNDER,0,0,0,2009,0,0,0 +THREAT,2009,0,0,0,0,0,0 +THREATENS,2009,0,0,0,0,0,0 +FACTO,0,0,0,2011,0,0,0 +FAILINGS,2009,0,0,0,0,0,0 +FALLOUT,2009,0,0,0,0,0,0 +FALSIFICATIONS,2009,0,0,0,0,0,0 +FALSIFYING,2009,0,0,0,0,0,0 +FATALITY,2009,0,0,0,0,0,0 +FAULTS,2009,0,0,0,0,0,0 +FAVORED,0,2009,0,0,0,0,0 +FEAR,2009,0,0,0,0,0,0 +FELONY,2009,0,0,2009,0,0,0 +DAMAGING,2009,0,0,0,0,0,0 +DANGEROUS,2009,0,0,0,0,0,0 +DEADLOCKED,2009,0,0,0,0,0,0 +DEADWEIGHTS,2009,0,0,0,0,0,0 +DECEASED,2009,0,0,0,0,0,0 +DECEITFUL,2009,0,0,0,0,0,0 +DECEIVES,2009,0,0,0,0,0,0 +DECEPTIVE,2009,0,0,0,0,0,0 +DECLINED,2009,0,0,0,0,0,0 +DECREED,0,0,0,2009,0,0,0 +DEFACED,2009,0,0,0,0,0,0 +DEFAMATION,2009,0,0,0,0,0,0 +DEFAMED,2009,0,0,0,0,0,0 +DEFAULTED,2009,0,0,0,0,0,0 +DEFEASANCES,0,0,0,2011,0,0,0 +DEFEASES,0,0,0,2014,0,0,0 +DEFEATING,2009,0,0,0,0,0,0 +DEFECTIVELY,0,0,0,2009,0,0,0 +DEFENDANT,2009,0,0,2009,0,0,0 +DEFENDS,2009,0,0,0,0,0,0 +DEFICIENCIES,2009,0,0,0,0,0,0 +DEFICITS,2009,0,0,0,0,0,0 +DEFRAUDED,2009,0,0,0,0,0,0 +DEGRADATION,2009,0,0,0,0,0,0 +DEGRADES,2009,0,0,0,0,0,0 +DELAYING,2009,0,0,0,0,0,0 +DELEGATEE,0,0,0,2011,0,0,0 +DELIBERATED,2009,0,0,0,0,0,0 +DELIGHTFUL,0,2009,0,0,0,0,0 +DELINQUENCIES,2009,0,0,0,0,0,0 +DELINQUENTS,2009,0,0,0,0,0,0 +DELISTS,2011,0,0,0,0,0,0 +DEMISING,2009,0,0,0,0,0,0 +DEMOLISHING,2009,0,0,0,0,0,0 +DEMOTED,2009,0,0,0,0,0,0 +DEMOTIONS,2009,0,0,0,0,0,0 +DEMURRING,0,0,0,2009,0,0,0 +DENIED,2009,0,0,0,0,0,0 +DENIGRATES,2009,0,0,0,0,0,0 +DENYING,2009,0,0,0,0,0,0 +DEPENDANCE,0,0,0,0,0,0,2011 +DEPENDENCE,0,0,2009,0,0,0,0 +DEPENDING,0,0,2009,0,0,2009,2011 +DEPLETES,2009,0,0,0,0,0,0 +DEPOSE,0,0,0,2009,0,0,0 +DEPOSITION,0,0,0,2009,0,0,0 +INVALIDATE,2009,0,0,0,0,0,0 +INVALIDATION,2009,0,0,0,0,0,0 +INVENTING,0,2009,0,0,0,0,0 +INVENTIVENESS,0,2009,0,0,0,0,0 +INVESTIGATED,2009,0,0,0,0,0,0 +INVESTIGATIONS,2009,0,0,0,0,0,0 +IRRECONCILABLY,2009,0,0,0,0,0,0 +IRREGULARITIES,2009,0,0,0,0,0,0 +IRREPARABLY,2009,0,0,0,0,0,0 +IRREVOCABLY,0,0,0,2009,0,0,2009 +JUDICIAL,0,0,0,2009,0,0,0 +JURIES,0,0,0,2009,0,0,0 +JURISDICTIONALLY,0,0,0,2011,0,0,0 +JURISTS,0,0,0,2009,0,0,0 +JURYMAN,0,0,0,2009,0,0,0 +KICKBACK,2009,0,0,0,0,0,0 +DIMINISH,2009,0,0,0,0,0,0 +DIMINUTION,2009,0,0,0,0,0,0 +DISADVANTAGED,2009,0,0,0,0,0,0 +DISAFFIRM,0,0,0,2009,0,0,0 +DISAGREE,2009,0,0,0,0,0,0 +DISAGREEMENT,2009,0,0,0,0,0,0 +DISALLOWANCE,2009,0,0,0,0,0,0 +DISALLOWS,2009,0,0,0,0,0,0 +DISAPPEARED,2009,0,0,0,0,0,0 +DISAPPOINTED,2009,0,0,0,0,0,0 +DISAPPOINTMENTS,2009,0,0,0,0,0,0 +DISAPPROVE,2009,0,0,0,0,0,0 +DISASSOCIATES,2009,0,0,0,0,0,0 +DISASTER,2009,0,0,0,0,0,0 +DISAVOW,2009,0,0,0,0,0,0 +DISAVOWS,2009,0,0,0,0,0,0 +GRATUITOUS,2009,0,0,0,0,0,0 +GREATEST,0,2009,0,0,0,0,0 +GRIEVANCES,2009,0,0,0,0,0,0 +HALT,2009,0,0,0,0,0,0 +HAMPERING,2009,0,0,0,0,0,0 +HAPPINESS,0,2009,0,0,0,0,0 +HARASSING,2009,0,0,0,0,0,0 +HARM,2009,0,0,0,0,0,0 +HARMING,2009,0,0,0,0,0,0 +HARSHEST,2009,0,0,0,0,0,0 +HAZARDOUS,2009,0,0,0,0,0,0 +NONINFRINGEMENT,0,0,0,2011,0,0,0 +NONJURISDICTIONAL,0,0,0,2011,0,0,0 +NONPERFORMANCES,2009,0,0,0,0,0,0 +HURTING,2009,0,0,0,0,0,0 +DISFAVORING,2009,0,0,0,0,0,0 +DISGORGEMENT,2009,0,0,0,0,0,0 +COMPLICATE,2009,0,0,0,0,0,0 +COMPLICATION,2009,0,0,0,0,0,0 +COMPLIMENTED,0,2009,0,0,0,0,0 +MISSTATEMENT,2009,0,0,0,0,0,0 +MISSTEP,2009,0,0,0,0,0,0 +MISTAKENLY,2009,0,0,0,0,0,0 +MISTRIALS,2009,0,0,2009,0,0,0 +MISUNDERSTOOD,2009,0,0,0,0,0,0 +MISUSING,2009,0,0,0,0,0,0 +MONOPOLIZE,2009,0,0,0,0,0,0 +MONOPOLY,2009,0,0,0,0,0,0 +MOREOVER,0,0,0,2009,0,0,0 +MUST,0,0,0,0,2009,0,0 +SLIPPAGE,2009,0,0,0,0,0,0 +SLOWDOWNS,2009,0,0,0,0,0,0 +SLOWING,2009,0,0,0,0,0,0 +SLUGGISHLY,2009,0,0,0,0,0,0 +SMOOTHLY,0,2009,0,0,0,0,0 +DEPRESSED,2009,0,0,0,0,0,0 +DEPRIVE,2009,0,0,0,0,0,0 +DERELICT,2009,0,0,0,0,0,0 +DEROGATES,0,0,0,2009,0,0,0 +DEROGATORY,2009,0,0,0,0,0,0 +DESIST,0,0,0,2009,0,0,0 +DESTABILIZED,2009,0,0,0,0,0,0 +DESTROYED,2009,0,0,0,0,0,0 +DESTRUCTIVE,2009,0,0,0,0,0,0 +DETENTION,2009,0,0,0,0,0,0 +DETERIORATED,2009,0,0,0,0,0,0 +DETERIORATIONS,2009,0,0,0,0,0,0 +DETERRENT,2009,0,0,0,0,0,0 +DETRACT,2009,0,0,0,0,0,0 +DETRIMENTAL,2009,0,0,0,0,0,0 +DEVALUED,2009,0,0,0,0,0,0 +DEVASTATED,2009,0,0,0,0,0,0 +DEVIATED,2009,0,2009,0,0,0,0 +DEVIATIONS,2009,0,2009,0,0,0,0 +DEVOLVES,2009,0,0,0,0,0,0 +DICTATES,0,0,0,0,0,0,2009 +DIFFERING,0,0,2009,0,0,0,0 +DIFFICULTLY,2009,0,0,0,0,0,0 +ASCENDANT,0,0,0,2009,0,0,0 +ASSAULTING,2009,0,0,0,0,0,0 +ASSIGNATION,0,0,0,2009,0,0,0 +ASSUMED,0,0,2009,0,0,0,0 +ASSUMPTIONS,0,0,2009,0,0,0,0 +ASSURING,0,2009,0,0,0,0,0 +ATTAINMENT,0,2009,0,0,0,0,0 +ATTESTATION,0,0,0,2009,0,0,0 +ATTORN,0,0,0,2011,0,0,0 +ATTORNS,0,0,0,2011,0,0,0 +AVERSELY,2011,0,0,0,0,0,0 +BAILED,0,0,0,2009,0,0,0 +BAILIFFS,0,0,0,2009,0,0,0 +BALKED,2009,0,0,0,0,0,0 +BANKRUPTED,2009,0,0,0,0,0,0 +CLAIMANT,0,0,0,2009,0,0,0 +CLAIMS,2009,0,0,2009,0,0,0 +CLAWBACKS,0,0,0,2014,0,0,0 +CLOSEOUTS,2009,0,0,0,0,0,0 +CLOSURES,2009,0,0,0,0,0,0 +CODICILS,0,0,0,2009,0,0,0 +CODIFIES,0,0,0,2009,0,0,0 +COERCED,2009,0,0,0,0,0,0 +COERCIVE,2009,0,0,0,0,0,0 +DISINCENTIVES,2009,0,0,0,0,0,0 +COLLABORATE,0,2009,0,0,0,0,0 +COLLABORATION,0,2009,0,0,0,0,0 +COLLABORATORS,0,2009,0,0,0,0,0 +COLLAPSING,2009,0,0,0,0,0,0 +COLLUDED,2009,0,0,0,0,0,0 +COLLUSIONS,2009,0,0,0,0,0,0 +POSITIVE,0,2009,0,0,0,0,0 +POSSIBILITY,0,0,2009,0,0,0,0 +POSTCLOSURE,0,0,0,2011,0,0,0 +POSTPONED,2009,0,0,0,0,0,0 +POSTPONING,2009,0,0,0,0,0,0 +WRIT,0,0,0,2009,0,0,0 +WRITEOFFS,2009,0,0,0,0,0,0 +WRONGDOINGS,2009,0,0,0,0,0,0 +HONORING,0,2009,0,0,0,0,0 +REASSESSES,0,0,2009,0,0,0,0 +REASSIGN,2009,0,0,0,0,0,0 +REASSIGNMENTS,2009,0,0,0,0,0,0 +REBOUNDING,0,2009,0,0,0,0,0 +REBUTTABLY,0,0,0,2011,0,0,0 +REBUTTING,0,0,0,2009,0,0,0 +RECALCULATING,0,0,2009,0,0,0,0 +RECALLED,2009,0,0,0,0,0,0 +RECESSION,2009,0,0,0,0,0,0 +RECKLESSLY,2009,0,0,0,0,0,0 +RECONSIDERING,0,0,2009,0,0,0,0 +RECOUPMENT,0,0,0,2009,0,0,0 +RECTIFICATION,0,0,0,2009,0,0,0 +RECUSED,0,0,0,2011,0,0,0 +REDACTED,2009,0,0,2009,0,0,0 +REDEFAULT,2014,0,0,0,0,0,0 +REDRESSED,2009,0,0,0,0,0,0 +REEXAMINE,0,0,2009,0,0,0,0 +REFERENDUMS,0,0,0,2009,0,0,0 +REFILING,0,0,0,2009,0,0,0 +REFUSAL,2009,0,0,0,0,0,0 +REFUSES,2009,0,0,0,0,0,0 +REGAINING,0,2009,0,0,0,0,0 +REGULATING,0,0,0,2009,0,0,0 +REGULATOR,0,0,0,2009,0,0,0 +REHEARD,0,0,0,2009,0,0,0 +VARIABLES,0,0,2009,0,0,0,0 +VARIANT,0,0,2009,0,0,0,0 +VARIED,0,0,2009,0,0,0,0 +VENDEE,0,0,0,2011,0,0,0 +VERSATILE,0,2009,0,0,0,0,0 +VIBRANCY,0,2009,0,0,0,0,0 +VIOLATED,2009,0,0,0,0,0,0 +VIOLATIONS,2009,0,0,0,0,0,0 +VIOLENCE,2009,0,0,0,0,0,0 +VITIATED,2009,0,0,0,0,0,0 +VOIDABLE,0,0,0,2009,0,0,0 +VOLATILITIES,0,0,2009,0,0,0,0 +VULNERABLE,2009,0,0,0,0,0,0 +WARNING,2009,0,0,0,0,0,0 +WARRANTOR,0,0,0,2011,0,0,0 +WEAK,2009,0,0,0,0,0,0 +WEAKENS,2009,0,0,0,0,0,0 +WEAKNESS,2009,0,0,0,0,0,0 +DISHONOR,2009,0,0,0,0,0,0 +DISHONORING,2009,0,0,0,0,0,0 +DISINTERESTED,2009,0,0,0,0,0,0 +DISLOYALLY,2009,0,0,0,0,0,0 +DISMISS,2009,0,0,0,0,0,0 +DISMISSES,2009,0,0,0,0,0,0 +DISPARAGED,2009,0,0,0,0,0,0 +DISPARAGING,2009,0,0,0,0,0,0 +DISPLACE,2009,0,0,0,0,0,0 +DISPLACES,2009,0,0,0,0,0,0 +DISPOSSESS,2009,0,0,0,0,0,0 +DISPOSSESSION,0,0,0,2009,0,0,0 +DISPROPORTIONATE,2009,0,0,0,0,0,0 +DISPUTES,2009,0,0,0,0,0,0 +DISQUALIFIED,2009,0,0,0,0,0,0 +DISREGARD,2009,0,0,0,0,0,0 +DISREPUTABLE,2009,0,0,0,0,0,0 +DISRUPTING,2009,0,0,0,0,0,0 +DISRUPTS,2009,0,0,0,0,0,0 +DISSENTED,2009,0,0,0,0,0,0 +DISSENTS,2009,0,0,0,0,0,0 +DISSOLUTIONS,2009,0,0,0,0,0,0 +DISTINCTIVELY,0,2009,0,0,0,0,0 +DISTORTING,2009,0,0,0,0,0,0 +DISTRACT,2009,0,0,0,0,0,0 +DISTRACTIONS,2009,0,0,0,0,0,0 +DISTRESSED,2009,0,0,0,0,0,0 +DISTURBANCE,2009,0,0,0,0,0,0 +DISTURBS,2009,0,0,0,0,0,0 +DIVERTING,2009,0,0,0,0,0,0 +DIVESTING,2009,0,0,0,0,0,0 +DIVESTMENTS,2009,0,0,0,0,0,0 +DIVULGE,2009,0,0,0,0,0,0 +DOCKET,0,0,0,2009,0,0,0 +DONEES,0,0,0,2011,0,0,0 +DOUBTS,2009,0,2009,0,0,0,0 +DOWNGRADING,2009,0,0,0,0,0,0 +DOWNSIZING,2009,0,0,0,0,0,0 +DOWNTURN,2009,0,0,0,0,0,0 +DRAG,2009,0,0,0,0,0,0 +DRAWBACKS,2009,0,0,0,0,0,0 +DROUGHTS,2009,0,0,0,0,0,0 +DYSFUNCTIONAL,2009,0,0,0,0,0,0 +EARMARKING,0,0,0,0,0,0,2009 +EASING,2009,0,0,0,0,0,0 +EFFICIENCY,0,2009,0,0,0,0,0 +EGREGIOUSLY,2009,0,0,0,0,0,0 +EMBARGOES,2009,0,0,0,0,0,0 +EMBARRASSES,2009,0,0,0,0,0,0 +EMBEZZLE,2009,0,0,0,0,0,0 +EMBEZZLER,2009,0,0,0,0,0,0 +EMPOWERED,0,2009,0,0,0,0,0 +ENABLED,0,2009,0,0,0,0,0 +ENCOURAGEMENT,0,2009,0,0,0,0,0 +ENCROACHED,2009,0,0,0,0,0,0 +ENCROACHMENTS,2009,0,0,0,0,0,0 +ENCUMBERS,2009,0,0,2009,0,0,2009 +ENCUMBRANCES,2009,0,0,2009,0,0,2009 +ENDANGERMENT,2009,0,0,0,0,0,0 +ENFORCEABLE,0,0,0,2009,0,0,0 +ENHANCEMENT,0,2009,0,0,0,0,0 +ENJOIN,2009,0,0,0,0,0,0 +ENJOY,0,2009,0,0,0,0,0 +ENJOYING,0,2009,0,0,0,0,0 +ENTAILED,0,0,0,0,0,0,2009 +PENALIZE,2009,0,0,0,0,0,0 +PENALTIES,2009,0,0,0,0,0,0 +PERFECTED,0,2009,0,0,0,0,0 +PERIL,2009,0,0,0,0,0,0 +PERMISSION,0,0,0,0,0,0,2009 +PERMITTEES,0,0,0,2011,0,0,0 +PERPETRATES,2009,0,0,2009,0,0,0 +PERSISTED,2009,0,0,0,0,0,0 +PERSISTING,2009,0,0,0,0,0,0 +PERVASIVELY,2009,0,0,0,0,0,0 +PETITIONER,0,0,0,2009,0,0,0 +PETTY,2009,0,0,0,0,0,0 +HEREAFTER,0,0,0,2009,0,0,0 +HEREFORE,0,0,0,2014,0,0,0 +HEREINAFTER,0,0,0,2009,0,0,0 +HEREON,0,0,0,2009,0,0,0 +HEREUNTO,0,0,0,2009,0,0,0 +HIDDEN,0,0,2009,0,0,0,0 +HINDERING,2009,0,0,0,0,0,0 +HINGES,0,0,2009,0,0,0,0 +WHEREABOUTS,0,0,0,2009,0,0,0 +WHEREFORE,0,0,0,2009,0,0,0 +WHERETO,0,0,0,2009,0,0,0 +WHISTLEBLOWERS,0,0,0,2011,0,0,0 +WILFUL,0,0,0,2009,0,0,0 +WILLFULNESS,0,0,0,2009,0,0,0 +WINNING,0,2009,0,0,0,0,0 +FLUCTUATE,0,0,2009,0,0,0,0 +FLUCTUATION,0,0,2009,0,0,0,0 +FORBEARANCE,0,0,0,2009,0,0,0 +FORBID,2009,0,0,0,0,0,2009 +FORCE,-2020,0,0,0,0,0,0 +FOREBEARANCE,0,0,0,2011,0,0,0 +FORECLOSES,2009,0,0,0,0,0,0 +FOREGO,2009,0,0,0,0,0,0 +FORESTALLED,2009,0,0,0,0,0,0 +FORFEITABILITY,0,0,0,2011,0,0,0 +FORFEITS,2009,0,0,0,0,0,0 +FORGERY,2009,0,0,0,0,0,0 +FRAUDS,2009,0,0,0,0,0,0 +FRIENDLY,0,2009,0,0,0,0,0 +FRUSTRATED,2009,0,0,0,0,0,0 +FRUSTRATION,2009,0,0,0,0,0,0 +FURTHERANCE,0,0,0,2009,0,0,0 +GAINS,0,2009,0,0,0,0,0 +DISGORGEMENTS,2009,0,0,0,0,0,0 +DISGRACEFUL,2009,0,0,0,0,0,0 +LITIGATE,2009,0,0,2009,0,0,0 +LITIGATION,2009,0,0,2009,0,0,0 +LITIGIOUS,0,0,0,2009,0,0,0 +LACKED,2009,0,0,0,0,0,0 +LAG,2009,0,0,0,0,0,0 +LAPSE,2009,0,0,0,0,0,0 +LATE,-2020,0,0,0,0,0,0 +LAWFULLY,0,0,0,2009,0,0,0 +LAWS,0,0,0,2009,0,0,0 +LAWYERS,0,0,0,2009,0,0,0 +LEADING,0,2009,0,0,0,0,0 +LEGALIZATION,0,0,0,2009,0,0,0 +LEGALIZES,0,0,0,2009,0,0,0 +LEGATEE,0,0,0,2009,0,0,0 +FLAWED,2009,0,0,0,0,0,0 +NONRECOVERABLE,2009,0,0,0,0,0,0 +LIQUIDATES,2009,0,0,0,0,0,0 +LIQUIDATOR,2009,0,0,0,0,0,0 +BENEFICIATION,0,0,0,2011,0,0,0 +BENEFITTED,0,2009,0,0,0,0,0 +POOR,2009,0,0,0,0,0,0 +REINTERPRETATION,0,0,2009,0,0,0,0 +REINTERPRETS,0,0,2009,0,0,0,0 +REJECTION,2009,0,0,0,0,0,0 +RELINQUISH,2009,0,0,0,0,0,0 +RELINQUISHMENT,2009,0,0,0,0,0,0 +REMAND,0,0,0,2009,0,0,0 +REMEDIATE,0,0,0,2009,0,0,0 +REMEDIATIONS,0,0,0,2009,0,0,0 +RENEGOTIATED,2009,0,0,0,0,0,0 +RENEGOTIATIONS,2009,0,0,0,0,0,0 +RENOUNCEMENTS,2009,0,0,0,0,0,0 +REPARATIONS,2009,0,0,0,0,0,0 +REPOSSESSES,2009,0,0,0,0,0,0 +REPRORATED,0,0,0,2018,0,0,0 +TROUBLED,2009,0,0,0,0,0,0 +UNABLE,2009,0,0,0,0,0,0 +UNAMBIGUOUSLY,0,0,0,0,2009,0,0 +UNAPPEALED,0,0,0,2011,0,0,0 +UNAVAILABILITY,2009,0,0,0,0,0,2011 +UNAWARE,2009,0,0,0,0,0,0 +UNCERTAINTY,0,0,2009,0,0,0,0 +UNCOLLECTIBILITY,2009,0,0,0,0,0,0 +UNCOMPLETED,2009,0,0,0,0,0,0 +UNCONSCIONABLY,2009,0,0,0,0,0,0 +UNCONTRACTED,0,0,0,2011,0,0,0 +UNCORRECTED,2009,0,0,0,0,0,0 +UNCOVERS,2009,0,0,0,0,0,0 +UNDELIVERABLE,2009,0,0,0,0,0,0 +UNDERCUTS,2009,0,0,0,0,0,0 +UNDERESTIMATES,2009,0,0,0,0,0,0 +UNDERINSURED,2009,0,0,0,0,0,0 +UNDERMINING,2009,0,0,0,0,0,0 +UNDERPAYS,2009,0,0,0,0,0,0 +UNDERPERFORMING,2009,0,0,0,0,0,0 +UNDERREPORTING,2011,0,0,0,0,0,0 +UNDERSTATEMENTS,2009,0,0,0,0,0,0 +UNDERUTILIZED,2009,0,0,0,0,0,0 +UNDETECTABLE,0,0,2009,0,0,0,0 +UNDISCHARGED,0,0,0,2009,0,0,0 +UNDOUBTEDLY,0,0,0,0,2009,0,0 +UNECONOMICAL,2009,0,0,0,0,0,0 +UNENCUMBER,0,0,0,2014,0,0,0 +UNEQUIVOCAL,0,0,0,0,2009,0,0 +UNEXCUSED,2009,0,0,0,0,0,0 +UNFAIRLY,2009,0,0,0,0,0,0 +UNFAVORABLE,2009,0,0,0,0,0,0 +UNFIT,2009,0,0,0,0,0,0 +UNFORESEEN,2009,0,0,0,0,0,0 +UNFOUNDED,2009,0,0,0,0,0,0 +UNGUARANTEED,0,0,2009,0,0,0,0 +UNINSURED,2009,0,0,0,0,0,0 +UNJUST,2009,0,0,0,0,0,0 +UNJUSTLY,2009,0,0,0,0,0,0 +UNKNOWNS,0,0,2009,0,0,0,0 +UNLICENSED,2009,0,0,0,0,0,0 +UNMERCHANTABLE,2011,0,0,0,0,0,0 +UNNEEDED,2009,0,0,0,0,0,0 +UNPAID,2009,0,0,0,0,0,0 +UNPOPULAR,2009,0,0,0,0,0,0 +UNPREDICTED,2011,0,2011,0,0,0,0 +UNPROVED,0,0,2009,0,0,0,0 +UNQUANTIFIED,0,0,2011,0,0,0,0 +UNREASONABLY,2009,0,0,0,0,0,0 +UNRECOVERED,2009,0,0,0,0,0,0 +UNREMEDIED,2009,0,0,0,0,0,0 +UNSAFE,2009,0,0,0,0,0,0 +UNSATISFIED,2009,0,0,0,0,0,0 +UNSEASONABLY,0,0,2009,0,0,0,0 +UNSOUND,2009,0,0,0,0,0,0 +UNSTABLE,2009,0,0,0,0,0,0 +UNSUCCESSFULLY,2009,0,0,0,0,0,0 +UNSUITED,2009,0,0,0,0,0,0 +UNSUSPECTING,2009,0,0,0,0,0,0 +UNTIMELY,2009,0,0,0,0,0,0 +UNTRUTHFUL,2009,0,0,0,0,0,0 +UNUSABLE,2009,0,0,0,0,0,0 +UNWARRANTED,2009,0,0,0,0,0,0 +UNWRITTEN,0,0,2009,0,0,0,0 +URGENCY,2009,0,0,0,0,0,0 +USURPATION,0,0,0,2009,0,0,0 +USURY,2009,0,0,2009,0,0,0 +VAGUENESS,0,0,2012,0,0,0,0 +VALUABLE,0,2009,0,0,0,0,0 +PLEAD,2009,0,0,0,0,0,0 +PLEADS,2009,0,0,2009,0,0,0 +PLEASED,0,2009,0,0,0,0,0 +PLEDGED,0,0,0,0,0,0,2009 +PLEDGING,0,0,0,0,0,0,2009 +COMPEL,0,0,0,0,0,0,2011 +COMPENSATORY,0,0,0,2009,0,0,0 +COMPLAINED,2009,0,0,0,0,0,0 +COMPLAINTS,2009,0,0,0,0,0,0 +COMMITMENT,0,0,0,0,0,0,2009 +COMMITTING,0,0,0,0,0,0,2009 +LIMITATION,2009,0,0,0,0,0,0 +LINGERING,2009,0,0,0,0,0,0 +RESTRAINING,0,0,0,0,0,0,2009 +RESTRICT,0,0,0,0,0,0,2009 +RESTRICTIONS,0,0,0,0,0,0,2009 +RESTRICTS,0,0,0,0,0,0,2009 +RESTRUCTURING,2009,0,0,0,0,0,0 +RETALIATES,2009,0,0,0,0,0,0 +RETALIATORY,2009,0,0,0,0,0,0 +PRECAUTIONS,0,0,2009,0,0,0,0 +PRECLUDE,2009,0,0,0,0,0,2009 +PRECONDITION,0,0,0,0,0,0,2009 +PREDECEASED,0,0,0,2009,0,0,0 +PREDICTABILITY,0,0,2009,0,0,0,0 +PREDICTIONS,0,0,2009,0,0,0,0 +PREDICTS,0,0,2009,0,0,0,0 +PREJUDICE,2009,0,0,2009,0,0,0 +PREJUDICING,2009,0,0,2009,0,0,0 +PREMATURELY,2009,0,0,0,0,0,0 +PRESET,0,0,0,0,0,0,2009 +PRESUMABLY,0,0,2009,0,0,0,0 +PRESUMING,0,0,2009,0,0,0,0 +PRETRIAL,2009,0,0,2009,0,0,0 +PREVENTION,2009,0,0,0,0,0,0 +PROACTIVE,0,2009,0,0,0,0,0 +PROBABILITY,0,0,2009,0,0,0,0 +PROBATED,0,0,0,2009,0,0,0 +PROBATIONAL,0,0,0,2009,0,0,0 +PROBATIONS,0,0,0,2009,0,0,0 +PROBLEMS,2009,0,0,0,0,0,0 +PROFITABILITY,0,2009,0,0,0,0,0 +PROGRESSED,0,2009,0,0,0,0,0 +PROHIBITED,0,0,0,0,0,0,2009 +PROHIBITIVE,0,0,0,0,0,0,2009 +PROLONG,2009,0,0,0,0,0,0 +PROLONGING,2009,0,0,0,0,0,0 +PROMULGATES,0,0,0,2009,0,0,0 +PROMULGATOR,0,0,0,2009,0,0,0 +PRORATION,0,0,0,2009,0,0,0 +PROSECUTING,2009,0,0,2009,0,0,0 +PROSECUTORIAL,0,0,0,2011,0,0,0 +PROSPERITY,0,2009,0,0,0,0,0 +PROTESTED,2009,0,0,0,0,0,0 +PROTESTOR,2009,0,0,0,0,0,0 +PROTRACTION,2009,0,0,0,0,0,0 +PROVOKE,2009,0,0,0,0,0,0 +PUNISHABLE,0,0,0,2009,0,0,0 +PUNISHMENT,2009,0,0,0,0,0,0 +PURPORTED,2009,0,0,0,0,0,0 +QUESTION,2009,0,0,0,0,0,0 +QUESTIONING,2009,0,0,0,0,0,0 +QUITCLAIMS,0,0,0,2009,0,0,0 +RANDOM,0,0,2009,0,0,0,0 +RANDOMIZING,0,0,2009,0,0,0,0 +RATABLE,0,0,0,2009,0,0,0 +RATIONALIZE,2009,0,0,0,0,0,0 +ABANDONED,2009,0,0,0,0,0,0 +ABANDONS,2009,0,0,0,0,0,0 +ABDICATION,2009,0,0,0,0,0,0 +ABERRATIONAL,2009,0,0,0,0,0,0 +ABEYANCES,0,0,2009,0,0,0,0 +ABNORMAL,2009,0,0,0,0,0,0 +ABOLISH,2009,0,0,0,0,0,0 +ABOVEMENTIONED,0,0,0,2011,0,0,0 +ABROGATING,2009,0,0,2009,0,0,0 +ABRUPTLY,2009,0,0,0,0,0,0 +ABSENTEEISM,2009,0,0,0,0,0,0 +ABSOLVING,0,0,0,2009,0,0,0 +ABUSED,2009,0,0,0,0,0,0 +ABUSIVELY,2009,0,0,0,0,0,0 +ACCIDENT,2009,0,0,0,0,0,0 +ACCLAIMED,0,2009,0,0,0,0,0 +ACCOMPLISHING,0,2009,0,0,0,0,0 +ACCUSATIONS,2009,0,0,0,0,0,0 +ACCUSING,2009,0,0,0,0,0,0 +ACHIEVEMENTS,0,2009,0,0,0,0,0 +ACQUIESCED,2009,0,0,0,0,0,0 +ACQUIRORS,0,0,0,2011,0,0,0 +ACQUITTALS,2009,0,0,2009,0,0,0 +ACQUITTING,2009,0,0,2009,0,0,0 +ADJOURNED,0,0,0,2009,0,0,0 +ADJOURNS,0,0,0,2009,0,0,0 +ADJUDGING,0,0,0,2009,0,0,0 +ADJUDICATING,0,0,0,2009,0,0,0 +ADJUDICATOR,0,0,0,2009,0,0,0 +ADMISSIBLE,0,0,0,2009,0,0,0 +ADULTERATE,2009,0,0,0,0,0,0 +ADULTERATIONS,2009,0,0,0,0,0,0 +ADVANCING,0,2009,0,0,0,0,0 +ADVANTAGEOUSLY,0,2009,0,0,0,0,0 +ADVERSARY,2009,0,0,0,0,0,0 +ADVERSITY,2009,0,0,0,0,0,0 +AFFREIGHTMENT,0,0,0,2012,0,0,0 +AFORESTATED,0,0,0,2011,0,0,0 +AGGRAVATE,2009,0,0,0,0,0,0 +AGGRAVATION,2009,0,0,0,0,0,0 +ALERTING,2009,0,0,0,0,0,0 +ALIENATING,2009,0,0,0,0,0,0 +ALLEGATIONS,2009,0,0,2009,0,0,0 +ALLEGES,2009,0,0,2009,0,0,0 +ALMOST,0,0,2009,0,0,2009,0 +AMBIGUITIES,0,0,2009,0,0,0,0 +AMENDABLE,0,0,0,2009,0,0,0 +AMENDMENT,0,0,0,2009,0,0,0 +ANNOYANCE,2009,0,0,0,0,0,0 +ANNOYS,2009,0,0,0,0,0,0 +ANNULMENT,2009,0,0,0,0,0,0 +ANOMALOUS,2009,0,2009,0,0,0,0 +ANTECEDENTS,0,0,0,2009,0,0,0 +ANTICIPATING,0,0,2009,0,0,0,0 +ANTICORRUPTION,0,0,0,2014,0,0,0 +APPARENTLY,0,0,2009,0,0,2009,0 +APPEALING,0,0,0,2009,0,0,0 +APPEARING,0,0,2009,0,0,2009,0 +APPELLATE,0,0,0,2009,0,0,0 +APPROXIMATED,0,0,2009,0,0,0,0 +APPROXIMATION,0,0,2009,0,0,0,0 +APPURTENANT,0,0,0,2009,0,0,0 +ARBITRARINESS,0,0,2009,0,0,0,0 +ARBITRATES,0,0,0,2009,0,0,0 +ARBITRATIONS,0,0,0,2009,0,0,0 +ARGUE,2009,0,0,0,0,0,0 +ARGUMENTATIVE,2009,0,0,0,0,0,0 +ARREARS,2009,0,0,0,0,0,0 +ARTIFICIALLY,2009,0,0,0,0,0,0 +RETRIBUTION,2009,0,0,0,0,0,0 +RETROCESSIONAIRES,0,0,0,2011,0,0,0 +BOLSTERS,0,2009,0,0,0,0,0 +BOOMING,0,2009,0,0,0,0,0 +BOTTLENECKS,2009,0,0,0,0,0,0 +BOYCOTTED,2009,0,0,0,0,0,0 +BREACHED,2009,0,0,2009,0,0,0 +BREAKAGE,2009,0,0,0,0,0,0 +BREAKING,-2020,0,0,0,0,0,0 +BRIBE,2009,0,0,0,0,0,0 +BRIBES,2009,0,0,0,0,0,0 +BROKEN,-2020,0,0,0,0,0,0 +BURDENS,2009,0,0,0,0,0,0 +CALAMITOUS,2009,0,0,0,0,0,0 +CANCELING,2009,0,0,0,0,0,0 +CANCELLING,2009,0,0,0,0,0,0 +CARELESSNESS,2009,0,0,0,0,0,0 +CATASTROPHIC,2009,0,0,0,0,0,0 +CAUTIONED,2009,0,0,0,0,0,0 +CAUTIOUSLY,0,0,2009,0,0,0,0 +CEASES,2009,0,0,0,0,0,0 +CENSURE,2009,0,0,0,0,0,0 +CERTIORARI,0,0,0,2011,0,0,0 +CHALLENGES,2009,0,0,0,0,0,0 +CHATTEL,0,0,0,2009,0,0,0 +CIRCUMVENTED,2009,0,0,0,0,0,0 +CIRCUMVENTS,2009,0,0,0,0,0,0 +SHALL,0,0,0,2009,0,0,0 +SHORTAGES,2009,0,0,0,0,0,0 +SHRINKAGES,2009,0,0,0,0,0,0 +SHUTS,2009,0,0,0,0,0,0 +SLANDEROUS,2009,0,0,0,0,0,0 +REPUDIATING,2009,0,0,0,0,0,0 +REQUESTOR,0,0,0,2011,0,0,0 +REQUIREMENTS,0,0,0,0,0,0,2009 +RESCIND,0,0,0,2009,0,0,0 +RESCISSION,0,0,0,2009,0,0,0 +RESIGNATIONS,2009,0,0,0,0,0,0 +RESOLVE,0,2009,0,0,0,0,0 +RESTATEMENTS,2009,0,0,0,0,0,0 +NOTARIES,0,0,0,2009,0,0,0 +NOTARIZED,0,0,0,2009,0,0,0 +NOVO,0,0,0,2011,0,0,0 +NULLIFICATIONS,2009,0,0,2009,0,0,0 +NULLIFYING,2009,0,0,2009,0,0,0 +OBJECTING,2009,0,0,0,0,0,0 +OBJECTIONS,2009,0,0,0,0,0,0 +OBLIGATING,0,0,0,0,0,0,2009 +OBLIGE,0,0,0,0,0,0,2009 +OBLIGES,0,0,0,0,0,0,2009 +OBSCENITY,2009,0,0,0,0,0,0 +OBSTACLES,2009,0,0,0,0,0,0 +OBSTRUCTION,2009,0,0,0,0,0,0 +OFFENCES,2009,0,0,0,0,0,0 +OFFENDERS,2009,0,0,0,0,0,0 +OFFEREE,0,0,0,2009,0,0,0 +OMISSION,2009,0,0,0,0,0,0 +OMITTED,2009,0,0,0,0,0,0 +OPPORTUNISTICALLY,2009,0,0,0,0,0,0 +OPPOSED,2009,0,0,0,0,0,0 +OPPOSITIONS,2009,0,0,0,0,0,0 +ORDINARILY,0,0,2009,0,0,0,0 +OUTMODED,2009,0,0,0,0,0,0 +OUTPERFORMS,0,2009,0,0,0,0,0 +OVERBUILDING,2009,0,0,0,0,0,0 +OVERBURDENED,2009,0,0,0,0,0,0 +OVERCHARGE,2009,0,0,0,0,0,0 +OVERCOME,2009,0,0,0,0,0,0 +OVERESTIMATE,2009,0,0,0,0,0,0 +OVERESTIMATION,2009,0,0,0,0,0,0 +OVERLOADING,2009,0,0,0,0,0,0 +OVERLOOKING,2009,0,0,0,0,0,0 +OVERPAYMENTS,2009,0,0,0,0,0,0 +OVERPRODUCTION,2009,0,0,0,0,0,0 +OVERRULING,0,0,0,2009,0,0,0 +OVERSHADOW,2009,0,0,0,0,0,0 +OVERSTATE,2009,0,0,0,0,0,0 +OVERSTATES,2009,0,0,0,0,0,0 +OVERSUPPLY,2009,0,0,0,0,0,0 +OVERTURNED,2009,0,0,0,0,0,0 +OVERVALUED,2009,0,0,0,0,0,0 +PARA,0,0,0,-2020,0,0,0 +NECESSITATED,0,0,0,0,0,0,2009 +NEGATIVELY,2009,0,0,0,0,0,0 +NEGLECTFUL,2009,0,0,0,0,0,0 +NEGLIGENCES,2009,0,0,0,0,0,0 +NOLO,0,0,0,2011,0,0,0 +BEAUTIFUL,0,2009,0,0,0,0,0 +BELIEVES,0,0,2009,0,0,0,0 +IDEAL,0,2009,0,0,0,0,0 +IGNORE,2009,0,0,0,0,0,0 +ILL,2009,0,0,0,0,0,0 +ILLEGALLY,2009,0,0,0,0,0,0 +ILLIQUID,2009,0,0,0,0,0,0 +IMMATERIALITY,0,0,0,2009,0,0,0 +IMPAIRED,2009,0,0,0,0,0,2011 +IMPAIRS,2009,0,0,0,0,0,2011 +IMPEDED,2009,0,0,0,0,0,0 +IMPEDING,2009,0,0,0,0,0,0 +IMPERFECTIONS,2009,0,0,0,0,0,0 +IMPLICATE,2009,0,0,0,0,0,0 +IMPOSE,0,0,0,0,0,0,2009 +IMPOSITION,0,0,0,0,0,0,2009 +IMPOUND,2009,0,0,0,0,0,0 +IMPRACTICABLE,2009,0,0,0,0,0,0 +IMPRECISE,0,0,2009,0,0,0,0 +IMPRESSED,0,2009,0,0,0,0,0 +IMPRESSIVELY,0,2009,0,0,0,0,0 +IMPROPER,2009,0,0,0,0,0,0 +IMPROVE,0,2009,0,0,0,0,0 +IMPROVES,0,2009,0,0,0,0,0 +INABILITY,2009,0,0,0,0,0,0 +INACCURATE,2009,0,0,0,0,0,0 +INACTIVATE,2009,0,0,0,0,0,0 +INACTIVATION,2009,0,0,0,0,0,0 +INADEQUACY,2009,0,0,0,0,0,0 +INADVERTENTLY,2009,0,0,0,0,0,0 +INAPPROPRIATELY,2009,0,0,0,0,0,0 +INCAPACITATED,2009,0,0,0,0,0,0 +INCARCERATES,2009,0,0,2009,0,0,0 +INCHOATE,0,0,0,2009,0,0,0 +INCIDENTS,2009,0,0,0,0,0,0 +INCOMPETENCE,2009,0,0,0,0,0,0 +INCOMPETENTS,2009,0,0,0,0,0,0 +INCONCLUSIVE,2009,0,0,0,0,0,0 +INCONSISTENTLY,2009,0,0,0,0,0,0 +INCONVENIENCES,2009,0,0,0,0,0,0 +INCORRECTNESS,2009,0,0,0,0,0,0 +INDECENCY,2009,0,0,0,0,0,0 +INDEFINITE,0,0,2009,0,0,0,0 +INDEMNIFICATION,0,0,0,2009,0,0,0 +INDEMNIFY,0,0,0,2009,0,0,0 +INDEMNITIES,0,0,0,2009,0,0,0 +INDETERMINABLE,0,0,2009,0,0,0,0 +INDICTED,2009,0,0,2009,0,0,0 +INDORSEES,0,0,0,2011,0,0,0 +INEFFICIENCIES,2009,0,0,0,0,0,0 +INELIGIBILITY,2009,0,0,0,0,0,0 +INEQUITIES,2009,0,0,0,0,0,0 +INEXACTNESS,0,0,2009,0,0,0,0 +INFLICTED,2009,0,0,0,0,0,0 +INFRACTION,2009,0,0,2009,0,0,0 +INFRINGEMENT,2009,0,0,0,0,0,0 +INFRINGING,2009,0,0,0,0,0,0 +INHIBITING,0,0,0,0,0,0,2011 +INJUNCTIONS,2009,0,0,2009,0,0,0 +INJURES,2009,0,0,0,0,0,0 +INJURY,2009,0,0,0,0,0,0 +INNOVATING,0,2009,0,0,0,0,0 +INNOVATIVENESS,0,2011,0,0,0,0,0 +INORDINATELY,2009,0,0,0,0,0,0 +INSIGHTFUL,0,2009,0,0,0,0,0 +INSISTING,0,0,0,0,0,0,2009 +INSOLVENCY,2009,0,0,0,0,0,0 +INSTABILITIES,0,0,2009,0,0,0,0 +INSUFFICIENT,2009,0,0,0,0,0,0 +INTANGIBLE,0,0,2009,0,0,0,0 +INTERFERE,2009,0,0,0,0,0,0 +INTERFERES,2009,0,0,0,0,0,0 +INTERMITTENTLY,2009,0,0,0,0,0,0 +INTERPOSES,0,0,0,2009,0,0,0 +INTERROGATE,0,0,0,2009,0,0,0 +INTERROGATION,0,0,0,2009,0,0,0 +INTERROGATORS,0,0,0,2009,0,0,0 +INTERRUPTING,2009,0,0,0,0,0,0 +INTESTACY,0,0,0,2009,0,0,0 +STABILIZATION,0,2009,0,0,0,0,0 +STABILIZES,0,2009,0,0,0,0,0 +STAGNANT,2009,0,0,0,0,0,0 +STAGNATING,2009,0,0,0,0,0,0 +STATUTE,0,0,0,2009,0,0,0 +STIPULATE,0,0,0,0,0,0,2009 +STIPULATION,0,0,0,0,0,0,2009 +STOPPAGES,2009,0,0,0,0,0,0 +STRAIN,2009,0,0,0,0,0,0 +STRENGTH,0,2009,0,0,0,0,0 +STRENGTHENS,0,2009,0,0,0,0,0 +STRESSES,2009,0,0,0,0,0,0 +STRICTER,0,0,0,0,0,0,2009 +STRONG,0,2009,0,0,0,0,0 +SUBCLAUSE,0,0,0,2009,0,0,0 +SUBJECTING,2009,0,0,0,0,0,0 +SUBLESSORS,0,0,0,2011,0,0,0 +SUBPARAGRAPHS,0,0,0,2009,0,0,0 +SUBROGATED,0,0,0,2009,0,0,0 +SUBTRUSTS,0,0,0,2011,0,0,0 +SUCCEEDS,0,2009,0,0,0,0,0 +SUCCESSFULLY,0,2009,0,0,0,0,0 +SUED,2009,0,0,2009,0,0,0 +SUFFERING,2009,0,0,0,0,0,0 +SUGGESTING,0,0,2009,0,0,0,0 +SUMMONING,2009,0,0,2009,0,0,0 +SUPERSEDE,0,0,0,2009,0,0,0 +SUPERSEDING,0,0,0,2009,0,0,0 +SURPASSED,0,2009,0,0,0,0,0 +SUSCEPTIBLE,2009,0,0,0,0,0,0 +SUSPEND,2009,0,0,0,0,0,0 +SUSPENSION,2009,0,0,0,0,0,0 +SUSPICIOUS,2009,0,0,0,0,0,0 +REVOCATION,2009,0,0,2009,0,0,0 +REVOKES,2009,0,0,0,0,0,0 +REVOLUTIONIZES,0,2009,0,0,0,0,0 +REWARDING,0,2009,0,0,0,0,0 +RIDICULES,2009,0,0,0,0,0,0 +RISKIER,2009,0,2009,0,0,0,0 +RISKS,0,0,2009,0,0,0,0 +RULINGS,0,0,0,2009,0,0,0 +SACRIFICED,2009,0,0,0,0,0,0 +SATISFACTION,0,2009,0,0,0,0,0 +SATISFIES,0,2009,0,0,0,0,0 +SCANDALS,2009,0,0,0,0,0,0 +SCRUTINIZING,2009,0,0,0,0,0,0 +SEIZE,2009,0,0,0,0,0,0 +SELDOM,0,0,2009,0,0,2009,0 +SEQUESTRATOR,0,0,0,2009,0,0,0 +SETBACK,2009,0,0,0,0,0,0 +SEVER,2009,0,0,0,0,0,0 +SEVERANCE,0,0,0,2009,0,0,0 +SEVERELY,2009,0,0,0,0,0,0 +ENTRENCH,0,0,0,0,0,0,2009 +ERODES,2009,0,0,0,0,0,0 +ERRATICALLY,2009,0,0,0,0,0,0 +ERRONEOUSLY,2009,0,0,0,0,0,0 +ESCALATE,2009,0,0,0,0,0,0 +ESCHEAT,0,0,0,2011,0,0,0 +ESCROWED,0,0,0,0,0,0,2009 +EVADE,2009,0,0,0,0,0,0 +EVASION,2009,0,0,0,0,0,0 +EVICTED,2009,0,0,0,0,0,0 +EVICTS,2009,0,0,0,0,0,0 +EXACERBATED,2009,0,0,0,0,0,0 +EXACERBATIONS,2009,0,0,0,0,0,0 +EXAGGERATING,2009,0,0,0,0,0,0 +EXCEEDENCES,0,0,0,2011,0,0,0 +EXCELS,0,2009,0,0,0,0,0 +EXCESSIVELY,2009,0,0,0,0,0,0 +EXCITING,0,2009,0,0,0,0,0 +EXCLUSIVES,0,2009,0,0,0,0,0 +EXCULPATES,2009,0,0,2009,0,0,0 +EXCULPATORY,2009,0,0,2009,0,0,0 +EXECUTRICES,0,0,0,2009,0,0,0 +EXONERATE,2009,0,0,0,0,0,0 +EXONERATION,2009,0,0,0,0,0,0 +EXPLOITATIONS,2009,0,0,0,0,0,0 +EXPLOITS,2009,0,0,0,0,0,0 +EXPOSING,2009,0,0,0,0,0,0 +EXPROPRIATED,2009,0,0,0,0,0,0 +EXPROPRIATIONS,2009,0,0,0,0,0,0 +EXTRACONTRACTUAL,0,0,0,2011,0,0,0 +SOLVENCIES,2009,0,0,0,0,0,0 +SOMETIME,0,0,2009,0,0,0,0 +SPAM,2014,0,0,0,0,0,0 +TRAUMATIC,2009,0,0,0,0,0,0 +LOSES,2009,0,0,0,0,0,0 +LOST,2009,0,0,0,0,0,0 +LYING,2009,0,0,0,0,0,0 +MALFUNCTIONED,2009,0,0,0,0,0,0 +MALICIOUS,2009,0,0,0,0,0,0 +MANDATE,0,0,0,0,0,0,2009 +MANDATORY,0,0,0,0,0,0,2009 +MANIPULATES,2009,0,0,0,0,0,0 +MANIPULATIVE,2009,0,0,0,0,0,0 +MAYBE,0,0,2009,0,0,2009,0 +MEDIATING,0,0,0,2009,0,0,0 +MEDIATORS,0,0,0,2009,0,0,0 +MISAPPLICATIONS,2009,0,0,0,0,0,0 +MISAPPLYING,2009,0,0,0,0,0,0 +MISAPPROPRIATING,2009,0,0,0,0,0,0 +MISCALCULATE,2009,0,0,0,0,0,0 +MISCALCULATION,2009,0,0,0,0,0,0 +MISCLASSIFICATION,2011,0,0,0,0,0,0 +MISCOMMUNICATION,2014,0,0,0,0,0,0 +MISDEMEANORS,2009,0,0,0,0,0,0 +MISHANDLED,2009,0,0,0,0,0,0 +MISINFORMATION,2009,0,0,0,0,0,0 +MISINTERPRET,2009,0,0,0,0,0,0 +MISINTERPRETING,2009,0,0,0,0,0,0 +MISJUDGES,2009,0,0,0,0,0,0 +MISLABEL,2009,0,0,0,0,0,0 +MISLABELS,2009,0,0,0,0,0,0 +MISLEADS,2009,0,0,0,0,0,0 +MISMANAGEMENT,2009,0,0,0,0,0,0 +MISMATCHED,2009,0,0,0,0,0,0 +MISPRICE,2014,0,0,0,0,0,0 +MISREPRESENTATION,2009,0,0,0,0,0,0 +MISREPRESENTS,2009,0,0,0,0,0,0 +WORRYING,2009,0,0,0,0,0,0 +WORSENING,2009,0,0,0,0,0,0 +WORTHY,0,2009,0,0,0,0,0 +TOLERATED,2009,0,0,0,0,0,0 +TORT,0,0,0,2009,0,0,0 +TORTUOUS,2009,0,0,0,0,0,0 +FIDE,0,0,0,2009,0,0,0 +FIRING,2009,0,0,0,0,0,0 +NONBREACHING,0,0,0,2011,0,0,0 +NONCOMPLIANCE,2009,0,0,0,0,0,0 +NONCONFORMING,2009,0,0,0,0,0,0 +NONCONTRACT,0,0,0,2012,0,0,0 +NONFEASANCE,0,0,0,2011,0,0,0 +NONFORFEITURE,0,0,0,2011,0,0,0 +DISCLAIMED,2009,0,0,0,0,0,0 +DISCLAIMS,2009,0,0,0,0,0,0 +DISCLOSING,2009,0,0,0,0,0,0 +DISCONTINUATIONS,2009,0,0,0,0,0,0 +DISCONTINUING,2009,0,0,0,0,0,0 +DISCOURAGING,2009,0,0,0,0,0,0 +DISCREDITS,2009,0,0,0,0,0,0 +SPECTACULARLY,0,2009,0,0,0,0,0 +SPECULATING,0,0,2009,0,0,0,0 +SPECULATIVELY,0,0,2009,0,0,0,0 +TRAGEDY,2009,0,0,0,0,0,0 +TRANSFERORS,0,0,0,2012,0,0,0 +LEGISLATING,0,0,0,2009,0,0,0 +LEGISLATIVELY,0,0,0,2009,0,0,0 +LEGISLATURES,0,0,0,2009,0,0,0 +LIBELS,0,0,0,2009,0,0,0 +CONCEALED,2009,0,0,0,0,0,0 +CONCEDES,2009,0,0,0,0,0,0 +CONCERN,2009,0,0,0,0,0,0 +CONCILIATION,2009,0,0,0,0,0,0 +CONDEMN,2009,0,0,0,0,0,0 +CONDEMNING,2009,0,0,0,0,0,0 +CONDITIONALLY,0,0,2009,0,0,0,0 +CONFESS,2009,0,0,0,0,0,0 +CONFESSION,2009,0,0,0,0,0,0 +CONFINEMENT,2009,0,0,0,0,0,2009 +CONFISCATE,2009,0,0,0,0,0,0 +CONFISCATION,2009,0,0,0,0,0,0 +CONFLICTED,2009,0,0,0,0,0,0 +CONFRONTATION,2009,0,0,0,0,0,0 +CONFRONTING,2009,0,0,0,0,0,0 +CONFUSES,2009,0,2009,0,0,0,0 +CONSENT,0,0,0,2009,0,0,0 +CONSERVATORSHIPS,0,0,0,2011,0,0,0 +CONSPIRATORIAL,2009,0,0,0,0,0,0 +CONSPIRES,2009,0,0,0,0,0,0 +CONSTITUTIONALITY,0,0,0,2009,0,0,0 +CONSTRAIN,0,0,0,0,0,0,2009 +CONSTRAINT,0,0,0,0,0,0,2009 +CONSTRUE,0,0,0,2012,0,0,0 +CONTEMPT,2009,0,0,0,0,0,0 +CONTENDS,2009,0,0,0,0,0,0 +CONTENTIOUSLY,2009,0,0,0,0,0,0 +CONTESTING,2009,0,0,0,0,0,0 +CONTINGENTLY,0,0,2009,0,0,0,0 +CONTRACTHOLDER,0,0,0,2009,0,0,0 +CONTRACTING,0,0,0,2009,0,0,0 +CONTRACTUAL,0,0,0,2009,0,0,0 +CONTRADICTING,2009,0,0,0,0,0,0 +CONTRADICTS,2009,0,0,0,0,0,0 +CONTRAVENES,0,0,0,2009,0,0,0 +CONTROVERSIAL,2009,0,0,0,0,0,0 +CONTROVERTED,0,0,0,2009,0,0,0 +CONVEYANCES,0,0,0,2009,0,0,0 +CONVICTION,2009,0,0,2009,0,0,0 +CORRECTION,2009,0,0,0,0,0,0 +CORRUPTED,2009,0,0,0,0,0,0 +CORRUPTLY,2009,0,0,0,0,0,0 +COULD,0,0,2009,0,0,2009,0 +COUNSELS,0,0,0,2009,0,0,0 +COUNTERCLAIMS,2009,0,0,0,0,0,0 +COUNTERFEITERS,2009,0,0,0,0,0,0 +COUNTERMEASURES,2009,0,0,0,0,0,0 +COUNTERSUITS,0,0,0,2014,0,0,0 +COURTS,0,0,0,2009,0,0,0 +COVENANTS,0,0,0,0,0,0,2011 +CREATIVITY,0,2009,0,0,0,0,0 +CRIMINALITY,0,0,0,2009,0,0,0 +CRIMINALS,2009,0,0,2009,0,0,0 +CRITICALLY,2009,0,0,0,0,0,0 +CRITICIZED,2009,0,0,0,0,0,0 +CROSSCLAIMS,0,0,0,2011,0,0,0 +CRUCIALLY,2009,0,0,0,0,0,0 +CUMBERSOME,2009,0,0,0,0,0,0 +CURTAILMENT,2009,0,0,0,0,0,0 +CUTBACK,2009,0,0,0,0,0,0 +CYBERBULLYING,2014,0,0,0,0,0,0 +CYBERCRIMINALS,2014,0,0,0,0,0,0 +TAINTED,2009,0,0,0,0,0,0 +TENANTABILITY,0,0,0,2011,0,0,0 +TENTATIVELY,0,0,2009,0,0,0,0 +TERMINATES,2009,0,0,0,0,0,0 +TERMINUS,0,0,0,-2020,0,0,0 +TESTIMONY,0,0,0,2009,0,0,0 +THEREAFTER,0,0,0,2009,0,0,0 +THEREINAFTER,0,0,0,2011,0,0,0 +THERETO,0,0,0,2009,0,0,0 +THEREUNTO,0,0,0,2009,0,0,0 +THREATEN,2009,0,0,0,0,0,0 +THREATS,2009,0,0,0,0,0,0 +FAIL,2009,0,0,0,0,0,0 +FAILS,2009,0,0,0,0,0,0 +FALSE,2009,0,0,0,0,0,0 +FALSIFIED,2009,0,0,0,0,0,0 +FALSITY,2009,0,0,0,0,0,0 +FATALLY,2009,0,0,0,0,0,0 +FAULTY,2009,0,0,0,0,0,0 +FAVORING,0,2009,0,0,0,0,0 +FEARS,2009,0,0,0,0,0,0 +DAMAGE,2009,0,0,0,0,0,0 +DAMPEN,2009,0,0,0,0,0,0 +DANGEROUSLY,2009,0,0,0,0,0,0 +DEADLOCKING,2009,0,0,0,0,0,0 +DEBARMENT,2009,0,0,0,0,0,0 +DECEDENT,0,0,0,2009,0,0,0 +DECEITFULNESS,2009,0,0,0,0,0,0 +DECEIVING,2009,0,0,0,0,0,0 +DECEPTIVELY,2009,0,0,0,0,0,0 +DECLINES,2009,0,0,0,0,0,0 +DECREEING,0,0,0,2009,0,0,0 +DEFACEMENT,2009,0,0,0,0,0,0 +DEFAMATIONS,2009,0,0,0,0,0,0 +DEFAMES,2009,0,0,0,0,0,0 +DEFAULTING,2009,0,0,0,0,0,0 +DEFEASE,0,0,0,2009,0,0,0 +DEFEASING,0,0,0,2011,0,0,0 +DEFEATS,2009,0,0,0,0,0,0 +DEFECTS,2009,0,0,0,0,0,0 +DEFENDANTS,2009,0,0,2009,0,0,0 +DEFENSIVE,2009,0,0,0,0,0,0 +DEFICIENCY,2009,0,0,0,0,0,0 +DEFINITELY,0,0,0,0,2009,0,0 +DEFRAUDING,2009,0,0,0,0,0,0 +DEGRADATIONS,2009,0,0,0,0,0,0 +DEGRADING,2009,0,0,0,0,0,0 +DELAYS,2009,0,0,0,0,0,0 +DELEGEES,0,0,0,2011,0,0,0 +DELIBERATELY,2009,0,0,0,0,0,0 +DELIGHTFULLY,0,2009,0,0,0,0,0 +DELINQUENCY,2009,0,0,0,0,0,0 +DELIST,2009,0,0,0,0,0,0 +DEMISE,2009,0,0,0,0,0,0 +DEMOLISH,2009,0,0,0,0,0,0 +DEMOLITION,2009,0,0,0,0,0,0 +DEMOTES,2009,0,0,0,0,0,0 +DEMURRED,0,0,0,2009,0,0,0 +DEMURS,0,0,0,2009,0,0,0 +DENIES,2009,0,0,0,0,0,0 +DENIGRATING,2009,0,0,0,0,0,0 +DEPEND,0,0,2009,0,0,2009,2011 +DEPENDANCES,0,0,0,0,0,0,2011 +DEPENDENCIES,0,0,2009,0,0,0,2011 +DEPENDS,0,0,2009,0,0,2009,2011 +DEPLETING,2009,0,0,0,0,0,0 +DEPOSED,0,0,0,2009,0,0,0 +DEPOSITIONAL,0,0,0,2011,0,0,0 +INVALIDATED,2009,0,0,0,0,0,0 +INVALIDITY,2009,0,0,0,0,0,0 +INVENTION,0,2009,0,0,0,0,0 +INVENTOR,0,2009,0,0,0,0,0 +INVESTIGATES,2009,0,0,0,0,0,0 +INVOLUNTARILY,2009,0,0,0,0,0,0 +IRRECOVERABLE,2009,0,0,0,0,0,0 +IRREGULARITY,2009,0,0,0,0,0,0 +IRREVERSIBLE,2009,0,0,0,0,0,0 +JEOPARDIZE,2009,0,0,0,0,0,0 +JUDICIALLY,0,0,0,2009,0,0,0 +JURIS,0,0,0,2011,0,0,0 +JURISDICTIONS,0,0,0,2009,0,0,0 +JUROR,0,0,0,2009,0,0,0 +JUSTICE,0,0,0,2009,0,0,0 +KICKBACKS,2009,0,0,0,0,0,0 +DIMINISHED,2009,0,0,0,0,0,0 +DIRECTIVE,0,0,0,0,0,0,2009 +DISADVANTAGEOUS,2009,0,0,0,0,0,0 +DISAFFIRMANCE,0,0,0,2009,0,0,0 +DISAGREEABLE,2009,0,0,0,0,0,0 +DISAGREEMENTS,2009,0,0,0,0,0,0 +DISALLOWANCES,2009,0,0,0,0,0,0 +DISAPPEAR,2009,0,0,0,0,0,0 +DISAPPEARING,2009,0,0,0,0,0,0 +DISAPPOINTING,2009,0,0,0,0,0,0 +DISAPPOINTS,2009,0,0,0,0,0,0 +DISAPPROVED,2009,0,0,0,0,0,0 +DISASSOCIATING,2009,0,0,0,0,0,0 +DISASTERS,2009,0,0,0,0,0,0 +DISAVOWAL,2009,0,0,0,0,0,0 +GRATUITOUSLY,2009,0,0,0,0,0,0 +GREATLY,0,2009,0,0,0,0,0 +GROSSLY,2009,0,0,0,0,0,0 +HALTED,2009,0,0,0,0,0,0 +HAMPERS,2009,0,0,0,0,0,0 +HAPPY,0,2009,0,0,0,0,0 +HARASSMENT,2009,0,0,0,0,0,0 +HARMED,2009,0,0,0,0,0,0 +HARMS,2009,0,0,0,0,0,0 +HARSHLY,2009,0,0,0,0,0,0 +HAZARDS,2009,0,0,0,0,0,0 +NONINFRINGING,0,0,0,2011,0,0,0 +NONPAYMENT,2009,0,0,0,0,0,0 +NONPERFORMING,2009,0,0,0,0,0,0 +DISFAVORS,2009,0,0,0,0,0,0 +PREAMENDMENT,0,0,0,2011,0,0,0 +COMPLICATED,2009,0,0,0,0,0,0 +COMPLICATIONS,2009,0,0,0,0,0,0 +COMPLIMENTING,0,2009,0,0,0,0,0 +MISSTATEMENTS,2009,0,0,0,0,0,0 +MISSTEPS,2009,0,0,0,0,0,0 +MISTAKES,2009,0,0,0,0,0,0 +MISUNDERSTAND,2009,0,0,0,0,0,0 +MISUSE,2009,0,0,0,0,0,0 +MONOPOLISTIC,2009,0,0,0,0,0,0 +MONOPOLIZED,2009,0,0,0,0,0,0 +MORATORIA,2009,0,0,0,0,0,0 +MOTHBALLED,2009,0,0,0,0,0,0 +MUTANDIS,0,0,0,2011,0,0,0 +SLIPPAGES,2009,0,0,0,0,0,0 +SLOWED,2009,0,0,0,0,0,0 +SLOWLY,2009,0,0,0,0,0,0 +SLUGGISHNESS,2009,0,0,0,0,0,0 +SMOOTHS,0,2009,0,0,0,0,0 +DEPRESSES,2009,0,0,0,0,0,0 +DEPRIVED,2009,0,0,0,0,0,0 +DERELICTION,2009,0,0,0,0,0,0 +DEROGATING,0,0,0,2009,0,0,0 +DESIGNATOR,0,0,0,2011,0,0,0 +DESPITE,0,2009,0,0,0,0,0 +DESTABILIZING,2009,0,2009,0,0,0,0 +DESTROYING,2009,0,0,0,0,0,0 +DETAIN,2009,0,0,0,0,0,0 +DETENTIONS,2009,0,0,0,0,0,0 +DETERIORATES,2009,0,0,0,0,0,0 +DETERRED,2009,0,0,0,0,0,0 +DETERRENTS,2009,0,0,0,0,0,0 +DETRACTED,2009,0,0,0,0,0,0 +DETRIMENTALLY,2009,0,0,0,0,0,0 +DEVALUES,2009,0,0,0,0,0,0 +DEVASTATING,2009,0,0,0,0,0,0 +DEVIATES,2009,0,2009,0,0,0,0 +DEVISEES,0,0,0,2011,0,0,0 +DEVOLVING,2009,0,0,0,0,0,0 +DICTATING,0,0,0,0,0,0,2009 +DIFFERS,0,0,2009,0,0,0,0 +DIFFICULTY,2009,0,0,0,0,0,0 +ASCENDANTS,0,0,0,2009,0,0,0 +ASSAULTS,2009,0,0,0,0,0,0 +ASSIGNATIONS,0,0,0,2009,0,0,0 +ASSUMES,0,0,2009,0,0,0,0 +ASSURE,0,2009,0,0,0,0,0 +ATTAIN,0,2009,0,0,0,0,0 +ATTAINMENTS,0,2009,0,0,0,0,0 +ATTESTATIONS,0,0,0,2009,0,0,0 +ATTORNEY,0,0,0,2009,0,0,0 +ATTRACTIVE,0,2009,0,0,0,0,0 +BACKDATING,2009,0,0,0,0,0,0 +BAILEE,0,0,0,2009,0,0,0 +BAILMENT,0,0,0,2011,0,0,0 +BANKRUPT,2009,0,0,0,0,0,0 +BANKRUPTING,2009,0,0,0,0,0,0 +CLAIMANTS,0,0,0,2009,0,0,0 +CLARIFICATION,0,0,2009,0,0,0,0 +CLEARLY,0,0,0,0,2009,0,0 +CLOSING,-2020,0,0,0,0,0,0 +CODEFENDANT,0,0,0,2011,0,0,0 +CODIFICATION,0,0,0,2009,0,0,0 +CODIFY,0,0,0,2009,0,0,0 +COERCES,2009,0,0,0,0,0,0 +COLLABORATED,0,2009,0,0,0,0,0 +COLLABORATIONS,0,2009,0,0,0,0,0 +COLLAPSE,2009,0,0,0,0,0,0 +COLLISION,2009,0,0,0,0,0,0 +COLLUDES,2009,0,0,0,0,0,0 +COLLUSIVE,2009,0,0,0,0,0,0 +POSITIVELY,0,2009,0,0,0,0,0 +POSSIBLE,0,0,2009,0,0,2009,0 +POSTCONTRACT,0,0,0,2011,0,0,0 +POSTPONEMENT,2009,0,0,0,0,0,0 +WRITEDOWN,2009,0,0,0,0,0,0 +WRITS,0,0,0,2009,0,0,0 +WRONGFUL,2009,0,0,0,0,0,0 +HONOR,0,2009,0,0,0,0,0 +HONORS,0,2009,0,0,0,0,0 +REARGUMENT,0,0,0,2011,0,0,0 +REASSESSING,0,0,2009,0,0,0,0 +REASSIGNED,2009,0,0,0,0,0,0 +REASSIGNS,2009,0,0,0,0,0,0 +REBUT,0,0,0,2009,0,0,0 +REBUTTAL,0,0,0,2009,0,0,0 +RECALCULATE,0,0,2009,0,0,0,0 +RECALCULATION,0,0,2009,0,0,0,0 +RECALLING,2009,0,0,0,0,0,0 +RECESSIONARY,2009,0,0,0,0,0,0 +RECKLESSNESS,2009,0,0,0,0,0,0 +RECONSIDERS,0,0,2009,0,0,0,0 +RECOUPMENTS,0,0,0,2009,0,0,0 +RECTIFICATIONS,0,0,0,2009,0,0,0 +RECUSES,0,0,0,2014,0,0,0 +REDACTING,2009,0,0,2009,0,0,0 +REDEFAULTED,2012,0,0,0,0,0,0 +REDRESSES,2009,0,0,0,0,0,0 +REEXAMINING,0,0,2009,0,0,0,0 +REFILE,0,0,0,2009,0,0,0 +REFRAIN,0,0,0,0,0,0,2009 +REFUSALS,2009,0,0,0,0,0,0 +REFUSING,2009,0,0,0,0,0,0 +REGULATE,0,0,0,2009,0,0,0 +REGULATION,0,0,0,2009,0,0,0 +REGULATORS,0,0,0,2009,0,0,0 +REHEARING,0,0,0,2009,0,0,0 +VARIABLY,0,0,2009,0,0,0,0 +VARIANTS,0,0,2009,0,0,0,0 +VARIES,0,0,2009,0,0,0,0 +VENDEES,0,0,0,2011,0,0,0 +VERSATILITY,0,2009,0,0,0,0,0 +VIBRANT,0,2009,0,0,0,0,0 +VIOLATES,2009,0,0,0,0,0,0 +VIOLATIVE,2009,0,0,2009,0,0,0 +VIOLENT,2009,0,0,0,0,0,0 +VITIATES,2009,0,0,0,0,0,0 +VOIDED,2009,0,0,2009,0,0,0 +VOLATILITY,2009,0,2009,0,0,0,0 +VULNERABLY,2009,0,0,0,0,0,0 +WARNINGS,2009,0,0,0,0,0,0 +WASTED,2009,0,0,0,0,0,0 +WEAKEN,2009,0,0,0,0,0,0 +WEAKER,2009,0,0,0,0,0,0 +WEAKNESSES,2009,0,0,0,0,0,0 +DISHONORABLE,2009,0,0,0,0,0,0 +DISHONORS,2009,0,0,0,0,0,0 +DISINTERESTEDLY,2009,0,0,0,0,0,0 +DISLOYALTY,2009,0,0,0,0,0,0 +DISMISSAL,2009,0,0,0,0,0,0 +DISMISSING,2009,0,0,0,0,0,0 +DISPARAGEMENT,2009,0,0,0,0,0,0 +DISPARAGINGLY,2009,0,0,0,0,0,0 +DISPLACED,2009,0,0,0,0,0,0 +DISPLACING,2009,0,0,0,0,0,0 +DISPOSSESSED,2009,0,0,0,0,0,0 +DISPOSSESSORY,0,0,0,2011,0,0,0 +DISPROPORTIONATELY,2009,0,0,0,0,0,0 +DISPUTING,2009,0,0,0,0,0,0 +DISQUALIFIES,2009,0,0,0,0,0,0 +DISREGARDED,2009,0,0,0,0,0,0 +DISREPUTE,2009,0,0,0,0,0,0 +DISRUPTION,2009,0,0,0,0,0,0 +DISSATISFACTION,2009,0,0,0,0,0,0 +DISSENTER,2009,0,0,0,0,0,0 +DISSIDENT,2009,0,0,0,0,0,0 +DISTINCTION,0,2009,0,0,0,0,0 +DISTINCTIVENESS,0,2009,0,0,0,0,0 +DISTORTION,2009,0,0,0,0,0,0 +DISTRACTED,2009,0,0,0,0,0,0 +DISTRACTS,2009,0,0,0,0,0,0 +DISTRIBUTEE,0,0,0,2009,0,0,0 +DISTURBANCES,2009,0,0,0,0,0,0 +DIVERSION,2009,0,0,0,0,0,0 +DIVERTS,2009,0,0,0,0,0,0 +DIVESTITURE,2009,0,0,0,0,0,0 +DIVESTS,2009,0,0,0,0,0,0 +DIVULGED,2009,0,0,0,0,0,0 +DOCKETED,0,0,0,2009,0,0,0 +DOUBT,2009,0,2009,0,0,0,0 +DOWNGRADE,2009,0,0,0,0,0,0 +DOWNSIZE,2009,0,0,0,0,0,0 +DOWNSIZINGS,2009,0,0,0,0,0,0 +DOWNTURNS,2009,0,0,0,0,0,0 +DRASTIC,2009,0,0,0,0,0,0 +DREAM,0,2009,0,0,0,0,0 +DULY,0,0,0,2009,0,0,0 +DYSFUNCTIONS,2009,0,0,0,0,0,0 +EARMARKS,0,0,0,0,0,0,2009 +EASY,0,2009,0,0,0,0,0 +EFFICIENT,0,2009,0,0,0,0,0 +EJECTMENT,0,0,0,2011,0,0,0 +EMBARGOING,2009,0,0,0,0,0,0 +EMBARRASSING,2009,0,0,0,0,0,0 +EMBEZZLED,2009,0,0,0,0,0,0 +EMBEZZLES,2009,0,0,0,0,0,0 +EMPOWERING,0,2009,0,0,0,0,0 +ENABLES,0,2009,0,0,0,0,0 +ENCOURAGES,0,2009,0,0,0,0,0 +ENCROACHES,2009,0,0,0,0,0,0 +ENCUMBER,2009,0,0,2009,0,0,2009 +ENCUMBRANCE,2009,0,0,2009,0,0,2009 +ENDANGER,2009,0,0,0,0,0,0 +ENDANGERS,2009,0,0,0,0,0,0 +ENFORCEABLY,0,0,0,2011,0,0,0 +ENHANCEMENTS,0,2009,0,0,0,0,0 +ENJOINED,2009,0,0,0,0,0,0 +ENJOYABLE,0,2009,0,0,0,0,0 +ENJOYMENT,0,2009,0,0,0,0,0 +ENTAILING,0,0,0,0,0,0,2009 +PASSU,0,0,0,2009,0,0,0 +PENALIZED,2009,0,0,0,0,0,0 +PENALTY,2009,0,0,0,0,0,0 +PERFECTLY,0,2009,0,0,0,0,0 +PERILS,2009,0,0,0,0,0,0 +PERMISSIONS,0,0,0,0,0,0,2009 +PERMITTING,0,0,0,0,0,0,2009 +PERPETRATING,2009,0,0,2009,0,0,0 +PERSISTENCE,2009,0,0,0,0,0,0 +PERSISTS,2009,0,0,0,0,0,0 +PERVASIVENESS,2009,0,0,0,0,0,0 +PETITIONERS,0,0,0,2009,0,0,0 +PICKET,2009,0,0,0,0,0,0 +HEREBY,0,0,0,2009,0,0,0 +HEREFROM,0,0,0,2009,0,0,0 +HEREINBEFORE,0,0,0,2009,0,0,0 +HERETO,0,0,0,2009,0,0,0 +HEREUPON,0,0,0,2009,0,0,0 +HIGHEST,0,2009,0,0,2009,0,0 +HINDERS,2009,0,0,0,0,0,0 +WHATEVER,0,0,0,2009,0,0,0 +WHEREAS,0,0,0,2009,0,0,0 +WHEREIN,0,0,0,2009,0,0,0 +WHEREUNDER,0,0,0,2011,0,0,0 +WHOMEVER,0,0,0,2009,0,0,0 +WILL,0,0,0,0,2009,0,0 +WIN,0,2009,0,0,0,0,0 +WITNESS,0,0,0,2009,0,0,0 +FLUCTUATED,0,0,2009,0,0,0,0 +FLUCTUATIONS,0,0,2009,0,0,0,0 +FORBEARANCES,0,0,0,2009,0,0,0 +FORBIDDEN,2009,0,0,0,0,0,2009 +FORCED,2009,0,0,0,0,0,0 +FOREBEARS,0,0,0,2009,0,0,0 +FORECLOSING,2009,0,0,0,0,0,0 +FOREGOES,2009,0,0,0,0,0,0 +FORESTALLING,2009,0,0,0,0,0,0 +FORFEITABLE,0,0,0,2009,0,0,0 +FORFEITURE,2009,0,0,0,0,0,0 +FORTHWITH,0,0,0,2009,0,0,0 +FRAUDULENCE,2009,0,0,0,0,0,0 +FRIVOLOUS,2009,0,0,0,0,0,0 +FRUSTRATES,2009,0,0,0,0,0,0 +FRUSTRATIONS,2009,0,0,0,0,0,0 +GAIN,0,2009,0,0,0,0,0 +GOOD,0,2009,0,0,0,0,0 +DISGORGES,2009,0,0,0,0,0,0 +DISGRACEFULLY,2009,0,0,0,0,0,0 +LITIGATED,2009,0,0,2009,0,0,0 +LITIGATIONS,2009,0,0,2009,0,0,0 +LITIGIOUSNESS,0,0,0,2009,0,0,0 +LACKING,2009,0,0,0,0,0,0 +LAGGED,2009,0,0,0,0,0,0 +LAPSED,2009,0,0,0,0,0,0 +LAUNDERING,2009,0,0,0,0,0,0 +LAWFULNESS,0,0,0,2009,0,0,0 +LAWSUIT,0,0,0,2009,0,0,0 +LAYOFF,2009,0,0,0,0,0,0 +LEGAL,0,0,0,2009,0,0,0 +LEGALIZATIONS,0,0,0,2009,0,0,0 +LEGALIZING,0,0,0,2009,0,0,0 +LEGATEES,0,0,0,2009,0,0,0 +FLAWS,2009,0,0,0,0,0,0 +NONRENEWAL,2009,0,0,0,0,0,0 +LIQUIDATING,2009,0,0,0,0,0,0 +LIQUIDATORS,2009,0,0,0,0,0,0 +BENEFICIAL,0,-2020,0,2020,0,0,0 +BENEFIT,0,-2020,0,0,0,0,0 +BENEFITTING,0,2009,0,0,0,0,0 +POORLY,2009,0,0,0,0,0,0 +REINTERPRETATIONS,0,0,2009,0,0,0,0 +REJECT,2009,0,0,0,0,0,0 +REJECTIONS,2009,0,0,0,0,0,0 +RELINQUISHED,2009,0,0,0,0,0,0 +RELINQUISHMENTS,2009,0,0,0,0,0,0 +REMANDED,0,0,0,2009,0,0,0 +REMEDIATED,0,0,0,2009,0,0,0 +REMEDIED,0,0,0,2009,0,0,0 +RENEGOTIATES,2009,0,0,0,0,0,0 +RENOUNCE,2009,0,0,0,0,0,0 +RENOUNCES,2009,0,0,0,0,0,0 +REPLEDGED,0,0,0,2012,0,0,0 +REPOSSESSING,2009,0,0,0,0,0,0 +TROUBLES,2009,0,0,0,0,0,0 +UNACCEPTABLE,2009,0,0,0,0,0,0 +UNANNOUNCED,2009,0,0,0,0,0,0 +UNAPPROVED,2009,0,0,0,0,0,0 +UNAVAILABLE,2009,0,0,0,0,0,2011 +UNCERTAIN,0,0,2009,0,0,2009,0 +UNCLEAR,0,0,2009,0,0,0,0 +UNCOLLECTIBLE,2009,0,0,0,0,0,0 +UNCOMPROMISING,0,0,0,0,2009,0,0 +UNCONSTITUTIONAL,0,0,0,2009,0,0,0 +UNCONTROLLABLE,2009,0,0,0,0,0,0 +UNCOVER,2009,0,0,0,0,0,0 +UNDECIDED,0,0,2009,0,0,0,0 +UNDELIVERED,2009,0,0,0,0,0,0 +UNDERCUTTING,2009,0,0,0,0,0,0 +UNDERESTIMATING,2009,0,0,0,0,0,0 +UNDERMINE,2009,0,0,0,0,0,0 +UNDERPAID,2009,0,0,0,0,0,0 +UNDERPERFORM,2011,0,0,0,0,0,0 +UNDERPERFORMS,2014,0,0,0,0,0,0 +UNDERSTATE,2009,0,0,0,0,0,0 +UNDERSTATES,2009,0,0,0,0,0,0 +UNDESIGNATED,0,0,2009,0,0,0,0 +UNDETECTED,2009,0,0,0,0,0,0 +UNDISCLOSED,2009,0,0,0,0,0,0 +UNDUE,2009,0,0,0,0,0,0 +UNECONOMICALLY,2009,0,0,0,0,0,0 +UNENCUMBERED,0,0,0,2009,0,0,0 +UNEQUIVOCALLY,0,0,0,0,2009,0,0 +UNEXPECTED,2009,0,2009,0,0,0,0 +UNFAMILIAR,0,0,2009,0,0,0,0 +UNFAVORABLY,2009,0,0,0,0,0,0 +UNFITNESS,2009,0,0,0,0,0,0 +UNFORSEEN,2011,0,2011,0,0,0,0 +UNFRIENDLY,2009,0,0,0,0,0,0 +UNHEDGED,0,0,2009,0,0,0,0 +UNINTENDED,2009,0,0,0,0,0,0 +UNJUSTIFIABLE,2009,0,0,0,0,0,0 +UNKNOWING,2009,0,0,0,0,0,0 +UNLAWFUL,2009,0,0,2009,0,0,0 +UNLIQUIDATED,2009,0,0,0,0,0,0 +UNMERITORIOUS,2014,0,0,0,0,0,0 +UNOBSERVABLE,0,0,2009,0,0,0,0 +UNPARALLELED,0,2009,0,0,2009,0,0 +UNPREDICTABILITY,2009,0,2009,0,0,0,0 +UNPRODUCTIVE,2009,0,0,0,0,0,0 +UNPROVEN,0,0,2009,0,0,0,0 +UNREALISTIC,2009,0,0,0,0,0,0 +UNRECEPTIVE,2014,0,0,0,0,0,0 +UNREIMBURSED,2009,0,0,0,0,0,0 +UNREPORTED,2009,0,0,0,0,0,0 +UNSALABLE,2009,0,0,0,0,0,0 +UNSAVORY,2009,0,0,0,0,0,0 +UNSELLABLE,2014,0,0,0,0,0,0 +UNSPECIFIC,0,0,2009,0,0,0,0 +UNSTAYED,0,0,0,2009,0,0,0 +UNSUITABILITY,2009,0,0,0,0,0,0 +UNSURE,2009,0,0,0,0,0,0 +UNSUSTAINABLE,2009,0,0,0,0,0,0 +UNTO,0,0,0,2009,0,0,0 +UNTRUTHFULLY,2009,0,0,0,0,0,0 +UNUSUAL,0,0,2009,0,0,0,0 +UNWELCOME,2009,0,0,0,0,0,0 +UPSET,2009,0,0,0,0,0,0 +URGENT,2009,0,0,0,0,0,0 +USURPED,2009,0,0,2009,0,0,0 +VAGARIES,0,0,2009,0,0,0,0 +VAGUENESSES,0,0,2012,0,0,0,0 +VANDALISM,2009,0,0,0,0,0,0 +PLAINTIFF,2009,0,0,2009,0,0,0 +PLEADED,2009,0,0,0,0,0,0 +PLEAS,2009,0,0,2009,0,0,0 +PLEASURE,0,2009,0,0,0,0,0 +PLEDGEE,0,0,0,2009,0,0,0 +PLEDGOR,0,0,0,2009,0,0,0 +COMPELLED,0,0,0,0,0,0,2009 +COMPLAIN,2009,0,0,0,0,0,0 +COMPLAINING,2009,0,0,0,0,0,0 +COMMITMENTS,0,0,0,0,0,0,2009 +LIMITATIONS,2009,0,0,0,0,0,0 +RESTRAINS,0,0,0,0,0,0,2009 +RESTRICTED,0,0,0,0,0,0,2009 +RESTRICTIVE,0,0,0,0,0,0,2009 +RESTRUCTURE,2009,0,0,0,0,0,0 +RESTRUCTURINGS,2009,0,0,0,0,0,0 +RETALIATING,2009,0,0,0,0,0,0 +RETENDERING,0,0,0,2011,0,0,0 +PRECIPITATED,2009,0,0,0,0,0,0 +PRECLUDED,2009,0,0,0,0,0,2009 +PRECONDITIONS,0,0,0,0,0,0,2009 +PREDECEASES,0,0,0,2009,0,0,0 +PREDICTED,0,0,2009,0,0,0,0 +PREDICTIVE,0,0,2009,0,0,0,0 +PREEMINENCE,0,2009,0,0,0,0,0 +PREJUDICED,2009,0,0,2009,0,0,0 +PRELIMINARILY,0,0,2009,0,0,0,0 +PREMIER,0,2009,0,0,0,0,0 +PRESSING,2009,0,0,0,0,0,0 +PRESUME,0,0,2009,0,0,0,0 +PRESUMPTION,0,0,2009,0,0,0,0 +PREVENT,0,0,0,0,0,0,2009 +PREVENTS,2009,0,0,0,0,0,2009 +PROACTIVELY,0,2009,0,0,0,0,0 +PROBABLE,0,0,2009,0,0,0,0 +PROBATES,0,0,0,2009,0,0,0 +PROBATIONARY,0,0,0,2009,0,0,0 +PROBLEM,2009,0,0,0,0,0,0 +PROFICIENCY,0,2009,0,0,0,0,0 +PROFITABLE,0,2009,0,0,0,0,0 +PROGRESSES,0,2009,0,0,0,0,0 +PROHIBITING,0,0,0,0,0,0,2009 +PROHIBITIVELY,0,0,0,0,0,0,2009 +PROLONGATION,2009,0,0,0,0,0,0 +PROLONGS,2009,0,0,0,0,0,0 +PROMULGATING,0,0,0,2009,0,0,0 +PROMULGATORS,0,0,0,2009,0,0,0 +PROSECUTE,2009,0,0,2009,0,0,0 +PROSECUTION,2009,0,0,2009,0,0,0 +PROSECUTORS,0,0,0,2009,0,0,0 +PROSPEROUS,0,2009,0,0,0,0,0 +PROTESTER,2009,0,0,0,0,0,0 +PROTESTORS,2009,0,0,0,0,0,0 +PROVISO,0,0,0,2009,0,0,0 +PROVOKED,2009,0,0,0,0,0,0 +PUNISHED,2009,0,0,0,0,0,0 +PUNISHMENTS,2009,0,0,0,0,0,0 +PURPORTEDLY,2009,0,0,0,0,0,0 +QUESTIONABLE,2009,0,0,0,0,0,0 +QUESTIONS,2009,0,0,0,0,0,0 +QUITTING,2009,0,0,0,0,0,0 +RANDOMIZE,0,0,2009,0,0,0,0 +RANDOMLY,0,0,2009,0,0,0,0 +RATABLY,0,0,0,2009,0,0,0 +RATIONALIZED,2009,0,0,0,0,0,0 +ABANDONING,2009,0,0,0,0,0,0 +ABDICATED,2009,0,0,0,0,0,0 +ABDICATIONS,2009,0,0,0,0,0,0 +ABERRATIONS,2009,0,0,0,0,0,0 +ABIDE,0,0,0,0,0,0,2009 +ABNORMALITIES,2009,0,0,0,0,0,0 +ABOLISHED,2009,0,0,0,0,0,0 +ABROGATE,2009,0,0,2009,0,0,0 +ABROGATION,2009,0,0,2009,0,0,0 +ABRUPTNESS,2009,0,0,0,0,0,0 +ABSOLVE,0,0,0,2009,0,0,0 +ABUNDANCE,0,2009,0,0,0,0,0 +ABUSES,2009,0,0,0,0,0,0 +ABUSIVENESS,2009,0,0,0,0,0,0 +ACCIDENTAL,2009,0,0,0,0,0,0 +ACCOMPLISH,0,2009,0,0,0,0,0 +ACCOMPLISHMENT,0,2009,0,0,0,0,0 +ACCUSE,2009,0,0,0,0,0,0 +ACHIEVE,0,2009,0,0,0,0,0 +ACHIEVES,0,2009,0,0,0,0,0 +ACQUIESCES,2009,0,0,0,0,0,0 +ACQUIT,2009,0,0,2009,0,0,0 +ACQUITTANCE,0,0,0,2009,0,0,0 +ADDENDUMS,0,0,0,2011,0,0,0 +ADJOURNING,0,0,0,2009,0,0,0 +ADJUDGE,0,0,0,2009,0,0,0 +ADJUDICATE,0,0,0,2009,0,0,0 +ADJUDICATION,0,0,0,2009,0,0,0 +ADJUDICATORS,0,0,0,2009,0,0,0 +ADMISSIBLY,0,0,0,2009,0,0,0 +ADULTERATED,2009,0,0,0,0,0,0 +ADVANCEMENT,0,2009,0,0,0,0,0 +ADVANTAGE,0,2009,0,0,0,0,0 +ADVANTAGES,0,2009,0,0,0,0,0 +ADVERSE,2009,0,0,0,0,0,0 +AFFIDAVIT,0,0,0,2009,0,0,0 +AFOREDESCRIBED,0,0,0,2011,0,0,0 +AFTERMATH,2009,0,0,0,0,0,0 +AGGRAVATED,2009,0,0,0,0,0,0 +AGGRAVATIONS,2009,0,0,0,0,0,0 +ALIENATE,2009,0,0,0,0,0,0 +ALIENATION,2009,0,0,0,0,0,0 +ALLEGE,2009,0,0,2009,0,0,0 +ALLEGING,2009,0,0,2009,0,0,0 +ALTERATION,0,0,2009,0,0,0,0 +AMBIGUITY,0,0,2009,0,0,0,0 +AMENDATORY,0,0,0,2009,0,0,0 +AMENDMENTS,0,0,0,2009,0,0,0 +ANNOYANCES,2009,0,0,0,0,0,0 +ANNUL,2009,0,0,0,0,0,0 +ANNULMENTS,2009,0,0,0,0,0,0 +ANOMALOUSLY,2009,0,2009,0,0,0,0 +ANTICIPATE,0,0,2009,0,0,0,0 +ANTICIPATION,0,0,2009,0,0,0,0 +ANTITRUST,2009,0,0,2009,0,0,0 +APPEAL,0,0,0,2009,0,0,0 +APPEALS,0,0,0,2009,0,0,0 +APPEARS,0,0,2009,0,0,2009,0 +APPELLEES,0,0,0,2011,0,0,0 +APPROXIMATELY,0,0,2009,0,0,0,0 +APPROXIMATIONS,0,0,2009,0,0,0,0 +ARBITRABILITY,0,0,0,2011,0,0,0 +ARBITRARY,0,0,2009,0,0,0,0 +ARBITRATING,0,0,0,2009,0,0,0 +ARBITRATIVE,0,0,0,2011,0,0,0 +ARGUED,2009,0,0,0,0,0,0 +ARGUMENTS,2009,0,0,0,0,0,0 +ARREST,2009,0,0,0,0,0,0 +RETRIBUTIONS,2009,0,0,0,0,0,0 +BONA,0,0,0,2009,0,0,0 +BOOST,0,2009,0,0,0,0,0 +BOUND,0,0,0,0,0,0,2011 +BOYCOTTING,2009,0,0,0,0,0,0 +BREACHES,2009,0,0,2009,0,0,0 +BREAKAGES,2009,0,0,0,0,0,0 +BREAKS,2009,0,0,0,0,0,0 +BRIBED,2009,0,0,0,0,0,0 +BRIBING,2009,0,0,0,0,0,0 +BURDEN,2009,0,0,0,0,0,0 +BURDENSOME,2009,0,0,0,0,0,0 +CALAMITY,2009,0,0,0,0,0,0 +CANCELLATION,2009,0,0,0,0,0,0 +CANCELS,2009,0,0,0,0,0,0 +CATASTROPHICALLY,2009,0,0,0,0,0,0 +CAUTIONING,2009,0,0,0,0,0,0 +CAUTIOUSNESS,0,0,2009,0,0,0,0 +CEASING,2009,0,0,0,0,0,0 +CENSURED,2009,0,0,0,0,0,0 +CESSION,0,0,0,2009,0,0,0 +CHALLENGING,2009,0,0,0,0,0,0 +CHATTELS,0,0,0,2009,0,0,0 +CIRCUMVENTING,2009,0,0,0,0,0,0 +SHARPLY,2009,0,0,0,0,0,0 +SHORTFALL,2009,0,0,0,0,0,0 +SHUT,2009,0,0,0,0,0,0 +SHUTTING,2009,0,0,0,0,0,0 +SLANDERS,2009,0,0,0,0,0,0 +REPUDIATE,2009,0,0,0,0,0,0 +REPUDIATION,2009,0,0,0,0,0,0 +REQUIRE,0,0,0,0,0,0,2009 +REQUIRES,0,0,0,0,0,0,2009 +RESCINDED,0,0,0,2009,0,0,0 +RESCISSIONS,0,0,0,2009,0,0,0 +RESIGNED,2009,0,0,0,0,0,0 +RESTATE,2009,0,0,0,0,0,0 +RESTATES,2009,0,0,0,0,0,0 +NONTERMINABLE,0,0,0,2011,0,0,0 +NOTARIZATION,0,0,0,2009,0,0,0 +NOTARIZING,0,0,0,2009,0,0,0 +NUISANCE,2009,0,0,0,0,0,0 +NULLIFIED,2009,0,0,2009,0,0,0 +NULLITIES,0,0,0,2009,0,0,0 +OBJECTION,2009,0,0,0,0,0,0 +OBLIGATE,0,0,0,0,0,0,2009 +OBLIGATION,0,0,0,0,0,0,2009 +OBLIGED,0,0,0,0,0,0,2009 +OBLIGOR,0,0,0,2009,0,0,0 +OBSOLESCENCE,2009,0,0,0,0,0,0 +OBSTRUCT,2009,0,0,0,0,0,0 +OBSTRUCTIONS,2009,0,0,0,0,0,0 +OFFEND,2009,0,0,0,0,0,0 +OFFENDING,2009,0,0,0,0,0,0 +OFFEREES,0,0,0,2011,0,0,0 +OMISSIONS,2009,0,0,0,0,0,0 +OMITTING,2009,0,0,0,0,0,0 +OPPORTUNITIES,0,2009,0,0,0,0,0 +OPPOSES,2009,0,0,0,0,0,0 +OPTIMISTIC,0,2009,0,0,0,0,0 +OUTAGE,2009,0,0,0,0,0,0 +OUTPERFORM,0,2009,0,0,0,0,0 +OVERAGE,2009,0,0,0,0,0,0 +OVERBUILDS,2009,0,0,0,0,0,0 +OVERBURDENING,2009,0,0,0,0,0,0 +OVERCHARGED,2009,0,0,0,0,0,0 +OVERCOMES,2009,0,0,0,0,0,0 +OVERESTIMATED,2009,0,0,0,0,0,0 +OVERESTIMATIONS,2009,0,0,0,0,0,0 +OVERLOADS,2009,0,0,0,0,0,0 +OVERLOOKS,2009,0,0,0,0,0,0 +OVERPRODUCED,2009,0,0,0,0,0,0 +OVERRULE,0,0,0,2009,0,0,0 +OVERRUN,2009,0,0,0,0,0,0 +OVERSHADOWED,2009,0,0,0,0,0,0 +OVERSTATED,2009,0,0,0,0,0,0 +OVERSTATING,2009,0,0,0,0,0,0 +OVERSUPPLYING,2009,0,0,0,0,0,0 +OVERTURNING,2009,0,0,0,0,0,0 +OVERVALUING,2009,0,0,0,0,0,0 +PARI,0,0,0,2009,0,0,0 +NECESSITATES,0,0,0,0,0,0,2009 +NEGATIVES,2009,0,0,0,0,0,0 +NEGLECTING,2009,0,0,0,0,0,0 +NEGLIGENT,2009,0,0,0,0,0,0 +BARRED,2009,0,0,0,0,0,0 +BEAUTIFULLY,0,2009,0,0,0,0,0 +BELIEVING,0,0,2009,0,0,0,0 +IDLE,2009,0,0,0,0,0,0 +IGNORED,2009,0,0,0,0,0,0 +ILLEGAL,2009,0,0,0,0,0,0 +ILLEGIBLE,2009,0,0,0,0,0,0 +ILLIQUIDITY,2009,0,0,0,0,0,0 +IMMATURE,2009,0,0,0,0,0,0 +IMPAIRING,2009,0,0,0,0,0,2011 +IMPASSE,2009,0,0,0,0,0,0 +IMPEDES,2009,0,0,0,0,0,0 +IMPENDING,2009,0,0,0,0,0,0 +IMPERIL,2009,0,0,0,0,0,0 +IMPLICATED,2009,0,0,0,0,0,0 +IMPOSED,0,0,0,0,0,0,2009 +IMPOSITIONS,0,0,0,0,0,0,2009 +IMPOUNDED,2009,0,0,0,0,0,0 +IMPRACTICAL,2009,0,0,0,0,0,0 +IMPRECISION,0,0,2009,0,0,0,0 +IMPRESSES,0,2009,0,0,0,0,0 +IMPRISONMENT,2009,0,0,0,0,0,0 +IMPROPERLY,2009,0,0,0,0,0,0 +IMPROVED,0,2009,0,0,0,0,0 +IMPROVING,0,2009,0,0,0,0,0 +INACCESSIBLE,2009,0,0,0,0,0,0 +INACCURATELY,2009,0,0,0,0,0,0 +INACTIVATED,2009,0,0,0,0,0,0 +INACTIVATIONS,2009,0,0,0,0,0,0 +INADEQUATE,2009,0,0,0,0,0,0 +INADVISABILITY,2009,0,0,0,0,0,0 +INASMUCH,0,0,0,2009,0,0,0 +INCAPACITY,2009,0,0,2009,0,0,0 +INCARCERATING,2009,0,0,2009,0,0,0 +INCIDENCE,2009,0,0,0,0,0,0 +INCOMPATIBILITIES,2009,0,0,0,0,0,0 +INCOMPETENCY,2009,0,0,0,0,0,0 +INCOMPLETE,2009,0,0,0,0,0,0 +INCONSISTENCIES,2009,0,0,0,0,0,0 +INCONTESTABILITY,0,0,0,2009,0,0,0 +INCONVENIENT,2009,0,0,0,0,0,0 +INCREDIBLE,0,2009,0,0,0,0,0 +INDECENT,2009,0,0,0,0,0,0 +INDEFINITELY,0,0,2009,0,0,0,0 +INDEMNIFICATIONS,0,0,0,2009,0,0,0 +INDEMNIFYING,0,0,0,2009,0,0,0 +INDEMNITOR,0,0,0,2009,0,0,0 +INDETERMINATE,0,0,2009,0,0,0,0 +INDICTING,2009,0,0,2009,0,0,0 +INEFFECTIVE,2009,0,0,0,0,0,0 +INEFFICIENCY,2009,0,0,0,0,0,0 +INELIGIBLE,2009,0,0,0,0,0,0 +INEQUITY,2009,0,0,0,0,0,0 +INEXPERIENCE,2009,0,0,0,0,0,0 +INFLUENTIAL,0,2009,0,0,0,0,0 +INFRACTIONS,2009,0,0,2009,0,0,0 +INFRINGEMENTS,2009,0,0,0,0,0,0 +INGENUITY,0,2009,0,0,0,0,0 +INHIBITS,0,0,0,0,0,0,2011 +INJUNCTIVE,0,0,0,2009,0,0,0 +INJURIES,2009,0,0,0,0,0,0 +INNOVATE,0,2009,0,0,0,0,0 +INNOVATION,0,2009,0,0,0,0,0 +INNOVATOR,0,2009,0,0,0,0,0 +INQUIRY,2009,0,0,0,0,0,0 +INSIST,0,0,0,0,0,0,2009 +INSISTS,0,0,0,0,0,0,2009 +INSOLVENT,2009,0,0,0,0,0,0 +INSTABILITY,2009,0,2009,0,0,0,0 +INSUFFICIENTLY,2009,0,0,0,0,0,0 +INTANGIBLES,0,0,2009,0,0,0,0 +INTERFERED,2009,0,0,0,0,0,0 +INTERFERING,2009,0,0,0,0,0,0 +INTERPLEADER,0,0,0,2009,0,0,0 +INTERPOSING,0,0,0,2009,0,0,0 +INTERROGATED,0,0,0,2009,0,0,0 +INTERROGATIONS,0,0,0,2009,0,0,0 +INTERROGATORY,0,0,0,2009,0,0,0 +INTERRUPTION,2009,0,0,0,0,0,0 +INTESTATE,0,0,0,2009,0,0,0 +SPORADIC,0,0,2009,0,0,0,0 +STABILIZATIONS,0,2009,0,0,0,0,0 +STABILIZING,0,2009,0,0,0,0,0 +STAGNATE,2009,0,0,0,0,0,0 +STAGNATION,2009,0,0,0,0,0,0 +STATUTES,0,0,0,2009,0,0,0 +STIPULATED,0,0,0,0,0,0,2009 +STIPULATIONS,0,0,0,0,0,0,2009 +STOPPED,2009,0,0,0,0,0,0 +STRAINED,2009,0,0,0,0,0,0 +STRENGTHEN,0,2009,0,0,0,0,0 +STRENGTHS,0,2009,0,0,0,0,0 +STRESSFUL,2009,0,0,0,0,0,0 +STRICTEST,0,0,0,0,0,0,2009 +STRONGER,0,2009,0,0,0,0,0 +SUBCLAUSES,0,0,0,2009,0,0,0 +SUBJECTION,2009,0,0,0,0,0,0 +SUBLICENSEE,0,0,0,2009,0,0,0 +SUBPOENA,2009,0,0,2009,0,0,0 +SUBROGATION,0,0,0,2009,0,0,0 +SUCCEED,0,2009,0,0,0,0,0 +SUCCESS,0,2009,0,0,0,0,0 +SUDDEN,0,0,2009,0,0,0,0 +SUES,2009,0,0,2009,0,0,0 +SUFFERS,2009,0,0,0,0,0,0 +SUGGESTS,0,0,2009,0,0,2009,0 +SUMMONS,2009,0,0,2009,0,0,0 +SUPERSEDEAS,0,0,0,2011,0,0,0 +SURETIES,0,0,0,2009,0,0,0 +SURPASSES,0,2009,0,0,0,0,0 +SUSPECT,2009,0,0,0,0,0,0 +SUSPENDED,2009,0,0,0,0,0,0 +SUSPENSIONS,2009,0,0,0,0,0,0 +SUSPICIOUSLY,2009,0,0,0,0,0,0 +REVISE,0,0,2009,0,0,0,0 +REVOCATIONS,2009,0,0,2009,0,0,0 +REVOKING,2009,0,0,0,0,0,0 +REVOLUTIONIZING,0,2009,0,0,0,0,0 +REWARDS,0,-2020,0,0,0,0,0 +RIDICULING,2009,0,0,0,0,0,0 +RISKIEST,2009,0,2009,0,0,0,0 +RISKY,2009,0,2009,0,0,0,0 +RUMORS,0,0,2009,0,0,0,0 +SACRIFICES,2009,0,0,0,0,0,0 +SATISFACTORILY,0,2009,0,0,0,0,0 +SATISFY,0,2009,0,0,0,0,0 +SCRUTINIZE,2009,0,0,0,0,0,0 +SCRUTINY,2009,0,0,0,0,0,0 +SEIZED,2009,0,0,0,0,0,0 +SELDOMLY,0,0,2009,0,0,2009,0 +SERIOUS,2009,0,0,0,0,0,0 +SETBACKS,2009,0,0,0,0,0,0 +SEVERABILITY,0,0,0,2009,0,0,0 +SEVERANCES,0,0,0,2009,0,0,0 +SEVERITIES,2009,0,0,0,0,0,0 +ENTHUSIASM,0,2009,0,0,0,0,0 +ENTRENCHED,0,0,0,0,0,0,2009 +ERODING,2009,0,0,0,0,0,0 +ERRED,2009,0,0,0,0,0,0 +ERROR,2009,0,0,0,0,0,0 +ESCALATED,2009,0,0,0,0,0,0 +ESCHEATED,0,0,0,2011,0,0,0 +ESCROWING,0,0,0,2011,0,0,0 +EVADED,2009,0,0,0,0,0,0 +EVASIONS,2009,0,0,0,0,0,0 +EVICTING,2009,0,0,0,0,0,0 +EVIDENTIAL,0,0,0,2011,0,0,0 +EXACERBATES,2009,0,0,0,0,0,0 +EXAGGERATE,2009,0,0,0,0,0,0 +EXAGGERATION,2009,0,0,0,0,0,0 +EXCELLENCE,0,2009,0,0,0,0,0 +EXCEPTIONAL,0,2009,0,0,0,0,0 +EXCISED,0,0,0,2009,0,0,0 +EXCLUSIVE,0,2009,0,0,0,0,0 +EXCLUSIVITY,0,2009,0,0,0,0,0 +EXCULPATING,2009,0,0,2009,0,0,0 +EXECUTOR,0,0,0,2009,0,0,0 +EXECUTRIX,0,0,0,2009,0,0,0 +EXONERATED,2009,0,0,0,0,0,0 +EXONERATIONS,2009,0,0,0,0,0,0 +EXPLOITATIVE,2009,0,0,0,0,0,0 +EXPOSE,2009,0,0,0,0,0,0 +EXPOSURE,0,0,2009,0,0,0,0 +EXPROPRIATES,2009,0,0,0,0,0,0 +EXPULSION,2009,0,0,0,0,0,0 +EXTRACORPOREAL,0,0,0,2011,0,0,0 +SOLVENCY,2009,0,0,0,0,0,0 +SOMETIMES,0,0,2009,0,0,2009,0 +SPAMMERS,2014,0,0,0,0,0,0 +TREMENDOUS,0,2009,0,0,0,0,0 +LOCKOUT,2009,0,0,0,0,0,0 +LOSING,2009,0,0,0,0,0,0 +LOWEST,0,0,0,0,2009,0,0 +MAJEURE,0,0,0,2011,0,0,0 +MALFUNCTIONING,2009,0,0,0,0,0,0 +MALICIOUSLY,2009,0,0,0,0,0,0 +MANDATED,0,0,0,0,0,0,2009 +MANDITORILY,0,0,0,0,0,0,2011 +MANIPULATING,2009,0,0,0,0,0,0 +MARKDOWN,2009,0,0,0,0,0,0 +MEDIATE,0,0,0,2009,0,0,0 +MEDIATION,0,0,0,2009,0,0,0 +MERITORIOUS,0,2009,0,0,0,0,0 +MISAPPLIED,2009,0,0,0,0,0,0 +MISAPPROPRIATE,2009,0,0,0,0,0,0 +MISAPPROPRIATION,2009,0,0,0,0,0,0 +MISCALCULATED,2009,0,0,0,0,0,0 +MISCALCULATIONS,2009,0,0,0,0,0,0 +MISCLASSIFICATIONS,2014,0,0,0,0,0,0 +MISCONDUCT,2009,0,0,0,0,0,0 +MISDIRECTED,2009,0,0,0,0,0,0 +MISHANDLES,2009,0,0,0,0,0,0 +MISINFORMED,2009,0,0,0,0,0,0 +MISINTERPRETATION,2009,0,0,0,0,0,0 +MISINTERPRETS,2009,0,0,0,0,0,0 +MISJUDGING,2009,0,0,0,0,0,0 +MISLABELED,2009,0,0,0,0,0,0 +MISLEAD,2009,0,0,0,0,0,0 +MISLED,2009,0,0,0,0,0,0 +MISMANAGES,2009,0,0,0,0,0,0 +MISMATCHES,2009,0,0,0,0,0,0 +MISPRICING,2014,0,0,0,0,0,0 +MISREPRESENTATIONS,2009,0,0,0,0,0,0 +MISS,2009,0,0,0,0,0,0 +WORSE,2009,0,0,0,0,0,0 +WORSENS,2009,0,0,0,0,0,0 +TOLERATES,2009,0,0,0,0,0,0 +TORTIOUS,0,0,0,2009,0,0,0 +TORTUOUSLY,2009,0,0,0,0,0,0 +FINED,2009,0,0,0,0,0,0 +NONAPPEALABLE,0,0,0,2009,0,0,0 +NONCANCELABLE,0,0,0,0,0,0,2009 +NONCOMPLIANCES,2009,0,0,0,0,0,0 +NONCONFORMITIES,2009,0,0,0,0,0,0 +NONCONTRACTUAL,0,0,0,2011,0,0,0 +NONFIDUCIARY,0,0,0,2011,0,0,0 +NONFUNCTIONAL,2009,0,0,0,0,0,0 +DISCLAIMER,2009,0,0,0,0,0,0 +DISCLOSE,2009,0,0,0,0,0,0 +DISCONTINUANCE,2009,0,0,0,0,0,0 +DISCONTINUE,2009,0,0,0,0,0,0 +DISCOURAGE,2009,0,0,0,0,0,0 +DISCREDIT,2009,0,0,0,0,0,0 +DISCREPANCIES,2009,0,0,0,0,0,0 +SPECULATE,0,0,2009,0,0,0,0 +SPECULATION,0,0,2009,0,0,0,0 +TRAGIC,2009,0,0,0,0,0,0 +TRANSPARENCY,0,2009,0,0,0,0,0 +LEGISLATE,0,0,0,2009,0,0,0 +LEGISLATION,0,0,0,2009,0,0,0 +LEGISLATOR,0,0,0,2009,0,0,0 +LIBEL,0,0,0,2009,0,0,0 +LICENSABLE,0,0,0,2011,0,0,0 +CONCEALING,2009,0,0,0,0,0,0 +CONCEDING,2009,0,0,0,0,0,0 +CONCERNED,2009,0,0,0,0,0,0 +CONCILIATIONS,2009,0,0,0,0,0,0 +CONDEMNATION,2009,0,0,0,0,0,0 +CONDEMNOR,0,0,0,2011,0,0,0 +CONDONE,2009,0,0,0,0,0,0 +CONFESSED,2009,0,0,0,0,0,0 +CONFIDENT,0,2009,0,0,0,0,0 +CONFINEMENTS,2009,0,0,0,0,0,0 +CONFISCATED,2009,0,0,0,0,0,0 +CONFISCATIONS,2009,0,0,0,0,0,0 +CONFLICTING,2009,0,0,0,0,0,0 +CONFRONTATIONAL,2009,0,0,0,0,0,0 +CONFRONTS,2009,0,0,0,0,0,0 +CONFUSING,2009,0,2009,0,0,0,0 +CONSENTED,0,0,0,2009,0,0,0 +CONSPIRACIES,2009,0,0,0,0,0,0 +CONSPIRATORS,2009,0,0,0,0,0,0 +CONSPIRING,2009,0,0,0,0,0,0 +CONSTITUTIONALLY,0,0,0,2009,0,0,0 +CONSTRAINED,0,0,0,0,0,0,2009 +CONSTRAINTS,0,0,0,0,0,0,2009 +CONSTRUED,0,0,0,2012,0,0,0 +CONTEND,2009,0,0,0,0,0,0 +CONTENTION,2009,0,0,0,0,0,0 +CONTESTABILITY,0,0,0,2014,0,0,0 +CONTINGENCIES,0,0,2009,0,0,0,0 +CONTINGENTS,0,0,2009,0,0,0,0 +CONTRACTHOLDERS,0,0,0,2009,0,0,0 +CONTRACTION,2009,0,0,0,0,0,0 +CONTRACTUALLY,0,0,0,2009,0,0,0 +CONTRADICTION,2009,0,0,0,0,0,0 +CONTRARY,2009,0,0,0,0,0,0 +CONTRAVENING,0,0,0,2009,0,0,0 +CONTROVERSIES,2009,0,0,0,0,0,0 +CONTROVERTING,0,0,0,2009,0,0,0 +CONVICT,2009,0,0,2009,0,0,0 +CONVICTIONS,2009,0,0,2009,0,0,0 +CORRECTIONS,2009,0,0,0,0,0,0 +CORRUPTING,2009,0,0,0,0,0,0 +CORRUPTNESS,2009,0,0,0,0,0,0 +COUNSEL,0,0,0,2009,0,0,0 +COUNTERCLAIM,2009,0,0,0,0,0,0 +COUNTERFEIT,2009,0,0,0,0,0,0 +COUNTERFEITING,2009,0,0,0,0,0,0 +COUNTERSIGNOR,0,0,0,2011,0,0,0 +COURT,0,0,0,2009,0,0,0 +COVENANT,0,0,0,0,0,0,2011 +CREATIVE,0,2009,0,0,0,0,0 +CRIME,2009,0,0,2009,0,0,0 +CRIMINALIZE,0,0,0,2014,0,0,0 +CRISES,2009,0,0,0,0,0,0 +CRITICISM,2009,0,0,0,0,0,0 +CRITICIZES,2009,0,0,0,0,0,0 +CROSSROAD,0,0,2009,0,0,0,0 +CULPABILITY,2009,0,0,0,0,0,0 +CURTAIL,2009,0,0,0,0,0,0 +CURTAILMENTS,2009,0,0,0,0,0,0 +CUTBACKS,2009,0,0,0,0,0,0 +CYBERCRIME,2014,0,0,0,0,0,0 +TAINTING,2009,0,0,0,0,0,0 +TENDING,0,0,2009,0,0,0,0 +TERMINABLE,0,0,0,2009,0,0,0 +TERMINATING,2009,0,0,0,0,0,0 +TESTAMENTARY,0,0,0,2009,0,0,0 +THENCE,0,0,0,2009,0,0,0 +THEREAT,0,0,0,2009,0,0,0 +THEREOF,0,0,0,2009,0,0,0 +THERETOFOR,0,0,0,2011,0,0,0 +THEREUPON,0,0,0,2009,0,0,0 +THREATENED,2009,0,0,0,0,0,0 +FAILED,2009,0,0,0,0,0,0 +FAILURE,2009,0,0,0,0,0,0 +FALSELY,2009,0,0,0,0,0,0 +FALSIFIES,2009,0,0,0,0,0,0 +FANTASTIC,0,2009,0,0,0,0,0 +FAULT,2009,0,0,0,0,0,0 +FAVORABLE,0,2009,0,0,0,0,0 +FAVORITE,0,2009,0,0,0,0,0 +FELONIES,2009,0,0,2009,0,0,0 +DAMAGED,2009,0,0,0,0,0,0 +DAMPENED,2009,0,0,0,0,0,0 +DANGERS,2009,0,0,0,0,0,0 +DEADLOCKS,2009,0,0,0,0,0,0 +DEBARMENTS,2009,0,0,0,0,0,0 +DECEDENTS,0,0,0,2009,0,0,0 +DECEIVE,2009,0,0,0,0,0,0 +DECEPTION,2009,0,0,0,0,0,0 +DECLARANT,0,0,0,2011,0,0,0 +DECLINING,2009,0,0,0,0,0,0 +DECREES,0,0,0,2009,0,0,0 +DEFALCATION,0,0,0,2009,0,0,0 +DEFAMATORY,2009,0,0,0,0,0,0 +DEFAMING,2009,0,0,0,0,0,0 +DEFAULTS,2009,0,0,0,0,0,0 +DEFEASED,0,0,0,2009,0,0,0 +DEFEAT,2009,0,0,0,0,0,0 +DEFECT,2009,0,0,0,0,0,0 +DEFEND,2009,0,0,0,0,0,0 +DEFENDED,2009,0,0,0,0,0,0 +DEFER,2009,0,0,0,0,0,0 +DEFICIENT,2009,0,0,0,0,0,0 +DEFINITIVELY,0,0,0,0,2009,0,0 +DEFRAUDS,2009,0,0,0,0,0,0 +DEGRADE,2009,0,0,0,0,0,0 +DELAY,2009,0,0,0,0,0,0 +DELEGABLE,0,0,0,2009,0,0,0 +DELETERIOUS,2009,0,0,0,0,0,0 +DELIGHT,0,2009,0,0,0,0,0 +DELIGHTING,0,2009,0,0,0,0,0 +DELINQUENT,2009,0,0,0,0,0,0 +DELISTED,2009,0,0,0,0,0,0 +DEMISED,2009,0,0,0,0,0,0 +DEMOLISHED,2009,0,0,0,0,0,0 +DEMOLITIONS,2009,0,0,0,0,0,0 +DEMOTING,2009,0,0,0,0,0,0 +DEMURRER,0,0,0,2009,0,0,0 +DENIAL,2009,0,0,0,0,0,0 +DENIGRATE,2009,0,0,0,0,0,0 +DENIGRATION,2009,0,0,0,0,0,0 +DEPENDABILITY,0,2009,0,0,0,0,0 +DEPENDANT,0,0,0,0,0,0,2011 +DEPENDENCY,0,0,2009,0,0,0,0 +DEPLETE,2009,0,0,0,0,0,0 +DEPLETION,2009,0,0,0,0,0,0 +DEPOSES,0,0,0,2009,0,0,0 +DEPOSITIONS,0,0,0,2009,0,0,0 +INTRUSION,2009,0,0,0,0,0,0 +INVALIDATES,2009,0,0,0,0,0,0 +INVENT,0,2009,0,0,0,0,0 +INVENTIONS,0,2009,0,0,0,0,0 +INVENTORS,0,2009,0,0,0,0,0 +INVESTIGATING,2009,0,0,0,0,0,0 +INVOLUNTARY,2009,0,0,0,0,0,0 +IRRECOVERABLY,2009,0,0,0,0,0,0 +IRREGULARLY,2009,0,0,0,0,0,0 +IRREVOCABILITY,0,0,0,2011,0,0,0 +JEOPARDIZED,2009,0,0,0,0,0,0 +JUDICIARIES,0,0,0,2009,0,0,0 +JURISDICTION,0,0,0,2009,0,0,0 +JURISPRUDENCE,0,0,0,2009,0,0,0 +JURORS,0,0,0,2009,0,0,0 +JUSTICES,0,0,0,2009,0,0,0 +KNOWINGLY,2009,0,0,0,0,0,0 +DILIGENT,0,2009,0,0,0,0,0 +DIMINISHES,2009,0,0,0,0,0,0 +DIRECTIVES,0,0,0,0,0,0,2009 +DISADVANTAGES,2009,0,0,0,0,0,0 +DISAFFIRMED,0,0,0,2011,0,0,0 +DISAGREED,2009,0,0,0,0,0,0 +DISAGREES,2009,0,0,0,0,0,0 +DISALLOWED,2009,0,0,0,0,0,0 +DISAPPEARANCE,2009,0,0,0,0,0,0 +DISAPPEARS,2009,0,0,0,0,0,0 +DISAPPOINTINGLY,2009,0,0,0,0,0,0 +DISAPPROVAL,2009,0,0,0,0,0,0 +DISAPPROVES,2009,0,0,0,0,0,0 +DISASSOCIATION,2009,0,0,0,0,0,0 +DISASTROUS,2009,0,0,0,0,0,0 +DISAVOWED,2009,0,0,0,0,0,0 +GREAT,0,-2020,0,0,0,0,0 +GREATNESS,0,2009,0,0,0,0,0 +GROUNDLESS,2009,0,0,0,0,0,0 +HAMPER,2009,0,0,0,0,0,0 +HAPPIEST,0,2009,0,0,0,0,0 +HARASS,2009,0,0,0,0,0,0 +HARDSHIP,2009,0,0,0,0,0,0 +HARMFUL,2009,0,0,0,0,0,0 +HARSH,2009,0,0,0,0,0,0 +HARSHNESS,2009,0,0,0,0,0,0 +NONJUDICIAL,0,0,0,2009,0,0,0 +NONPAYMENTS,2009,0,0,0,0,0,0 \ No newline at end of file diff --git a/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/python-challenge/task.py b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/python-challenge/task.py new file mode 100644 index 000000000000..a7e0702e011a --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/python-challenge/task.py @@ -0,0 +1,68 @@ +# 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. + +# beam-playground: +# name: FinalChallenge2 +# description: Final challenge 2. +# multifile: true +# files: +# - name: analysis.csv +# context_line: 50 +# categories: +# - Quickstart +# complexity: ADVANCED +# tags: +# - hellobeam + +import re +import apache_beam as beam +from apache_beam.io import ReadFromText +from apache_beam.options.pipeline_options import PipelineOptions +from apache_beam.transforms import window, trigger +from apache_beam.transforms.combiners import CountCombineFn + + +class SplitWords(beam.DoFn): + def process(self, element): + return element.lower().split(" ") + + +class Analysis: + def __init__(self, word, negative, positive, uncertainty, litigious, strong, weak, constraining): + self.word = word + self.negative = negative + self.positive = positive + self.uncertainty = uncertainty + self.litigious = litigious + self.strong = strong + self.weak = weak + self.constraining = constraining + + def __str__(self): + return (f'Analysis(word={self.word}, negative={self.negative}, positive={self.positive}, ' + f'uncertainty={self.uncertainty}, litigious={self.litigious}, strong={self.strong}, ' + f'weak={self.weak}, constraining={self.constraining})') + +def run(): + pipeline_options = PipelineOptions() + with beam.Pipeline(options=pipeline_options) as p: + shakespeare = (p + | 'Read from text file' >> ReadFromText('gs://apache-beam-samples/shakespeare/kinglear.txt') + | 'Split into words' >> beam.ParDo(SplitWords()) + | 'Filter empty words' >> beam.Filter(bool)) + +if __name__ == "__main__": + run() diff --git a/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/python-solution/analysis.csv b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/python-solution/analysis.csv new file mode 100644 index 000000000000..5c4a1246021e --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/python-solution/analysis.csv @@ -0,0 +1,3877 @@ +Word,Negative,Positive,Uncertainty,Litigious,Strong_Modal,Weak_Modal,Constraining +NONSEVERABLE,0,0,0,2011,0,0,0 +DISFAVOR,2009,0,0,0,0,0,0 +DISGORGE,2009,0,0,0,0,0,0 +COMPLICATES,2009,0,0,0,0,0,0 +COMPLIMENT,0,2009,0,0,0,0,0 +COMPLIMENTS,0,2009,0,0,0,0,0 +MISSTATE,2009,0,0,0,0,0,0 +MISSTATES,2009,0,0,0,0,0,0 +MISTAKE,2009,0,0,0,0,0,0 +MISTAKING,2009,0,0,0,0,0,0 +MISUNDERSTANDING,2009,0,0,0,0,0,0 +MISUSED,2009,0,0,0,0,0,0 +MONOPOLISTS,2009,0,0,0,0,0,0 +MONOPOLIZES,2009,0,0,0,0,0,0 +MORATORIUM,2009,0,0,0,0,0,0 +MOTHBALLING,2009,0,0,0,0,0,0 +SLOW,2009,0,0,0,0,0,0 +SLOWER,2009,0,0,0,0,0,0 +SLOWNESS,2009,0,0,0,0,0,0 +SMOOTH,0,2009,0,0,0,0,0 +DEPRECATION,2009,0,0,0,0,0,0 +DEPRESSING,2009,0,0,0,0,0,0 +DEPRIVES,2009,0,0,0,0,0,0 +DEROGATE,0,0,0,2009,0,0,0 +DEROGATION,0,0,0,2009,0,0,0 +DESIRABLE,0,2009,0,0,0,0,0 +DESTABILIZATION,2009,0,0,0,0,0,0 +DESTINED,0,2009,0,0,0,0,0 +DESTROYS,2009,0,0,0,0,0,0 +DETAINED,2009,0,0,0,0,0,0 +DETER,2009,0,0,0,0,0,0 +DETERIORATING,2009,0,0,0,0,0,0 +DETERRENCE,2009,0,0,0,0,0,0 +DETERRING,2009,0,0,0,0,0,0 +DETRACTING,2009,0,0,0,0,0,0 +DETRIMENTS,2009,0,0,0,0,0,0 +DEVALUING,2009,0,0,0,0,0,0 +DEVASTATION,2009,0,0,0,0,0,0 +DEVIATING,2009,0,2009,0,0,0,0 +DEVOLVE,2009,0,0,0,0,0,0 +DICTATE,0,0,0,0,0,0,2009 +DIFFER,0,0,2009,0,0,0,0 +DIFFICULT,2009,0,0,0,0,0,0 +ASSAULT,2009,0,0,0,0,0,0 +ASSERTABLE,0,0,0,2011,0,0,0 +ASSUMABLE,0,0,0,2009,0,0,0 +ASSUMING,0,0,2009,0,0,0,0 +ASSURED,0,2009,0,0,0,0,0 +ATTAINED,0,2009,0,0,0,0,0 +ATTAINS,0,2009,0,0,0,0,0 +ATTESTED,0,0,0,2009,0,0,0 +ATTORNEYS,0,0,0,2009,0,0,0 +ATTRACTIVENESS,0,2009,0,0,0,0,0 +BAD,2009,0,0,0,0,0,0 +BAILEES,0,0,0,2011,0,0,0 +BAILOUT,2009,0,0,0,0,0,0 +BANKRUPTCIES,2009,0,0,0,0,0,0 +BANKRUPTS,2009,0,0,0,0,0,0 +CLAIM,0,0,0,2009,0,0,0 +CLAIMHOLDER,0,0,0,2014,0,0,0 +CLARIFICATIONS,0,0,2009,0,0,0,0 +CLOSED,-2020,0,0,0,0,0,0 +CLOSINGS,2009,0,0,0,0,0,0 +CODEFENDANTS,0,0,0,2011,0,0,0 +CODIFICATIONS,0,0,0,2009,0,0,0 +CODIFYING,0,0,0,2009,0,0,0 +COERCING,2009,0,0,0,0,0,0 +COLLABORATES,0,2009,0,0,0,0,0 +COLLABORATIVE,0,2009,0,0,0,0,0 +COLLAPSED,2009,0,0,0,0,0,0 +COLLISIONS,2009,0,0,0,0,0,0 +COLLUDING,2009,0,0,0,0,0,0 +POSES,2009,0,0,0,0,0,0 +POSSESSORY,0,0,0,2009,0,0,0 +POSSIBLY,0,0,2009,0,0,2009,0 +POSTJUDGMENT,0,0,0,2011,0,0,0 +POSTPONEMENTS,2009,0,0,0,0,0,0 +WRITEDOWNS,2009,0,0,0,0,0,0 +WRONG,2009,0,0,0,0,0,0 +WRONGFULLY,2009,0,0,0,0,0,0 +HONORABLE,0,-2020,0,0,0,0,0 +HOSTILE,2009,0,0,0,0,0,0 +REASSESS,0,0,2009,0,0,0,0 +REASSESSMENT,2009,0,2009,0,0,0,0 +REASSIGNING,2009,0,0,0,0,0,0 +REBOUND,0,2009,0,0,0,0,0 +REBUTS,0,0,0,2009,0,0,0 +REBUTTALS,0,0,0,2009,0,0,0 +RECALCULATED,0,0,2009,0,0,0,0 +RECALCULATIONS,0,0,2009,0,0,0,0 +RECALLS,2009,0,0,0,0,0,0 +RECESSIONS,2009,0,0,0,0,0,0 +RECONSIDER,0,0,2009,0,0,0,0 +RECORDATION,0,0,0,2009,0,0,0 +RECOURSE,0,0,0,2009,0,0,0 +RECUSAL,0,0,0,2011,0,0,0 +RECUSING,0,0,0,2011,0,0,0 +REDACTION,2009,0,0,2009,0,0,0 +REDEFAULTS,2014,0,0,0,0,0,0 +REDRESSING,2009,0,0,0,0,0,0 +REFERENDA,0,0,0,2009,0,0,0 +REFILED,0,0,0,2009,0,0,0 +REFRAINING,0,0,0,0,0,0,2009 +REFUSE,2009,0,0,0,0,0,0 +REGAIN,0,2009,0,0,0,0,0 +REGULATED,0,0,0,2009,0,0,0 +REGULATIONS,0,0,0,2009,0,0,0 +REGULATORY,0,0,0,2009,0,0,0 +REHEARINGS,0,0,0,2009,0,0,0 +VARIABILITY,0,0,2009,0,0,0,0 +VARIANCE,0,0,2009,0,0,0,0 +VARIATION,0,0,2009,0,0,0,0 +VARY,0,0,2009,0,0,0,0 +VERDICT,2009,0,0,2009,0,0,0 +VETOED,2009,0,0,0,0,0,0 +VICTIMS,2009,0,0,0,0,0,0 +VIOLATING,2009,0,0,0,0,0,0 +VIOLATOR,2009,0,0,0,0,0,0 +VIOLENTLY,2009,0,0,0,0,0,0 +VITIATING,2009,0,0,0,0,0,0 +VOIDING,2009,0,0,2009,0,0,0 +VULNERABILITIES,2009,0,0,0,0,0,0 +WARN,2009,0,0,0,0,0,0 +WARNS,2009,0,0,0,0,0,0 +WASTEFUL,2009,0,0,0,0,0,0 +WEAKENED,2009,0,0,0,0,0,0 +WEAKEST,2009,0,0,0,0,0,0 +DISHONESTLY,2009,0,0,0,0,0,0 +DISHONORABLY,2009,0,0,0,0,0,0 +DISINTERESTEDNESS,2009,0,0,0,0,0,0 +DISMAL,2009,0,0,0,0,0,0 +DISMISSALS,2009,0,0,0,0,0,0 +DISORDERLY,2009,0,0,0,0,0,0 +DISPARAGEMENTS,2009,0,0,0,0,0,0 +DISPARITIES,2009,0,0,0,0,0,0 +DISPLACEMENT,2009,0,0,0,0,0,0 +DISPOSE,2009,0,0,0,0,0,0 +DISPOSSESSES,2009,0,0,0,0,0,0 +DISPROPORTION,2009,0,0,0,0,0,0 +DISPUTE,2009,0,0,0,0,0,0 +DISQUALIFICATION,2009,0,0,0,0,0,0 +DISQUALIFY,2009,0,0,0,0,0,0 +DISREGARDING,2009,0,0,0,0,0,0 +DISRUPT,2009,0,0,0,0,0,0 +DISRUPTIONS,2009,0,0,0,0,0,0 +DISSATISFIED,2009,0,0,0,0,0,0 +DISSENTERS,2009,0,0,0,0,0,0 +DISSIDENTS,2009,0,0,0,0,0,0 +DISTINCTIONS,0,2009,0,0,0,0,0 +DISTORT,2009,0,0,0,0,0,0 +DISTORTIONS,2009,0,0,0,0,0,0 +DISTRACTING,2009,0,0,0,0,0,0 +DISTRAINT,0,0,0,2009,0,0,0 +DISTRIBUTEES,0,0,0,2009,0,0,0 +DISTURBED,2009,0,0,0,0,0,0 +DIVERT,2009,0,0,0,0,0,0 +DIVEST,2009,0,0,0,0,0,0 +DIVESTITURES,2009,0,0,0,0,0,0 +DIVORCE,2009,0,0,0,0,0,0 +DIVULGES,2009,0,0,0,0,0,0 +DOCKETING,0,0,0,2009,0,0,0 +DOUBTED,2009,0,2009,0,0,0,0 +DOWNGRADED,2009,0,0,0,0,0,0 +DOWNSIZED,2009,0,0,0,0,0,0 +DOWNTIME,2009,0,0,0,0,0,0 +DOWNWARD,2009,0,0,0,0,0,0 +DRASTICALLY,2009,0,0,0,0,0,0 +DROPPED,2009,0,0,0,0,0,0 +DURESS,2009,0,0,0,0,0,0 +EARMARK,0,0,0,0,0,0,2009 +EASIER,0,2009,0,0,0,0,0 +EFFECTIVE,0,-2020,0,0,0,0,0 +EFFICIENTLY,0,2009,0,0,0,0,0 +EMBARGO,2009,0,0,0,0,0,0 +EMBARRASS,2009,0,0,0,0,0,0 +EMBARRASSMENT,2009,0,0,0,0,0,0 +EMBEZZLEMENT,2009,0,0,0,0,0,0 +EMBEZZLING,2009,0,0,0,0,0,0 +EMPOWERS,0,2009,0,0,0,0,0 +ENABLING,0,2009,0,0,0,0,0 +ENCOURAGING,0,2009,0,0,0,0,0 +ENCROACHING,2009,0,0,0,0,0,0 +ENCUMBERED,2009,0,0,2009,0,0,2009 +ENCUMBRANCER,0,0,0,2009,0,0,0 +ENDANGERED,2009,0,0,0,0,0,0 +ENDORSEE,0,0,0,2011,0,0,0 +ENHANCE,0,2009,0,0,0,0,0 +ENHANCES,0,2009,0,0,0,0,0 +ENJOINING,2009,0,0,0,0,0,0 +ENJOYABLY,0,2009,0,0,0,0,0 +ENJOYS,0,2009,0,0,0,0,0 +ENTAILS,0,0,0,0,0,0,2009 +PATENTEE,0,0,0,2014,0,0,0 +PENALIZES,2009,0,0,0,0,0,0 +PENDING,0,0,2009,0,0,0,0 +PERFECTS,0,2009,0,0,0,0,0 +PERJURY,2009,0,0,2009,0,0,0 +PERMITTED,0,0,0,0,0,0,2009 +PERPETRATE,2009,0,0,2009,0,0,0 +PERPETRATION,2009,0,0,2009,0,0,0 +PERSISTENT,2009,0,0,0,0,0,0 +PERSONAM,0,0,0,2011,0,0,0 +PETITION,0,0,0,2009,0,0,0 +PETITIONING,0,0,0,2009,0,0,0 +PICKETED,2009,0,0,0,0,0,0 +HENCEFORTH,0,0,0,2009,0,0,0 +HEREDITAMENTS,0,0,0,2009,0,0,0 +HEREIN,0,0,0,2009,0,0,0 +HEREINBELOW,0,0,0,2009,0,0,0 +HERETOFORE,0,0,0,2009,0,0,0 +HEREWITH,0,0,0,2009,0,0,0 +HINDER,2009,0,0,0,0,0,0 +HINDRANCE,2009,0,0,0,0,0,0 +WHATSOEVER,0,0,0,2009,0,0,0 +WHEREAT,0,0,0,2009,0,0,0 +WHEREOF,0,0,0,2009,0,0,0 +WHEREUPON,0,0,0,2009,0,0,0 +WHOMSOEVER,0,0,0,2009,0,0,0 +WILLFUL,0,0,0,2009,0,0,0 +WINNER,0,2009,0,0,0,0,0 +WITNESSES,0,0,0,2009,0,0,0 +FLUCTUATES,0,0,2009,0,0,0,0 +FORBADE,0,0,0,2009,0,0,2011 +FORBEARING,0,0,0,2009,0,0,0 +FORBIDDING,2009,0,0,0,0,0,2009 +FORCING,2009,0,0,0,0,0,0 +FORECLOSE,2009,0,0,0,0,0,0 +FORECLOSURE,2009,0,0,0,0,0,0 +FOREGONE,2009,0,0,0,0,0,0 +FORESTALLS,2009,0,0,0,0,0,0 +FORFEITED,2009,0,0,0,0,0,0 +FORFEITURES,2009,0,0,0,0,0,0 +FORWHICH,0,0,0,2012,0,0,0 +FRAUDULENT,2009,0,0,0,0,0,0 +FRIVOLOUSLY,2009,0,0,0,0,0,0 +FRUSTRATING,2009,0,0,0,0,0,0 +FUGITIVE,-2020,0,0,2009,0,0,0 +GAINED,0,2009,0,0,0,0,0 +GRANTOR,0,0,0,2009,0,0,0 +DISGORGING,2009,0,0,0,0,0,0 +DISHONEST,2009,0,0,0,0,0,0 +LITIGANT,2009,0,0,2009,0,0,0 +LITIGATES,2009,0,0,2009,0,0,0 +LITIGATOR,0,0,0,2009,0,0,0 +LACKLUSTER,2009,0,0,0,0,0,0 +LAGGING,2009,0,0,0,0,0,0 +LAPSES,2009,0,0,0,0,0,0 +LAW,0,0,0,2009,0,0,0 +LAWMAKERS,0,0,0,2009,0,0,0 +LAWSUITS,0,0,0,2009,0,0,0 +LAYOFFS,2009,0,0,0,0,0,0 +LEGALESE,0,0,0,2009,0,0,0 +LEGALIZE,0,0,0,2009,0,0,0 +LEGALLY,0,0,0,2009,0,0,0 +NONPRODUCING,2009,0,0,0,0,0,0 +LIQUIDATE,2009,0,0,0,0,0,0 +LIQUIDATION,2009,0,0,0,0,0,0 +BENEFICIALLY,0,2009,0,0,0,0,0 +BENEFITED,0,2009,0,0,0,0,0 +BEST,0,2012,0,0,2009,0,0 +POPULAR,0,2009,0,0,0,0,0 +REINTERPRETED,0,0,2009,0,0,0,0 +REJECTED,2009,0,0,0,0,0,0 +REJECTS,2009,0,0,0,0,0,0 +RELINQUISHES,2009,0,0,0,0,0,0 +RELUCTANCE,2009,0,0,0,0,0,0 +REMANDING,0,0,0,2009,0,0,0 +REMEDIATING,0,0,0,2009,0,0,0 +REMISED,0,0,0,2011,0,0,0 +RENEGOTIATING,2009,0,0,0,0,0,0 +RENOUNCED,2009,0,0,0,0,0,0 +RENOUNCING,2009,0,0,0,0,0,0 +REPLEVIN,0,0,0,2009,0,0,0 +REPOSSESSION,2009,0,0,0,0,0,0 +TURBULENCE,2009,0,2009,0,0,0,0 +UNACCEPTABLY,2009,0,0,0,0,0,0 +UNANTICIPATED,2009,0,0,0,0,0,0 +UNATTRACTIVE,2009,0,0,0,0,0,0 +UNAVOIDABLE,2009,0,0,0,0,0,0 +UNCERTAINLY,0,0,2009,0,0,2009,0 +UNCOLLECTABLE,2009,0,0,0,0,0,0 +UNCOLLECTIBLES,2009,0,0,0,0,0,0 +UNCONFIRMED,0,0,2009,0,0,0,0 +UNCONSTITUTIONALITY,0,0,0,2009,0,0,0 +UNCONTROLLABLY,2009,0,0,0,0,0,0 +UNCOVERED,2009,0,0,0,0,0,0 +UNDEFEASED,0,0,0,2012,0,0,0 +UNDERCAPITALIZED,2009,0,0,0,0,0,0 +UNDERESTIMATE,2009,0,0,0,0,0,0 +UNDERESTIMATION,2009,0,0,0,0,0,0 +UNDERMINED,2009,0,0,0,0,0,0 +UNDERPAYMENT,2009,0,0,0,0,0,0 +UNDERPERFORMANCE,2009,0,0,0,0,0,0 +UNDERPRODUCED,2009,0,0,0,0,0,0 +UNDERSTATED,2009,0,0,0,0,0,0 +UNDERSTATING,2009,0,0,0,0,0,0 +UNDESIRABLE,2009,0,0,0,0,0,0 +UNDETERMINABLE,0,0,2009,0,0,0,0 +UNDISPUTED,0,0,0,0,2009,0,0 +UNDULY,2009,0,0,0,0,0,0 +UNEMPLOYED,2009,0,0,0,0,0,0 +UNENFORCEABILITY,0,0,0,2009,0,0,0 +UNETHICAL,2009,0,0,0,0,0,0 +UNEXPECTEDLY,2009,0,2009,0,0,0,0 +UNFAMILIARITY,0,0,2009,0,0,0,0 +UNFAVOURABLE,2011,0,0,0,0,0,0 +UNFORECASTED,0,0,2011,0,0,0,0 +UNFORTUNATE,2009,0,0,0,0,0,0 +UNFULFILLED,2009,0,0,0,0,0,0 +UNIDENTIFIABLE,0,0,2009,0,0,0,0 +UNINTENTIONAL,2009,0,0,0,0,0,0 +UNJUSTIFIABLY,2009,0,0,0,0,0,0 +UNKNOWINGLY,2009,0,0,0,0,0,0 +UNLAWFULLY,2009,0,0,2009,0,0,0 +UNMARKETABLE,2009,0,0,0,0,0,0 +UNNECESSARILY,2009,0,0,0,0,0,0 +UNOBTAINABLE,2009,0,0,0,0,0,0 +UNPERFORMED,2009,0,0,0,0,0,0 +UNPREDICTABLE,2009,0,2009,0,0,0,0 +UNPROFITABILITY,2011,0,0,0,0,0,0 +UNQUALIFIED,2009,0,0,0,0,0,0 +UNREASONABLE,2009,0,0,0,0,0,0 +UNRECONCILED,0,0,2011,0,0,0,0 +UNRELIABLE,2009,0,0,0,0,0,0 +UNRESOLVED,2009,0,0,0,0,0,0 +UNSALEABLE,2009,0,0,0,0,0,0 +UNSCHEDULED,2009,0,0,0,0,0,0 +UNSETTLED,0,0,2009,0,0,0,0 +UNSPECIFIED,0,0,2009,0,0,0,0 +UNSUBSTANTIATED,2009,0,0,0,0,0,0 +UNSUITABLE,2009,0,0,0,0,0,0 +UNSURPASSED,0,2009,0,0,2009,0,0 +UNTENABLE,2009,0,0,0,0,0,0 +UNTRUSTED,2014,0,0,0,0,0,0 +UNTRUTHFULNESS,2009,0,0,0,0,0,0 +UNUSUALLY,0,0,2009,0,0,0,0 +UNWILLING,2009,0,0,0,0,0,0 +UPTURN,0,2009,0,0,0,0,0 +USURIOUS,2009,0,0,2009,0,0,0 +USURPING,2009,0,0,2009,0,0,0 +VAGUE,0,0,2012,0,0,0,0 +VAGUER,0,0,2012,0,0,0,0 +PLAINTIFFS,2009,0,0,2009,0,0,0 +PLEADING,2009,0,0,2009,0,0,0 +PLEASANT,0,2009,0,0,0,0,0 +PLED,2009,0,0,0,0,0,0 +PLEDGEES,0,0,0,2011,0,0,0 +PLEDGORS,0,0,0,2012,0,0,0 +COMPELLING,0,0,0,0,0,0,2011 +COMPLAINANT,0,0,0,2009,0,0,0 +COMPLAINS,2009,0,0,0,0,0,0 +COMMITS,0,0,0,0,0,0,2009 +LIKELIHOOD,0,0,2009,0,0,0,0 +LIMITING,0,0,0,0,0,0,2009 +RESTRAIN,0,0,0,0,0,0,2009 +RESTRAINT,0,0,0,0,0,0,2009 +RESTRICTING,0,0,0,0,0,0,2009 +RESTRICTIVELY,0,0,0,0,0,0,2009 +RESTRUCTURED,2009,0,0,0,0,0,0 +RETALIATE,2009,0,0,0,0,0,0 +RETALIATION,2009,0,0,0,0,0,0 +PRECAUTION,0,0,2009,0,0,0,0 +PRECIPITOUS,2009,0,0,0,0,0,0 +PRECLUDES,2009,0,0,0,0,0,2009 +PREDATORY,2009,0,0,0,0,0,0 +PREDECEASING,0,0,0,2009,0,0,0 +PREDICTING,0,0,2009,0,0,0,0 +PREDICTOR,0,0,2009,0,0,0,0 +PREEMINENT,0,2009,0,0,0,0,0 +PREJUDICES,2009,0,0,2009,0,0,0 +PRELIMINARY,0,0,2009,0,0,0,0 +PREMIERE,0,2009,0,0,0,0,0 +PRESTIGE,0,2009,0,0,0,0,0 +PRESUMED,0,0,2009,0,0,0,0 +PRESUMPTIONS,0,0,2009,0,0,0,0 +PREVENTED,0,0,0,0,0,0,2009 +PRIMA,0,0,0,2009,0,0,0 +PROBABILISTIC,0,0,2009,0,0,0,0 +PROBABLY,0,0,2009,0,0,0,0 +PROBATING,0,0,0,2009,0,0,0 +PROBATIONER,0,0,0,2009,0,0,0 +PROBLEMATIC,2009,0,0,0,0,0,0 +PROFICIENT,0,2009,0,0,0,0,0 +PROFITABLY,0,2009,0,0,0,0,0 +PROGRESSING,0,2009,0,0,0,0,0 +PROHIBITION,0,0,0,0,0,0,2009 +PROHIBITORY,0,0,0,0,0,0,2009 +PROLONGATIONS,2009,0,0,0,0,0,0 +PROMULGATE,0,0,0,2009,0,0,0 +PROMULGATION,0,0,0,2009,0,0,0 +PRONE,2009,0,0,0,0,0,0 +PROSECUTED,2009,0,0,2009,0,0,0 +PROSECUTIONS,2009,0,0,2009,0,0,0 +PROSPERED,0,2009,0,0,0,0,0 +PROSPERS,0,2009,0,0,0,0,0 +PROTESTERS,2009,0,0,0,0,0,0 +PROTESTS,2009,0,0,0,0,0,0 +PROVISOES,0,0,0,2009,0,0,0 +PROVOKES,2009,0,0,0,0,0,0 +PUNISHES,2009,0,0,0,0,0,0 +PUNITIVE,2009,0,0,0,0,0,0 +PURPORTING,2009,0,0,0,0,0,0 +QUESTIONABLY,2009,0,0,0,0,0,0 +QUIT,2009,0,0,0,0,0,0 +RACKETEER,2009,0,0,0,0,0,0 +RANDOMIZED,0,0,2009,0,0,0,0 +RANDOMNESS,0,0,2009,0,0,0,0 +RATIONALIZATION,2009,0,0,0,0,0,0 +RATIONALIZES,2009,0,0,0,0,0,0 +ABANDONMENT,2009,0,0,0,0,0,0 +ABDICATES,2009,0,0,0,0,0,0 +ABERRANT,2009,0,0,0,0,0,0 +ABETTING,2009,0,0,0,0,0,0 +ABIDING,0,0,0,0,0,0,2009 +ABNORMALITY,2009,0,0,0,0,0,0 +ABOLISHES,2009,0,0,0,0,0,0 +ABROGATED,2009,0,0,2009,0,0,0 +ABROGATIONS,2009,0,0,2009,0,0,0 +ABSENCE,2009,0,0,0,0,0,0 +ABSOLVED,0,0,0,2009,0,0,0 +ABUNDANT,0,2009,0,0,0,0,0 +ABUSING,2009,0,0,0,0,0,0 +ACCESSION,0,0,0,2009,0,0,0 +ACCIDENTALLY,2009,0,0,0,0,0,0 +ACCOMPLISHED,0,2009,0,0,0,0,0 +ACCOMPLISHMENTS,0,2009,0,0,0,0,0 +ACCUSED,2009,0,0,0,0,0,0 +ACHIEVED,0,2009,0,0,0,0,0 +ACHIEVING,0,2009,0,0,0,0,0 +ACQUIESCING,2009,0,0,0,0,0,0 +ACQUITS,2009,0,0,2009,0,0,0 +ACQUITTANCES,0,0,0,2011,0,0,0 +ADEQUATELY,0,2009,0,0,0,0,0 +ADJOURNMENT,0,0,0,2009,0,0,0 +ADJUDGED,0,0,0,2009,0,0,0 +ADJUDICATED,0,0,0,2009,0,0,0 +ADJUDICATIONS,0,0,0,2009,0,0,0 +ADJUDICATORY,0,0,0,2009,0,0,0 +ADMISSION,0,0,0,2009,0,0,0 +ADULTERATING,2009,0,0,0,0,0,0 +ADVANCEMENTS,0,2009,0,0,0,0,0 +ADVANTAGED,0,2009,0,0,0,0,0 +ADVERSARIAL,2009,0,0,0,0,0,0 +ADVERSELY,2009,0,0,0,0,0,0 +AFFIDAVITS,0,0,0,2009,0,0,0 +AFOREMENTIONED,0,0,0,2009,0,0,0 +AFTERMATHS,2009,0,0,0,0,0,0 +AGGRAVATES,2009,0,0,0,0,0,0 +AGGRIEVED,0,0,0,2009,0,0,0 +ALIENATED,2009,0,0,0,0,0,0 +ALIENATIONS,2009,0,0,0,0,0,0 +ALLEGED,2009,0,0,2009,0,0,0 +ALLIANCE,0,2009,0,0,0,0,0 +ALTERATIONS,0,0,2009,0,0,0,0 +AMBIGUOUS,0,0,2009,0,0,0,0 +AMENDED,0,0,0,2009,0,0,0 +AMENDS,0,0,0,2009,0,0,0 +ANNOYED,2009,0,0,0,0,0,0 +ANNULLED,2009,0,0,0,0,0,0 +ANNULS,2009,0,0,0,0,0,0 +ANOMALY,2009,0,2009,0,0,0,0 +ANTICIPATED,0,0,2009,0,0,0,0 +ANTICIPATIONS,0,0,2009,0,0,0,0 +ANYWISE,0,0,0,2009,0,0,0 +APPEALABLE,0,0,0,2009,0,0,0 +APPEAR,0,0,2009,0,0,0,0 +APPELLANT,0,0,0,2009,0,0,0 +APPOINTOR,0,0,0,2011,0,0,0 +APPROXIMATES,0,0,2009,0,0,0,0 +APPURTENANCE,0,0,0,2009,0,0,0 +ARBITRAL,0,0,0,2009,0,0,0 +ARBITRATE,0,0,0,2009,0,0,0 +ARBITRATION,0,0,0,2009,0,0,0 +ARBITRATOR,0,0,0,2009,0,0,0 +ARGUING,2009,0,0,0,0,0,0 +ARREARAGE,2009,0,0,2009,0,0,0 +ARRESTED,2009,0,0,0,0,0,0 +RETROCEDE,0,0,0,2011,0,0,0 +BOLSTERED,0,2009,0,0,0,0,0 +BONAFIDE,0,0,0,2009,0,0,0 +BOOSTED,0,2009,0,0,0,0,0 +BOUNDED,0,0,0,0,0,0,2009 +BOYCOTTS,2009,0,0,0,0,0,0 +BREACHING,2009,0,0,2009,0,0,0 +BREAKDOWN,2009,0,0,0,0,0,0 +BREAKTHROUGH,0,2009,0,0,0,0,0 +BRIBERIES,2009,0,0,0,0,0,0 +BRIDGE,-2020,0,0,0,0,0,0 +BURDENED,2009,0,0,0,0,0,0 +BURNED,2009,0,0,0,0,0,0 +CANCEL,2009,0,0,0,0,0,0 +CANCELLATIONS,2009,0,0,0,0,0,0 +CARELESS,2009,0,0,0,0,0,0 +CATASTROPHE,2009,0,0,0,0,0,0 +CAUTION,2009,0,0,0,0,0,0 +CAUTIONS,2009,0,0,0,0,0,0 +CEASE,2009,0,0,0,0,0,0 +CEDANT,0,0,0,2012,0,0,0 +CENSURES,2009,0,0,0,0,0,0 +CHALLENGE,2009,0,0,0,0,0,0 +CHARGEOFFS,2009,0,0,0,0,0,0 +CHOATE,0,0,0,2011,0,0,0 +CIRCUMVENTION,2009,0,0,0,0,0,0 +SHOCKED,2009,0,0,0,0,0,0 +SHORTFALLS,2009,0,0,0,0,0,0 +SHUTDOWN,2009,0,0,0,0,0,0 +SLANDER,2009,0,0,0,0,0,0 +REPUDIATED,2009,0,0,0,0,0,0 +REPUDIATIONS,2009,0,0,0,0,0,0 +REQUIRED,0,0,0,0,0,0,2009 +REQUIRING,0,0,0,0,0,0,2009 +RESCINDING,0,0,0,2009,0,0,0 +RESIGN,2009,0,0,0,0,0,0 +RESIGNING,2009,0,0,0,0,0,0 +RESTATED,2009,0,0,0,0,0,0 +RESTATING,2009,0,0,0,0,0,0 +NONUSURIOUS,0,0,0,2011,0,0,0 +NOTARIZATIONS,0,0,0,2009,0,0,0 +NOTARY,0,0,0,2009,0,0,0 +NUISANCES,2009,0,0,0,0,0,0 +NULLIFIES,2009,0,0,2009,0,0,0 +NULLITY,0,0,0,2009,0,0,0 +OBJECTIONABLE,2009,0,0,0,0,0,0 +OBLIGATED,0,0,0,0,0,0,2009 +OBLIGATIONS,0,0,0,0,0,0,2009 +OBLIGEE,0,0,0,2009,0,0,0 +OBLIGORS,0,0,0,2009,0,0,0 +OBSOLETE,2009,0,0,0,0,0,0 +OBSTRUCTED,2009,0,0,0,0,0,0 +OCCASIONALLY,0,0,2009,0,0,2009,0 +OFFENDED,2009,0,0,0,0,0,0 +OFFENDS,2009,0,0,0,0,0,0 +OFFEROR,0,0,0,2009,0,0,0 +OMIT,2009,0,0,0,0,0,0 +ONEROUS,2009,0,0,0,0,0,0 +OPPORTUNITY,0,2009,0,0,0,0,0 +OPPOSING,2009,0,0,0,0,0,0 +OPTIONEE,0,0,0,2009,0,0,0 +OUTAGES,2009,0,0,0,0,0,0 +OUTPERFORMED,0,2009,0,0,0,0,0 +OVERAGES,2009,0,0,0,0,0,0 +OVERBUILT,2009,0,0,0,0,0,0 +OVERCAPACITIES,2009,0,0,0,0,0,0 +OVERCHARGES,2009,0,0,0,0,0,0 +OVERCOMING,2009,0,0,0,0,0,0 +OVERESTIMATES,2009,0,0,0,0,0,0 +OVERLOAD,2009,0,0,0,0,0,0 +OVERLOOK,2009,0,0,0,0,0,0 +OVERPAID,2009,0,0,0,0,0,0 +OVERPRODUCES,2009,0,0,0,0,0,0 +OVERRULED,0,0,0,2009,0,0,0 +OVERRUNNING,2009,0,0,0,0,0,0 +OVERSHADOWING,2009,0,0,0,0,0,0 +OVERSTATEMENT,2009,0,0,0,0,0,0 +OVERSUPPLIED,2009,0,0,0,0,0,0 +OVERTLY,2009,0,0,0,0,0,0 +OVERTURNS,2009,0,0,0,0,0,0 +PANIC,2009,0,0,0,0,0,0 +NEARLY,0,0,2009,0,0,2009,0 +NECESSITATING,0,0,0,0,0,0,2009 +NEGLECT,2009,0,0,0,0,0,0 +NEGLECTS,2009,0,0,0,0,0,0 +NEGLIGENTLY,2009,0,0,0,0,0,0 +BARRIER,2009,0,0,0,0,0,0 +BELIEVE,0,0,2009,0,0,0,0 +IDLED,2009,0,0,0,0,0,0 +IGNORES,2009,0,0,0,0,0,0 +ILLEGALITIES,2009,0,0,0,0,0,0 +ILLICIT,2009,0,0,0,0,0,0 +IMBALANCE,2009,0,0,0,0,0,0 +IMMORAL,2009,0,0,0,0,0,0 +IMPAIRMENT,2009,0,0,0,0,0,2011 +IMPASSES,2009,0,0,0,0,0,0 +IMPEDIMENT,2009,0,0,0,0,0,0 +IMPERATIVE,2009,0,0,0,0,0,0 +IMPERMISSIBLE,2009,0,0,0,0,0,0 +IMPLICATES,2009,0,0,0,0,0,0 +IMPOSES,0,0,0,0,0,0,2009 +IMPOSSIBILITY,2009,0,0,0,0,0,0 +IMPOUNDING,2009,0,0,0,0,0,0 +IMPRACTICALITIES,2009,0,0,0,0,0,0 +IMPRECISIONS,0,0,2009,0,0,0,0 +IMPRESSING,0,2009,0,0,0,0,0 +IMPROBABILITY,0,0,2009,0,0,0,0 +IMPROPRIETIES,2009,0,0,0,0,0,0 +IMPROVEMENT,0,2009,0,0,0,0,0 +IMPRUDENT,2009,0,0,0,0,0,0 +INACCURACIES,2009,0,0,0,0,0,0 +INACTION,2009,0,0,0,0,0,0 +INACTIVATES,2009,0,0,0,0,0,0 +INACTIVITY,2009,0,0,0,0,0,0 +INADEQUATELY,2009,0,0,0,0,0,0 +INADVISABLE,2009,0,0,0,0,0,0 +INATTENTION,2009,0,0,0,0,0,0 +INCARCERATE,2009,0,0,2009,0,0,0 +INCARCERATION,2009,0,0,2009,0,0,0 +INCIDENCES,2009,0,0,0,0,0,0 +INCOMPATIBILITY,2009,0,0,0,0,0,0 +INCOMPETENT,2009,0,0,0,0,0,0 +INCOMPLETELY,2009,0,0,0,0,0,0 +INCONSISTENCY,2009,0,0,0,0,0,0 +INCONTESTABLE,0,0,0,2009,0,0,0 +INCORRECT,2009,0,0,0,0,0,0 +INCREDIBLY,0,2009,0,0,0,0,0 +INDEFEASIBLE,2009,0,0,0,0,0,0 +INDEFINITENESS,0,0,2009,0,0,0,0 +INDEMNIFIED,0,0,0,2009,0,0,0 +INDEMNITEE,0,0,0,2009,0,0,0 +INDEMNITORS,0,0,0,2009,0,0,0 +INDICT,2009,0,0,2009,0,0,0 +INDICTMENT,2009,0,0,2009,0,0,0 +INEFFECTIVELY,2009,0,0,0,0,0,0 +INEFFICIENT,2009,0,0,0,0,0,0 +INEQUITABLE,2009,0,0,0,0,0,0 +INEVITABLE,2009,0,0,0,0,0,0 +INEXPERIENCED,2009,0,0,0,0,0,0 +INFORCE,0,0,0,2009,0,0,0 +INFRINGE,2009,0,0,0,0,0,0 +INFRINGER,0,0,0,2009,0,0,0 +INHIBIT,0,0,0,0,0,0,2011 +INIMICAL,2009,0,0,0,0,0,0 +INJURE,2009,0,0,0,0,0,0 +INJURING,2009,0,0,0,0,0,0 +INNOVATED,0,2009,0,0,0,0,0 +INNOVATIONS,0,2009,0,0,0,0,0 +INNOVATORS,0,2009,0,0,0,0,0 +INSECURE,2009,0,0,0,0,0,0 +INSISTED,0,0,0,0,0,0,2009 +INSOFAR,0,0,0,2009,0,0,0 +INSPIRATION,0,2009,0,0,0,0,0 +INSUBORDINATION,2009,0,0,0,0,0,0 +INSURRECTION,2009,0,0,0,0,0,0 +INTEGRITY,0,2009,0,0,0,0,0 +INTERFERENCE,2009,0,0,0,0,0,0 +INTERLOCUTORY,0,0,0,2009,0,0,0 +INTERPOSE,0,0,0,2009,0,0,0 +INTERPOSITION,0,0,0,2009,0,0,0 +INTERROGATES,0,0,0,2009,0,0,0 +INTERROGATOR,0,0,0,2009,0,0,0 +INTERRUPT,2009,0,0,0,0,0,0 +INTERRUPTIONS,2009,0,0,0,0,0,0 +INTIMIDATION,2009,0,0,0,0,0,0 +SPORADICALLY,0,0,2009,0,0,0,0 +STABILIZE,0,2009,0,0,0,0,0 +STABLE,0,2009,0,0,0,0,0 +STAGNATED,2009,0,0,0,0,0,0 +STANDSTILL,2009,0,0,0,0,0,0 +STATUTORILY,0,0,0,2009,0,0,0 +STIPULATES,0,0,0,0,0,0,2009 +STOLEN,2009,0,0,0,0,0,0 +STOPPING,2009,0,0,0,0,0,0 +STRAINING,2009,0,0,0,0,0,0 +STRENGTHENED,0,2009,0,0,0,0,0 +STRESS,2009,0,0,0,0,0,0 +STRESSING,2009,0,0,0,0,0,0 +STRICTLY,0,0,0,0,0,0,2009 +STRONGEST,0,2009,0,0,0,0,0 +SUBDOCKET,0,0,0,2012,0,0,0 +SUBLEASEE,0,0,0,2011,0,0,0 +SUBLICENSOR,0,0,0,2011,0,0,0 +SUBPOENAED,2009,0,0,2009,0,0,0 +SUBSTANDARD,2009,0,0,0,0,0,0 +SUCCEEDED,0,2009,0,0,0,0,0 +SUCCESSES,0,2009,0,0,0,0,0 +SUDDENLY,0,0,2009,0,0,0,0 +SUFFER,2009,0,0,0,0,0,0 +SUGGEST,0,0,2009,0,0,2009,0 +SUING,2009,0,0,2009,0,0,0 +SUMMONSES,2009,0,0,2009,0,0,0 +SUPERSEDED,0,0,0,2009,0,0,0 +SURETY,0,0,0,2009,0,0,0 +SURPASSING,0,2009,0,0,0,0,0 +SUSPECTED,2009,0,0,0,0,0,0 +SUSPENDING,2009,0,0,0,0,0,0 +SUSPICION,2009,0,0,0,0,0,0 +REVISED,0,0,2009,0,0,0,0 +REVOKE,2009,0,0,0,0,0,0 +REVOLUTIONIZE,0,2009,0,0,0,0,0 +REWARD,0,2009,0,0,0,0,0 +RIDICULE,2009,0,0,0,0,0,0 +RISK,0,0,2009,0,0,0,0 +RISKINESS,0,0,2009,0,0,0,0 +ROUGHLY,0,0,2009,0,0,0,0 +SABOTAGE,2009,0,0,0,0,0,0 +SACRIFICIAL,2009,0,0,0,0,0,0 +SATISFACTORY,0,2009,0,0,0,0,0 +SATISFYING,0,2009,0,0,0,0,0 +SCRUTINIZED,2009,0,0,0,0,0,0 +SECRECY,-2020,0,0,0,0,0,0 +SEIZES,2009,0,0,0,0,0,0 +SENTENCED,2009,0,0,2009,0,0,0 +SERIOUSLY,2009,0,0,0,0,0,0 +SETTLEMENT,0,0,0,2009,0,0,0 +SEVERABLE,0,0,0,2009,0,0,0 +SEVERE,2009,0,0,0,0,0,0 +SEVERITY,2009,0,0,0,0,0,0 +ENTHUSIASTIC,0,2009,0,0,0,0,0 +ERODE,2009,0,0,0,0,0,0 +EROSION,2009,0,0,0,0,0,0 +ERRING,2009,0,0,0,0,0,0 +ERRORS,2009,0,0,0,0,0,0 +ESCALATES,2009,0,0,0,0,0,0 +ESCHEATMENT,0,0,0,2011,0,0,0 +ESCROWS,0,0,0,0,0,0,2009 +EVADES,2009,0,0,0,0,0,0 +EVASIVE,2009,0,0,0,0,0,0 +EVICTION,2009,0,0,0,0,0,0 +EVIDENTIARY,0,0,0,2009,0,0,0 +EXACERBATING,2009,0,0,0,0,0,0 +EXAGGERATED,2009,0,0,0,0,0,0 +EXCEEDANCE,0,0,0,2011,0,0,0 +EXCELLENT,0,2009,0,0,0,0,0 +EXCEPTIONALLY,0,2009,0,0,0,0,0 +EXCITED,0,2009,0,0,0,0,0 +EXCLUSIVELY,0,2009,0,0,0,0,0 +EXCULPATE,2009,0,0,2009,0,0,0 +EXCULPATION,2009,0,0,2009,0,0,0 +EXECUTORS,0,0,0,2009,0,0,0 +EXECUTRIXES,0,0,0,2009,0,0,0 +EXONERATES,2009,0,0,0,0,0,0 +EXPLOIT,2009,0,0,0,0,0,0 +EXPLOITED,2009,0,0,0,0,0,0 +EXPOSED,2009,0,0,0,0,0,0 +EXPOSURES,0,0,2009,0,0,0,0 +EXPROPRIATING,2009,0,0,0,0,0,0 +EXPULSIONS,2009,0,0,0,0,0,0 +EXTRAJUDICIAL,0,0,0,2014,0,0,0 +SOLVES,0,2009,0,0,0,0,0 +SOMEWHAT,0,0,2009,0,0,2009,0 +SPAMMING,2014,0,0,0,0,0,0 +TREMENDOUSLY,0,2009,0,0,0,0,0 +LOCKOUTS,2009,0,0,0,0,0,0 +LOSS,2009,0,0,0,0,0,0 +LOYAL,0,2009,0,0,0,0,0 +MALFEASANCE,2009,0,0,0,0,0,0 +MALFUNCTIONS,2009,0,0,0,0,0,0 +MALPRACTICE,2009,0,0,0,0,0,0 +MANDATES,0,0,0,0,0,0,2009 +MANIPULATE,2009,0,0,0,0,0,0 +MANIPULATION,2009,0,0,0,0,0,0 +MARKDOWNS,2009,0,0,0,0,0,0 +MEDIATED,0,0,0,2009,0,0,0 +MEDIATIONS,0,0,0,2009,0,0,0 +MIGHT,0,0,2009,0,0,2009,0 +MISAPPLIES,2009,0,0,0,0,0,0 +MISAPPROPRIATED,2009,0,0,0,0,0,0 +MISAPPROPRIATIONS,2009,0,0,0,0,0,0 +MISCALCULATES,2009,0,0,0,0,0,0 +MISCHARACTERIZATION,2014,0,0,0,0,0,0 +MISCLASSIFIED,2011,0,0,0,0,0,0 +MISDATED,2011,0,0,0,0,0,0 +MISFEASANCE,0,0,0,2009,0,0,0 +MISHANDLING,2009,0,0,0,0,0,0 +MISINFORMING,2009,0,0,0,0,0,0 +MISINTERPRETATIONS,2009,0,0,0,0,0,0 +MISJUDGE,2009,0,0,0,0,0,0 +MISJUDGMENT,2009,0,0,0,0,0,0 +MISLABELING,2009,0,0,0,0,0,0 +MISLEADING,2009,0,0,0,0,0,0 +MISMANAGE,2009,0,0,0,0,0,0 +MISMANAGING,2009,0,0,0,0,0,0 +MISMATCHING,2009,0,0,0,0,0,0 +MISPRICINGS,2014,0,0,0,0,0,0 +MISREPRESENTED,2009,0,0,0,0,0,0 +MISSED,2009,0,0,0,0,0,0 +WORRIES,2009,0,0,0,0,0,0 +WORSEN,2009,0,0,0,0,0,0 +WORST,2009,0,0,0,0,0,0 +TIGHTENING,2009,0,0,0,0,0,0 +TOLERATING,2009,0,0,0,0,0,0 +TORTIOUSLY,0,0,0,2009,0,0,0 +FINES,2009,0,0,0,0,0,0 +NONASSESSABLE,0,0,2009,0,0,0,0 +NONCANCELLABLE,0,0,0,0,0,0,2009 +NONCOMPLIANT,2009,0,0,0,0,0,0 +NONCONFORMITY,2009,0,0,0,0,0,0 +NONCONTRIBUTORY,0,0,0,2009,0,0,0 +NONFORFEITABILITY,0,0,0,2011,0,0,0 +NONGUARANTOR,0,0,0,2011,0,0,0 +DISCIPLINARY,2009,0,0,0,0,0,0 +DISCLAIMERS,2009,0,0,0,0,0,0 +DISCLOSED,2009,0,0,0,0,0,0 +DISCONTINUANCES,2009,0,0,0,0,0,0 +DISCONTINUED,2009,0,0,0,0,0,0 +DISCOURAGED,2009,0,0,0,0,0,0 +DISCREDITED,2009,0,0,0,0,0,0 +DISCREPANCY,2009,0,0,0,0,0,0 +SPECULATED,0,0,2009,0,0,0,0 +SPECULATIONS,0,0,2009,0,0,0,0 +TRAGICALLY,2009,0,0,0,0,0,0 +LEGISLATED,0,0,0,2009,0,0,0 +LEGISLATIONS,0,0,0,2009,0,0,0 +LEGISLATORS,0,0,0,2009,0,0,0 +LIBELED,0,0,0,2009,0,0,0 +LIE,2009,0,0,0,0,0,0 +COMPULSION,2009,0,0,0,0,0,2009 +CONCEDE,2009,0,0,0,0,0,0 +CONCEIVABLE,0,0,2009,0,0,2009,0 +CONCERNS,2009,0,0,0,0,0,0 +CONCLUSIVE,0,2009,0,0,0,0,0 +CONDEMNATIONS,2009,0,0,0,0,0,0 +CONDEMNS,2009,0,0,0,0,0,0 +CONDONED,2009,0,0,0,0,0,0 +CONFESSES,2009,0,0,0,0,0,0 +CONFINE,2009,0,0,0,0,0,2009 +CONFINES,2009,0,0,0,0,0,2009 +CONFISCATES,2009,0,0,0,0,0,0 +CONFISCATORY,0,0,0,2009,0,0,0 +CONFLICTS,2009,0,0,0,0,0,0 +CONFRONTATIONS,2009,0,0,0,0,0,0 +CONFUSE,2009,0,0,0,0,0,0 +CONFUSINGLY,2009,0,2009,0,0,0,0 +CONSENTING,0,0,0,2009,0,0,0 +CONSPIRACY,2009,0,0,0,0,0,0 +CONSPIRE,2009,0,0,0,0,0,0 +CONSTITUTION,0,0,0,2009,0,0,0 +CONSTITUTIONS,0,0,0,2009,0,0,0 +CONSTRAINING,0,0,0,0,0,0,2009 +CONSTRUCTIVE,0,2009,0,0,0,0,0 +CONSTRUES,0,0,0,2012,0,0,0 +CONTENDED,2009,0,0,0,0,0,0 +CONTENTIONS,2009,0,0,0,0,0,0 +CONTESTATION,0,0,0,2011,0,0,0 +CONTINGENCY,0,0,2009,0,0,0,0 +CONTRACT,0,0,0,2009,0,0,0 +CONTRACTIBLE,0,0,0,2009,0,0,0 +CONTRACTIONS,2009,0,0,0,0,0,0 +CONTRADICT,2009,0,0,0,0,0,0 +CONTRADICTIONS,2009,0,0,0,0,0,0 +CONTRAVENE,0,0,0,2009,0,0,0 +CONTRAVENTION,0,0,0,2009,0,0,0 +CONTROVERSY,2009,0,0,0,0,0,0 +CONVENIENS,0,0,0,2012,0,0,0 +CONVICTED,2009,0,0,2009,0,0,0 +CORRECTED,2009,0,0,0,0,0,0 +CORRECTS,2009,0,0,0,0,0,0 +CORRUPTION,2009,0,0,0,0,0,0 +COSTLY,2009,0,0,0,0,0,0 +COUNSELED,0,0,0,2009,0,0,0 +COUNTERCLAIMED,2009,0,0,0,0,0,0 +COUNTERFEITED,2009,0,0,0,0,0,0 +COUNTERFEITS,2009,0,0,0,0,0,0 +COUNTERSUED,0,0,0,2011,0,0,0 +COURTEOUS,0,2009,0,0,0,0,0 +COVENANTED,0,0,0,0,0,0,2011 +CREATIVELY,0,2009,0,0,0,0,0 +CRIMES,2009,0,0,2009,0,0,0 +CRIMINALIZING,0,0,0,2014,0,0,0 +CRISIS,2009,0,0,0,0,0,0 +CRITICISMS,2009,0,0,0,0,0,0 +CRITICIZING,2009,0,0,0,0,0,0 +CROSSROADS,0,0,2009,0,0,0,0 +CULPABLE,2009,0,0,0,0,0,0 +CURTAILED,2009,0,0,0,0,0,0 +CURTAILS,2009,0,0,0,0,0,0 +CYBERATTACK,2014,0,0,0,0,0,0 +CYBERCRIMES,2014,0,0,0,0,0,0 +TAINTS,2009,0,0,0,0,0,0 +TENSE,2009,0,0,0,0,0,0 +TERMINATE,2009,0,0,0,0,0,0 +TERMINATION,2009,0,0,0,0,0,0 +TESTIFY,2009,0,0,2009,0,0,0 +THENCEFORTH,0,0,0,2009,0,0,0 +THEREFROM,0,0,0,2009,0,0,0 +THEREON,0,0,0,2009,0,0,0 +THERETOFORE,0,0,0,2009,0,0,0 +THEREWITH,0,0,0,2009,0,0,0 +THREATENING,2009,0,0,0,0,0,0 +FACIE,0,0,0,2009,0,0,0 +FAILING,2009,0,0,0,0,0,0 +FAILURES,2009,0,0,0,0,0,0 +FALSIFICATION,2009,0,0,0,0,0,0 +FALSIFY,2009,0,0,0,0,0,0 +FATALITIES,2009,0,0,0,0,0,0 +FAULTED,2009,0,0,0,0,0,0 +FAVORABLY,0,2009,0,0,0,0,0 +FAVORITES,0,2009,0,0,0,0,0 +FELONIOUS,2009,0,0,2009,0,0,0 +DAMAGES,2009,0,0,0,0,0,0 +DANGER,2009,0,0,0,0,0,0 +DEADLOCK,2009,0,0,0,0,0,0 +DEADWEIGHT,2009,0,0,0,0,0,0 +DEBARRED,2009,0,0,0,0,0,0 +DECEIT,2009,0,0,0,0,0,0 +DECEIVED,2009,0,0,0,0,0,0 +DECEPTIONS,2009,0,0,0,0,0,0 +DECLINE,2009,0,0,0,0,0,0 +DECREE,0,0,0,2009,0,0,0 +DEFACE,2009,0,0,0,0,0,0 +DEFALCATIONS,0,0,0,2009,0,0,0 +DEFAME,2009,0,0,0,0,0,0 +DEFAULT,2009,0,0,0,0,0,0 +DEFEASANCE,0,0,0,2009,0,0,0 +DEFEASEMENT,0,0,0,2014,0,0,0 +DEFEATED,2009,0,0,0,0,0,0 +DEFECTIVE,2009,0,0,0,0,0,0 +DEFENDABLE,0,0,0,2014,0,0,0 +DEFENDING,2009,0,0,0,0,0,0 +DEFERENCE,0,0,0,2009,0,0,0 +DEFICIT,2009,0,0,0,0,0,0 +DEFRAUD,2009,0,0,0,0,0,0 +DEFUNCT,2009,0,0,0,0,0,0 +DEGRADED,2009,0,0,0,0,0,0 +DELAYED,2009,0,0,0,0,0,0 +DELEGATABLE,0,0,0,2011,0,0,0 +DELIBERATE,2009,0,0,0,0,0,0 +DELIGHTED,0,2009,0,0,0,0,0 +DELIGHTS,0,2009,0,0,0,0,0 +DELINQUENTLY,2009,0,0,0,0,0,0 +DELISTING,2009,0,0,0,0,0,0 +DEMISES,2009,0,0,0,0,0,0 +DEMOLISHES,2009,0,0,0,0,0,0 +DEMOTE,2009,0,0,0,0,0,0 +DEMOTION,2009,0,0,0,0,0,0 +DEMURRERS,0,0,0,2009,0,0,0 +DENIALS,2009,0,0,0,0,0,0 +DENIGRATED,2009,0,0,0,0,0,0 +DENY,2009,0,0,0,0,0,0 +DEPENDABLE,0,2009,0,0,0,0,0 +DEPENDED,0,0,2009,0,0,2009,0 +DEPENDENT,0,0,2009,0,0,0,2011 +DEPLETED,2009,0,0,0,0,0,0 +DEPLETIONS,2009,0,0,0,0,0,0 +DEPOSING,0,0,0,2009,0,0,0 +INVALID,2009,0,0,0,0,0,0 +INVALIDATING,2009,0,0,0,0,0,0 +INVENTED,0,2009,0,0,0,0,0 +INVENTIVE,0,2009,0,0,0,0,0 +INVESTIGATE,2009,0,0,0,0,0,0 +INVESTIGATION,2009,0,0,0,0,0,0 +IRRECONCILABLE,2009,0,0,0,0,0,0 +IRREGULAR,2009,0,0,0,0,0,0 +IRREPARABLE,2009,0,0,0,0,0,0 +IRREVOCABLE,0,0,0,2009,0,0,2009 +JOINDER,0,0,0,2009,0,0,0 +JUDICIARY,0,0,0,2009,0,0,0 +JURISDICTIONAL,0,0,0,2009,0,0,0 +JURIST,0,0,0,2009,0,0,0 +JURY,0,0,0,2009,0,0,0 +JUSTIFIABLE,2009,0,0,0,0,0,0 +DILIGENTLY,0,2009,0,0,0,0,0 +DIMINISHING,2009,0,0,0,0,0,0 +DISADVANTAGE,2009,0,0,0,0,0,0 +DISAFFILIATION,2009,0,0,2009,0,0,0 +DISAFFIRMS,0,0,0,2011,0,0,0 +DISAGREEING,2009,0,0,0,0,0,0 +DISALLOW,2009,0,0,0,0,0,0 +DISALLOWING,2009,0,0,0,0,0,0 +DISAPPEARANCES,2009,0,0,0,0,0,0 +DISAPPOINT,2009,0,0,0,0,0,0 +DISAPPOINTMENT,2009,0,0,0,0,0,0 +DISAPPROVALS,2009,0,0,0,0,0,0 +DISAPPROVING,2009,0,0,0,0,0,0 +DISASSOCIATIONS,2009,0,0,0,0,0,0 +DISASTROUSLY,2009,0,0,0,0,0,0 +DISAVOWING,2009,0,0,0,0,0,0 +GREATER,0,-2020,0,0,0,0,0 +GRIEVANCE,2009,0,0,0,0,0,0 +GUILTY,2009,0,0,0,0,0,0 +HAMPERED,2009,0,0,0,0,0,0 +HAPPILY,0,2009,0,0,0,0,0 +HARASSED,2009,0,0,0,0,0,0 +HARDSHIPS,2009,0,0,0,0,0,0 +HARMFULLY,2009,0,0,0,0,0,0 +HARSHER,2009,0,0,0,0,0,0 +HAZARD,2009,0,0,0,0,0,0 +NONJUDICIALLY,0,0,0,2011,0,0,0 +NONPERFORMANCE,2009,0,0,0,0,0,0 +HURT,2009,0,0,0,0,0,0 +DISFAVORED,2009,0,0,0,0,0,0 +DISGORGED,2009,0,0,0,0,0,0 +COMPLICATING,2009,0,0,0,0,0,0 +COMPLIMENTARY,0,2009,0,0,0,0,0 +COMPLY,0,0,0,0,0,0,2009 +MISSTATED,2009,0,0,0,0,0,0 +MISSTATING,2009,0,0,0,0,0,0 +MISTAKEN,2009,0,0,0,0,0,0 +MISTRIAL,2009,0,0,2009,0,0,0 +MISUNDERSTANDINGS,2009,0,0,0,0,0,0 +MISUSES,2009,0,0,0,0,0,0 +MONOPOLIZATION,2009,0,0,0,0,0,0 +MONOPOLIZING,2009,0,0,0,0,0,0 +MORATORIUMS,2009,0,0,0,0,0,0 +MOTIONS,0,0,0,2009,0,0,0 +SLOWDOWN,2009,0,0,0,0,0,0 +SLOWEST,2009,0,0,0,0,0,0 +SLUGGISH,2009,0,0,0,0,0,0 +SMOOTHING,0,2009,0,0,0,0,0 +DEPRESS,2009,0,0,0,0,0,0 +DEPRIVATION,2009,0,0,0,0,0,0 +DEPRIVING,2009,0,0,0,0,0,0 +DEROGATED,0,0,0,2009,0,0,0 +DEROGATIONS,0,0,0,2009,0,0,0 +DESIRED,0,2009,0,0,0,0,0 +DESTABILIZE,2009,0,0,0,0,0,0 +DESTROY,2009,0,0,0,0,0,0 +DESTRUCTION,2009,0,0,0,0,0,0 +DETAINER,0,0,0,2009,0,0,0 +DETERIORATE,2009,0,0,0,0,0,0 +DETERIORATION,2009,0,0,0,0,0,0 +DETERRENCES,2009,0,0,0,0,0,0 +DETERS,2009,0,0,0,0,0,0 +DETRIMENT,2009,0,0,0,0,0,0 +DEVALUE,2009,0,0,0,0,0,0 +DEVASTATE,2009,0,0,0,0,0,0 +DEVIATE,2009,0,2009,0,0,0,0 +DEVIATION,2009,0,2009,0,0,0,0 +DEVOLVED,2009,0,0,0,0,0,0 +DICTATED,0,0,0,0,0,0,2009 +DIFFERED,0,0,2009,0,0,0,0 +DIFFICULTIES,2009,0,0,0,0,0,0 +ASCENDANCY,0,0,0,2009,0,0,0 +ASSAULTED,2009,0,0,0,0,0,0 +ASSERTIONS,2009,0,0,0,0,0,0 +ASSUME,0,0,2009,0,0,0,0 +ASSUMPTION,0,0,2009,0,0,0,0 +ASSURES,0,2009,0,0,0,0,0 +ATTAINING,0,2009,0,0,0,0,0 +ATTEST,0,0,0,2009,0,0,0 +ATTESTING,0,0,0,2009,0,0,0 +ATTORNMENT,0,0,0,2009,0,0,0 +ATTRITION,2009,0,0,0,0,0,0 +BAIL,2009,0,0,2009,0,0,0 +BAILIFF,0,0,0,2009,0,0,0 +BALK,2009,0,0,0,0,0,0 +BANKRUPTCY,2009,0,0,0,0,0,0 +BANS,2009,0,0,0,0,0,0 +CLAIMABLE,0,0,0,2009,0,0,0 +CLAIMING,2009,0,0,0,0,0,0 +CLAWBACK,2009,0,0,0,0,0,0 +CLOSEOUT,2009,0,0,0,0,0,0 +CLOSURE,2009,0,0,0,0,0,0 +CODICIL,0,0,0,2009,0,0,0 +CODIFIED,0,0,0,2009,0,0,0 +COERCE,2009,0,0,0,0,0,0 +COERCION,2009,0,0,0,0,0,0 +COLLABORATING,0,2009,0,0,0,0,0 +COLLABORATOR,0,2009,0,0,0,0,0 +COLLAPSES,2009,0,0,0,0,0,0 +COLLUDE,2009,0,0,0,0,0,0 +COLLUSION,2009,0,0,2009,0,0,0 +POSING,2009,0,0,0,0,0,0 +POSSIBILITIES,0,0,2009,0,0,0,0 +POSTCLOSING,0,0,0,2011,0,0,0 +POSTPONE,2009,0,0,0,0,0,0 +POSTPONES,2009,0,0,0,0,0,0 +WRITEOFF,2009,0,0,0,0,0,0 +WRONGDOING,2009,0,0,0,0,0,0 +WRONGLY,2009,0,0,0,0,0,0 +HONORED,0,2009,0,0,0,0,0 +HOSTILITY,2009,0,0,0,0,0,0 +REASSESSED,0,0,2009,0,0,0,0 +REASSESSMENTS,2009,0,2009,0,0,0,0 +REASSIGNMENT,2009,0,0,0,0,0,0 +REBOUNDED,0,2009,0,0,0,0,0 +REBUTTABLE,0,0,0,2009,0,0,0 +REBUTTED,0,0,0,2009,0,0,0 +RECALCULATES,0,0,2009,0,0,0,0 +RECALL,2009,0,0,0,0,0,0 +RECEPTIVE,0,2009,0,0,0,0,0 +RECKLESS,2009,0,0,0,0,0,0 +RECONSIDERED,0,0,2009,0,0,0,0 +RECOUPABLE,0,0,0,2009,0,0,0 +RECOURSES,0,0,0,2009,0,0,0 +RECUSE,0,0,0,2011,0,0,0 +REDACT,2009,0,0,2009,0,0,0 +REDACTIONS,2009,0,0,2009,0,0,0 +REDRESS,2009,0,0,0,0,0,0 +REEXAMINATION,0,0,2009,0,0,0,0 +REFERENDUM,0,0,0,2009,0,0,0 +REFILES,0,0,0,2009,0,0,0 +REFRAINS,0,0,0,0,0,0,2009 +REFUSED,2009,0,0,0,0,0,0 +REGAINED,0,2009,0,0,0,0,0 +REGULATES,0,0,0,2009,0,0,0 +REGULATIVE,0,0,0,2009,0,0,0 +REHEAR,0,0,0,2009,0,0,0 +VARIABLE,0,0,2009,0,0,0,0 +VARIANCES,0,0,2009,0,0,0,0 +VARIATIONS,0,0,2009,0,0,0,0 +VARYING,0,0,2009,0,0,0,0 +VERDICTS,2009,0,0,2009,0,0,0 +VIATICAL,0,0,0,2011,0,0,0 +VIOLATE,2009,0,0,0,0,0,0 +VIOLATION,2009,0,0,0,0,0,0 +VIOLATORS,2009,0,0,0,0,0,0 +VITIATE,2009,0,0,0,0,0,0 +VITIATION,2009,0,0,0,0,0,0 +VOLATILE,2009,0,2009,0,0,0,0 +VULNERABILITY,2009,0,0,0,0,0,0 +WARNED,2009,0,0,0,0,0,0 +WARRANTEES,0,0,0,2011,0,0,0 +WASTING,2009,0,0,0,0,0,0 +WEAKENING,2009,0,0,0,0,0,0 +WEAKLY,2009,0,0,0,0,0,0 +DISHONESTY,2009,0,0,0,0,0,0 +DISHONORED,2009,0,0,0,0,0,0 +DISLOYAL,2009,0,0,0,0,0,0 +DISMALLY,2009,0,0,0,0,0,0 +DISMISSED,2009,0,0,0,0,0,0 +DISPARAGE,2009,0,0,0,0,0,0 +DISPARAGES,2009,0,0,0,0,0,0 +DISPARITY,2009,0,0,0,0,0,0 +DISPLACEMENTS,2009,0,0,0,0,0,0 +DISPOSITIVE,0,0,0,2009,0,0,0 +DISPOSSESSING,2009,0,0,0,0,0,0 +DISPROPORTIONAL,2009,0,0,0,0,0,0 +DISPUTED,2009,0,0,0,0,0,0 +DISQUALIFICATIONS,2009,0,0,0,0,0,0 +DISQUALIFYING,2009,0,0,0,0,0,0 +DISREGARDS,2009,0,0,0,0,0,0 +DISRUPTED,2009,0,0,0,0,0,0 +DISRUPTIVE,2009,0,0,0,0,0,0 +DISSENT,2009,0,0,0,0,0,0 +DISSENTING,2009,0,0,0,0,0,0 +DISSOLUTION,2009,0,0,0,0,0,0 +DISTINCTIVE,0,2009,0,0,0,0,0 +DISTORTED,2009,0,0,0,0,0,0 +DISTORTS,2009,0,0,0,0,0,0 +DISTRACTION,2009,0,0,0,0,0,0 +DISTRESS,2009,0,0,0,0,0,0 +DISTURB,2009,0,0,0,0,0,0 +DISTURBING,2009,0,0,0,0,0,0 +DIVERTED,2009,0,0,0,0,0,0 +DIVESTED,2009,0,0,0,0,0,0 +DIVESTMENT,2009,0,0,0,0,0,0 +DIVORCED,2009,0,0,0,0,0,0 +DIVULGING,2009,0,0,0,0,0,0 +DOCKETS,0,0,0,2009,0,0,0 +DOUBTFUL,2009,0,2009,0,0,0,0 +DOWNGRADES,2009,0,0,0,0,0,0 +DOWNSIZES,2009,0,0,0,0,0,0 +DOWNTIMES,2009,0,0,0,0,0,0 +DOWNWARDS,2009,0,0,0,0,0,0 +DRAWBACK,2009,0,0,0,0,0,0 +DROUGHT,2009,0,0,0,0,0,0 +DYSFUNCTION,2009,0,0,0,0,0,0 +EARMARKED,0,0,0,0,0,0,2009 +EASILY,0,2009,0,0,0,0,0 +EFFICIENCIES,0,2009,0,0,0,0,0 +EGREGIOUS,2009,0,0,0,0,0,0 +EMBARGOED,2009,0,0,0,0,0,0 +EMBARRASSED,2009,0,0,0,0,0,0 +EMBARRASSMENTS,2009,0,0,0,0,0,0 +EMBEZZLEMENTS,2009,0,0,0,0,0,0 +EMPOWER,0,2009,0,0,0,0,0 +ENABLE,0,2009,0,0,0,0,0 +ENCOURAGED,0,2009,0,0,0,0,0 +ENCROACH,2009,0,0,0,0,0,0 +ENCROACHMENT,2009,0,0,0,0,0,0 +ENCUMBERING,2009,0,0,2009,0,0,2009 +ENCUMBRANCERS,0,0,0,2011,0,0,0 +ENDANGERING,2009,0,0,0,0,0,0 +ENFORCEABILITY,0,0,0,2009,0,0,0 +ENHANCED,0,2009,0,0,0,0,0 +ENHANCING,0,2009,0,0,0,0,0 +ENJOINS,2009,0,0,0,0,0,0 +ENJOYED,0,2009,0,0,0,0,0 +ENTAIL,0,0,0,0,0,0,2009 +PECUNIARILY,0,0,0,2009,0,0,0 +PENALIZING,2009,0,0,0,0,0,0 +PERFECT,0,2009,0,0,0,0,0 +PERHAPS,0,0,2009,0,0,2009,0 +PERMISSIBLE,0,0,0,0,0,0,2009 +PERMITTEE,0,0,0,2011,0,0,0 +PERPETRATED,2009,0,0,2009,0,0,0 +PERSIST,2009,0,0,0,0,0,0 +PERSISTENTLY,2009,0,0,0,0,0,0 +PERVASIVE,2009,0,0,0,0,0,0 +PETITIONED,0,0,0,2009,0,0,0 +PETITIONS,0,0,0,2009,0,0,0 +PICKETING,2009,0,0,0,0,0,0 +HENCEFORWARD,0,0,0,2009,0,0,0 +HEREFOR,0,0,0,2009,0,0,0 +HEREINABOVE,0,0,0,2009,0,0,0 +HEREOF,0,0,0,2009,0,0,0 +HEREUNDER,0,0,0,2009,0,0,0 +HEREWITHIN,0,0,0,2014,0,0,0 +HINDERED,2009,0,0,0,0,0,0 +HINDRANCES,2009,0,0,0,0,0,0 +WHENSOEVER,0,0,0,2009,0,0,0 +WHEREBY,0,0,0,2009,0,0,0 +WHEREON,0,0,0,2009,0,0,0 +WHEREWITH,0,0,0,2009,0,0,0 +WHOSOEVER,0,0,0,2009,0,0,0 +WILLFULLY,2009,0,0,2009,0,0,0 +WINNERS,0,2009,0,0,0,0,0 +FLUCTUATING,0,0,2009,0,0,0,0 +FORBEAR,0,0,0,2009,0,0,0 +FORBEARS,0,0,0,2009,0,0,0 +FORBIDS,2009,0,0,0,0,0,2009 +FOREBEAR,0,0,0,2009,0,0,0 +FORECLOSED,2009,0,0,0,0,0,0 +FORECLOSURES,2009,0,0,0,0,0,0 +FORESTALL,2009,0,0,0,0,0,0 +FORFEIT,2009,0,0,0,0,0,0 +FORFEITING,2009,0,0,0,0,0,0 +FORGERS,2009,0,0,0,0,0,0 +FRAUD,2009,0,0,0,0,0,0 +FRAUDULENTLY,2009,0,0,0,0,0,0 +FRUSTRATE,2009,0,0,0,0,0,0 +FRUSTRATINGLY,2009,0,0,0,0,0,0 +FUGITIVES,2009,0,0,2009,0,0,0 +GAINING,0,2009,0,0,0,0,0 +GRANTORS,0,0,0,2009,0,0,0 +DISGRACE,2009,0,0,0,0,0,0 +LITIGANTS,2009,0,0,2009,0,0,0 +LITIGATING,2009,0,0,2009,0,0,0 +LITIGATORS,0,0,0,2009,0,0,0 +LACK,2009,0,0,0,0,0,0 +LACKS,2009,0,0,0,0,0,0 +LAGS,2009,0,0,0,0,0,0 +LAPSING,2009,0,0,0,0,0,0 +LAWFUL,0,0,0,2009,0,0,0 +LAWMAKING,0,0,0,2009,0,0,0 +LAWYER,0,0,0,2009,0,0,0 +LEADERSHIP,0,2009,0,0,0,0,0 +LEGALITY,0,0,0,2009,0,0,0 +LEGALIZED,0,0,0,2009,0,0,0 +LEGALS,0,0,0,2009,0,0,0 +FLAW,2009,0,0,0,0,0,0 +NONPRODUCTIVE,2009,0,0,0,0,0,0 +LIQUIDATED,2009,0,0,0,0,0,0 +LIQUIDATIONS,2009,0,0,0,0,0,0 +BENEFICIATED,0,0,0,2014,0,0,0 +BENEFITING,0,2009,0,0,0,0,0 +BETTER,0,2009,0,0,0,0,0 +POPULARITY,0,2009,0,0,0,0,0 +REINTERPRET,0,0,2009,0,0,0,0 +REINTERPRETING,0,0,2009,0,0,0,0 +REJECTING,2009,0,0,0,0,0,0 +RELEASEES,0,0,0,2011,0,0,0 +RELINQUISHING,2009,0,0,0,0,0,0 +RELUCTANT,2009,0,0,0,0,0,0 +REMANDS,0,0,0,2009,0,0,0 +REMEDIATION,0,0,0,2009,0,0,0 +RENEGOTIATE,2009,0,0,0,0,0,0 +RENEGOTIATION,2009,0,0,0,0,0,0 +RENOUNCEMENT,2009,0,0,0,0,0,0 +REPARATION,2009,0,0,0,0,0,0 +REPOSSESSED,2009,0,0,0,0,0,0 +REPOSSESSIONS,2009,0,0,0,0,0,0 +TROUBLE,2009,0,0,0,0,0,0 +TURMOIL,2009,0,0,0,0,0,0 +UNACCOUNTED,2009,0,0,0,0,0,0 +UNAPPEALABLE,0,0,0,2009,0,0,0 +UNAUTHORIZED,2009,0,0,0,0,0,0 +UNAVOIDABLY,2009,0,0,0,0,0,0 +UNCERTAINTIES,0,0,2009,0,0,0,0 +UNCOLLECTED,2009,0,0,0,0,0,0 +UNCOMPETITIVE,2009,0,0,0,0,0,0 +UNCONSCIONABLE,2009,0,0,0,0,0,0 +UNCONSTITUTIONALLY,0,0,0,2009,0,0,0 +UNCONTROLLED,2009,0,0,0,0,0,0 +UNCOVERING,2009,0,0,0,0,0,0 +UNDEFINED,0,0,2009,0,0,0,0 +UNDERCUT,2009,0,0,0,0,0,0 +UNDERESTIMATED,2009,0,0,0,0,0,0 +UNDERFUNDED,2009,0,0,0,0,0,0 +UNDERMINES,2009,0,0,0,0,0,0 +UNDERPAYMENTS,2009,0,0,0,0,0,0 +UNDERPERFORMED,2011,0,0,0,0,0,0 +UNDERPRODUCTION,2009,0,0,0,0,0,0 +UNDERSTATEMENT,2009,0,0,0,0,0,0 +UNDERUTILIZATION,2009,0,0,0,0,0,0 +UNDESIRED,2009,0,0,0,0,0,0 +UNDETERMINED,2009,0,2009,0,0,0,0 +UNDOCUMENTED,2009,0,2009,0,0,0,0 +UNECONOMIC,2009,0,0,0,0,0,0 +UNEMPLOYMENT,2009,0,0,0,0,0,0 +UNENFORCEABLE,0,0,0,2009,0,0,0 +UNETHICALLY,2009,0,0,0,0,0,0 +UNFAIR,2009,0,0,0,0,0,0 +UNFAVORABILITY,2014,0,0,0,0,0,0 +UNFEASIBLE,2009,0,0,0,0,0,0 +UNFORESEEABLE,2009,0,0,0,0,0,0 +UNFORTUNATELY,2009,0,0,0,0,0,0 +UNFUNDED,2009,0,0,0,0,0,0 +UNIDENTIFIED,0,0,2009,0,0,0,0 +UNINTENTIONALLY,2009,0,0,0,0,0,0 +UNJUSTIFIED,2009,0,0,0,0,0,0 +UNKNOWN,0,0,2009,0,0,0,0 +UNLAWFULNESS,0,0,0,2009,0,0,0 +UNMATCHED,0,2009,0,0,0,0,0 +UNNECESSARY,2009,0,0,0,0,0,0 +UNOCCUPIED,2009,0,0,0,0,0,0 +UNPLANNED,2009,0,2009,0,0,0,0 +UNPREDICTABLY,2009,0,2009,0,0,0,0 +UNPROFITABLE,2009,0,0,0,0,0,0 +UNQUANTIFIABLE,0,0,2011,0,0,0,0 +UNREASONABLENESS,2009,0,0,0,0,0,0 +UNRECOVERABLE,2009,0,0,0,0,0,0 +UNREMEDIATED,0,0,0,2011,0,0,0 +UNREST,2009,0,0,0,0,0,0 +UNSATISFACTORY,2009,0,0,0,0,0,0 +UNSEASONABLE,0,0,2009,0,0,0,0 +UNSOLD,2009,0,0,0,0,0,0 +UNSTABILIZED,2014,0,0,0,0,0,0 +UNSUCCESSFUL,2009,0,0,0,0,0,0 +UNSUITABLY,2009,0,0,0,0,0,0 +UNSUSPECTED,2009,0,0,0,0,0,0 +UNTESTED,0,0,2009,0,0,0,0 +UNTRUTH,2009,0,0,0,0,0,0 +UNTRUTHS,2009,0,0,0,0,0,0 +UNWANTED,2009,0,0,0,0,0,0 +UNWILLINGNESS,2009,0,0,0,0,0,0 +UPTURNS,0,2009,0,0,0,0,0 +USURP,2009,0,0,2009,0,0,0 +USURPS,2009,0,0,2009,0,0,0 +VAGUELY,0,0,2012,0,0,0,0 +VAGUEST,0,0,2012,0,0,0,0 +PLEA,2009,0,0,0,0,0,0 +PLEADINGS,2009,0,0,2009,0,0,0 +PLEASANTLY,0,2009,0,0,0,0,0 +PLEDGE,0,0,0,0,0,0,2009 +PLEDGES,0,0,0,0,0,0,2009 +PLENTIFUL,0,2009,0,0,0,0,0 +COMPELS,0,0,0,0,0,0,2009 +COMPLAINANTS,0,0,0,2009,0,0,0 +COMPLAINT,2009,0,0,0,0,0,0 +COMMIT,0,0,0,0,0,0,2009 +COMMITTED,0,0,0,0,0,0,2009 +LIMIT,0,0,0,0,0,0,2009 +LIMITS,0,0,0,0,0,0,2009 +RESTRAINED,0,0,0,0,0,0,2009 +RESTRAINTS,0,0,0,0,0,0,2009 +RESTRICTION,0,0,0,0,0,0,2009 +RESTRICTIVENESS,0,0,0,0,0,0,2009 +RESTRUCTURES,2009,0,0,0,0,0,0 +RETALIATED,2009,0,0,0,0,0,0 +RETALIATIONS,2009,0,0,0,0,0,0 +PRECAUTIONARY,0,0,2009,0,0,0,0 +PRECIPITOUSLY,2009,0,0,0,0,0,0 +PRECLUDING,2009,0,0,0,0,0,2009 +PREDECEASE,0,0,0,2009,0,0,0 +PREDICT,0,0,2009,0,0,0,0 +PREDICTION,0,0,2009,0,0,0,0 +PREDICTORS,0,0,2009,0,0,0,0 +PREHEARING,0,0,0,2011,0,0,0 +PREJUDICIAL,2009,0,0,2009,0,0,0 +PREMATURE,2009,0,0,0,0,0,0 +PREPETITION,0,0,0,2009,0,0,0 +PRESTIGIOUS,0,2009,0,0,0,0,0 +PRESUMES,0,0,2009,0,0,0,0 +PRESUMPTIVELY,0,0,0,2009,0,0,0 +PREVENTING,2009,0,0,0,0,0,2009 +PRIVITY,0,0,0,2011,0,0,0 +PROBABILITIES,0,0,2009,0,0,0,0 +PROBATE,0,0,0,2009,0,0,0 +PROBATION,0,0,0,2009,0,0,0 +PROBATIONERS,0,0,0,2009,0,0,0 +PROBLEMATICAL,2009,0,0,0,0,0,0 +PROFICIENTLY,0,2009,0,0,0,0,0 +PROGRESS,0,2009,0,0,0,0,0 +PROHIBIT,0,0,0,0,0,0,2009 +PROHIBITIONS,0,0,0,0,0,0,2009 +PROHIBITS,0,0,0,0,0,0,2009 +PROLONGED,2009,0,0,0,0,0,0 +PROMULGATED,0,0,0,2009,0,0,0 +PROMULGATIONS,0,0,0,2009,0,0,0 +PRORATA,0,0,0,2009,0,0,0 +PROSECUTES,2009,0,0,2009,0,0,0 +PROSECUTOR,0,0,0,2009,0,0,0 +PROSPERING,0,2009,0,0,0,0,0 +PROTEST,2009,0,0,0,0,0,0 +PROTESTING,2009,0,0,0,0,0,0 +PROTRACTED,2009,0,0,0,0,0,0 +PROVISOS,0,0,0,2009,0,0,0 +PROVOKING,2009,0,0,0,0,0,0 +PUNISHING,2009,0,0,0,0,0,0 +PURPORT,2009,0,0,0,0,0,0 +PURPORTS,2009,0,0,0,0,0,0 +QUESTIONED,2009,0,0,0,0,0,0 +QUITCLAIM,0,0,0,2009,0,0,0 +RACKETEERING,2009,0,0,0,0,0,0 +RANDOMIZES,0,0,2009,0,0,0,0 +RATA,0,0,0,2009,0,0,0 +RATIONALIZATIONS,2009,0,0,0,0,0,0 +RATIONALIZING,2009,0,0,0,0,0,0 +ABANDON,2009,0,0,0,0,0,0 +ABANDONMENTS,2009,0,0,0,0,0,0 +ABDICATING,2009,0,0,0,0,0,0 +ABERRATION,2009,0,0,0,0,0,0 +ABEYANCE,0,0,2009,0,0,0,0 +ABLE,0,2009,0,0,0,0,0 +ABNORMALLY,2009,0,0,0,0,0,0 +ABOLISHING,2009,0,0,0,0,0,0 +ABROGATES,2009,0,0,2009,0,0,0 +ABRUPT,2009,0,0,0,0,0,0 +ABSENCES,2009,0,0,0,0,0,0 +ABSOLVES,0,0,0,2009,0,0,0 +ABUSE,2009,0,0,0,0,0,0 +ABUSIVE,2009,0,0,0,0,0,0 +ACCESSIONS,0,0,0,2009,0,0,0 +ACCIDENTS,2009,0,0,0,0,0,0 +ACCOMPLISHES,0,2009,0,0,0,0,0 +ACCUSATION,2009,0,0,0,0,0,0 +ACCUSES,2009,0,0,0,0,0,0 +ACHIEVEMENT,0,2009,0,0,0,0,0 +ACQUIESCE,2009,0,0,0,0,0,0 +ACQUIREES,0,0,0,2011,0,0,0 +ACQUITTAL,2009,0,0,2009,0,0,0 +ACQUITTED,2009,0,0,2009,0,0,0 +ADJOURN,0,0,0,2009,0,0,0 +ADJOURNMENTS,0,0,0,2009,0,0,0 +ADJUDGES,0,0,0,2009,0,0,0 +ADJUDICATES,0,0,0,2009,0,0,0 +ADJUDICATIVE,0,0,0,2009,0,0,0 +ADMISSIBILITY,0,0,0,2009,0,0,0 +ADMISSIONS,0,0,0,2009,0,0,0 +ADULTERATION,2009,0,0,0,0,0,0 +ADVANCES,0,2009,0,0,0,0,0 +ADVANTAGEOUS,0,2009,0,0,0,0,0 +ADVERSARIES,2009,0,0,0,0,0,0 +ADVERSITIES,2009,0,0,0,0,0,0 +AFFIRMANCE,0,0,0,2011,0,0,0 +AFORESAID,0,0,0,2009,0,0,0 +AGAINST,2009,0,0,0,0,0,0 +AGGRAVATING,2009,0,0,0,0,0,0 +ALERTED,2009,0,0,0,0,0,0 +ALIENATES,2009,0,0,0,0,0,0 +ALLEGATION,2009,0,0,2009,0,0,0 +ALLEGEDLY,2009,0,0,2009,0,0,0 +ALLIANCES,0,2009,0,0,0,0,0 +ALWAYS,0,0,0,0,2009,0,0 +AMEND,0,0,0,2009,0,0,0 +AMENDING,0,0,0,2009,0,0,0 +ANNOY,2009,0,0,0,0,0,0 +ANNOYING,2009,0,0,0,0,0,0 +ANNULLING,2009,0,0,0,0,0,0 +ANOMALIES,2009,0,2009,0,0,0,0 +ANTECEDENT,0,0,0,2009,0,0,0 +ANTICIPATES,0,0,2009,0,0,0,0 +ANTICOMPETITIVE,2009,0,0,0,0,0,0 +APPARENT,0,0,2009,0,0,0,0 +APPEALED,0,0,0,2009,0,0,0 +APPEARED,0,0,2009,0,0,2009,0 +APPELLANTS,0,0,0,2009,0,0,0 +APPROXIMATE,0,0,2009,0,0,0,0 +APPROXIMATING,0,0,2009,0,0,0,0 +APPURTENANCES,0,0,0,2009,0,0,0 +ARBITRARILY,0,0,2009,0,0,0,0 +ARBITRATED,0,0,0,2009,0,0,0 +ARBITRATIONAL,0,0,0,2011,0,0,0 +ARBITRATORS,0,0,0,2009,0,0,0 +ARGUMENT,2009,0,0,0,0,0,0 +ARREARAGES,2009,0,0,2009,0,0,0 +ARRESTS,2009,0,0,0,0,0,0 +RETROCEDED,0,0,0,2011,0,0,0 +BOLSTERING,0,2009,0,0,0,0,0 +BOOM,0,2009,0,0,0,0,0 +BOTTLENECK,2009,0,0,0,0,0,0 +BOYCOTT,2009,0,0,0,0,0,0 +BREACH,2009,0,0,2009,0,0,0 +BREAK,2009,0,0,0,0,0,0 +BREAKDOWNS,2009,0,0,0,0,0,0 +BREAKTHROUGHS,0,2009,0,0,0,0,0 +BRIBERY,2009,0,0,0,0,0,0 +BRILLIANT,0,2009,0,0,0,0,0 +BURDENING,2009,0,0,0,0,0,0 +CALAMITIES,2009,0,0,0,0,0,0 +CANCELED,2009,0,0,0,0,0,0 +CANCELLED,2009,0,0,0,0,0,0 +CARELESSLY,2009,0,0,0,0,0,0 +CATASTROPHES,2009,0,0,0,0,0,0 +CAUTIONARY,2009,0,0,0,0,0,0 +CAUTIOUS,0,0,2009,0,0,0,0 +CEASED,2009,0,0,0,0,0,0 +CEDANTS,0,0,0,2012,0,0,0 +CENSURING,2009,0,0,0,0,0,0 +CHALLENGED,2009,0,0,0,0,0,0 +CHARITABLE,0,2009,0,0,0,0,0 +CIRCUMVENT,2009,0,0,0,0,0,0 +CIRCUMVENTIONS,2009,0,0,0,0,0,0 +SHORTAGE,2009,0,0,0,0,0,0 +SHRINKAGE,2009,0,0,0,0,0,0 +SHUTDOWNS,2009,0,0,0,0,0,0 +SLANDERED,2009,0,0,0,0,0,0 +REPUDIATES,2009,0,0,0,0,0,0 +REQUESTER,0,0,0,2011,0,0,0 +REQUIREMENT,0,0,0,0,0,0,2009 +REREGULATION,0,0,0,2011,0,0,0 +RESCINDS,0,0,0,2009,0,0,0 +RESIGNATION,2009,0,0,0,0,0,0 +RESIGNS,2009,0,0,0,0,0,0 +RESTATEMENT,2009,0,0,0,0,0,0 +RESTITUTIONARY,0,0,0,2011,0,0,0 +NOTARIAL,0,0,0,2009,0,0,0 +NOTARIZE,0,0,0,2009,0,0,0 +NOTWITHSTANDING,0,0,0,2009,0,0,0 +NULLIFICATION,2009,0,0,2009,0,0,0 +NULLIFY,2009,0,0,2009,0,0,0 +OBJECTED,2009,0,0,0,0,0,0 +OBJECTIONABLY,2009,0,0,0,0,0,0 +OBLIGATES,0,0,0,0,0,0,2009 +OBLIGATORY,0,0,0,0,0,0,2009 +OBLIGEES,0,0,0,2011,0,0,0 +OBSCENE,2009,0,0,0,0,0,0 +OBSTACLE,2009,0,0,0,0,0,0 +OBSTRUCTING,2009,0,0,0,0,0,0 +OFFENCE,2009,0,0,0,0,0,0 +OFFENDER,2009,0,0,0,0,0,0 +OFFENSE,0,0,0,2009,0,0,0 +OFFERORS,0,0,0,2011,0,0,0 +OMITS,2009,0,0,0,0,0,0 +OPPORTUNISTIC,2009,0,0,0,0,0,0 +OPPOSE,2009,0,0,0,0,0,0 +OPPOSITION,2009,0,0,0,0,0,0 +OPTIONEES,0,0,0,2009,0,0,0 +OUTDATED,2009,0,0,0,0,0,0 +OUTPERFORMING,0,2009,0,0,0,0,0 +OVERBUILD,2009,0,0,0,0,0,0 +OVERBURDEN,2009,0,0,0,0,0,0 +OVERCAPACITY,2009,0,0,0,0,0,0 +OVERCHARGING,2009,0,0,0,0,0,0 +OVERDUE,2009,0,0,0,0,0,0 +OVERESTIMATING,2009,0,0,0,0,0,0 +OVERLOADED,2009,0,0,0,0,0,0 +OVERLOOKED,2009,0,0,0,0,0,0 +OVERPAYMENT,2009,0,0,0,0,0,0 +OVERPRODUCING,2009,0,0,0,0,0,0 +OVERRULES,0,0,0,2009,0,0,0 +OVERRUNS,2009,0,0,0,0,0,0 +OVERSHADOWS,2009,0,0,0,0,0,0 +OVERSTATEMENTS,2009,0,0,0,0,0,0 +OVERSUPPLIES,2009,0,0,0,0,0,0 +OVERTURN,2009,0,0,0,0,0,0 +OVERVALUE,2009,0,0,0,0,0,0 +PANICS,2009,0,0,0,0,0,0 +NECESSITATE,0,0,0,0,0,0,2009 +NEGATIVE,2009,0,0,0,0,0,0 +NEGLECTED,2009,0,0,0,0,0,0 +NEGLIGENCE,2009,0,0,0,0,0,0 +NEVER,0,0,0,0,2009,0,0 +BARRIERS,2009,0,0,0,0,0,0 +BELIEVED,0,0,2009,0,0,0,0 +IDLING,2009,0,0,0,0,0,0 +IGNORING,2009,0,0,0,0,0,0 +ILLEGALITY,2009,0,0,0,0,0,0 +ILLICITLY,2009,0,0,0,0,0,0 +IMBALANCES,2009,0,0,0,0,0,0 +IMPAIR,2009,0,0,0,0,0,2011 +IMPAIRMENTS,2009,0,0,0,0,0,2011 +IMPEDE,2009,0,0,0,0,0,0 +IMPEDIMENTS,2009,0,0,0,0,0,0 +IMPERFECTION,2009,0,0,0,0,0,0 +IMPLEADED,0,0,0,2009,0,0,0 +IMPLICATING,2009,0,0,0,0,0,0 +IMPOSING,0,0,0,0,0,0,2009 +IMPOSSIBLE,2009,0,0,0,0,0,0 +IMPOUNDS,2009,0,0,0,0,0,0 +IMPRACTICALITY,2009,0,0,0,0,0,0 +IMPRESS,0,2009,0,0,0,0,0 +IMPRESSIVE,0,2009,0,0,0,0,0 +IMPROBABLE,0,0,2009,0,0,0,0 +IMPROPRIETY,2009,0,0,0,0,0,0 +IMPROVEMENTS,0,2009,0,0,0,0,0 +IMPRUDENTLY,2009,0,0,0,0,0,0 +INACCURACY,2009,0,0,0,0,0,0 +INACTIONS,2009,0,0,0,0,0,0 +INACTIVATING,2009,0,0,0,0,0,0 +INADEQUACIES,2009,0,0,0,0,0,0 +INADVERTENT,2009,0,0,0,0,0,0 +INAPPROPRIATE,2009,0,0,0,0,0,0 +INCAPABLE,2009,0,0,0,0,0,0 +INCARCERATED,2009,0,0,2009,0,0,0 +INCARCERATIONS,2009,0,0,2009,0,0,0 +INCIDENT,2009,0,0,0,0,0,0 +INCOMPATIBLE,2009,0,0,0,0,0,0 +INCOMPETENTLY,2009,0,0,0,0,0,0 +INCOMPLETENESS,2009,0,2009,0,0,0,0 +INCONSISTENT,2009,0,0,0,0,0,0 +INCONVENIENCE,2009,0,0,0,0,0,0 +INCORRECTLY,2009,0,0,0,0,0,0 +INDEBTED,0,0,0,0,0,0,2009 +INDEFEASIBLY,2009,0,0,0,0,0,0 +INDEMNIFIABLE,0,0,0,2009,0,0,0 +INDEMNIFIES,0,0,0,2009,0,0,0 +INDEMNITEES,0,0,0,2009,0,0,0 +INDEMNITY,0,0,0,2009,0,0,0 +INDICTABLE,2009,0,0,2009,0,0,0 +INDICTMENTS,2009,0,0,2009,0,0,0 +INEFFECTIVENESS,2009,0,0,0,0,0,0 +INEFFICIENTLY,2009,0,0,0,0,0,0 +INEQUITABLY,2009,0,0,0,0,0,0 +INEXACT,0,0,2009,0,0,0,0 +INFERIOR,2009,0,0,0,0,0,0 +INFORMATIVE,0,2009,0,0,0,0,0 +INFRINGED,2009,0,0,0,0,0,0 +INFRINGES,2009,0,0,0,0,0,0 +INHIBITED,2009,0,0,0,0,0,2009 +INJUNCTION,2009,0,0,2009,0,0,0 +INJURED,2009,0,0,0,0,0,0 +INJURIOUS,2009,0,0,0,0,0,0 +INNOVATES,0,2009,0,0,0,0,0 +INNOVATIVE,0,2009,0,0,0,0,0 +INORDINATE,2009,0,0,0,0,0,0 +INSENSITIVE,2009,0,0,0,0,0,0 +INSISTENCE,0,0,0,0,0,0,2009 +INSOLVENCIES,2009,0,0,0,0,0,0 +INSPIRATIONAL,0,2009,0,0,0,0,0 +INSUFFICIENCY,2009,0,0,0,0,0,0 +INSURRECTIONS,2009,0,0,0,0,0,0 +INTENTIONAL,2009,0,0,0,0,0,0 +INTERFERENCES,2009,0,0,0,0,0,0 +INTERMITTENT,2009,0,0,0,0,0,0 +INTERPOSED,0,0,0,2009,0,0,0 +INTERPOSITIONS,0,0,0,2009,0,0,0 +INTERROGATING,0,0,0,2009,0,0,0 +INTERROGATORIES,0,0,0,2009,0,0,0 +INTERRUPTED,2009,0,0,0,0,0,0 +INTERRUPTS,2009,0,0,0,0,0,0 +STABILITY,0,2009,0,0,0,0,0 +STABILIZED,0,2009,0,0,0,0,0 +STAGGERING,2009,0,0,0,0,0,0 +STAGNATES,2009,0,0,0,0,0,0 +STANDSTILLS,2009,0,0,0,0,0,0 +STATUTORY,0,0,0,2009,0,0,0 +STIPULATING,0,0,0,0,0,0,2009 +STOPPAGE,2009,0,0,0,0,0,0 +STOPS,2009,0,0,0,0,0,0 +STRAINS,2009,0,0,0,0,0,0 +STRENGTHENING,0,2009,0,0,0,0,0 +STRESSED,2009,0,0,0,0,0,0 +STRICT,0,0,0,0,0,0,2009 +STRINGENT,2009,0,0,0,0,0,0 +STRONGLY,0,0,0,0,2009,0,0 +SUBJECTED,2009,0,0,0,0,0,0 +SUBLEASEHOLD,0,0,0,2011,0,0,0 +SUBPARAGRAPH,0,0,0,2009,0,0,0 +SUBPOENAS,2009,0,0,2009,0,0,0 +SUBTRUST,0,0,0,2011,0,0,0 +SUCCEEDING,0,2009,0,0,0,0,0 +SUCCESSFUL,0,2009,0,0,0,0,0 +SUE,2009,0,0,2009,0,0,0 +SUFFERED,2009,0,0,0,0,0,0 +SUGGESTED,0,0,2009,0,0,0,0 +SUMMONED,2009,0,0,2009,0,0,0 +SUPERIOR,0,2009,0,0,0,0,0 +SUPERSEDES,0,0,0,2009,0,0,0 +SURPASS,0,2009,0,0,0,0,0 +SUSCEPTIBILITY,2009,0,2009,0,0,0,0 +SUSPECTS,2009,0,0,0,0,0,0 +SUSPENDS,2009,0,0,0,0,0,0 +SUSPICIONS,2009,0,0,0,0,0,0 +REVOCABILITY,0,0,0,2011,0,0,0 +REVOKED,2009,0,0,0,0,0,0 +REVOLUTIONIZED,0,2009,0,0,0,0,0 +REWARDED,0,2009,0,0,0,0,0 +RIDICULED,2009,0,0,0,0,0,0 +RISKED,0,0,2009,0,0,0,0 +RISKING,0,0,2009,0,0,0,0 +RULING,0,0,0,2009,0,0,0 +SACRIFICE,2009,0,0,0,0,0,0 +SACRIFICING,2009,0,0,0,0,0,0 +SATISFIED,0,2009,0,0,0,0,0 +SCANDALOUS,2009,0,0,0,0,0,0 +SCRUTINIZES,2009,0,0,0,0,0,0 +SEEMS,0,0,2009,0,0,0,0 +SEIZING,2009,0,0,0,0,0,0 +SENTENCING,2009,0,0,2009,0,0,0 +SERIOUSNESS,2009,0,0,0,0,0,0 +SETTLEMENTS,0,0,0,2009,0,0,0 +SEVERALLY,0,0,0,2009,0,0,0 +SEVERED,2009,0,0,0,0,0,0 +ENTHUSIASTICALLY,0,2009,0,0,0,0,0 +ERODED,2009,0,0,0,0,0,0 +ERRATIC,2009,0,0,0,0,0,0 +ERRONEOUS,2009,0,0,0,0,0,0 +ERRS,2009,0,0,0,0,0,0 +ESCALATING,2009,0,0,0,0,0,0 +ESCROW,0,0,0,0,0,0,2009 +ESTOPPEL,0,0,0,2011,0,0,0 +EVADING,2009,0,0,0,0,0,0 +EVICT,2009,0,0,0,0,0,0 +EVICTIONS,2009,0,0,0,0,0,0 +EXACERBATE,2009,0,0,0,0,0,0 +EXACERBATION,2009,0,0,0,0,0,0 +EXAGGERATES,2009,0,0,0,0,0,0 +EXCEEDANCES,0,0,0,2011,0,0,0 +EXCELLING,0,2009,0,0,0,0,0 +EXCESSIVE,2009,0,0,0,0,0,0 +EXCITEMENT,0,2009,0,0,0,0,0 +EXCLUSIVENESS,0,2009,0,0,0,0,0 +EXCULPATED,2009,0,0,2009,0,0,0 +EXCULPATIONS,2009,0,0,2009,0,0,0 +EXECUTORY,0,0,0,2009,0,0,0 +EXEMPLARY,0,2009,0,0,0,0,0 +EXONERATING,2009,0,0,0,0,0,0 +EXPLOITATION,2009,0,0,0,0,0,0 +EXPLOITING,2009,0,0,0,0,0,0 +EXPOSES,2009,0,0,0,0,0,0 +EXPROPRIATE,2009,0,0,0,0,0,0 +EXPROPRIATION,2009,0,0,0,0,0,0 +EXTENUATING,2009,0,0,0,0,0,0 +SOLVING,0,2009,0,0,0,0,0 +SOMEWHERE,0,0,2009,0,0,0,0 +LOSE,2009,0,0,0,0,0,0 +LOSSES,2009,0,0,0,0,0,0 +LUCRATIVE,0,2009,0,0,0,0,0 +MALFUNCTION,2009,0,0,0,0,0,0 +MALICE,2009,0,0,0,0,0,0 +MANDAMUS,0,0,0,2009,0,0,0 +MANDATING,0,0,0,0,0,0,2009 +MANIPULATED,2009,0,0,0,0,0,0 +MANIPULATIONS,2009,0,0,0,0,0,0 +MAY,0,0,2009,0,0,2009,0 +MEDIATES,0,0,0,2009,0,0,0 +MEDIATOR,0,0,0,2009,0,0,0 +MISAPPLICATION,2009,0,0,0,0,0,0 +MISAPPLY,2009,0,0,0,0,0,0 +MISAPPROPRIATES,2009,0,0,0,0,0,0 +MISBRANDED,2009,0,0,0,0,0,0 +MISCALCULATING,2009,0,0,0,0,0,0 +MISCHIEF,2009,0,0,0,0,0,0 +MISCLASSIFY,2014,0,0,0,0,0,0 +MISDEMEANOR,2009,0,0,2009,0,0,0 +MISHANDLE,2009,0,0,0,0,0,0 +MISINFORM,2009,0,0,0,0,0,0 +MISINFORMS,2009,0,0,0,0,0,0 +MISINTERPRETED,2009,0,0,0,0,0,0 +MISJUDGED,2009,0,0,0,0,0,0 +MISJUDGMENTS,2009,0,0,0,0,0,0 +MISLABELLED,2009,0,0,0,0,0,0 +MISLEADINGLY,2009,0,0,0,0,0,0 +MISMANAGED,2009,0,0,0,0,0,0 +MISMATCH,2009,0,0,0,0,0,0 +MISPLACED,2009,0,0,0,0,0,0 +MISREPRESENT,2009,0,0,0,0,0,0 +MISREPRESENTING,2009,0,0,0,0,0,0 +MISSES,2009,0,0,0,0,0,0 +WORRY,2009,0,0,0,0,0,0 +WORSENED,2009,0,0,0,0,0,0 +WORTHLESS,2009,0,0,0,0,0,0 +TOLERATE,2009,0,0,0,0,0,0 +TOLERATION,2009,0,0,0,0,0,0 +TORTS,0,0,0,2009,0,0,0 +FICTITIOUS,2009,0,0,0,0,0,0 +FIRED,2009,0,0,0,0,0,0 +NONATTAINMENT,2009,0,0,0,0,0,0 +NONCOMPETITIVE,2009,0,0,0,0,0,0 +NONCOMPLYING,2009,0,0,0,0,0,0 +NONCONTINGENT,0,0,0,2011,0,0,0 +NONDISCLOSURE,2009,0,0,0,0,0,0 +NONFORFEITABLE,0,0,0,2009,0,0,0 +DISCLAIM,2009,0,0,0,0,0,0 +DISCLAIMING,2009,0,0,0,0,0,0 +DISCLOSES,2009,0,0,0,0,0,0 +DISCONTINUATION,2009,0,0,0,0,0,0 +DISCONTINUES,2009,0,0,0,0,0,0 +DISCOURAGES,2009,0,0,0,0,0,0 +DISCREDITING,2009,0,0,0,0,0,0 +SPECTACULAR,0,2009,0,0,0,0,0 +SPECULATES,0,0,2009,0,0,0,0 +SPECULATIVE,0,0,2009,0,0,0,0 +TRAGEDIES,2009,0,0,0,0,0,0 +TRANSFEROR,0,0,0,2009,0,0,0 +LEGISLATES,0,0,0,2009,0,0,0 +LEGISLATIVE,0,0,0,2009,0,0,0 +LEGISLATURE,0,0,0,2009,0,0,0 +LIBELOUS,0,0,0,2009,0,0,0 +LIENHOLDERS,0,0,0,2011,0,0,0 +COMPULSORY,0,0,0,0,0,0,2009 +CONCEDED,2009,0,0,0,0,0,0 +CONCEIVABLY,0,0,2009,0,0,0,0 +CONCILIATING,2009,0,0,0,0,0,0 +CONCLUSIVELY,0,2009,0,0,0,0,0 +CONDEMNED,2009,0,0,0,0,0,0 +CONDITIONAL,0,0,2009,0,0,0,0 +CONDUCIVE,0,2009,0,0,0,0,0 +CONFESSING,2009,0,0,0,0,0,0 +CONFINED,2009,0,0,0,0,0,2009 +CONFINING,2009,0,0,0,0,0,2009 +CONFISCATING,2009,0,0,0,0,0,0 +CONFLICT,2009,0,0,0,0,0,0 +CONFRONT,2009,0,0,0,0,0,0 +CONFRONTED,2009,0,0,0,0,0,0 +CONFUSED,2009,0,0,0,0,0,0 +CONFUSION,2009,0,2009,0,0,0,0 +CONSENTS,0,0,0,2009,0,0,0 +CONSPIRATOR,2009,0,0,0,0,0,0 +CONSPIRED,2009,0,0,0,0,0,0 +CONSTITUTIONAL,0,0,0,2009,0,0,0 +CONSTITUTIVE,0,0,0,2009,0,0,0 +CONSTRAINS,0,0,0,0,0,0,2009 +CONSTRUCTIVELY,0,2009,0,0,0,0,0 +CONSTRUING,0,0,0,2012,0,0,0 +CONTENDING,2009,0,0,0,0,0,0 +CONTENTIOUS,2009,0,0,0,0,0,0 +CONTESTED,2009,0,0,0,0,0,0 +CONTINGENT,0,0,2009,0,0,0,0 +CONTRACTED,0,0,0,2009,0,0,0 +CONTRACTILE,0,0,0,2009,0,0,0 +CONTRACTS,0,0,0,2009,0,0,0 +CONTRADICTED,2009,0,0,0,0,0,0 +CONTRADICTORY,2009,0,0,0,0,0,0 +CONTRAVENED,0,0,0,2009,0,0,0 +CONTRAVENTIONS,0,0,0,2009,0,0,0 +CONTROVERT,0,0,0,2009,0,0,0 +CONVEYANCE,0,0,0,2009,0,0,0 +CONVICTING,2009,0,0,2009,0,0,0 +CORRECTING,2009,0,0,0,0,0,0 +CORRUPT,2009,0,0,0,0,0,0 +CORRUPTIONS,2009,0,0,0,0,0,0 +COTERMINOUS,0,0,0,2009,0,0,0 +COUNSELLED,0,0,0,2009,0,0,0 +COUNTERCLAIMING,2009,0,0,0,0,0,0 +COUNTERFEITER,2009,0,0,0,0,0,0 +COUNTERMEASURE,2009,0,0,0,0,0,0 +COUNTERSUIT,0,0,0,2011,0,0,0 +COURTROOM,0,0,0,2009,0,0,0 +COVENANTING,0,0,0,0,0,0,2011 +CREATIVENESS,0,2009,0,0,0,0,0 +CRIMINAL,2009,0,0,2009,0,0,0 +CRIMINALLY,2009,0,0,2009,0,0,0 +CRITICAL,-2020,0,0,0,0,0,0 +CRITICIZE,2009,0,0,0,0,0,0 +CROSSCLAIM,0,0,0,2011,0,0,0 +CRUCIAL,2009,0,0,0,0,0,0 +CULPABLY,2009,0,0,0,0,0,0 +CURTAILING,2009,0,0,0,0,0,0 +CUT,2009,0,0,0,0,0,0 +CYBERATTACKS,2014,0,0,0,0,0,0 +CYBERCRIMINAL,2014,0,0,0,0,0,0 +TAINT,2009,0,0,0,0,0,0 +TAMPERED,2009,0,0,0,0,0,0 +TENTATIVE,0,0,2009,0,0,0,0 +TERMINATED,2009,0,0,0,0,0,0 +TERMINATIONS,2009,0,0,0,0,0,0 +TESTIFYING,2009,0,0,2009,0,0,0 +THENCEFORWARD,0,0,0,2009,0,0,0 +THEREIN,0,0,0,2009,0,0,0 +THEREOVER,0,0,0,2011,0,0,0 +THEREUNDER,0,0,0,2009,0,0,0 +THREAT,2009,0,0,0,0,0,0 +THREATENS,2009,0,0,0,0,0,0 +FACTO,0,0,0,2011,0,0,0 +FAILINGS,2009,0,0,0,0,0,0 +FALLOUT,2009,0,0,0,0,0,0 +FALSIFICATIONS,2009,0,0,0,0,0,0 +FALSIFYING,2009,0,0,0,0,0,0 +FATALITY,2009,0,0,0,0,0,0 +FAULTS,2009,0,0,0,0,0,0 +FAVORED,0,2009,0,0,0,0,0 +FEAR,2009,0,0,0,0,0,0 +FELONY,2009,0,0,2009,0,0,0 +DAMAGING,2009,0,0,0,0,0,0 +DANGEROUS,2009,0,0,0,0,0,0 +DEADLOCKED,2009,0,0,0,0,0,0 +DEADWEIGHTS,2009,0,0,0,0,0,0 +DECEASED,2009,0,0,0,0,0,0 +DECEITFUL,2009,0,0,0,0,0,0 +DECEIVES,2009,0,0,0,0,0,0 +DECEPTIVE,2009,0,0,0,0,0,0 +DECLINED,2009,0,0,0,0,0,0 +DECREED,0,0,0,2009,0,0,0 +DEFACED,2009,0,0,0,0,0,0 +DEFAMATION,2009,0,0,0,0,0,0 +DEFAMED,2009,0,0,0,0,0,0 +DEFAULTED,2009,0,0,0,0,0,0 +DEFEASANCES,0,0,0,2011,0,0,0 +DEFEASES,0,0,0,2014,0,0,0 +DEFEATING,2009,0,0,0,0,0,0 +DEFECTIVELY,0,0,0,2009,0,0,0 +DEFENDANT,2009,0,0,2009,0,0,0 +DEFENDS,2009,0,0,0,0,0,0 +DEFICIENCIES,2009,0,0,0,0,0,0 +DEFICITS,2009,0,0,0,0,0,0 +DEFRAUDED,2009,0,0,0,0,0,0 +DEGRADATION,2009,0,0,0,0,0,0 +DEGRADES,2009,0,0,0,0,0,0 +DELAYING,2009,0,0,0,0,0,0 +DELEGATEE,0,0,0,2011,0,0,0 +DELIBERATED,2009,0,0,0,0,0,0 +DELIGHTFUL,0,2009,0,0,0,0,0 +DELINQUENCIES,2009,0,0,0,0,0,0 +DELINQUENTS,2009,0,0,0,0,0,0 +DELISTS,2011,0,0,0,0,0,0 +DEMISING,2009,0,0,0,0,0,0 +DEMOLISHING,2009,0,0,0,0,0,0 +DEMOTED,2009,0,0,0,0,0,0 +DEMOTIONS,2009,0,0,0,0,0,0 +DEMURRING,0,0,0,2009,0,0,0 +DENIED,2009,0,0,0,0,0,0 +DENIGRATES,2009,0,0,0,0,0,0 +DENYING,2009,0,0,0,0,0,0 +DEPENDANCE,0,0,0,0,0,0,2011 +DEPENDENCE,0,0,2009,0,0,0,0 +DEPENDING,0,0,2009,0,0,2009,2011 +DEPLETES,2009,0,0,0,0,0,0 +DEPOSE,0,0,0,2009,0,0,0 +DEPOSITION,0,0,0,2009,0,0,0 +INVALIDATE,2009,0,0,0,0,0,0 +INVALIDATION,2009,0,0,0,0,0,0 +INVENTING,0,2009,0,0,0,0,0 +INVENTIVENESS,0,2009,0,0,0,0,0 +INVESTIGATED,2009,0,0,0,0,0,0 +INVESTIGATIONS,2009,0,0,0,0,0,0 +IRRECONCILABLY,2009,0,0,0,0,0,0 +IRREGULARITIES,2009,0,0,0,0,0,0 +IRREPARABLY,2009,0,0,0,0,0,0 +IRREVOCABLY,0,0,0,2009,0,0,2009 +JUDICIAL,0,0,0,2009,0,0,0 +JURIES,0,0,0,2009,0,0,0 +JURISDICTIONALLY,0,0,0,2011,0,0,0 +JURISTS,0,0,0,2009,0,0,0 +JURYMAN,0,0,0,2009,0,0,0 +KICKBACK,2009,0,0,0,0,0,0 +DIMINISH,2009,0,0,0,0,0,0 +DIMINUTION,2009,0,0,0,0,0,0 +DISADVANTAGED,2009,0,0,0,0,0,0 +DISAFFIRM,0,0,0,2009,0,0,0 +DISAGREE,2009,0,0,0,0,0,0 +DISAGREEMENT,2009,0,0,0,0,0,0 +DISALLOWANCE,2009,0,0,0,0,0,0 +DISALLOWS,2009,0,0,0,0,0,0 +DISAPPEARED,2009,0,0,0,0,0,0 +DISAPPOINTED,2009,0,0,0,0,0,0 +DISAPPOINTMENTS,2009,0,0,0,0,0,0 +DISAPPROVE,2009,0,0,0,0,0,0 +DISASSOCIATES,2009,0,0,0,0,0,0 +DISASTER,2009,0,0,0,0,0,0 +DISAVOW,2009,0,0,0,0,0,0 +DISAVOWS,2009,0,0,0,0,0,0 +GRATUITOUS,2009,0,0,0,0,0,0 +GREATEST,0,2009,0,0,0,0,0 +GRIEVANCES,2009,0,0,0,0,0,0 +HALT,2009,0,0,0,0,0,0 +HAMPERING,2009,0,0,0,0,0,0 +HAPPINESS,0,2009,0,0,0,0,0 +HARASSING,2009,0,0,0,0,0,0 +HARM,2009,0,0,0,0,0,0 +HARMING,2009,0,0,0,0,0,0 +HARSHEST,2009,0,0,0,0,0,0 +HAZARDOUS,2009,0,0,0,0,0,0 +NONINFRINGEMENT,0,0,0,2011,0,0,0 +NONJURISDICTIONAL,0,0,0,2011,0,0,0 +NONPERFORMANCES,2009,0,0,0,0,0,0 +HURTING,2009,0,0,0,0,0,0 +DISFAVORING,2009,0,0,0,0,0,0 +DISGORGEMENT,2009,0,0,0,0,0,0 +COMPLICATE,2009,0,0,0,0,0,0 +COMPLICATION,2009,0,0,0,0,0,0 +COMPLIMENTED,0,2009,0,0,0,0,0 +MISSTATEMENT,2009,0,0,0,0,0,0 +MISSTEP,2009,0,0,0,0,0,0 +MISTAKENLY,2009,0,0,0,0,0,0 +MISTRIALS,2009,0,0,2009,0,0,0 +MISUNDERSTOOD,2009,0,0,0,0,0,0 +MISUSING,2009,0,0,0,0,0,0 +MONOPOLIZE,2009,0,0,0,0,0,0 +MONOPOLY,2009,0,0,0,0,0,0 +MOREOVER,0,0,0,2009,0,0,0 +MUST,0,0,0,0,2009,0,0 +SLIPPAGE,2009,0,0,0,0,0,0 +SLOWDOWNS,2009,0,0,0,0,0,0 +SLOWING,2009,0,0,0,0,0,0 +SLUGGISHLY,2009,0,0,0,0,0,0 +SMOOTHLY,0,2009,0,0,0,0,0 +DEPRESSED,2009,0,0,0,0,0,0 +DEPRIVE,2009,0,0,0,0,0,0 +DERELICT,2009,0,0,0,0,0,0 +DEROGATES,0,0,0,2009,0,0,0 +DEROGATORY,2009,0,0,0,0,0,0 +DESIST,0,0,0,2009,0,0,0 +DESTABILIZED,2009,0,0,0,0,0,0 +DESTROYED,2009,0,0,0,0,0,0 +DESTRUCTIVE,2009,0,0,0,0,0,0 +DETENTION,2009,0,0,0,0,0,0 +DETERIORATED,2009,0,0,0,0,0,0 +DETERIORATIONS,2009,0,0,0,0,0,0 +DETERRENT,2009,0,0,0,0,0,0 +DETRACT,2009,0,0,0,0,0,0 +DETRIMENTAL,2009,0,0,0,0,0,0 +DEVALUED,2009,0,0,0,0,0,0 +DEVASTATED,2009,0,0,0,0,0,0 +DEVIATED,2009,0,2009,0,0,0,0 +DEVIATIONS,2009,0,2009,0,0,0,0 +DEVOLVES,2009,0,0,0,0,0,0 +DICTATES,0,0,0,0,0,0,2009 +DIFFERING,0,0,2009,0,0,0,0 +DIFFICULTLY,2009,0,0,0,0,0,0 +ASCENDANT,0,0,0,2009,0,0,0 +ASSAULTING,2009,0,0,0,0,0,0 +ASSIGNATION,0,0,0,2009,0,0,0 +ASSUMED,0,0,2009,0,0,0,0 +ASSUMPTIONS,0,0,2009,0,0,0,0 +ASSURING,0,2009,0,0,0,0,0 +ATTAINMENT,0,2009,0,0,0,0,0 +ATTESTATION,0,0,0,2009,0,0,0 +ATTORN,0,0,0,2011,0,0,0 +ATTORNS,0,0,0,2011,0,0,0 +AVERSELY,2011,0,0,0,0,0,0 +BAILED,0,0,0,2009,0,0,0 +BAILIFFS,0,0,0,2009,0,0,0 +BALKED,2009,0,0,0,0,0,0 +BANKRUPTED,2009,0,0,0,0,0,0 +CLAIMANT,0,0,0,2009,0,0,0 +CLAIMS,2009,0,0,2009,0,0,0 +CLAWBACKS,0,0,0,2014,0,0,0 +CLOSEOUTS,2009,0,0,0,0,0,0 +CLOSURES,2009,0,0,0,0,0,0 +CODICILS,0,0,0,2009,0,0,0 +CODIFIES,0,0,0,2009,0,0,0 +COERCED,2009,0,0,0,0,0,0 +COERCIVE,2009,0,0,0,0,0,0 +DISINCENTIVES,2009,0,0,0,0,0,0 +COLLABORATE,0,2009,0,0,0,0,0 +COLLABORATION,0,2009,0,0,0,0,0 +COLLABORATORS,0,2009,0,0,0,0,0 +COLLAPSING,2009,0,0,0,0,0,0 +COLLUDED,2009,0,0,0,0,0,0 +COLLUSIONS,2009,0,0,0,0,0,0 +POSITIVE,0,2009,0,0,0,0,0 +POSSIBILITY,0,0,2009,0,0,0,0 +POSTCLOSURE,0,0,0,2011,0,0,0 +POSTPONED,2009,0,0,0,0,0,0 +POSTPONING,2009,0,0,0,0,0,0 +WRIT,0,0,0,2009,0,0,0 +WRITEOFFS,2009,0,0,0,0,0,0 +WRONGDOINGS,2009,0,0,0,0,0,0 +HONORING,0,2009,0,0,0,0,0 +REASSESSES,0,0,2009,0,0,0,0 +REASSIGN,2009,0,0,0,0,0,0 +REASSIGNMENTS,2009,0,0,0,0,0,0 +REBOUNDING,0,2009,0,0,0,0,0 +REBUTTABLY,0,0,0,2011,0,0,0 +REBUTTING,0,0,0,2009,0,0,0 +RECALCULATING,0,0,2009,0,0,0,0 +RECALLED,2009,0,0,0,0,0,0 +RECESSION,2009,0,0,0,0,0,0 +RECKLESSLY,2009,0,0,0,0,0,0 +RECONSIDERING,0,0,2009,0,0,0,0 +RECOUPMENT,0,0,0,2009,0,0,0 +RECTIFICATION,0,0,0,2009,0,0,0 +RECUSED,0,0,0,2011,0,0,0 +REDACTED,2009,0,0,2009,0,0,0 +REDEFAULT,2014,0,0,0,0,0,0 +REDRESSED,2009,0,0,0,0,0,0 +REEXAMINE,0,0,2009,0,0,0,0 +REFERENDUMS,0,0,0,2009,0,0,0 +REFILING,0,0,0,2009,0,0,0 +REFUSAL,2009,0,0,0,0,0,0 +REFUSES,2009,0,0,0,0,0,0 +REGAINING,0,2009,0,0,0,0,0 +REGULATING,0,0,0,2009,0,0,0 +REGULATOR,0,0,0,2009,0,0,0 +REHEARD,0,0,0,2009,0,0,0 +VARIABLES,0,0,2009,0,0,0,0 +VARIANT,0,0,2009,0,0,0,0 +VARIED,0,0,2009,0,0,0,0 +VENDEE,0,0,0,2011,0,0,0 +VERSATILE,0,2009,0,0,0,0,0 +VIBRANCY,0,2009,0,0,0,0,0 +VIOLATED,2009,0,0,0,0,0,0 +VIOLATIONS,2009,0,0,0,0,0,0 +VIOLENCE,2009,0,0,0,0,0,0 +VITIATED,2009,0,0,0,0,0,0 +VOIDABLE,0,0,0,2009,0,0,0 +VOLATILITIES,0,0,2009,0,0,0,0 +VULNERABLE,2009,0,0,0,0,0,0 +WARNING,2009,0,0,0,0,0,0 +WARRANTOR,0,0,0,2011,0,0,0 +WEAK,2009,0,0,0,0,0,0 +WEAKENS,2009,0,0,0,0,0,0 +WEAKNESS,2009,0,0,0,0,0,0 +DISHONOR,2009,0,0,0,0,0,0 +DISHONORING,2009,0,0,0,0,0,0 +DISINTERESTED,2009,0,0,0,0,0,0 +DISLOYALLY,2009,0,0,0,0,0,0 +DISMISS,2009,0,0,0,0,0,0 +DISMISSES,2009,0,0,0,0,0,0 +DISPARAGED,2009,0,0,0,0,0,0 +DISPARAGING,2009,0,0,0,0,0,0 +DISPLACE,2009,0,0,0,0,0,0 +DISPLACES,2009,0,0,0,0,0,0 +DISPOSSESS,2009,0,0,0,0,0,0 +DISPOSSESSION,0,0,0,2009,0,0,0 +DISPROPORTIONATE,2009,0,0,0,0,0,0 +DISPUTES,2009,0,0,0,0,0,0 +DISQUALIFIED,2009,0,0,0,0,0,0 +DISREGARD,2009,0,0,0,0,0,0 +DISREPUTABLE,2009,0,0,0,0,0,0 +DISRUPTING,2009,0,0,0,0,0,0 +DISRUPTS,2009,0,0,0,0,0,0 +DISSENTED,2009,0,0,0,0,0,0 +DISSENTS,2009,0,0,0,0,0,0 +DISSOLUTIONS,2009,0,0,0,0,0,0 +DISTINCTIVELY,0,2009,0,0,0,0,0 +DISTORTING,2009,0,0,0,0,0,0 +DISTRACT,2009,0,0,0,0,0,0 +DISTRACTIONS,2009,0,0,0,0,0,0 +DISTRESSED,2009,0,0,0,0,0,0 +DISTURBANCE,2009,0,0,0,0,0,0 +DISTURBS,2009,0,0,0,0,0,0 +DIVERTING,2009,0,0,0,0,0,0 +DIVESTING,2009,0,0,0,0,0,0 +DIVESTMENTS,2009,0,0,0,0,0,0 +DIVULGE,2009,0,0,0,0,0,0 +DOCKET,0,0,0,2009,0,0,0 +DONEES,0,0,0,2011,0,0,0 +DOUBTS,2009,0,2009,0,0,0,0 +DOWNGRADING,2009,0,0,0,0,0,0 +DOWNSIZING,2009,0,0,0,0,0,0 +DOWNTURN,2009,0,0,0,0,0,0 +DRAG,2009,0,0,0,0,0,0 +DRAWBACKS,2009,0,0,0,0,0,0 +DROUGHTS,2009,0,0,0,0,0,0 +DYSFUNCTIONAL,2009,0,0,0,0,0,0 +EARMARKING,0,0,0,0,0,0,2009 +EASING,2009,0,0,0,0,0,0 +EFFICIENCY,0,2009,0,0,0,0,0 +EGREGIOUSLY,2009,0,0,0,0,0,0 +EMBARGOES,2009,0,0,0,0,0,0 +EMBARRASSES,2009,0,0,0,0,0,0 +EMBEZZLE,2009,0,0,0,0,0,0 +EMBEZZLER,2009,0,0,0,0,0,0 +EMPOWERED,0,2009,0,0,0,0,0 +ENABLED,0,2009,0,0,0,0,0 +ENCOURAGEMENT,0,2009,0,0,0,0,0 +ENCROACHED,2009,0,0,0,0,0,0 +ENCROACHMENTS,2009,0,0,0,0,0,0 +ENCUMBERS,2009,0,0,2009,0,0,2009 +ENCUMBRANCES,2009,0,0,2009,0,0,2009 +ENDANGERMENT,2009,0,0,0,0,0,0 +ENFORCEABLE,0,0,0,2009,0,0,0 +ENHANCEMENT,0,2009,0,0,0,0,0 +ENJOIN,2009,0,0,0,0,0,0 +ENJOY,0,2009,0,0,0,0,0 +ENJOYING,0,2009,0,0,0,0,0 +ENTAILED,0,0,0,0,0,0,2009 +PENALIZE,2009,0,0,0,0,0,0 +PENALTIES,2009,0,0,0,0,0,0 +PERFECTED,0,2009,0,0,0,0,0 +PERIL,2009,0,0,0,0,0,0 +PERMISSION,0,0,0,0,0,0,2009 +PERMITTEES,0,0,0,2011,0,0,0 +PERPETRATES,2009,0,0,2009,0,0,0 +PERSISTED,2009,0,0,0,0,0,0 +PERSISTING,2009,0,0,0,0,0,0 +PERVASIVELY,2009,0,0,0,0,0,0 +PETITIONER,0,0,0,2009,0,0,0 +PETTY,2009,0,0,0,0,0,0 +HEREAFTER,0,0,0,2009,0,0,0 +HEREFORE,0,0,0,2014,0,0,0 +HEREINAFTER,0,0,0,2009,0,0,0 +HEREON,0,0,0,2009,0,0,0 +HEREUNTO,0,0,0,2009,0,0,0 +HIDDEN,0,0,2009,0,0,0,0 +HINDERING,2009,0,0,0,0,0,0 +HINGES,0,0,2009,0,0,0,0 +WHEREABOUTS,0,0,0,2009,0,0,0 +WHEREFORE,0,0,0,2009,0,0,0 +WHERETO,0,0,0,2009,0,0,0 +WHISTLEBLOWERS,0,0,0,2011,0,0,0 +WILFUL,0,0,0,2009,0,0,0 +WILLFULNESS,0,0,0,2009,0,0,0 +WINNING,0,2009,0,0,0,0,0 +FLUCTUATE,0,0,2009,0,0,0,0 +FLUCTUATION,0,0,2009,0,0,0,0 +FORBEARANCE,0,0,0,2009,0,0,0 +FORBID,2009,0,0,0,0,0,2009 +FORCE,-2020,0,0,0,0,0,0 +FOREBEARANCE,0,0,0,2011,0,0,0 +FORECLOSES,2009,0,0,0,0,0,0 +FOREGO,2009,0,0,0,0,0,0 +FORESTALLED,2009,0,0,0,0,0,0 +FORFEITABILITY,0,0,0,2011,0,0,0 +FORFEITS,2009,0,0,0,0,0,0 +FORGERY,2009,0,0,0,0,0,0 +FRAUDS,2009,0,0,0,0,0,0 +FRIENDLY,0,2009,0,0,0,0,0 +FRUSTRATED,2009,0,0,0,0,0,0 +FRUSTRATION,2009,0,0,0,0,0,0 +FURTHERANCE,0,0,0,2009,0,0,0 +GAINS,0,2009,0,0,0,0,0 +DISGORGEMENTS,2009,0,0,0,0,0,0 +DISGRACEFUL,2009,0,0,0,0,0,0 +LITIGATE,2009,0,0,2009,0,0,0 +LITIGATION,2009,0,0,2009,0,0,0 +LITIGIOUS,0,0,0,2009,0,0,0 +LACKED,2009,0,0,0,0,0,0 +LAG,2009,0,0,0,0,0,0 +LAPSE,2009,0,0,0,0,0,0 +LATE,-2020,0,0,0,0,0,0 +LAWFULLY,0,0,0,2009,0,0,0 +LAWS,0,0,0,2009,0,0,0 +LAWYERS,0,0,0,2009,0,0,0 +LEADING,0,2009,0,0,0,0,0 +LEGALIZATION,0,0,0,2009,0,0,0 +LEGALIZES,0,0,0,2009,0,0,0 +LEGATEE,0,0,0,2009,0,0,0 +FLAWED,2009,0,0,0,0,0,0 +NONRECOVERABLE,2009,0,0,0,0,0,0 +LIQUIDATES,2009,0,0,0,0,0,0 +LIQUIDATOR,2009,0,0,0,0,0,0 +BENEFICIATION,0,0,0,2011,0,0,0 +BENEFITTED,0,2009,0,0,0,0,0 +POOR,2009,0,0,0,0,0,0 +REINTERPRETATION,0,0,2009,0,0,0,0 +REINTERPRETS,0,0,2009,0,0,0,0 +REJECTION,2009,0,0,0,0,0,0 +RELINQUISH,2009,0,0,0,0,0,0 +RELINQUISHMENT,2009,0,0,0,0,0,0 +REMAND,0,0,0,2009,0,0,0 +REMEDIATE,0,0,0,2009,0,0,0 +REMEDIATIONS,0,0,0,2009,0,0,0 +RENEGOTIATED,2009,0,0,0,0,0,0 +RENEGOTIATIONS,2009,0,0,0,0,0,0 +RENOUNCEMENTS,2009,0,0,0,0,0,0 +REPARATIONS,2009,0,0,0,0,0,0 +REPOSSESSES,2009,0,0,0,0,0,0 +REPRORATED,0,0,0,2018,0,0,0 +TROUBLED,2009,0,0,0,0,0,0 +UNABLE,2009,0,0,0,0,0,0 +UNAMBIGUOUSLY,0,0,0,0,2009,0,0 +UNAPPEALED,0,0,0,2011,0,0,0 +UNAVAILABILITY,2009,0,0,0,0,0,2011 +UNAWARE,2009,0,0,0,0,0,0 +UNCERTAINTY,0,0,2009,0,0,0,0 +UNCOLLECTIBILITY,2009,0,0,0,0,0,0 +UNCOMPLETED,2009,0,0,0,0,0,0 +UNCONSCIONABLY,2009,0,0,0,0,0,0 +UNCONTRACTED,0,0,0,2011,0,0,0 +UNCORRECTED,2009,0,0,0,0,0,0 +UNCOVERS,2009,0,0,0,0,0,0 +UNDELIVERABLE,2009,0,0,0,0,0,0 +UNDERCUTS,2009,0,0,0,0,0,0 +UNDERESTIMATES,2009,0,0,0,0,0,0 +UNDERINSURED,2009,0,0,0,0,0,0 +UNDERMINING,2009,0,0,0,0,0,0 +UNDERPAYS,2009,0,0,0,0,0,0 +UNDERPERFORMING,2009,0,0,0,0,0,0 +UNDERREPORTING,2011,0,0,0,0,0,0 +UNDERSTATEMENTS,2009,0,0,0,0,0,0 +UNDERUTILIZED,2009,0,0,0,0,0,0 +UNDETECTABLE,0,0,2009,0,0,0,0 +UNDISCHARGED,0,0,0,2009,0,0,0 +UNDOUBTEDLY,0,0,0,0,2009,0,0 +UNECONOMICAL,2009,0,0,0,0,0,0 +UNENCUMBER,0,0,0,2014,0,0,0 +UNEQUIVOCAL,0,0,0,0,2009,0,0 +UNEXCUSED,2009,0,0,0,0,0,0 +UNFAIRLY,2009,0,0,0,0,0,0 +UNFAVORABLE,2009,0,0,0,0,0,0 +UNFIT,2009,0,0,0,0,0,0 +UNFORESEEN,2009,0,0,0,0,0,0 +UNFOUNDED,2009,0,0,0,0,0,0 +UNGUARANTEED,0,0,2009,0,0,0,0 +UNINSURED,2009,0,0,0,0,0,0 +UNJUST,2009,0,0,0,0,0,0 +UNJUSTLY,2009,0,0,0,0,0,0 +UNKNOWNS,0,0,2009,0,0,0,0 +UNLICENSED,2009,0,0,0,0,0,0 +UNMERCHANTABLE,2011,0,0,0,0,0,0 +UNNEEDED,2009,0,0,0,0,0,0 +UNPAID,2009,0,0,0,0,0,0 +UNPOPULAR,2009,0,0,0,0,0,0 +UNPREDICTED,2011,0,2011,0,0,0,0 +UNPROVED,0,0,2009,0,0,0,0 +UNQUANTIFIED,0,0,2011,0,0,0,0 +UNREASONABLY,2009,0,0,0,0,0,0 +UNRECOVERED,2009,0,0,0,0,0,0 +UNREMEDIED,2009,0,0,0,0,0,0 +UNSAFE,2009,0,0,0,0,0,0 +UNSATISFIED,2009,0,0,0,0,0,0 +UNSEASONABLY,0,0,2009,0,0,0,0 +UNSOUND,2009,0,0,0,0,0,0 +UNSTABLE,2009,0,0,0,0,0,0 +UNSUCCESSFULLY,2009,0,0,0,0,0,0 +UNSUITED,2009,0,0,0,0,0,0 +UNSUSPECTING,2009,0,0,0,0,0,0 +UNTIMELY,2009,0,0,0,0,0,0 +UNTRUTHFUL,2009,0,0,0,0,0,0 +UNUSABLE,2009,0,0,0,0,0,0 +UNWARRANTED,2009,0,0,0,0,0,0 +UNWRITTEN,0,0,2009,0,0,0,0 +URGENCY,2009,0,0,0,0,0,0 +USURPATION,0,0,0,2009,0,0,0 +USURY,2009,0,0,2009,0,0,0 +VAGUENESS,0,0,2012,0,0,0,0 +VALUABLE,0,2009,0,0,0,0,0 +PLEAD,2009,0,0,0,0,0,0 +PLEADS,2009,0,0,2009,0,0,0 +PLEASED,0,2009,0,0,0,0,0 +PLEDGED,0,0,0,0,0,0,2009 +PLEDGING,0,0,0,0,0,0,2009 +COMPEL,0,0,0,0,0,0,2011 +COMPENSATORY,0,0,0,2009,0,0,0 +COMPLAINED,2009,0,0,0,0,0,0 +COMPLAINTS,2009,0,0,0,0,0,0 +COMMITMENT,0,0,0,0,0,0,2009 +COMMITTING,0,0,0,0,0,0,2009 +LIMITATION,2009,0,0,0,0,0,0 +LINGERING,2009,0,0,0,0,0,0 +RESTRAINING,0,0,0,0,0,0,2009 +RESTRICT,0,0,0,0,0,0,2009 +RESTRICTIONS,0,0,0,0,0,0,2009 +RESTRICTS,0,0,0,0,0,0,2009 +RESTRUCTURING,2009,0,0,0,0,0,0 +RETALIATES,2009,0,0,0,0,0,0 +RETALIATORY,2009,0,0,0,0,0,0 +PRECAUTIONS,0,0,2009,0,0,0,0 +PRECLUDE,2009,0,0,0,0,0,2009 +PRECONDITION,0,0,0,0,0,0,2009 +PREDECEASED,0,0,0,2009,0,0,0 +PREDICTABILITY,0,0,2009,0,0,0,0 +PREDICTIONS,0,0,2009,0,0,0,0 +PREDICTS,0,0,2009,0,0,0,0 +PREJUDICE,2009,0,0,2009,0,0,0 +PREJUDICING,2009,0,0,2009,0,0,0 +PREMATURELY,2009,0,0,0,0,0,0 +PRESET,0,0,0,0,0,0,2009 +PRESUMABLY,0,0,2009,0,0,0,0 +PRESUMING,0,0,2009,0,0,0,0 +PRETRIAL,2009,0,0,2009,0,0,0 +PREVENTION,2009,0,0,0,0,0,0 +PROACTIVE,0,2009,0,0,0,0,0 +PROBABILITY,0,0,2009,0,0,0,0 +PROBATED,0,0,0,2009,0,0,0 +PROBATIONAL,0,0,0,2009,0,0,0 +PROBATIONS,0,0,0,2009,0,0,0 +PROBLEMS,2009,0,0,0,0,0,0 +PROFITABILITY,0,2009,0,0,0,0,0 +PROGRESSED,0,2009,0,0,0,0,0 +PROHIBITED,0,0,0,0,0,0,2009 +PROHIBITIVE,0,0,0,0,0,0,2009 +PROLONG,2009,0,0,0,0,0,0 +PROLONGING,2009,0,0,0,0,0,0 +PROMULGATES,0,0,0,2009,0,0,0 +PROMULGATOR,0,0,0,2009,0,0,0 +PRORATION,0,0,0,2009,0,0,0 +PROSECUTING,2009,0,0,2009,0,0,0 +PROSECUTORIAL,0,0,0,2011,0,0,0 +PROSPERITY,0,2009,0,0,0,0,0 +PROTESTED,2009,0,0,0,0,0,0 +PROTESTOR,2009,0,0,0,0,0,0 +PROTRACTION,2009,0,0,0,0,0,0 +PROVOKE,2009,0,0,0,0,0,0 +PUNISHABLE,0,0,0,2009,0,0,0 +PUNISHMENT,2009,0,0,0,0,0,0 +PURPORTED,2009,0,0,0,0,0,0 +QUESTION,2009,0,0,0,0,0,0 +QUESTIONING,2009,0,0,0,0,0,0 +QUITCLAIMS,0,0,0,2009,0,0,0 +RANDOM,0,0,2009,0,0,0,0 +RANDOMIZING,0,0,2009,0,0,0,0 +RATABLE,0,0,0,2009,0,0,0 +RATIONALIZE,2009,0,0,0,0,0,0 +ABANDONED,2009,0,0,0,0,0,0 +ABANDONS,2009,0,0,0,0,0,0 +ABDICATION,2009,0,0,0,0,0,0 +ABERRATIONAL,2009,0,0,0,0,0,0 +ABEYANCES,0,0,2009,0,0,0,0 +ABNORMAL,2009,0,0,0,0,0,0 +ABOLISH,2009,0,0,0,0,0,0 +ABOVEMENTIONED,0,0,0,2011,0,0,0 +ABROGATING,2009,0,0,2009,0,0,0 +ABRUPTLY,2009,0,0,0,0,0,0 +ABSENTEEISM,2009,0,0,0,0,0,0 +ABSOLVING,0,0,0,2009,0,0,0 +ABUSED,2009,0,0,0,0,0,0 +ABUSIVELY,2009,0,0,0,0,0,0 +ACCIDENT,2009,0,0,0,0,0,0 +ACCLAIMED,0,2009,0,0,0,0,0 +ACCOMPLISHING,0,2009,0,0,0,0,0 +ACCUSATIONS,2009,0,0,0,0,0,0 +ACCUSING,2009,0,0,0,0,0,0 +ACHIEVEMENTS,0,2009,0,0,0,0,0 +ACQUIESCED,2009,0,0,0,0,0,0 +ACQUIRORS,0,0,0,2011,0,0,0 +ACQUITTALS,2009,0,0,2009,0,0,0 +ACQUITTING,2009,0,0,2009,0,0,0 +ADJOURNED,0,0,0,2009,0,0,0 +ADJOURNS,0,0,0,2009,0,0,0 +ADJUDGING,0,0,0,2009,0,0,0 +ADJUDICATING,0,0,0,2009,0,0,0 +ADJUDICATOR,0,0,0,2009,0,0,0 +ADMISSIBLE,0,0,0,2009,0,0,0 +ADULTERATE,2009,0,0,0,0,0,0 +ADULTERATIONS,2009,0,0,0,0,0,0 +ADVANCING,0,2009,0,0,0,0,0 +ADVANTAGEOUSLY,0,2009,0,0,0,0,0 +ADVERSARY,2009,0,0,0,0,0,0 +ADVERSITY,2009,0,0,0,0,0,0 +AFFREIGHTMENT,0,0,0,2012,0,0,0 +AFORESTATED,0,0,0,2011,0,0,0 +AGGRAVATE,2009,0,0,0,0,0,0 +AGGRAVATION,2009,0,0,0,0,0,0 +ALERTING,2009,0,0,0,0,0,0 +ALIENATING,2009,0,0,0,0,0,0 +ALLEGATIONS,2009,0,0,2009,0,0,0 +ALLEGES,2009,0,0,2009,0,0,0 +ALMOST,0,0,2009,0,0,2009,0 +AMBIGUITIES,0,0,2009,0,0,0,0 +AMENDABLE,0,0,0,2009,0,0,0 +AMENDMENT,0,0,0,2009,0,0,0 +ANNOYANCE,2009,0,0,0,0,0,0 +ANNOYS,2009,0,0,0,0,0,0 +ANNULMENT,2009,0,0,0,0,0,0 +ANOMALOUS,2009,0,2009,0,0,0,0 +ANTECEDENTS,0,0,0,2009,0,0,0 +ANTICIPATING,0,0,2009,0,0,0,0 +ANTICORRUPTION,0,0,0,2014,0,0,0 +APPARENTLY,0,0,2009,0,0,2009,0 +APPEALING,0,0,0,2009,0,0,0 +APPEARING,0,0,2009,0,0,2009,0 +APPELLATE,0,0,0,2009,0,0,0 +APPROXIMATED,0,0,2009,0,0,0,0 +APPROXIMATION,0,0,2009,0,0,0,0 +APPURTENANT,0,0,0,2009,0,0,0 +ARBITRARINESS,0,0,2009,0,0,0,0 +ARBITRATES,0,0,0,2009,0,0,0 +ARBITRATIONS,0,0,0,2009,0,0,0 +ARGUE,2009,0,0,0,0,0,0 +ARGUMENTATIVE,2009,0,0,0,0,0,0 +ARREARS,2009,0,0,0,0,0,0 +ARTIFICIALLY,2009,0,0,0,0,0,0 +RETRIBUTION,2009,0,0,0,0,0,0 +RETROCESSIONAIRES,0,0,0,2011,0,0,0 +BOLSTERS,0,2009,0,0,0,0,0 +BOOMING,0,2009,0,0,0,0,0 +BOTTLENECKS,2009,0,0,0,0,0,0 +BOYCOTTED,2009,0,0,0,0,0,0 +BREACHED,2009,0,0,2009,0,0,0 +BREAKAGE,2009,0,0,0,0,0,0 +BREAKING,-2020,0,0,0,0,0,0 +BRIBE,2009,0,0,0,0,0,0 +BRIBES,2009,0,0,0,0,0,0 +BROKEN,-2020,0,0,0,0,0,0 +BURDENS,2009,0,0,0,0,0,0 +CALAMITOUS,2009,0,0,0,0,0,0 +CANCELING,2009,0,0,0,0,0,0 +CANCELLING,2009,0,0,0,0,0,0 +CARELESSNESS,2009,0,0,0,0,0,0 +CATASTROPHIC,2009,0,0,0,0,0,0 +CAUTIONED,2009,0,0,0,0,0,0 +CAUTIOUSLY,0,0,2009,0,0,0,0 +CEASES,2009,0,0,0,0,0,0 +CENSURE,2009,0,0,0,0,0,0 +CERTIORARI,0,0,0,2011,0,0,0 +CHALLENGES,2009,0,0,0,0,0,0 +CHATTEL,0,0,0,2009,0,0,0 +CIRCUMVENTED,2009,0,0,0,0,0,0 +CIRCUMVENTS,2009,0,0,0,0,0,0 +SHALL,0,0,0,2009,0,0,0 +SHORTAGES,2009,0,0,0,0,0,0 +SHRINKAGES,2009,0,0,0,0,0,0 +SHUTS,2009,0,0,0,0,0,0 +SLANDEROUS,2009,0,0,0,0,0,0 +REPUDIATING,2009,0,0,0,0,0,0 +REQUESTOR,0,0,0,2011,0,0,0 +REQUIREMENTS,0,0,0,0,0,0,2009 +RESCIND,0,0,0,2009,0,0,0 +RESCISSION,0,0,0,2009,0,0,0 +RESIGNATIONS,2009,0,0,0,0,0,0 +RESOLVE,0,2009,0,0,0,0,0 +RESTATEMENTS,2009,0,0,0,0,0,0 +NOTARIES,0,0,0,2009,0,0,0 +NOTARIZED,0,0,0,2009,0,0,0 +NOVO,0,0,0,2011,0,0,0 +NULLIFICATIONS,2009,0,0,2009,0,0,0 +NULLIFYING,2009,0,0,2009,0,0,0 +OBJECTING,2009,0,0,0,0,0,0 +OBJECTIONS,2009,0,0,0,0,0,0 +OBLIGATING,0,0,0,0,0,0,2009 +OBLIGE,0,0,0,0,0,0,2009 +OBLIGES,0,0,0,0,0,0,2009 +OBSCENITY,2009,0,0,0,0,0,0 +OBSTACLES,2009,0,0,0,0,0,0 +OBSTRUCTION,2009,0,0,0,0,0,0 +OFFENCES,2009,0,0,0,0,0,0 +OFFENDERS,2009,0,0,0,0,0,0 +OFFEREE,0,0,0,2009,0,0,0 +OMISSION,2009,0,0,0,0,0,0 +OMITTED,2009,0,0,0,0,0,0 +OPPORTUNISTICALLY,2009,0,0,0,0,0,0 +OPPOSED,2009,0,0,0,0,0,0 +OPPOSITIONS,2009,0,0,0,0,0,0 +ORDINARILY,0,0,2009,0,0,0,0 +OUTMODED,2009,0,0,0,0,0,0 +OUTPERFORMS,0,2009,0,0,0,0,0 +OVERBUILDING,2009,0,0,0,0,0,0 +OVERBURDENED,2009,0,0,0,0,0,0 +OVERCHARGE,2009,0,0,0,0,0,0 +OVERCOME,2009,0,0,0,0,0,0 +OVERESTIMATE,2009,0,0,0,0,0,0 +OVERESTIMATION,2009,0,0,0,0,0,0 +OVERLOADING,2009,0,0,0,0,0,0 +OVERLOOKING,2009,0,0,0,0,0,0 +OVERPAYMENTS,2009,0,0,0,0,0,0 +OVERPRODUCTION,2009,0,0,0,0,0,0 +OVERRULING,0,0,0,2009,0,0,0 +OVERSHADOW,2009,0,0,0,0,0,0 +OVERSTATE,2009,0,0,0,0,0,0 +OVERSTATES,2009,0,0,0,0,0,0 +OVERSUPPLY,2009,0,0,0,0,0,0 +OVERTURNED,2009,0,0,0,0,0,0 +OVERVALUED,2009,0,0,0,0,0,0 +PARA,0,0,0,-2020,0,0,0 +NECESSITATED,0,0,0,0,0,0,2009 +NEGATIVELY,2009,0,0,0,0,0,0 +NEGLECTFUL,2009,0,0,0,0,0,0 +NEGLIGENCES,2009,0,0,0,0,0,0 +NOLO,0,0,0,2011,0,0,0 +BEAUTIFUL,0,2009,0,0,0,0,0 +BELIEVES,0,0,2009,0,0,0,0 +IDEAL,0,2009,0,0,0,0,0 +IGNORE,2009,0,0,0,0,0,0 +ILL,2009,0,0,0,0,0,0 +ILLEGALLY,2009,0,0,0,0,0,0 +ILLIQUID,2009,0,0,0,0,0,0 +IMMATERIALITY,0,0,0,2009,0,0,0 +IMPAIRED,2009,0,0,0,0,0,2011 +IMPAIRS,2009,0,0,0,0,0,2011 +IMPEDED,2009,0,0,0,0,0,0 +IMPEDING,2009,0,0,0,0,0,0 +IMPERFECTIONS,2009,0,0,0,0,0,0 +IMPLICATE,2009,0,0,0,0,0,0 +IMPOSE,0,0,0,0,0,0,2009 +IMPOSITION,0,0,0,0,0,0,2009 +IMPOUND,2009,0,0,0,0,0,0 +IMPRACTICABLE,2009,0,0,0,0,0,0 +IMPRECISE,0,0,2009,0,0,0,0 +IMPRESSED,0,2009,0,0,0,0,0 +IMPRESSIVELY,0,2009,0,0,0,0,0 +IMPROPER,2009,0,0,0,0,0,0 +IMPROVE,0,2009,0,0,0,0,0 +IMPROVES,0,2009,0,0,0,0,0 +INABILITY,2009,0,0,0,0,0,0 +INACCURATE,2009,0,0,0,0,0,0 +INACTIVATE,2009,0,0,0,0,0,0 +INACTIVATION,2009,0,0,0,0,0,0 +INADEQUACY,2009,0,0,0,0,0,0 +INADVERTENTLY,2009,0,0,0,0,0,0 +INAPPROPRIATELY,2009,0,0,0,0,0,0 +INCAPACITATED,2009,0,0,0,0,0,0 +INCARCERATES,2009,0,0,2009,0,0,0 +INCHOATE,0,0,0,2009,0,0,0 +INCIDENTS,2009,0,0,0,0,0,0 +INCOMPETENCE,2009,0,0,0,0,0,0 +INCOMPETENTS,2009,0,0,0,0,0,0 +INCONCLUSIVE,2009,0,0,0,0,0,0 +INCONSISTENTLY,2009,0,0,0,0,0,0 +INCONVENIENCES,2009,0,0,0,0,0,0 +INCORRECTNESS,2009,0,0,0,0,0,0 +INDECENCY,2009,0,0,0,0,0,0 +INDEFINITE,0,0,2009,0,0,0,0 +INDEMNIFICATION,0,0,0,2009,0,0,0 +INDEMNIFY,0,0,0,2009,0,0,0 +INDEMNITIES,0,0,0,2009,0,0,0 +INDETERMINABLE,0,0,2009,0,0,0,0 +INDICTED,2009,0,0,2009,0,0,0 +INDORSEES,0,0,0,2011,0,0,0 +INEFFICIENCIES,2009,0,0,0,0,0,0 +INELIGIBILITY,2009,0,0,0,0,0,0 +INEQUITIES,2009,0,0,0,0,0,0 +INEXACTNESS,0,0,2009,0,0,0,0 +INFLICTED,2009,0,0,0,0,0,0 +INFRACTION,2009,0,0,2009,0,0,0 +INFRINGEMENT,2009,0,0,0,0,0,0 +INFRINGING,2009,0,0,0,0,0,0 +INHIBITING,0,0,0,0,0,0,2011 +INJUNCTIONS,2009,0,0,2009,0,0,0 +INJURES,2009,0,0,0,0,0,0 +INJURY,2009,0,0,0,0,0,0 +INNOVATING,0,2009,0,0,0,0,0 +INNOVATIVENESS,0,2011,0,0,0,0,0 +INORDINATELY,2009,0,0,0,0,0,0 +INSIGHTFUL,0,2009,0,0,0,0,0 +INSISTING,0,0,0,0,0,0,2009 +INSOLVENCY,2009,0,0,0,0,0,0 +INSTABILITIES,0,0,2009,0,0,0,0 +INSUFFICIENT,2009,0,0,0,0,0,0 +INTANGIBLE,0,0,2009,0,0,0,0 +INTERFERE,2009,0,0,0,0,0,0 +INTERFERES,2009,0,0,0,0,0,0 +INTERMITTENTLY,2009,0,0,0,0,0,0 +INTERPOSES,0,0,0,2009,0,0,0 +INTERROGATE,0,0,0,2009,0,0,0 +INTERROGATION,0,0,0,2009,0,0,0 +INTERROGATORS,0,0,0,2009,0,0,0 +INTERRUPTING,2009,0,0,0,0,0,0 +INTESTACY,0,0,0,2009,0,0,0 +STABILIZATION,0,2009,0,0,0,0,0 +STABILIZES,0,2009,0,0,0,0,0 +STAGNANT,2009,0,0,0,0,0,0 +STAGNATING,2009,0,0,0,0,0,0 +STATUTE,0,0,0,2009,0,0,0 +STIPULATE,0,0,0,0,0,0,2009 +STIPULATION,0,0,0,0,0,0,2009 +STOPPAGES,2009,0,0,0,0,0,0 +STRAIN,2009,0,0,0,0,0,0 +STRENGTH,0,2009,0,0,0,0,0 +STRENGTHENS,0,2009,0,0,0,0,0 +STRESSES,2009,0,0,0,0,0,0 +STRICTER,0,0,0,0,0,0,2009 +STRONG,0,2009,0,0,0,0,0 +SUBCLAUSE,0,0,0,2009,0,0,0 +SUBJECTING,2009,0,0,0,0,0,0 +SUBLESSORS,0,0,0,2011,0,0,0 +SUBPARAGRAPHS,0,0,0,2009,0,0,0 +SUBROGATED,0,0,0,2009,0,0,0 +SUBTRUSTS,0,0,0,2011,0,0,0 +SUCCEEDS,0,2009,0,0,0,0,0 +SUCCESSFULLY,0,2009,0,0,0,0,0 +SUED,2009,0,0,2009,0,0,0 +SUFFERING,2009,0,0,0,0,0,0 +SUGGESTING,0,0,2009,0,0,0,0 +SUMMONING,2009,0,0,2009,0,0,0 +SUPERSEDE,0,0,0,2009,0,0,0 +SUPERSEDING,0,0,0,2009,0,0,0 +SURPASSED,0,2009,0,0,0,0,0 +SUSCEPTIBLE,2009,0,0,0,0,0,0 +SUSPEND,2009,0,0,0,0,0,0 +SUSPENSION,2009,0,0,0,0,0,0 +SUSPICIOUS,2009,0,0,0,0,0,0 +REVOCATION,2009,0,0,2009,0,0,0 +REVOKES,2009,0,0,0,0,0,0 +REVOLUTIONIZES,0,2009,0,0,0,0,0 +REWARDING,0,2009,0,0,0,0,0 +RIDICULES,2009,0,0,0,0,0,0 +RISKIER,2009,0,2009,0,0,0,0 +RISKS,0,0,2009,0,0,0,0 +RULINGS,0,0,0,2009,0,0,0 +SACRIFICED,2009,0,0,0,0,0,0 +SATISFACTION,0,2009,0,0,0,0,0 +SATISFIES,0,2009,0,0,0,0,0 +SCANDALS,2009,0,0,0,0,0,0 +SCRUTINIZING,2009,0,0,0,0,0,0 +SEIZE,2009,0,0,0,0,0,0 +SELDOM,0,0,2009,0,0,2009,0 +SEQUESTRATOR,0,0,0,2009,0,0,0 +SETBACK,2009,0,0,0,0,0,0 +SEVER,2009,0,0,0,0,0,0 +SEVERANCE,0,0,0,2009,0,0,0 +SEVERELY,2009,0,0,0,0,0,0 +ENTRENCH,0,0,0,0,0,0,2009 +ERODES,2009,0,0,0,0,0,0 +ERRATICALLY,2009,0,0,0,0,0,0 +ERRONEOUSLY,2009,0,0,0,0,0,0 +ESCALATE,2009,0,0,0,0,0,0 +ESCHEAT,0,0,0,2011,0,0,0 +ESCROWED,0,0,0,0,0,0,2009 +EVADE,2009,0,0,0,0,0,0 +EVASION,2009,0,0,0,0,0,0 +EVICTED,2009,0,0,0,0,0,0 +EVICTS,2009,0,0,0,0,0,0 +EXACERBATED,2009,0,0,0,0,0,0 +EXACERBATIONS,2009,0,0,0,0,0,0 +EXAGGERATING,2009,0,0,0,0,0,0 +EXCEEDENCES,0,0,0,2011,0,0,0 +EXCELS,0,2009,0,0,0,0,0 +EXCESSIVELY,2009,0,0,0,0,0,0 +EXCITING,0,2009,0,0,0,0,0 +EXCLUSIVES,0,2009,0,0,0,0,0 +EXCULPATES,2009,0,0,2009,0,0,0 +EXCULPATORY,2009,0,0,2009,0,0,0 +EXECUTRICES,0,0,0,2009,0,0,0 +EXONERATE,2009,0,0,0,0,0,0 +EXONERATION,2009,0,0,0,0,0,0 +EXPLOITATIONS,2009,0,0,0,0,0,0 +EXPLOITS,2009,0,0,0,0,0,0 +EXPOSING,2009,0,0,0,0,0,0 +EXPROPRIATED,2009,0,0,0,0,0,0 +EXPROPRIATIONS,2009,0,0,0,0,0,0 +EXTRACONTRACTUAL,0,0,0,2011,0,0,0 +SOLVENCIES,2009,0,0,0,0,0,0 +SOMETIME,0,0,2009,0,0,0,0 +SPAM,2014,0,0,0,0,0,0 +TRAUMATIC,2009,0,0,0,0,0,0 +LOSES,2009,0,0,0,0,0,0 +LOST,2009,0,0,0,0,0,0 +LYING,2009,0,0,0,0,0,0 +MALFUNCTIONED,2009,0,0,0,0,0,0 +MALICIOUS,2009,0,0,0,0,0,0 +MANDATE,0,0,0,0,0,0,2009 +MANDATORY,0,0,0,0,0,0,2009 +MANIPULATES,2009,0,0,0,0,0,0 +MANIPULATIVE,2009,0,0,0,0,0,0 +MAYBE,0,0,2009,0,0,2009,0 +MEDIATING,0,0,0,2009,0,0,0 +MEDIATORS,0,0,0,2009,0,0,0 +MISAPPLICATIONS,2009,0,0,0,0,0,0 +MISAPPLYING,2009,0,0,0,0,0,0 +MISAPPROPRIATING,2009,0,0,0,0,0,0 +MISCALCULATE,2009,0,0,0,0,0,0 +MISCALCULATION,2009,0,0,0,0,0,0 +MISCLASSIFICATION,2011,0,0,0,0,0,0 +MISCOMMUNICATION,2014,0,0,0,0,0,0 +MISDEMEANORS,2009,0,0,0,0,0,0 +MISHANDLED,2009,0,0,0,0,0,0 +MISINFORMATION,2009,0,0,0,0,0,0 +MISINTERPRET,2009,0,0,0,0,0,0 +MISINTERPRETING,2009,0,0,0,0,0,0 +MISJUDGES,2009,0,0,0,0,0,0 +MISLABEL,2009,0,0,0,0,0,0 +MISLABELS,2009,0,0,0,0,0,0 +MISLEADS,2009,0,0,0,0,0,0 +MISMANAGEMENT,2009,0,0,0,0,0,0 +MISMATCHED,2009,0,0,0,0,0,0 +MISPRICE,2014,0,0,0,0,0,0 +MISREPRESENTATION,2009,0,0,0,0,0,0 +MISREPRESENTS,2009,0,0,0,0,0,0 +WORRYING,2009,0,0,0,0,0,0 +WORSENING,2009,0,0,0,0,0,0 +WORTHY,0,2009,0,0,0,0,0 +TOLERATED,2009,0,0,0,0,0,0 +TORT,0,0,0,2009,0,0,0 +TORTUOUS,2009,0,0,0,0,0,0 +FIDE,0,0,0,2009,0,0,0 +FIRING,2009,0,0,0,0,0,0 +NONBREACHING,0,0,0,2011,0,0,0 +NONCOMPLIANCE,2009,0,0,0,0,0,0 +NONCONFORMING,2009,0,0,0,0,0,0 +NONCONTRACT,0,0,0,2012,0,0,0 +NONFEASANCE,0,0,0,2011,0,0,0 +NONFORFEITURE,0,0,0,2011,0,0,0 +DISCLAIMED,2009,0,0,0,0,0,0 +DISCLAIMS,2009,0,0,0,0,0,0 +DISCLOSING,2009,0,0,0,0,0,0 +DISCONTINUATIONS,2009,0,0,0,0,0,0 +DISCONTINUING,2009,0,0,0,0,0,0 +DISCOURAGING,2009,0,0,0,0,0,0 +DISCREDITS,2009,0,0,0,0,0,0 +SPECTACULARLY,0,2009,0,0,0,0,0 +SPECULATING,0,0,2009,0,0,0,0 +SPECULATIVELY,0,0,2009,0,0,0,0 +TRAGEDY,2009,0,0,0,0,0,0 +TRANSFERORS,0,0,0,2012,0,0,0 +LEGISLATING,0,0,0,2009,0,0,0 +LEGISLATIVELY,0,0,0,2009,0,0,0 +LEGISLATURES,0,0,0,2009,0,0,0 +LIBELS,0,0,0,2009,0,0,0 +CONCEALED,2009,0,0,0,0,0,0 +CONCEDES,2009,0,0,0,0,0,0 +CONCERN,2009,0,0,0,0,0,0 +CONCILIATION,2009,0,0,0,0,0,0 +CONDEMN,2009,0,0,0,0,0,0 +CONDEMNING,2009,0,0,0,0,0,0 +CONDITIONALLY,0,0,2009,0,0,0,0 +CONFESS,2009,0,0,0,0,0,0 +CONFESSION,2009,0,0,0,0,0,0 +CONFINEMENT,2009,0,0,0,0,0,2009 +CONFISCATE,2009,0,0,0,0,0,0 +CONFISCATION,2009,0,0,0,0,0,0 +CONFLICTED,2009,0,0,0,0,0,0 +CONFRONTATION,2009,0,0,0,0,0,0 +CONFRONTING,2009,0,0,0,0,0,0 +CONFUSES,2009,0,2009,0,0,0,0 +CONSENT,0,0,0,2009,0,0,0 +CONSERVATORSHIPS,0,0,0,2011,0,0,0 +CONSPIRATORIAL,2009,0,0,0,0,0,0 +CONSPIRES,2009,0,0,0,0,0,0 +CONSTITUTIONALITY,0,0,0,2009,0,0,0 +CONSTRAIN,0,0,0,0,0,0,2009 +CONSTRAINT,0,0,0,0,0,0,2009 +CONSTRUE,0,0,0,2012,0,0,0 +CONTEMPT,2009,0,0,0,0,0,0 +CONTENDS,2009,0,0,0,0,0,0 +CONTENTIOUSLY,2009,0,0,0,0,0,0 +CONTESTING,2009,0,0,0,0,0,0 +CONTINGENTLY,0,0,2009,0,0,0,0 +CONTRACTHOLDER,0,0,0,2009,0,0,0 +CONTRACTING,0,0,0,2009,0,0,0 +CONTRACTUAL,0,0,0,2009,0,0,0 +CONTRADICTING,2009,0,0,0,0,0,0 +CONTRADICTS,2009,0,0,0,0,0,0 +CONTRAVENES,0,0,0,2009,0,0,0 +CONTROVERSIAL,2009,0,0,0,0,0,0 +CONTROVERTED,0,0,0,2009,0,0,0 +CONVEYANCES,0,0,0,2009,0,0,0 +CONVICTION,2009,0,0,2009,0,0,0 +CORRECTION,2009,0,0,0,0,0,0 +CORRUPTED,2009,0,0,0,0,0,0 +CORRUPTLY,2009,0,0,0,0,0,0 +COULD,0,0,2009,0,0,2009,0 +COUNSELS,0,0,0,2009,0,0,0 +COUNTERCLAIMS,2009,0,0,0,0,0,0 +COUNTERFEITERS,2009,0,0,0,0,0,0 +COUNTERMEASURES,2009,0,0,0,0,0,0 +COUNTERSUITS,0,0,0,2014,0,0,0 +COURTS,0,0,0,2009,0,0,0 +COVENANTS,0,0,0,0,0,0,2011 +CREATIVITY,0,2009,0,0,0,0,0 +CRIMINALITY,0,0,0,2009,0,0,0 +CRIMINALS,2009,0,0,2009,0,0,0 +CRITICALLY,2009,0,0,0,0,0,0 +CRITICIZED,2009,0,0,0,0,0,0 +CROSSCLAIMS,0,0,0,2011,0,0,0 +CRUCIALLY,2009,0,0,0,0,0,0 +CUMBERSOME,2009,0,0,0,0,0,0 +CURTAILMENT,2009,0,0,0,0,0,0 +CUTBACK,2009,0,0,0,0,0,0 +CYBERBULLYING,2014,0,0,0,0,0,0 +CYBERCRIMINALS,2014,0,0,0,0,0,0 +TAINTED,2009,0,0,0,0,0,0 +TENANTABILITY,0,0,0,2011,0,0,0 +TENTATIVELY,0,0,2009,0,0,0,0 +TERMINATES,2009,0,0,0,0,0,0 +TERMINUS,0,0,0,-2020,0,0,0 +TESTIMONY,0,0,0,2009,0,0,0 +THEREAFTER,0,0,0,2009,0,0,0 +THEREINAFTER,0,0,0,2011,0,0,0 +THERETO,0,0,0,2009,0,0,0 +THEREUNTO,0,0,0,2009,0,0,0 +THREATEN,2009,0,0,0,0,0,0 +THREATS,2009,0,0,0,0,0,0 +FAIL,2009,0,0,0,0,0,0 +FAILS,2009,0,0,0,0,0,0 +FALSE,2009,0,0,0,0,0,0 +FALSIFIED,2009,0,0,0,0,0,0 +FALSITY,2009,0,0,0,0,0,0 +FATALLY,2009,0,0,0,0,0,0 +FAULTY,2009,0,0,0,0,0,0 +FAVORING,0,2009,0,0,0,0,0 +FEARS,2009,0,0,0,0,0,0 +DAMAGE,2009,0,0,0,0,0,0 +DAMPEN,2009,0,0,0,0,0,0 +DANGEROUSLY,2009,0,0,0,0,0,0 +DEADLOCKING,2009,0,0,0,0,0,0 +DEBARMENT,2009,0,0,0,0,0,0 +DECEDENT,0,0,0,2009,0,0,0 +DECEITFULNESS,2009,0,0,0,0,0,0 +DECEIVING,2009,0,0,0,0,0,0 +DECEPTIVELY,2009,0,0,0,0,0,0 +DECLINES,2009,0,0,0,0,0,0 +DECREEING,0,0,0,2009,0,0,0 +DEFACEMENT,2009,0,0,0,0,0,0 +DEFAMATIONS,2009,0,0,0,0,0,0 +DEFAMES,2009,0,0,0,0,0,0 +DEFAULTING,2009,0,0,0,0,0,0 +DEFEASE,0,0,0,2009,0,0,0 +DEFEASING,0,0,0,2011,0,0,0 +DEFEATS,2009,0,0,0,0,0,0 +DEFECTS,2009,0,0,0,0,0,0 +DEFENDANTS,2009,0,0,2009,0,0,0 +DEFENSIVE,2009,0,0,0,0,0,0 +DEFICIENCY,2009,0,0,0,0,0,0 +DEFINITELY,0,0,0,0,2009,0,0 +DEFRAUDING,2009,0,0,0,0,0,0 +DEGRADATIONS,2009,0,0,0,0,0,0 +DEGRADING,2009,0,0,0,0,0,0 +DELAYS,2009,0,0,0,0,0,0 +DELEGEES,0,0,0,2011,0,0,0 +DELIBERATELY,2009,0,0,0,0,0,0 +DELIGHTFULLY,0,2009,0,0,0,0,0 +DELINQUENCY,2009,0,0,0,0,0,0 +DELIST,2009,0,0,0,0,0,0 +DEMISE,2009,0,0,0,0,0,0 +DEMOLISH,2009,0,0,0,0,0,0 +DEMOLITION,2009,0,0,0,0,0,0 +DEMOTES,2009,0,0,0,0,0,0 +DEMURRED,0,0,0,2009,0,0,0 +DEMURS,0,0,0,2009,0,0,0 +DENIES,2009,0,0,0,0,0,0 +DENIGRATING,2009,0,0,0,0,0,0 +DEPEND,0,0,2009,0,0,2009,2011 +DEPENDANCES,0,0,0,0,0,0,2011 +DEPENDENCIES,0,0,2009,0,0,0,2011 +DEPENDS,0,0,2009,0,0,2009,2011 +DEPLETING,2009,0,0,0,0,0,0 +DEPOSED,0,0,0,2009,0,0,0 +DEPOSITIONAL,0,0,0,2011,0,0,0 +INVALIDATED,2009,0,0,0,0,0,0 +INVALIDITY,2009,0,0,0,0,0,0 +INVENTION,0,2009,0,0,0,0,0 +INVENTOR,0,2009,0,0,0,0,0 +INVESTIGATES,2009,0,0,0,0,0,0 +INVOLUNTARILY,2009,0,0,0,0,0,0 +IRRECOVERABLE,2009,0,0,0,0,0,0 +IRREGULARITY,2009,0,0,0,0,0,0 +IRREVERSIBLE,2009,0,0,0,0,0,0 +JEOPARDIZE,2009,0,0,0,0,0,0 +JUDICIALLY,0,0,0,2009,0,0,0 +JURIS,0,0,0,2011,0,0,0 +JURISDICTIONS,0,0,0,2009,0,0,0 +JUROR,0,0,0,2009,0,0,0 +JUSTICE,0,0,0,2009,0,0,0 +KICKBACKS,2009,0,0,0,0,0,0 +DIMINISHED,2009,0,0,0,0,0,0 +DIRECTIVE,0,0,0,0,0,0,2009 +DISADVANTAGEOUS,2009,0,0,0,0,0,0 +DISAFFIRMANCE,0,0,0,2009,0,0,0 +DISAGREEABLE,2009,0,0,0,0,0,0 +DISAGREEMENTS,2009,0,0,0,0,0,0 +DISALLOWANCES,2009,0,0,0,0,0,0 +DISAPPEAR,2009,0,0,0,0,0,0 +DISAPPEARING,2009,0,0,0,0,0,0 +DISAPPOINTING,2009,0,0,0,0,0,0 +DISAPPOINTS,2009,0,0,0,0,0,0 +DISAPPROVED,2009,0,0,0,0,0,0 +DISASSOCIATING,2009,0,0,0,0,0,0 +DISASTERS,2009,0,0,0,0,0,0 +DISAVOWAL,2009,0,0,0,0,0,0 +GRATUITOUSLY,2009,0,0,0,0,0,0 +GREATLY,0,2009,0,0,0,0,0 +GROSSLY,2009,0,0,0,0,0,0 +HALTED,2009,0,0,0,0,0,0 +HAMPERS,2009,0,0,0,0,0,0 +HAPPY,0,2009,0,0,0,0,0 +HARASSMENT,2009,0,0,0,0,0,0 +HARMED,2009,0,0,0,0,0,0 +HARMS,2009,0,0,0,0,0,0 +HARSHLY,2009,0,0,0,0,0,0 +HAZARDS,2009,0,0,0,0,0,0 +NONINFRINGING,0,0,0,2011,0,0,0 +NONPAYMENT,2009,0,0,0,0,0,0 +NONPERFORMING,2009,0,0,0,0,0,0 +DISFAVORS,2009,0,0,0,0,0,0 +PREAMENDMENT,0,0,0,2011,0,0,0 +COMPLICATED,2009,0,0,0,0,0,0 +COMPLICATIONS,2009,0,0,0,0,0,0 +COMPLIMENTING,0,2009,0,0,0,0,0 +MISSTATEMENTS,2009,0,0,0,0,0,0 +MISSTEPS,2009,0,0,0,0,0,0 +MISTAKES,2009,0,0,0,0,0,0 +MISUNDERSTAND,2009,0,0,0,0,0,0 +MISUSE,2009,0,0,0,0,0,0 +MONOPOLISTIC,2009,0,0,0,0,0,0 +MONOPOLIZED,2009,0,0,0,0,0,0 +MORATORIA,2009,0,0,0,0,0,0 +MOTHBALLED,2009,0,0,0,0,0,0 +MUTANDIS,0,0,0,2011,0,0,0 +SLIPPAGES,2009,0,0,0,0,0,0 +SLOWED,2009,0,0,0,0,0,0 +SLOWLY,2009,0,0,0,0,0,0 +SLUGGISHNESS,2009,0,0,0,0,0,0 +SMOOTHS,0,2009,0,0,0,0,0 +DEPRESSES,2009,0,0,0,0,0,0 +DEPRIVED,2009,0,0,0,0,0,0 +DERELICTION,2009,0,0,0,0,0,0 +DEROGATING,0,0,0,2009,0,0,0 +DESIGNATOR,0,0,0,2011,0,0,0 +DESPITE,0,2009,0,0,0,0,0 +DESTABILIZING,2009,0,2009,0,0,0,0 +DESTROYING,2009,0,0,0,0,0,0 +DETAIN,2009,0,0,0,0,0,0 +DETENTIONS,2009,0,0,0,0,0,0 +DETERIORATES,2009,0,0,0,0,0,0 +DETERRED,2009,0,0,0,0,0,0 +DETERRENTS,2009,0,0,0,0,0,0 +DETRACTED,2009,0,0,0,0,0,0 +DETRIMENTALLY,2009,0,0,0,0,0,0 +DEVALUES,2009,0,0,0,0,0,0 +DEVASTATING,2009,0,0,0,0,0,0 +DEVIATES,2009,0,2009,0,0,0,0 +DEVISEES,0,0,0,2011,0,0,0 +DEVOLVING,2009,0,0,0,0,0,0 +DICTATING,0,0,0,0,0,0,2009 +DIFFERS,0,0,2009,0,0,0,0 +DIFFICULTY,2009,0,0,0,0,0,0 +ASCENDANTS,0,0,0,2009,0,0,0 +ASSAULTS,2009,0,0,0,0,0,0 +ASSIGNATIONS,0,0,0,2009,0,0,0 +ASSUMES,0,0,2009,0,0,0,0 +ASSURE,0,2009,0,0,0,0,0 +ATTAIN,0,2009,0,0,0,0,0 +ATTAINMENTS,0,2009,0,0,0,0,0 +ATTESTATIONS,0,0,0,2009,0,0,0 +ATTORNEY,0,0,0,2009,0,0,0 +ATTRACTIVE,0,2009,0,0,0,0,0 +BACKDATING,2009,0,0,0,0,0,0 +BAILEE,0,0,0,2009,0,0,0 +BAILMENT,0,0,0,2011,0,0,0 +BANKRUPT,2009,0,0,0,0,0,0 +BANKRUPTING,2009,0,0,0,0,0,0 +CLAIMANTS,0,0,0,2009,0,0,0 +CLARIFICATION,0,0,2009,0,0,0,0 +CLEARLY,0,0,0,0,2009,0,0 +CLOSING,-2020,0,0,0,0,0,0 +CODEFENDANT,0,0,0,2011,0,0,0 +CODIFICATION,0,0,0,2009,0,0,0 +CODIFY,0,0,0,2009,0,0,0 +COERCES,2009,0,0,0,0,0,0 +COLLABORATED,0,2009,0,0,0,0,0 +COLLABORATIONS,0,2009,0,0,0,0,0 +COLLAPSE,2009,0,0,0,0,0,0 +COLLISION,2009,0,0,0,0,0,0 +COLLUDES,2009,0,0,0,0,0,0 +COLLUSIVE,2009,0,0,0,0,0,0 +POSITIVELY,0,2009,0,0,0,0,0 +POSSIBLE,0,0,2009,0,0,2009,0 +POSTCONTRACT,0,0,0,2011,0,0,0 +POSTPONEMENT,2009,0,0,0,0,0,0 +WRITEDOWN,2009,0,0,0,0,0,0 +WRITS,0,0,0,2009,0,0,0 +WRONGFUL,2009,0,0,0,0,0,0 +HONOR,0,2009,0,0,0,0,0 +HONORS,0,2009,0,0,0,0,0 +REARGUMENT,0,0,0,2011,0,0,0 +REASSESSING,0,0,2009,0,0,0,0 +REASSIGNED,2009,0,0,0,0,0,0 +REASSIGNS,2009,0,0,0,0,0,0 +REBUT,0,0,0,2009,0,0,0 +REBUTTAL,0,0,0,2009,0,0,0 +RECALCULATE,0,0,2009,0,0,0,0 +RECALCULATION,0,0,2009,0,0,0,0 +RECALLING,2009,0,0,0,0,0,0 +RECESSIONARY,2009,0,0,0,0,0,0 +RECKLESSNESS,2009,0,0,0,0,0,0 +RECONSIDERS,0,0,2009,0,0,0,0 +RECOUPMENTS,0,0,0,2009,0,0,0 +RECTIFICATIONS,0,0,0,2009,0,0,0 +RECUSES,0,0,0,2014,0,0,0 +REDACTING,2009,0,0,2009,0,0,0 +REDEFAULTED,2012,0,0,0,0,0,0 +REDRESSES,2009,0,0,0,0,0,0 +REEXAMINING,0,0,2009,0,0,0,0 +REFILE,0,0,0,2009,0,0,0 +REFRAIN,0,0,0,0,0,0,2009 +REFUSALS,2009,0,0,0,0,0,0 +REFUSING,2009,0,0,0,0,0,0 +REGULATE,0,0,0,2009,0,0,0 +REGULATION,0,0,0,2009,0,0,0 +REGULATORS,0,0,0,2009,0,0,0 +REHEARING,0,0,0,2009,0,0,0 +VARIABLY,0,0,2009,0,0,0,0 +VARIANTS,0,0,2009,0,0,0,0 +VARIES,0,0,2009,0,0,0,0 +VENDEES,0,0,0,2011,0,0,0 +VERSATILITY,0,2009,0,0,0,0,0 +VIBRANT,0,2009,0,0,0,0,0 +VIOLATES,2009,0,0,0,0,0,0 +VIOLATIVE,2009,0,0,2009,0,0,0 +VIOLENT,2009,0,0,0,0,0,0 +VITIATES,2009,0,0,0,0,0,0 +VOIDED,2009,0,0,2009,0,0,0 +VOLATILITY,2009,0,2009,0,0,0,0 +VULNERABLY,2009,0,0,0,0,0,0 +WARNINGS,2009,0,0,0,0,0,0 +WASTED,2009,0,0,0,0,0,0 +WEAKEN,2009,0,0,0,0,0,0 +WEAKER,2009,0,0,0,0,0,0 +WEAKNESSES,2009,0,0,0,0,0,0 +DISHONORABLE,2009,0,0,0,0,0,0 +DISHONORS,2009,0,0,0,0,0,0 +DISINTERESTEDLY,2009,0,0,0,0,0,0 +DISLOYALTY,2009,0,0,0,0,0,0 +DISMISSAL,2009,0,0,0,0,0,0 +DISMISSING,2009,0,0,0,0,0,0 +DISPARAGEMENT,2009,0,0,0,0,0,0 +DISPARAGINGLY,2009,0,0,0,0,0,0 +DISPLACED,2009,0,0,0,0,0,0 +DISPLACING,2009,0,0,0,0,0,0 +DISPOSSESSED,2009,0,0,0,0,0,0 +DISPOSSESSORY,0,0,0,2011,0,0,0 +DISPROPORTIONATELY,2009,0,0,0,0,0,0 +DISPUTING,2009,0,0,0,0,0,0 +DISQUALIFIES,2009,0,0,0,0,0,0 +DISREGARDED,2009,0,0,0,0,0,0 +DISREPUTE,2009,0,0,0,0,0,0 +DISRUPTION,2009,0,0,0,0,0,0 +DISSATISFACTION,2009,0,0,0,0,0,0 +DISSENTER,2009,0,0,0,0,0,0 +DISSIDENT,2009,0,0,0,0,0,0 +DISTINCTION,0,2009,0,0,0,0,0 +DISTINCTIVENESS,0,2009,0,0,0,0,0 +DISTORTION,2009,0,0,0,0,0,0 +DISTRACTED,2009,0,0,0,0,0,0 +DISTRACTS,2009,0,0,0,0,0,0 +DISTRIBUTEE,0,0,0,2009,0,0,0 +DISTURBANCES,2009,0,0,0,0,0,0 +DIVERSION,2009,0,0,0,0,0,0 +DIVERTS,2009,0,0,0,0,0,0 +DIVESTITURE,2009,0,0,0,0,0,0 +DIVESTS,2009,0,0,0,0,0,0 +DIVULGED,2009,0,0,0,0,0,0 +DOCKETED,0,0,0,2009,0,0,0 +DOUBT,2009,0,2009,0,0,0,0 +DOWNGRADE,2009,0,0,0,0,0,0 +DOWNSIZE,2009,0,0,0,0,0,0 +DOWNSIZINGS,2009,0,0,0,0,0,0 +DOWNTURNS,2009,0,0,0,0,0,0 +DRASTIC,2009,0,0,0,0,0,0 +DREAM,0,2009,0,0,0,0,0 +DULY,0,0,0,2009,0,0,0 +DYSFUNCTIONS,2009,0,0,0,0,0,0 +EARMARKS,0,0,0,0,0,0,2009 +EASY,0,2009,0,0,0,0,0 +EFFICIENT,0,2009,0,0,0,0,0 +EJECTMENT,0,0,0,2011,0,0,0 +EMBARGOING,2009,0,0,0,0,0,0 +EMBARRASSING,2009,0,0,0,0,0,0 +EMBEZZLED,2009,0,0,0,0,0,0 +EMBEZZLES,2009,0,0,0,0,0,0 +EMPOWERING,0,2009,0,0,0,0,0 +ENABLES,0,2009,0,0,0,0,0 +ENCOURAGES,0,2009,0,0,0,0,0 +ENCROACHES,2009,0,0,0,0,0,0 +ENCUMBER,2009,0,0,2009,0,0,2009 +ENCUMBRANCE,2009,0,0,2009,0,0,2009 +ENDANGER,2009,0,0,0,0,0,0 +ENDANGERS,2009,0,0,0,0,0,0 +ENFORCEABLY,0,0,0,2011,0,0,0 +ENHANCEMENTS,0,2009,0,0,0,0,0 +ENJOINED,2009,0,0,0,0,0,0 +ENJOYABLE,0,2009,0,0,0,0,0 +ENJOYMENT,0,2009,0,0,0,0,0 +ENTAILING,0,0,0,0,0,0,2009 +PASSU,0,0,0,2009,0,0,0 +PENALIZED,2009,0,0,0,0,0,0 +PENALTY,2009,0,0,0,0,0,0 +PERFECTLY,0,2009,0,0,0,0,0 +PERILS,2009,0,0,0,0,0,0 +PERMISSIONS,0,0,0,0,0,0,2009 +PERMITTING,0,0,0,0,0,0,2009 +PERPETRATING,2009,0,0,2009,0,0,0 +PERSISTENCE,2009,0,0,0,0,0,0 +PERSISTS,2009,0,0,0,0,0,0 +PERVASIVENESS,2009,0,0,0,0,0,0 +PETITIONERS,0,0,0,2009,0,0,0 +PICKET,2009,0,0,0,0,0,0 +HEREBY,0,0,0,2009,0,0,0 +HEREFROM,0,0,0,2009,0,0,0 +HEREINBEFORE,0,0,0,2009,0,0,0 +HERETO,0,0,0,2009,0,0,0 +HEREUPON,0,0,0,2009,0,0,0 +HIGHEST,0,2009,0,0,2009,0,0 +HINDERS,2009,0,0,0,0,0,0 +WHATEVER,0,0,0,2009,0,0,0 +WHEREAS,0,0,0,2009,0,0,0 +WHEREIN,0,0,0,2009,0,0,0 +WHEREUNDER,0,0,0,2011,0,0,0 +WHOMEVER,0,0,0,2009,0,0,0 +WILL,0,0,0,0,2009,0,0 +WIN,0,2009,0,0,0,0,0 +WITNESS,0,0,0,2009,0,0,0 +FLUCTUATED,0,0,2009,0,0,0,0 +FLUCTUATIONS,0,0,2009,0,0,0,0 +FORBEARANCES,0,0,0,2009,0,0,0 +FORBIDDEN,2009,0,0,0,0,0,2009 +FORCED,2009,0,0,0,0,0,0 +FOREBEARS,0,0,0,2009,0,0,0 +FORECLOSING,2009,0,0,0,0,0,0 +FOREGOES,2009,0,0,0,0,0,0 +FORESTALLING,2009,0,0,0,0,0,0 +FORFEITABLE,0,0,0,2009,0,0,0 +FORFEITURE,2009,0,0,0,0,0,0 +FORTHWITH,0,0,0,2009,0,0,0 +FRAUDULENCE,2009,0,0,0,0,0,0 +FRIVOLOUS,2009,0,0,0,0,0,0 +FRUSTRATES,2009,0,0,0,0,0,0 +FRUSTRATIONS,2009,0,0,0,0,0,0 +GAIN,0,2009,0,0,0,0,0 +GOOD,0,2009,0,0,0,0,0 +DISGORGES,2009,0,0,0,0,0,0 +DISGRACEFULLY,2009,0,0,0,0,0,0 +LITIGATED,2009,0,0,2009,0,0,0 +LITIGATIONS,2009,0,0,2009,0,0,0 +LITIGIOUSNESS,0,0,0,2009,0,0,0 +LACKING,2009,0,0,0,0,0,0 +LAGGED,2009,0,0,0,0,0,0 +LAPSED,2009,0,0,0,0,0,0 +LAUNDERING,2009,0,0,0,0,0,0 +LAWFULNESS,0,0,0,2009,0,0,0 +LAWSUIT,0,0,0,2009,0,0,0 +LAYOFF,2009,0,0,0,0,0,0 +LEGAL,0,0,0,2009,0,0,0 +LEGALIZATIONS,0,0,0,2009,0,0,0 +LEGALIZING,0,0,0,2009,0,0,0 +LEGATEES,0,0,0,2009,0,0,0 +FLAWS,2009,0,0,0,0,0,0 +NONRENEWAL,2009,0,0,0,0,0,0 +LIQUIDATING,2009,0,0,0,0,0,0 +LIQUIDATORS,2009,0,0,0,0,0,0 +BENEFICIAL,0,-2020,0,2020,0,0,0 +BENEFIT,0,-2020,0,0,0,0,0 +BENEFITTING,0,2009,0,0,0,0,0 +POORLY,2009,0,0,0,0,0,0 +REINTERPRETATIONS,0,0,2009,0,0,0,0 +REJECT,2009,0,0,0,0,0,0 +REJECTIONS,2009,0,0,0,0,0,0 +RELINQUISHED,2009,0,0,0,0,0,0 +RELINQUISHMENTS,2009,0,0,0,0,0,0 +REMANDED,0,0,0,2009,0,0,0 +REMEDIATED,0,0,0,2009,0,0,0 +REMEDIED,0,0,0,2009,0,0,0 +RENEGOTIATES,2009,0,0,0,0,0,0 +RENOUNCE,2009,0,0,0,0,0,0 +RENOUNCES,2009,0,0,0,0,0,0 +REPLEDGED,0,0,0,2012,0,0,0 +REPOSSESSING,2009,0,0,0,0,0,0 +TROUBLES,2009,0,0,0,0,0,0 +UNACCEPTABLE,2009,0,0,0,0,0,0 +UNANNOUNCED,2009,0,0,0,0,0,0 +UNAPPROVED,2009,0,0,0,0,0,0 +UNAVAILABLE,2009,0,0,0,0,0,2011 +UNCERTAIN,0,0,2009,0,0,2009,0 +UNCLEAR,0,0,2009,0,0,0,0 +UNCOLLECTIBLE,2009,0,0,0,0,0,0 +UNCOMPROMISING,0,0,0,0,2009,0,0 +UNCONSTITUTIONAL,0,0,0,2009,0,0,0 +UNCONTROLLABLE,2009,0,0,0,0,0,0 +UNCOVER,2009,0,0,0,0,0,0 +UNDECIDED,0,0,2009,0,0,0,0 +UNDELIVERED,2009,0,0,0,0,0,0 +UNDERCUTTING,2009,0,0,0,0,0,0 +UNDERESTIMATING,2009,0,0,0,0,0,0 +UNDERMINE,2009,0,0,0,0,0,0 +UNDERPAID,2009,0,0,0,0,0,0 +UNDERPERFORM,2011,0,0,0,0,0,0 +UNDERPERFORMS,2014,0,0,0,0,0,0 +UNDERSTATE,2009,0,0,0,0,0,0 +UNDERSTATES,2009,0,0,0,0,0,0 +UNDESIGNATED,0,0,2009,0,0,0,0 +UNDETECTED,2009,0,0,0,0,0,0 +UNDISCLOSED,2009,0,0,0,0,0,0 +UNDUE,2009,0,0,0,0,0,0 +UNECONOMICALLY,2009,0,0,0,0,0,0 +UNENCUMBERED,0,0,0,2009,0,0,0 +UNEQUIVOCALLY,0,0,0,0,2009,0,0 +UNEXPECTED,2009,0,2009,0,0,0,0 +UNFAMILIAR,0,0,2009,0,0,0,0 +UNFAVORABLY,2009,0,0,0,0,0,0 +UNFITNESS,2009,0,0,0,0,0,0 +UNFORSEEN,2011,0,2011,0,0,0,0 +UNFRIENDLY,2009,0,0,0,0,0,0 +UNHEDGED,0,0,2009,0,0,0,0 +UNINTENDED,2009,0,0,0,0,0,0 +UNJUSTIFIABLE,2009,0,0,0,0,0,0 +UNKNOWING,2009,0,0,0,0,0,0 +UNLAWFUL,2009,0,0,2009,0,0,0 +UNLIQUIDATED,2009,0,0,0,0,0,0 +UNMERITORIOUS,2014,0,0,0,0,0,0 +UNOBSERVABLE,0,0,2009,0,0,0,0 +UNPARALLELED,0,2009,0,0,2009,0,0 +UNPREDICTABILITY,2009,0,2009,0,0,0,0 +UNPRODUCTIVE,2009,0,0,0,0,0,0 +UNPROVEN,0,0,2009,0,0,0,0 +UNREALISTIC,2009,0,0,0,0,0,0 +UNRECEPTIVE,2014,0,0,0,0,0,0 +UNREIMBURSED,2009,0,0,0,0,0,0 +UNREPORTED,2009,0,0,0,0,0,0 +UNSALABLE,2009,0,0,0,0,0,0 +UNSAVORY,2009,0,0,0,0,0,0 +UNSELLABLE,2014,0,0,0,0,0,0 +UNSPECIFIC,0,0,2009,0,0,0,0 +UNSTAYED,0,0,0,2009,0,0,0 +UNSUITABILITY,2009,0,0,0,0,0,0 +UNSURE,2009,0,0,0,0,0,0 +UNSUSTAINABLE,2009,0,0,0,0,0,0 +UNTO,0,0,0,2009,0,0,0 +UNTRUTHFULLY,2009,0,0,0,0,0,0 +UNUSUAL,0,0,2009,0,0,0,0 +UNWELCOME,2009,0,0,0,0,0,0 +UPSET,2009,0,0,0,0,0,0 +URGENT,2009,0,0,0,0,0,0 +USURPED,2009,0,0,2009,0,0,0 +VAGARIES,0,0,2009,0,0,0,0 +VAGUENESSES,0,0,2012,0,0,0,0 +VANDALISM,2009,0,0,0,0,0,0 +PLAINTIFF,2009,0,0,2009,0,0,0 +PLEADED,2009,0,0,0,0,0,0 +PLEAS,2009,0,0,2009,0,0,0 +PLEASURE,0,2009,0,0,0,0,0 +PLEDGEE,0,0,0,2009,0,0,0 +PLEDGOR,0,0,0,2009,0,0,0 +COMPELLED,0,0,0,0,0,0,2009 +COMPLAIN,2009,0,0,0,0,0,0 +COMPLAINING,2009,0,0,0,0,0,0 +COMMITMENTS,0,0,0,0,0,0,2009 +LIMITATIONS,2009,0,0,0,0,0,0 +RESTRAINS,0,0,0,0,0,0,2009 +RESTRICTED,0,0,0,0,0,0,2009 +RESTRICTIVE,0,0,0,0,0,0,2009 +RESTRUCTURE,2009,0,0,0,0,0,0 +RESTRUCTURINGS,2009,0,0,0,0,0,0 +RETALIATING,2009,0,0,0,0,0,0 +RETENDERING,0,0,0,2011,0,0,0 +PRECIPITATED,2009,0,0,0,0,0,0 +PRECLUDED,2009,0,0,0,0,0,2009 +PRECONDITIONS,0,0,0,0,0,0,2009 +PREDECEASES,0,0,0,2009,0,0,0 +PREDICTED,0,0,2009,0,0,0,0 +PREDICTIVE,0,0,2009,0,0,0,0 +PREEMINENCE,0,2009,0,0,0,0,0 +PREJUDICED,2009,0,0,2009,0,0,0 +PRELIMINARILY,0,0,2009,0,0,0,0 +PREMIER,0,2009,0,0,0,0,0 +PRESSING,2009,0,0,0,0,0,0 +PRESUME,0,0,2009,0,0,0,0 +PRESUMPTION,0,0,2009,0,0,0,0 +PREVENT,0,0,0,0,0,0,2009 +PREVENTS,2009,0,0,0,0,0,2009 +PROACTIVELY,0,2009,0,0,0,0,0 +PROBABLE,0,0,2009,0,0,0,0 +PROBATES,0,0,0,2009,0,0,0 +PROBATIONARY,0,0,0,2009,0,0,0 +PROBLEM,2009,0,0,0,0,0,0 +PROFICIENCY,0,2009,0,0,0,0,0 +PROFITABLE,0,2009,0,0,0,0,0 +PROGRESSES,0,2009,0,0,0,0,0 +PROHIBITING,0,0,0,0,0,0,2009 +PROHIBITIVELY,0,0,0,0,0,0,2009 +PROLONGATION,2009,0,0,0,0,0,0 +PROLONGS,2009,0,0,0,0,0,0 +PROMULGATING,0,0,0,2009,0,0,0 +PROMULGATORS,0,0,0,2009,0,0,0 +PROSECUTE,2009,0,0,2009,0,0,0 +PROSECUTION,2009,0,0,2009,0,0,0 +PROSECUTORS,0,0,0,2009,0,0,0 +PROSPEROUS,0,2009,0,0,0,0,0 +PROTESTER,2009,0,0,0,0,0,0 +PROTESTORS,2009,0,0,0,0,0,0 +PROVISO,0,0,0,2009,0,0,0 +PROVOKED,2009,0,0,0,0,0,0 +PUNISHED,2009,0,0,0,0,0,0 +PUNISHMENTS,2009,0,0,0,0,0,0 +PURPORTEDLY,2009,0,0,0,0,0,0 +QUESTIONABLE,2009,0,0,0,0,0,0 +QUESTIONS,2009,0,0,0,0,0,0 +QUITTING,2009,0,0,0,0,0,0 +RANDOMIZE,0,0,2009,0,0,0,0 +RANDOMLY,0,0,2009,0,0,0,0 +RATABLY,0,0,0,2009,0,0,0 +RATIONALIZED,2009,0,0,0,0,0,0 +ABANDONING,2009,0,0,0,0,0,0 +ABDICATED,2009,0,0,0,0,0,0 +ABDICATIONS,2009,0,0,0,0,0,0 +ABERRATIONS,2009,0,0,0,0,0,0 +ABIDE,0,0,0,0,0,0,2009 +ABNORMALITIES,2009,0,0,0,0,0,0 +ABOLISHED,2009,0,0,0,0,0,0 +ABROGATE,2009,0,0,2009,0,0,0 +ABROGATION,2009,0,0,2009,0,0,0 +ABRUPTNESS,2009,0,0,0,0,0,0 +ABSOLVE,0,0,0,2009,0,0,0 +ABUNDANCE,0,2009,0,0,0,0,0 +ABUSES,2009,0,0,0,0,0,0 +ABUSIVENESS,2009,0,0,0,0,0,0 +ACCIDENTAL,2009,0,0,0,0,0,0 +ACCOMPLISH,0,2009,0,0,0,0,0 +ACCOMPLISHMENT,0,2009,0,0,0,0,0 +ACCUSE,2009,0,0,0,0,0,0 +ACHIEVE,0,2009,0,0,0,0,0 +ACHIEVES,0,2009,0,0,0,0,0 +ACQUIESCES,2009,0,0,0,0,0,0 +ACQUIT,2009,0,0,2009,0,0,0 +ACQUITTANCE,0,0,0,2009,0,0,0 +ADDENDUMS,0,0,0,2011,0,0,0 +ADJOURNING,0,0,0,2009,0,0,0 +ADJUDGE,0,0,0,2009,0,0,0 +ADJUDICATE,0,0,0,2009,0,0,0 +ADJUDICATION,0,0,0,2009,0,0,0 +ADJUDICATORS,0,0,0,2009,0,0,0 +ADMISSIBLY,0,0,0,2009,0,0,0 +ADULTERATED,2009,0,0,0,0,0,0 +ADVANCEMENT,0,2009,0,0,0,0,0 +ADVANTAGE,0,2009,0,0,0,0,0 +ADVANTAGES,0,2009,0,0,0,0,0 +ADVERSE,2009,0,0,0,0,0,0 +AFFIDAVIT,0,0,0,2009,0,0,0 +AFOREDESCRIBED,0,0,0,2011,0,0,0 +AFTERMATH,2009,0,0,0,0,0,0 +AGGRAVATED,2009,0,0,0,0,0,0 +AGGRAVATIONS,2009,0,0,0,0,0,0 +ALIENATE,2009,0,0,0,0,0,0 +ALIENATION,2009,0,0,0,0,0,0 +ALLEGE,2009,0,0,2009,0,0,0 +ALLEGING,2009,0,0,2009,0,0,0 +ALTERATION,0,0,2009,0,0,0,0 +AMBIGUITY,0,0,2009,0,0,0,0 +AMENDATORY,0,0,0,2009,0,0,0 +AMENDMENTS,0,0,0,2009,0,0,0 +ANNOYANCES,2009,0,0,0,0,0,0 +ANNUL,2009,0,0,0,0,0,0 +ANNULMENTS,2009,0,0,0,0,0,0 +ANOMALOUSLY,2009,0,2009,0,0,0,0 +ANTICIPATE,0,0,2009,0,0,0,0 +ANTICIPATION,0,0,2009,0,0,0,0 +ANTITRUST,2009,0,0,2009,0,0,0 +APPEAL,0,0,0,2009,0,0,0 +APPEALS,0,0,0,2009,0,0,0 +APPEARS,0,0,2009,0,0,2009,0 +APPELLEES,0,0,0,2011,0,0,0 +APPROXIMATELY,0,0,2009,0,0,0,0 +APPROXIMATIONS,0,0,2009,0,0,0,0 +ARBITRABILITY,0,0,0,2011,0,0,0 +ARBITRARY,0,0,2009,0,0,0,0 +ARBITRATING,0,0,0,2009,0,0,0 +ARBITRATIVE,0,0,0,2011,0,0,0 +ARGUED,2009,0,0,0,0,0,0 +ARGUMENTS,2009,0,0,0,0,0,0 +ARREST,2009,0,0,0,0,0,0 +RETRIBUTIONS,2009,0,0,0,0,0,0 +BONA,0,0,0,2009,0,0,0 +BOOST,0,2009,0,0,0,0,0 +BOUND,0,0,0,0,0,0,2011 +BOYCOTTING,2009,0,0,0,0,0,0 +BREACHES,2009,0,0,2009,0,0,0 +BREAKAGES,2009,0,0,0,0,0,0 +BREAKS,2009,0,0,0,0,0,0 +BRIBED,2009,0,0,0,0,0,0 +BRIBING,2009,0,0,0,0,0,0 +BURDEN,2009,0,0,0,0,0,0 +BURDENSOME,2009,0,0,0,0,0,0 +CALAMITY,2009,0,0,0,0,0,0 +CANCELLATION,2009,0,0,0,0,0,0 +CANCELS,2009,0,0,0,0,0,0 +CATASTROPHICALLY,2009,0,0,0,0,0,0 +CAUTIONING,2009,0,0,0,0,0,0 +CAUTIOUSNESS,0,0,2009,0,0,0,0 +CEASING,2009,0,0,0,0,0,0 +CENSURED,2009,0,0,0,0,0,0 +CESSION,0,0,0,2009,0,0,0 +CHALLENGING,2009,0,0,0,0,0,0 +CHATTELS,0,0,0,2009,0,0,0 +CIRCUMVENTING,2009,0,0,0,0,0,0 +SHARPLY,2009,0,0,0,0,0,0 +SHORTFALL,2009,0,0,0,0,0,0 +SHUT,2009,0,0,0,0,0,0 +SHUTTING,2009,0,0,0,0,0,0 +SLANDERS,2009,0,0,0,0,0,0 +REPUDIATE,2009,0,0,0,0,0,0 +REPUDIATION,2009,0,0,0,0,0,0 +REQUIRE,0,0,0,0,0,0,2009 +REQUIRES,0,0,0,0,0,0,2009 +RESCINDED,0,0,0,2009,0,0,0 +RESCISSIONS,0,0,0,2009,0,0,0 +RESIGNED,2009,0,0,0,0,0,0 +RESTATE,2009,0,0,0,0,0,0 +RESTATES,2009,0,0,0,0,0,0 +NONTERMINABLE,0,0,0,2011,0,0,0 +NOTARIZATION,0,0,0,2009,0,0,0 +NOTARIZING,0,0,0,2009,0,0,0 +NUISANCE,2009,0,0,0,0,0,0 +NULLIFIED,2009,0,0,2009,0,0,0 +NULLITIES,0,0,0,2009,0,0,0 +OBJECTION,2009,0,0,0,0,0,0 +OBLIGATE,0,0,0,0,0,0,2009 +OBLIGATION,0,0,0,0,0,0,2009 +OBLIGED,0,0,0,0,0,0,2009 +OBLIGOR,0,0,0,2009,0,0,0 +OBSOLESCENCE,2009,0,0,0,0,0,0 +OBSTRUCT,2009,0,0,0,0,0,0 +OBSTRUCTIONS,2009,0,0,0,0,0,0 +OFFEND,2009,0,0,0,0,0,0 +OFFENDING,2009,0,0,0,0,0,0 +OFFEREES,0,0,0,2011,0,0,0 +OMISSIONS,2009,0,0,0,0,0,0 +OMITTING,2009,0,0,0,0,0,0 +OPPORTUNITIES,0,2009,0,0,0,0,0 +OPPOSES,2009,0,0,0,0,0,0 +OPTIMISTIC,0,2009,0,0,0,0,0 +OUTAGE,2009,0,0,0,0,0,0 +OUTPERFORM,0,2009,0,0,0,0,0 +OVERAGE,2009,0,0,0,0,0,0 +OVERBUILDS,2009,0,0,0,0,0,0 +OVERBURDENING,2009,0,0,0,0,0,0 +OVERCHARGED,2009,0,0,0,0,0,0 +OVERCOMES,2009,0,0,0,0,0,0 +OVERESTIMATED,2009,0,0,0,0,0,0 +OVERESTIMATIONS,2009,0,0,0,0,0,0 +OVERLOADS,2009,0,0,0,0,0,0 +OVERLOOKS,2009,0,0,0,0,0,0 +OVERPRODUCED,2009,0,0,0,0,0,0 +OVERRULE,0,0,0,2009,0,0,0 +OVERRUN,2009,0,0,0,0,0,0 +OVERSHADOWED,2009,0,0,0,0,0,0 +OVERSTATED,2009,0,0,0,0,0,0 +OVERSTATING,2009,0,0,0,0,0,0 +OVERSUPPLYING,2009,0,0,0,0,0,0 +OVERTURNING,2009,0,0,0,0,0,0 +OVERVALUING,2009,0,0,0,0,0,0 +PARI,0,0,0,2009,0,0,0 +NECESSITATES,0,0,0,0,0,0,2009 +NEGATIVES,2009,0,0,0,0,0,0 +NEGLECTING,2009,0,0,0,0,0,0 +NEGLIGENT,2009,0,0,0,0,0,0 +BARRED,2009,0,0,0,0,0,0 +BEAUTIFULLY,0,2009,0,0,0,0,0 +BELIEVING,0,0,2009,0,0,0,0 +IDLE,2009,0,0,0,0,0,0 +IGNORED,2009,0,0,0,0,0,0 +ILLEGAL,2009,0,0,0,0,0,0 +ILLEGIBLE,2009,0,0,0,0,0,0 +ILLIQUIDITY,2009,0,0,0,0,0,0 +IMMATURE,2009,0,0,0,0,0,0 +IMPAIRING,2009,0,0,0,0,0,2011 +IMPASSE,2009,0,0,0,0,0,0 +IMPEDES,2009,0,0,0,0,0,0 +IMPENDING,2009,0,0,0,0,0,0 +IMPERIL,2009,0,0,0,0,0,0 +IMPLICATED,2009,0,0,0,0,0,0 +IMPOSED,0,0,0,0,0,0,2009 +IMPOSITIONS,0,0,0,0,0,0,2009 +IMPOUNDED,2009,0,0,0,0,0,0 +IMPRACTICAL,2009,0,0,0,0,0,0 +IMPRECISION,0,0,2009,0,0,0,0 +IMPRESSES,0,2009,0,0,0,0,0 +IMPRISONMENT,2009,0,0,0,0,0,0 +IMPROPERLY,2009,0,0,0,0,0,0 +IMPROVED,0,2009,0,0,0,0,0 +IMPROVING,0,2009,0,0,0,0,0 +INACCESSIBLE,2009,0,0,0,0,0,0 +INACCURATELY,2009,0,0,0,0,0,0 +INACTIVATED,2009,0,0,0,0,0,0 +INACTIVATIONS,2009,0,0,0,0,0,0 +INADEQUATE,2009,0,0,0,0,0,0 +INADVISABILITY,2009,0,0,0,0,0,0 +INASMUCH,0,0,0,2009,0,0,0 +INCAPACITY,2009,0,0,2009,0,0,0 +INCARCERATING,2009,0,0,2009,0,0,0 +INCIDENCE,2009,0,0,0,0,0,0 +INCOMPATIBILITIES,2009,0,0,0,0,0,0 +INCOMPETENCY,2009,0,0,0,0,0,0 +INCOMPLETE,2009,0,0,0,0,0,0 +INCONSISTENCIES,2009,0,0,0,0,0,0 +INCONTESTABILITY,0,0,0,2009,0,0,0 +INCONVENIENT,2009,0,0,0,0,0,0 +INCREDIBLE,0,2009,0,0,0,0,0 +INDECENT,2009,0,0,0,0,0,0 +INDEFINITELY,0,0,2009,0,0,0,0 +INDEMNIFICATIONS,0,0,0,2009,0,0,0 +INDEMNIFYING,0,0,0,2009,0,0,0 +INDEMNITOR,0,0,0,2009,0,0,0 +INDETERMINATE,0,0,2009,0,0,0,0 +INDICTING,2009,0,0,2009,0,0,0 +INEFFECTIVE,2009,0,0,0,0,0,0 +INEFFICIENCY,2009,0,0,0,0,0,0 +INELIGIBLE,2009,0,0,0,0,0,0 +INEQUITY,2009,0,0,0,0,0,0 +INEXPERIENCE,2009,0,0,0,0,0,0 +INFLUENTIAL,0,2009,0,0,0,0,0 +INFRACTIONS,2009,0,0,2009,0,0,0 +INFRINGEMENTS,2009,0,0,0,0,0,0 +INGENUITY,0,2009,0,0,0,0,0 +INHIBITS,0,0,0,0,0,0,2011 +INJUNCTIVE,0,0,0,2009,0,0,0 +INJURIES,2009,0,0,0,0,0,0 +INNOVATE,0,2009,0,0,0,0,0 +INNOVATION,0,2009,0,0,0,0,0 +INNOVATOR,0,2009,0,0,0,0,0 +INQUIRY,2009,0,0,0,0,0,0 +INSIST,0,0,0,0,0,0,2009 +INSISTS,0,0,0,0,0,0,2009 +INSOLVENT,2009,0,0,0,0,0,0 +INSTABILITY,2009,0,2009,0,0,0,0 +INSUFFICIENTLY,2009,0,0,0,0,0,0 +INTANGIBLES,0,0,2009,0,0,0,0 +INTERFERED,2009,0,0,0,0,0,0 +INTERFERING,2009,0,0,0,0,0,0 +INTERPLEADER,0,0,0,2009,0,0,0 +INTERPOSING,0,0,0,2009,0,0,0 +INTERROGATED,0,0,0,2009,0,0,0 +INTERROGATIONS,0,0,0,2009,0,0,0 +INTERROGATORY,0,0,0,2009,0,0,0 +INTERRUPTION,2009,0,0,0,0,0,0 +INTESTATE,0,0,0,2009,0,0,0 +SPORADIC,0,0,2009,0,0,0,0 +STABILIZATIONS,0,2009,0,0,0,0,0 +STABILIZING,0,2009,0,0,0,0,0 +STAGNATE,2009,0,0,0,0,0,0 +STAGNATION,2009,0,0,0,0,0,0 +STATUTES,0,0,0,2009,0,0,0 +STIPULATED,0,0,0,0,0,0,2009 +STIPULATIONS,0,0,0,0,0,0,2009 +STOPPED,2009,0,0,0,0,0,0 +STRAINED,2009,0,0,0,0,0,0 +STRENGTHEN,0,2009,0,0,0,0,0 +STRENGTHS,0,2009,0,0,0,0,0 +STRESSFUL,2009,0,0,0,0,0,0 +STRICTEST,0,0,0,0,0,0,2009 +STRONGER,0,2009,0,0,0,0,0 +SUBCLAUSES,0,0,0,2009,0,0,0 +SUBJECTION,2009,0,0,0,0,0,0 +SUBLICENSEE,0,0,0,2009,0,0,0 +SUBPOENA,2009,0,0,2009,0,0,0 +SUBROGATION,0,0,0,2009,0,0,0 +SUCCEED,0,2009,0,0,0,0,0 +SUCCESS,0,2009,0,0,0,0,0 +SUDDEN,0,0,2009,0,0,0,0 +SUES,2009,0,0,2009,0,0,0 +SUFFERS,2009,0,0,0,0,0,0 +SUGGESTS,0,0,2009,0,0,2009,0 +SUMMONS,2009,0,0,2009,0,0,0 +SUPERSEDEAS,0,0,0,2011,0,0,0 +SURETIES,0,0,0,2009,0,0,0 +SURPASSES,0,2009,0,0,0,0,0 +SUSPECT,2009,0,0,0,0,0,0 +SUSPENDED,2009,0,0,0,0,0,0 +SUSPENSIONS,2009,0,0,0,0,0,0 +SUSPICIOUSLY,2009,0,0,0,0,0,0 +REVISE,0,0,2009,0,0,0,0 +REVOCATIONS,2009,0,0,2009,0,0,0 +REVOKING,2009,0,0,0,0,0,0 +REVOLUTIONIZING,0,2009,0,0,0,0,0 +REWARDS,0,-2020,0,0,0,0,0 +RIDICULING,2009,0,0,0,0,0,0 +RISKIEST,2009,0,2009,0,0,0,0 +RISKY,2009,0,2009,0,0,0,0 +RUMORS,0,0,2009,0,0,0,0 +SACRIFICES,2009,0,0,0,0,0,0 +SATISFACTORILY,0,2009,0,0,0,0,0 +SATISFY,0,2009,0,0,0,0,0 +SCRUTINIZE,2009,0,0,0,0,0,0 +SCRUTINY,2009,0,0,0,0,0,0 +SEIZED,2009,0,0,0,0,0,0 +SELDOMLY,0,0,2009,0,0,2009,0 +SERIOUS,2009,0,0,0,0,0,0 +SETBACKS,2009,0,0,0,0,0,0 +SEVERABILITY,0,0,0,2009,0,0,0 +SEVERANCES,0,0,0,2009,0,0,0 +SEVERITIES,2009,0,0,0,0,0,0 +ENTHUSIASM,0,2009,0,0,0,0,0 +ENTRENCHED,0,0,0,0,0,0,2009 +ERODING,2009,0,0,0,0,0,0 +ERRED,2009,0,0,0,0,0,0 +ERROR,2009,0,0,0,0,0,0 +ESCALATED,2009,0,0,0,0,0,0 +ESCHEATED,0,0,0,2011,0,0,0 +ESCROWING,0,0,0,2011,0,0,0 +EVADED,2009,0,0,0,0,0,0 +EVASIONS,2009,0,0,0,0,0,0 +EVICTING,2009,0,0,0,0,0,0 +EVIDENTIAL,0,0,0,2011,0,0,0 +EXACERBATES,2009,0,0,0,0,0,0 +EXAGGERATE,2009,0,0,0,0,0,0 +EXAGGERATION,2009,0,0,0,0,0,0 +EXCELLENCE,0,2009,0,0,0,0,0 +EXCEPTIONAL,0,2009,0,0,0,0,0 +EXCISED,0,0,0,2009,0,0,0 +EXCLUSIVE,0,2009,0,0,0,0,0 +EXCLUSIVITY,0,2009,0,0,0,0,0 +EXCULPATING,2009,0,0,2009,0,0,0 +EXECUTOR,0,0,0,2009,0,0,0 +EXECUTRIX,0,0,0,2009,0,0,0 +EXONERATED,2009,0,0,0,0,0,0 +EXONERATIONS,2009,0,0,0,0,0,0 +EXPLOITATIVE,2009,0,0,0,0,0,0 +EXPOSE,2009,0,0,0,0,0,0 +EXPOSURE,0,0,2009,0,0,0,0 +EXPROPRIATES,2009,0,0,0,0,0,0 +EXPULSION,2009,0,0,0,0,0,0 +EXTRACORPOREAL,0,0,0,2011,0,0,0 +SOLVENCY,2009,0,0,0,0,0,0 +SOMETIMES,0,0,2009,0,0,2009,0 +SPAMMERS,2014,0,0,0,0,0,0 +TREMENDOUS,0,2009,0,0,0,0,0 +LOCKOUT,2009,0,0,0,0,0,0 +LOSING,2009,0,0,0,0,0,0 +LOWEST,0,0,0,0,2009,0,0 +MAJEURE,0,0,0,2011,0,0,0 +MALFUNCTIONING,2009,0,0,0,0,0,0 +MALICIOUSLY,2009,0,0,0,0,0,0 +MANDATED,0,0,0,0,0,0,2009 +MANDITORILY,0,0,0,0,0,0,2011 +MANIPULATING,2009,0,0,0,0,0,0 +MARKDOWN,2009,0,0,0,0,0,0 +MEDIATE,0,0,0,2009,0,0,0 +MEDIATION,0,0,0,2009,0,0,0 +MERITORIOUS,0,2009,0,0,0,0,0 +MISAPPLIED,2009,0,0,0,0,0,0 +MISAPPROPRIATE,2009,0,0,0,0,0,0 +MISAPPROPRIATION,2009,0,0,0,0,0,0 +MISCALCULATED,2009,0,0,0,0,0,0 +MISCALCULATIONS,2009,0,0,0,0,0,0 +MISCLASSIFICATIONS,2014,0,0,0,0,0,0 +MISCONDUCT,2009,0,0,0,0,0,0 +MISDIRECTED,2009,0,0,0,0,0,0 +MISHANDLES,2009,0,0,0,0,0,0 +MISINFORMED,2009,0,0,0,0,0,0 +MISINTERPRETATION,2009,0,0,0,0,0,0 +MISINTERPRETS,2009,0,0,0,0,0,0 +MISJUDGING,2009,0,0,0,0,0,0 +MISLABELED,2009,0,0,0,0,0,0 +MISLEAD,2009,0,0,0,0,0,0 +MISLED,2009,0,0,0,0,0,0 +MISMANAGES,2009,0,0,0,0,0,0 +MISMATCHES,2009,0,0,0,0,0,0 +MISPRICING,2014,0,0,0,0,0,0 +MISREPRESENTATIONS,2009,0,0,0,0,0,0 +MISS,2009,0,0,0,0,0,0 +WORSE,2009,0,0,0,0,0,0 +WORSENS,2009,0,0,0,0,0,0 +TOLERATES,2009,0,0,0,0,0,0 +TORTIOUS,0,0,0,2009,0,0,0 +TORTUOUSLY,2009,0,0,0,0,0,0 +FINED,2009,0,0,0,0,0,0 +NONAPPEALABLE,0,0,0,2009,0,0,0 +NONCANCELABLE,0,0,0,0,0,0,2009 +NONCOMPLIANCES,2009,0,0,0,0,0,0 +NONCONFORMITIES,2009,0,0,0,0,0,0 +NONCONTRACTUAL,0,0,0,2011,0,0,0 +NONFIDUCIARY,0,0,0,2011,0,0,0 +NONFUNCTIONAL,2009,0,0,0,0,0,0 +DISCLAIMER,2009,0,0,0,0,0,0 +DISCLOSE,2009,0,0,0,0,0,0 +DISCONTINUANCE,2009,0,0,0,0,0,0 +DISCONTINUE,2009,0,0,0,0,0,0 +DISCOURAGE,2009,0,0,0,0,0,0 +DISCREDIT,2009,0,0,0,0,0,0 +DISCREPANCIES,2009,0,0,0,0,0,0 +SPECULATE,0,0,2009,0,0,0,0 +SPECULATION,0,0,2009,0,0,0,0 +TRAGIC,2009,0,0,0,0,0,0 +TRANSPARENCY,0,2009,0,0,0,0,0 +LEGISLATE,0,0,0,2009,0,0,0 +LEGISLATION,0,0,0,2009,0,0,0 +LEGISLATOR,0,0,0,2009,0,0,0 +LIBEL,0,0,0,2009,0,0,0 +LICENSABLE,0,0,0,2011,0,0,0 +CONCEALING,2009,0,0,0,0,0,0 +CONCEDING,2009,0,0,0,0,0,0 +CONCERNED,2009,0,0,0,0,0,0 +CONCILIATIONS,2009,0,0,0,0,0,0 +CONDEMNATION,2009,0,0,0,0,0,0 +CONDEMNOR,0,0,0,2011,0,0,0 +CONDONE,2009,0,0,0,0,0,0 +CONFESSED,2009,0,0,0,0,0,0 +CONFIDENT,0,2009,0,0,0,0,0 +CONFINEMENTS,2009,0,0,0,0,0,0 +CONFISCATED,2009,0,0,0,0,0,0 +CONFISCATIONS,2009,0,0,0,0,0,0 +CONFLICTING,2009,0,0,0,0,0,0 +CONFRONTATIONAL,2009,0,0,0,0,0,0 +CONFRONTS,2009,0,0,0,0,0,0 +CONFUSING,2009,0,2009,0,0,0,0 +CONSENTED,0,0,0,2009,0,0,0 +CONSPIRACIES,2009,0,0,0,0,0,0 +CONSPIRATORS,2009,0,0,0,0,0,0 +CONSPIRING,2009,0,0,0,0,0,0 +CONSTITUTIONALLY,0,0,0,2009,0,0,0 +CONSTRAINED,0,0,0,0,0,0,2009 +CONSTRAINTS,0,0,0,0,0,0,2009 +CONSTRUED,0,0,0,2012,0,0,0 +CONTEND,2009,0,0,0,0,0,0 +CONTENTION,2009,0,0,0,0,0,0 +CONTESTABILITY,0,0,0,2014,0,0,0 +CONTINGENCIES,0,0,2009,0,0,0,0 +CONTINGENTS,0,0,2009,0,0,0,0 +CONTRACTHOLDERS,0,0,0,2009,0,0,0 +CONTRACTION,2009,0,0,0,0,0,0 +CONTRACTUALLY,0,0,0,2009,0,0,0 +CONTRADICTION,2009,0,0,0,0,0,0 +CONTRARY,2009,0,0,0,0,0,0 +CONTRAVENING,0,0,0,2009,0,0,0 +CONTROVERSIES,2009,0,0,0,0,0,0 +CONTROVERTING,0,0,0,2009,0,0,0 +CONVICT,2009,0,0,2009,0,0,0 +CONVICTIONS,2009,0,0,2009,0,0,0 +CORRECTIONS,2009,0,0,0,0,0,0 +CORRUPTING,2009,0,0,0,0,0,0 +CORRUPTNESS,2009,0,0,0,0,0,0 +COUNSEL,0,0,0,2009,0,0,0 +COUNTERCLAIM,2009,0,0,0,0,0,0 +COUNTERFEIT,2009,0,0,0,0,0,0 +COUNTERFEITING,2009,0,0,0,0,0,0 +COUNTERSIGNOR,0,0,0,2011,0,0,0 +COURT,0,0,0,2009,0,0,0 +COVENANT,0,0,0,0,0,0,2011 +CREATIVE,0,2009,0,0,0,0,0 +CRIME,2009,0,0,2009,0,0,0 +CRIMINALIZE,0,0,0,2014,0,0,0 +CRISES,2009,0,0,0,0,0,0 +CRITICISM,2009,0,0,0,0,0,0 +CRITICIZES,2009,0,0,0,0,0,0 +CROSSROAD,0,0,2009,0,0,0,0 +CULPABILITY,2009,0,0,0,0,0,0 +CURTAIL,2009,0,0,0,0,0,0 +CURTAILMENTS,2009,0,0,0,0,0,0 +CUTBACKS,2009,0,0,0,0,0,0 +CYBERCRIME,2014,0,0,0,0,0,0 +TAINTING,2009,0,0,0,0,0,0 +TENDING,0,0,2009,0,0,0,0 +TERMINABLE,0,0,0,2009,0,0,0 +TERMINATING,2009,0,0,0,0,0,0 +TESTAMENTARY,0,0,0,2009,0,0,0 +THENCE,0,0,0,2009,0,0,0 +THEREAT,0,0,0,2009,0,0,0 +THEREOF,0,0,0,2009,0,0,0 +THERETOFOR,0,0,0,2011,0,0,0 +THEREUPON,0,0,0,2009,0,0,0 +THREATENED,2009,0,0,0,0,0,0 +FAILED,2009,0,0,0,0,0,0 +FAILURE,2009,0,0,0,0,0,0 +FALSELY,2009,0,0,0,0,0,0 +FALSIFIES,2009,0,0,0,0,0,0 +FANTASTIC,0,2009,0,0,0,0,0 +FAULT,2009,0,0,0,0,0,0 +FAVORABLE,0,2009,0,0,0,0,0 +FAVORITE,0,2009,0,0,0,0,0 +FELONIES,2009,0,0,2009,0,0,0 +DAMAGED,2009,0,0,0,0,0,0 +DAMPENED,2009,0,0,0,0,0,0 +DANGERS,2009,0,0,0,0,0,0 +DEADLOCKS,2009,0,0,0,0,0,0 +DEBARMENTS,2009,0,0,0,0,0,0 +DECEDENTS,0,0,0,2009,0,0,0 +DECEIVE,2009,0,0,0,0,0,0 +DECEPTION,2009,0,0,0,0,0,0 +DECLARANT,0,0,0,2011,0,0,0 +DECLINING,2009,0,0,0,0,0,0 +DECREES,0,0,0,2009,0,0,0 +DEFALCATION,0,0,0,2009,0,0,0 +DEFAMATORY,2009,0,0,0,0,0,0 +DEFAMING,2009,0,0,0,0,0,0 +DEFAULTS,2009,0,0,0,0,0,0 +DEFEASED,0,0,0,2009,0,0,0 +DEFEAT,2009,0,0,0,0,0,0 +DEFECT,2009,0,0,0,0,0,0 +DEFEND,2009,0,0,0,0,0,0 +DEFENDED,2009,0,0,0,0,0,0 +DEFER,2009,0,0,0,0,0,0 +DEFICIENT,2009,0,0,0,0,0,0 +DEFINITIVELY,0,0,0,0,2009,0,0 +DEFRAUDS,2009,0,0,0,0,0,0 +DEGRADE,2009,0,0,0,0,0,0 +DELAY,2009,0,0,0,0,0,0 +DELEGABLE,0,0,0,2009,0,0,0 +DELETERIOUS,2009,0,0,0,0,0,0 +DELIGHT,0,2009,0,0,0,0,0 +DELIGHTING,0,2009,0,0,0,0,0 +DELINQUENT,2009,0,0,0,0,0,0 +DELISTED,2009,0,0,0,0,0,0 +DEMISED,2009,0,0,0,0,0,0 +DEMOLISHED,2009,0,0,0,0,0,0 +DEMOLITIONS,2009,0,0,0,0,0,0 +DEMOTING,2009,0,0,0,0,0,0 +DEMURRER,0,0,0,2009,0,0,0 +DENIAL,2009,0,0,0,0,0,0 +DENIGRATE,2009,0,0,0,0,0,0 +DENIGRATION,2009,0,0,0,0,0,0 +DEPENDABILITY,0,2009,0,0,0,0,0 +DEPENDANT,0,0,0,0,0,0,2011 +DEPENDENCY,0,0,2009,0,0,0,0 +DEPLETE,2009,0,0,0,0,0,0 +DEPLETION,2009,0,0,0,0,0,0 +DEPOSES,0,0,0,2009,0,0,0 +DEPOSITIONS,0,0,0,2009,0,0,0 +INTRUSION,2009,0,0,0,0,0,0 +INVALIDATES,2009,0,0,0,0,0,0 +INVENT,0,2009,0,0,0,0,0 +INVENTIONS,0,2009,0,0,0,0,0 +INVENTORS,0,2009,0,0,0,0,0 +INVESTIGATING,2009,0,0,0,0,0,0 +INVOLUNTARY,2009,0,0,0,0,0,0 +IRRECOVERABLY,2009,0,0,0,0,0,0 +IRREGULARLY,2009,0,0,0,0,0,0 +IRREVOCABILITY,0,0,0,2011,0,0,0 +JEOPARDIZED,2009,0,0,0,0,0,0 +JUDICIARIES,0,0,0,2009,0,0,0 +JURISDICTION,0,0,0,2009,0,0,0 +JURISPRUDENCE,0,0,0,2009,0,0,0 +JURORS,0,0,0,2009,0,0,0 +JUSTICES,0,0,0,2009,0,0,0 +KNOWINGLY,2009,0,0,0,0,0,0 +DILIGENT,0,2009,0,0,0,0,0 +DIMINISHES,2009,0,0,0,0,0,0 +DIRECTIVES,0,0,0,0,0,0,2009 +DISADVANTAGES,2009,0,0,0,0,0,0 +DISAFFIRMED,0,0,0,2011,0,0,0 +DISAGREED,2009,0,0,0,0,0,0 +DISAGREES,2009,0,0,0,0,0,0 +DISALLOWED,2009,0,0,0,0,0,0 +DISAPPEARANCE,2009,0,0,0,0,0,0 +DISAPPEARS,2009,0,0,0,0,0,0 +DISAPPOINTINGLY,2009,0,0,0,0,0,0 +DISAPPROVAL,2009,0,0,0,0,0,0 +DISAPPROVES,2009,0,0,0,0,0,0 +DISASSOCIATION,2009,0,0,0,0,0,0 +DISASTROUS,2009,0,0,0,0,0,0 +DISAVOWED,2009,0,0,0,0,0,0 +GREAT,0,-2020,0,0,0,0,0 +GREATNESS,0,2009,0,0,0,0,0 +GROUNDLESS,2009,0,0,0,0,0,0 +HAMPER,2009,0,0,0,0,0,0 +HAPPIEST,0,2009,0,0,0,0,0 +HARASS,2009,0,0,0,0,0,0 +HARDSHIP,2009,0,0,0,0,0,0 +HARMFUL,2009,0,0,0,0,0,0 +HARSH,2009,0,0,0,0,0,0 +HARSHNESS,2009,0,0,0,0,0,0 +NONJUDICIAL,0,0,0,2009,0,0,0 +NONPAYMENTS,2009,0,0,0,0,0,0 \ No newline at end of file diff --git a/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/python-solution/task.py b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/python-solution/task.py new file mode 100644 index 000000000000..5965768403e7 --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/python-solution/task.py @@ -0,0 +1,135 @@ +# 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. + +# beam-playground: +# name: FinalSolution2 +# description: Final challenge solution 2. +# multifile: true +# files: +# - name: analysis.csv +# context_line: 57 +# categories: +# - Quickstart +# complexity: ADVANCED +# tags: +# - hellobeam + +import re +import apache_beam as beam +from apache_beam.io import ReadFromText +from apache_beam.options.pipeline_options import PipelineOptions +from apache_beam.transforms.combiners import CountCombineFn + + +class SplitWords(beam.DoFn): + def process(self, element): + return element.lower().split(" ") + + +class Analysis: + def __init__(self, word, negative, positive, uncertainty, litigious, strong, weak, constraining): + self.word = word + self.negative = negative + self.positive = positive + self.uncertainty = uncertainty + self.litigious = litigious + self.strong = strong + self.weak = weak + self.constraining = constraining + + def __str__(self): + return (f'Analysis(word={self.word}, negative={self.negative}, positive={self.positive}, ' + f'uncertainty={self.uncertainty}, litigious={self.litigious}, strong={self.strong}, ' + f'weak={self.weak}, constraining={self.constraining})') + + +class ExtractAnalysis(beam.DoFn): + def process(self, element): + items = re.split(r',(?=(?:[^"]*"[^"]*")*[^"]*$)', element) + if items[1] != 'Negative': + yield Analysis(items[0].lower(), items[1], items[2], items[3], items[4], items[5], items[6], items[7]) + + +class Partition(beam.PTransform): + def expand(self, pcoll): + return pcoll | beam.Partition(self._analysis_partition_fn, 3) + + @staticmethod + def _analysis_partition_fn(analysis, num_partitions): + if analysis.positive != "0": + return 0 + elif analysis.negative != "0": + return 1 + else: + return 2 + + +class LogOutput(beam.DoFn): + def __init__(self, message): + self.message = message + + def process(self, element): + print(f"{self.message}: {element}") + + +class MatchWordDoFn(beam.DoFn): + def process(self, element, analysis): + for a in analysis: + if a.word == element: + yield a + + +def run(): + pipeline_options = PipelineOptions() + with beam.Pipeline(options=pipeline_options) as p: + shakespeare = (p + | 'Read from text file' >> ReadFromText('gs://apache-beam-samples/shakespeare/kinglear.txt') + | 'Split into words' >> beam.ParDo(SplitWords()) + | 'Filter empty words' >> beam.Filter(bool)) + + analysis = (p + | 'Read from csv file' >> ReadFromText('analysis.csv') + | 'Extract Analysis' >> beam.ParDo(ExtractAnalysis())) + + matches = shakespeare | beam.ParDo(MatchWordDoFn(), beam.pvalue.AsList(analysis)) + + result = matches | Partition() + + positive_words = result[0] + negative_words = result[1] + + (positive_words + | 'Count Positive Words' >> beam.CombineGlobally(CountCombineFn()).without_defaults() + | 'Log Positive Words' >> beam.ParDo(LogOutput('Positive word count'))) + + (positive_words + | 'Filter Strong or Weak Positive Words' >> beam.Filter( + lambda analysis: analysis.strong != '0' or analysis.weak != '0') + | 'Count Strong or Weak Positive Words' >> beam.CombineGlobally(CountCombineFn()).without_defaults() + | 'Log Strong or Weak Positive Words' >> beam.ParDo(LogOutput('Positive words with enhanced effect count'))) + + (negative_words + | 'Count Negative Words' >> beam.CombineGlobally(CountCombineFn()).without_defaults() + | 'Log Negative Words' >> beam.ParDo(LogOutput('Negative word count'))) + + (negative_words + | 'Filter Strong or Weak Negative Words' >> beam.Filter( + lambda analysis: analysis.strong != '0' or analysis.weak != '0') + | 'Count Strong or Weak Negative Words' >> beam.CombineGlobally(CountCombineFn()).without_defaults() + | 'Log Strong or Weak Negative Words' >> beam.ParDo(LogOutput('Negative words with enhanced effect count'))) + +if __name__ == "__main__": + run() diff --git a/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/unit-info.yaml b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/unit-info.yaml new file mode 100644 index 000000000000..9bd80fe93f33 --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/final-challenge-2/unit-info.yaml @@ -0,0 +1,27 @@ +# +# 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. +# + +sdk: + - Java + - Python + - Go +id: final-challenge-2 +name: Final Challenge 2 +taskName: FinalChallenge2 +solutionName: FinalSolution2 diff --git a/learning/tour-of-beam/learning-content/final-challenge/module-info.yaml b/learning/tour-of-beam/learning-content/final-challenge/module-info.yaml new file mode 100644 index 000000000000..e031bd36da09 --- /dev/null +++ b/learning/tour-of-beam/learning-content/final-challenge/module-info.yaml @@ -0,0 +1,29 @@ +# +# 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. +# + +sdk: + - Java + - Python + - Go +id: final-challenge +name: Final challenge +complexity: ADVANCED +content: +- final-challenge-1 +- final-challenge-2 diff --git a/learning/tour-of-beam/learning-content/introduction/introduction-concepts/creating-collections/from-memory/go-example/from_memory.go b/learning/tour-of-beam/learning-content/introduction/introduction-concepts/creating-collections/from-memory/go-example/from_memory.go index ef8cccb3bc19..5ed38c2c8331 100644 --- a/learning/tour-of-beam/learning-content/introduction/introduction-concepts/creating-collections/from-memory/go-example/from_memory.go +++ b/learning/tour-of-beam/learning-content/introduction/introduction-concepts/creating-collections/from-memory/go-example/from_memory.go @@ -17,7 +17,7 @@ // name: ParDo // description: ParDo example. // multifile: false -// context_line: 32 +// context_line: 37 // categories: // - Quickstart // complexity: BASIC diff --git a/learning/tour-of-beam/learning-content/introduction/introduction-concepts/creating-collections/reading-from-csv/go-example/csvExample.go b/learning/tour-of-beam/learning-content/introduction/introduction-concepts/creating-collections/reading-from-csv/go-example/csvExample.go index a3417354a307..1967afc14381 100644 --- a/learning/tour-of-beam/learning-content/introduction/introduction-concepts/creating-collections/reading-from-csv/go-example/csvExample.go +++ b/learning/tour-of-beam/learning-content/introduction/introduction-concepts/creating-collections/reading-from-csv/go-example/csvExample.go @@ -20,7 +20,7 @@ // name: CSV // description: CSV example. // multifile: false -// context_line: 44 +// context_line: 49 // categories: // - Quickstart // complexity: BASIC diff --git a/learning/tour-of-beam/learning-content/introduction/introduction-concepts/creating-collections/reading-from-text/go-example/textIo.go b/learning/tour-of-beam/learning-content/introduction/introduction-concepts/creating-collections/reading-from-text/go-example/textIo.go index 38d18d59bb00..3a59f2a95807 100644 --- a/learning/tour-of-beam/learning-content/introduction/introduction-concepts/creating-collections/reading-from-text/go-example/textIo.go +++ b/learning/tour-of-beam/learning-content/introduction/introduction-concepts/creating-collections/reading-from-text/go-example/textIo.go @@ -19,7 +19,7 @@ // name: TextIO // description: TextIO example. // multifile: false -// context_line: 46 +// context_line: 51 // categories: // - Quickstart // complexity: BASIC diff --git a/learning/tour-of-beam/learning-content/introduction/introduction-concepts/pipeline-concepts/creating-pipeline/go-example/main.go b/learning/tour-of-beam/learning-content/introduction/introduction-concepts/pipeline-concepts/creating-pipeline/go-example/main.go index 05e8e0af767b..d86e9881fc1b 100644 --- a/learning/tour-of-beam/learning-content/introduction/introduction-concepts/pipeline-concepts/creating-pipeline/go-example/main.go +++ b/learning/tour-of-beam/learning-content/introduction/introduction-concepts/pipeline-concepts/creating-pipeline/go-example/main.go @@ -17,7 +17,7 @@ // name: creating-pipeline // description: Creating pipeline example. // multifile: false -// context_line: 34 +// context_line: 39 // categories: // - Quickstart // complexity: BASIC diff --git a/learning/tour-of-beam/learning-content/introduction/introduction-concepts/runner-concepts/description.md b/learning/tour-of-beam/learning-content/introduction/introduction-concepts/runner-concepts/description.md index 93345d3c2cfa..bbb976434915 100644 --- a/learning/tour-of-beam/learning-content/introduction/introduction-concepts/runner-concepts/description.md +++ b/learning/tour-of-beam/learning-content/introduction/introduction-concepts/runner-concepts/description.md @@ -150,7 +150,6 @@ python -m apache_beam.examples.wordcount --input gs://dataflow-samples/shakespea ``` {{end}} -{{if (eq .Sdk "java" "python")}} ### Apache Flink runner The Apache Flink Runner can be used to execute Beam pipelines using Apache Flink. For execution, you can choose between a cluster execution mode (e.g. Yarn/Kubernetes/Mesos) or a local embedded execution mode which is useful for testing pipelines. The Flink Runner and Flink are suitable for large scale, continuous jobs, and provide: @@ -164,6 +163,29 @@ The Apache Flink Runner can be used to execute Beam pipelines using Apache Flink Additionally, you can read more about the Apache Flink Runner [here](https://beam.apache.org/documentation/runners/flink/) #### Run example + +{{if (eq .Sdk "go")}} + +Need import: +``` +"github.com/apache/beam/sdks/v2/go/pkg/beam/runners/flink" +``` + +It is necessary to give an endpoint where the runner is raised with `--endpoint`: +``` +$ go install github.com/apache/beam/sdks/v2/go/examples/wordcount +# As part of the initial setup, for non linux users - install package unix before run +$ go get -u golang.org/x/sys/unix +$ wordcount --input gs://dataflow-samples/shakespeare/kinglear.txt \ +--output gs:///counts \ +--runner flink \ +--project your-gcp-project \ +--region your-gcp-region \ +--temp_location gs:///tmp/ \ +--staging_location gs:///binaries/ \ +--worker_harness_container_image=apache/beam_go_sdk:latest \ +--endpoint=localhost:8081 +``` {{end}} {{if (eq .Sdk "java")}} @@ -229,7 +251,6 @@ with beam.Pipeline(options) as p: ``` {{end}} -{{if (eq .Sdk "java" "python")}} ### Apache Spark runner The Apache Spark Runner can be used to execute Beam pipelines using Apache Spark. The Spark Runner can execute Spark pipelines just like a native Spark application; deploying a self-contained application for local mode, running on Spark’s Standalone RM, or using YARN or Mesos. @@ -246,6 +267,28 @@ Additionally, you can read more about the Apache Spark Runner [here](https://bea #### Run example +{{if (eq .Sdk "go")}} + +Need import: +``` +"github.com/apache/beam/sdks/v2/go/pkg/beam/runners/spark" +``` + +It is necessary to give an endpoint where the runner is raised with `--endpoint`: +``` +$ go install github.com/apache/beam/sdks/v2/go/examples/wordcount +# As part of the initial setup, for non linux users - install package unix before run +$ go get -u golang.org/x/sys/unix +$ wordcount --input gs://dataflow-samples/shakespeare/kinglear.txt \ +--output gs:///counts \ +--runner spark \ +--project your-gcp-project \ +--region your-gcp-region \ +--temp_location gs:///tmp/ \ +--staging_location gs:///binaries/ \ +--worker_harness_container_image=apache/beam_go_sdk:latest \ +--endpoint=localhost:8081 +``` {{end}} {{if (eq .Sdk "java")}} @@ -347,7 +390,7 @@ python -m apache_beam.examples.wordcount --input /path/to/inputfile \ ``` {{end}} -{{if (eq .Sdk "java")}} +{{if (eq .Sdk "java" "go")}} ### Samza runner The Apache Samza Runner can be used to execute Beam pipelines using Apache Samza. The Samza Runner executes Beam pipeline in a Samza application and can run locally. The application can further be built into a .tgz file, and deployed to a YARN cluster or Samza standalone cluster with Zookeeper. @@ -363,7 +406,33 @@ The Samza Runner and Samza are suitable for large scale, stateful streaming jobs Additionally, you can read more about the Samza Runner [here](https://beam.apache.org/documentation/runners/samza/) #### Run example +{{end}} + +{{if (eq .Sdk "go")}} +Need import: +``` +"github.com/apache/beam/sdks/v2/go/pkg/beam/runners/samza" +``` + +It is necessary to give an endpoint where the runner is raised with `--endpoint`: +``` +$ go install github.com/apache/beam/sdks/v2/go/examples/wordcount +# As part of the initial setup, for non linux users - install package unix before run +$ go get -u golang.org/x/sys/unix +$ wordcount --input gs://dataflow-samples/shakespeare/kinglear.txt \ +--output gs:///counts \ +--runner samza \ +--project your-gcp-project \ +--region your-gcp-region \ +--temp_location gs:///tmp/ \ +--staging_location gs:///binaries/ \ +--worker_harness_container_image=apache/beam_go_sdk:latest \ +--endpoint=localhost:8081 +``` +{{end}} + +{{if (eq .Sdk "java")}} You can specify your dependency on the Samza Runner by adding the following to your `pom.xml`: ``` diff --git a/learning/tour-of-beam/learning-content/io/big-query-io/read-query/go-example/main.go b/learning/tour-of-beam/learning-content/io/big-query-io/read-query/go-example/main.go index fec979ad7eda..49ab6057bac2 100644 --- a/learning/tour-of-beam/learning-content/io/big-query-io/read-query/go-example/main.go +++ b/learning/tour-of-beam/learning-content/io/big-query-io/read-query/go-example/main.go @@ -18,9 +18,11 @@ // beam-playground: // name: read-query -// description: BigQuery read query example. +// description: BigQueryIO read query example. // multifile: false -// context_line: 40 +// context_line: 42 +// never_run: true +// always_run: true // categories: // - Quickstart // complexity: ADVANCED @@ -29,47 +31,49 @@ package main import ( - _ "context" - _ "flag" - _ "github.com/apache/beam/sdks/v2/go/pkg/beam" - _ "github.com/apache/beam/sdks/v2/go/pkg/beam/io/bigqueryio" - _ "github.com/apache/beam/sdks/v2/go/pkg/beam/log" - _ "github.com/apache/beam/sdks/v2/go/pkg/beam/x/beamx" - _ "github.com/apache/beam/sdks/v2/go/pkg/beam/x/debug" + "context" + "github.com/apache/beam/sdks/v2/go/pkg/beam" + "github.com/apache/beam/sdks/v2/go/pkg/beam/io/bigqueryio" + "github.com/apache/beam/sdks/v2/go/pkg/beam/log" + "github.com/apache/beam/sdks/v2/go/pkg/beam/transforms/top" + "github.com/apache/beam/sdks/v2/go/pkg/beam/x/beamx" + "github.com/apache/beam/sdks/v2/go/pkg/beam/x/debug" + + "cloud.google.com/go/bigquery" internal_log "log" - _ "reflect" + "reflect" ) -// Define the data model: The CommentRow struct is defined, which models one row of HackerNews comments. -//The bigquery tag in the struct field is used to map the struct field to the BigQuery column. -type CommentRow struct { - Text string `bigquery:"text"` +type Game struct { + GameID bigquery.NullString `bigquery:"gameId"` + GameNumber bigquery.NullInt64 `bigquery:"gameNumber"` + SeasonID bigquery.NullString `bigquery:"seasonId"` + Year bigquery.NullInt64 `bigquery:"year"` + Type bigquery.NullString `bigquery:"type"` + DayNight bigquery.NullString `bigquery:"dayNight"` + Duration bigquery.NullString `bigquery:"duration"` } -// Construct the BigQuery query: A constant query is defined that selects the text column -// from the bigquery-public-data.hacker_news.comments table for a certain time range. -const query = `SELECT text -FROM ` + "`bigquery-public-data.hacker_news.comments`" + ` -WHERE time_ts BETWEEN '2013-01-01' AND '2014-01-01' -LIMIT 1000 -` - func main() { internal_log.Println("Running Task") - /* - ctx := context.Background() - p := beam.NewPipeline() - s := p.Root() - project := "tess-372508" - // Build a PCollection by querying BigQuery. - rows := bigqueryio.Query(s, project, query, - reflect.TypeOf(CommentRow{}), bigqueryio.UseStandardSQL()) + ctx := context.Background() + p := beam.NewPipeline() + s := p.Root() + project := "apache-beam-testing" - debug.Print(s, rows) + // Build a PCollection by querying BigQuery. + rows := bigqueryio.Query(s, project, "select * from `bigquery-public-data.baseball.schedules`", + reflect.TypeOf(Game{}), bigqueryio.UseStandardSQL()) - // Now that the pipeline is fully constructed, we execute it. - if err := beamx.Run(ctx, p); err != nil { - log.Exitf(ctx, "Failed to execute job: %v", err) - }*/ + fixedSizeLines := top.Largest(s, rows, 5, less) + + debug.Print(s, fixedSizeLines) + // Now that the pipeline is fully constructed, we execute it. + if err := beamx.Run(ctx, p); err != nil { + log.Exitf(ctx, "Failed to execute job: %v", err) + } +} +func less(a, b Game) bool { + return true } diff --git a/learning/tour-of-beam/learning-content/io/big-query-io/read-query/java-example/Task.java b/learning/tour-of-beam/learning-content/io/big-query-io/read-query/java-example/Task.java index 256c70919ce7..12c1fbcd9b48 100644 --- a/learning/tour-of-beam/learning-content/io/big-query-io/read-query/java-example/Task.java +++ b/learning/tour-of-beam/learning-content/io/big-query-io/read-query/java-example/Task.java @@ -27,11 +27,10 @@ // tags: // - hellobeam +import com.google.api.services.bigquery.model.TableRow; import org.apache.beam.sdk.Pipeline; -import org.apache.beam.sdk.coders.DoubleCoder; import org.apache.beam.sdk.io.gcp.bigquery.BigQueryIO; -import org.apache.beam.sdk.io.gcp.bigquery.BigQueryOptions; -import org.apache.beam.sdk.io.gcp.bigquery.SchemaAndRecord; +import org.apache.beam.sdk.io.gcp.bigquery.BigQueryIO.TypedRead; import org.apache.beam.sdk.options.PipelineOptions; import org.apache.beam.sdk.options.PipelineOptionsFactory; import org.apache.beam.sdk.transforms.DoFn; @@ -40,52 +39,49 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class Task { +public class Task { private static final Logger LOG = LoggerFactory.getLogger(Task.class); - public static void main(String[] args) { - LOG.info("Running Task"); - System.setProperty("GOOGLE_APPLICATION_CREDENTIALS", "to\\path\\credential.json"); - PipelineOptions options = PipelineOptionsFactory.fromArgs(args).create(); - options.setTempLocation("gs://bucket"); - options.as(BigQueryOptions.class).setProject("project-id"); + private static final String WEATHER_SAMPLES_QUERY = + "select * from `clouddataflow-readonly.samples.weather_stations`"; - Pipeline pipeline = Pipeline.create(options); + public static void applyBigQueryTornadoes(Pipeline p) { + /*TypedRead bigqueryIO = + BigQueryIO.readTableRows() + .fromQuery(WEATHER_SAMPLES_QUERY) + .usingStandardSql(); - // pCollection.apply(BigQueryIO.read(... - This part of the pipeline reads from a BigQuery table using a SQL query and stores the result in a PCollection. - // The BigQueryIO.read() function is used to read from BigQuery. It is configured with a lambda function to extract a field from each record. - // The .fromQuery("SELECT field FROM project-id.dataset.table") - // specifies the SQL query used to read from BigQuery. You should replace "field", "project-id", "dataset", and "table" with your specific field name, project id, dataset name, and table name, respectively. -/* - PCollection pCollection = pipeline - .apply(BigQueryIO.read( - (SchemaAndRecord elem) -> (Double) elem.getRecord().get("field")) - .fromQuery( - "SELECT field FROM `project-id.dataset.table`") - .usingStandardSql() - .withCoder(DoubleCoder.of())); - pCollection - .apply("Log words", ParDo.of(new LogOutput<>())); -*/ - pipeline.run(); + PCollection rowsFromBigQuery = p.apply(bigqueryIO); + + rowsFromBigQuery + .apply(ParDo.of(new LogOutput<>("Result: ")));*/ + } + + public static void runBigQueryTornadoes(PipelineOptions options) { + Pipeline p = Pipeline.create(options); + applyBigQueryTornadoes(p); + p.run().waitUntilFinish(); + } + + public static void main(String[] args) { + PipelineOptions options = + PipelineOptionsFactory.fromArgs(args).withValidation().as(PipelineOptions.class); + runBigQueryTornadoes(options); } static class LogOutput extends DoFn { private final String prefix; - LogOutput() { - this.prefix = "Processing element"; - } - LogOutput(String prefix) { this.prefix = prefix; } @ProcessElement - public void processElement(ProcessContext c) throws Exception { - LOG.info(prefix + ": {}", c.element()); + public void processElement(ProcessContext c) { + LOG.info(prefix + c.element()); + c.output(c.element()); } } -} \ No newline at end of file +} diff --git a/learning/tour-of-beam/learning-content/io/big-query-io/read-query/python-example/task.py b/learning/tour-of-beam/learning-content/io/big-query-io/read-query/python-example/task.py index 1fab9964d670..fbb1e1e302d1 100644 --- a/learning/tour-of-beam/learning-content/io/big-query-io/read-query/python-example/task.py +++ b/learning/tour-of-beam/learning-content/io/big-query-io/read-query/python-example/task.py @@ -14,10 +14,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -# beam-playground-broken: +# beam-playground: # name: read-query -# description: TextIO read query example. +# description: BigQueryIO read query example. # multifile: false +# never_run: true +# always_run: true # context_line: 34 # categories: # - Quickstart @@ -26,39 +28,43 @@ # - hellobeam import argparse +import os +import warnings + import apache_beam as beam -from apache_beam.io import ReadFromText -from apache_beam.io import WriteToBigQuery -from apache_beam.options.pipeline_options import PipelineOptions -from apache_beam.options.pipeline_options import SetupOptions +from apache_beam.options.pipeline_options import PipelineOptions, GoogleCloudOptions, SetupOptions +from apache_beam.io.gcp.bigquery import ReadFromBigQueryRequest, ReadAllFromBigQuery + +class WeatherData: + def __init__(self, station_number, wban_number, year, month, day): + self.station_number = station_number + self.wban_number = wban_number + self.year = year + self.month = month + self.day = day + def __str__(self): + return f"Weather Data: Station {self.station_number} (WBAN {self.wban_number}), Date: {self.year}-{self.month}-{self.day}" def run(argv=None): parser = argparse.ArgumentParser() - parser.add_argument('--input', - dest='input', - default='gs://bucket', - help='Input file to process.') known_args, pipeline_args = parser.parse_known_args(argv) pipeline_options = PipelineOptions(pipeline_args) - pipeline_options.view_as(SetupOptions).save_main_session = True + pipeline_options.view_as(PipelineOptions) - """ - (p | 'ReadTable' >> ReadFromBigQuery(query='SELECT * FROM project-id.dataset.table') - This part of the - pipeline reads from a BigQuery table using a SQL query and processes the result. The ReadFromBigQuery( - query='SELECT * FROM project-id.dataset.table') function is used to read from BigQuery. 'LogOutput' >> - beam.Map(lambda elem: print(f"Processing element: {elem['field']}"))) - This part of the pipeline processes the - PCollection and logs the output to the console. It prints the 'field' column from each row in the table. - """ - with beam.Pipeline(options=pipeline_options) as p: - (p #| 'ReadTable' >> beam.io.Read(beam.io.BigQuerySource(query='SELECT * FROM `project-id.dataset.table`'))) - # Each row is a dictionary where the keys are the BigQuery columns - #| beam.Map(lambda elem: elem['field']) - ) + with beam.Pipeline(options=pipeline_options, argv=argv) as p: + (p + # | 'ReadFromBigQuery' >> beam.io.ReadFromBigQuery(query='select * from `apache-beam-testing.clouddataflow_samples.weather_stations`',use_standard_sql=True, + # method=beam.io.ReadFromBigQuery.Method.DIRECT_READ) + # | beam.combiners.Sample.FixedSizeGlobally(5) + # | beam.FlatMap(lambda line: line) + # | beam.Map(lambda element: WeatherData(element['station_number'],element['wban_number'],element['year'],element['month'],element['day'])) + # | beam.Map(print) + ) if __name__ == '__main__': - run() + run() diff --git a/learning/tour-of-beam/learning-content/io/big-query-io/read-table/description.md b/learning/tour-of-beam/learning-content/io/big-query-io/read-table/description.md index ef0231fe90d5..23344989d0aa 100644 --- a/learning/tour-of-beam/learning-content/io/big-query-io/read-table/description.md +++ b/learning/tour-of-beam/learning-content/io/big-query-io/read-table/description.md @@ -20,8 +20,7 @@ limitations under the License. {{if (eq .Sdk "go")}} ``` -rows := bigqueryio.Read(s, bigquery.TableReference{ProjectID: projectID, DatasetID: datasetID, TableID: tableID}) -beam.ParDo0(s, &logOutput{}, rows) +rows := bigqueryio.Read(s, project, "bigquery-public-data:baseball.schedules", reflect.TypeOf(Game{})) ``` The `bigqueryio.Read()` method is called with a `bigquery.TableReference` object that specifies the project, dataset, and table IDs for the `BigQuery` table to read from. @@ -35,11 +34,8 @@ The `logOutput` struct is defined as a custom `DoFn` that implements the Process {{end}} {{if (eq .Sdk "java")}} ``` -PCollection rows = - pipeline - .apply( - "Read from BigQuery query", - BigQueryIO.readTableRows().from("tess-372508.fir.xasw") + PCollection pCollection = pipeline + .apply("ReadFromBigQuery", BigQueryIO.readTableRows().from("clouddataflow-readonly:samples.weather_stations").withMethod(TypedRead.Method.DIRECT_READ)) ``` The `BigQueryIO.readTableRows()` method is called to create a `BigQueryIO.Read` transform that will read data from a `BigQuery` table. @@ -50,10 +46,11 @@ The `Read` transform returns a `PCollection` of `TableRow` objects, which repres {{end}} {{if (eq .Sdk "python")}} ``` -p | 'ReadTable' >> beam.io.ReadFromBigQuery(table=table_spec) | beam.Map(lambda elem: elem['max_temperature']) +p | 'ReadFromBigQuery' >> beam.io.ReadFromBigQuery(table='apache-beam-testing:clouddataflow_samples.weather_stations', + method=beam.io.ReadFromBigQuery.Method.DIRECT_READ) ``` -The `beam.io.ReadFromBigQuery()` method is called to create a `Read` transform that will read data from a `BigQuery` table. The `table_spec` parameter specifies the name of the `BigQuery` table to read from, along with any other configuration options such as **project ID**, **dataset ID**, or **query**. +The `beam.io.ReadFromBigQuery()` method is called to create a `Read` transform that will read data from a `BigQuery` table. The `table` parameter specifies the name of the `BigQuery` table to read from, along with any other configuration options such as **project ID**, **dataset ID**, or **query**. The Read transform returns a `PCollection` of dict objects, where each dictionary represents a single row of data in the `BigQuery` table. {{end}} \ No newline at end of file diff --git a/learning/tour-of-beam/learning-content/io/big-query-io/read-table/go-example/main.go b/learning/tour-of-beam/learning-content/io/big-query-io/read-table/go-example/main.go index f6966264284d..ef2462f4de36 100644 --- a/learning/tour-of-beam/learning-content/io/big-query-io/read-table/go-example/main.go +++ b/learning/tour-of-beam/learning-content/io/big-query-io/read-table/go-example/main.go @@ -21,6 +21,8 @@ // description: BigQueryIO read table example. // multifile: false // context_line: 42 +// never_run: true +// always_run: true // categories: // - Quickstart // complexity: ADVANCED @@ -30,52 +32,48 @@ package main import ( - _ "context" - _ "flag" - _ "github.com/apache/beam/sdks/v2/go/pkg/beam" - _ "github.com/apache/beam/sdks/v2/go/pkg/beam/io/bigqueryio" - _ "github.com/apache/beam/sdks/v2/go/pkg/beam/log" - _ "github.com/apache/beam/sdks/v2/go/pkg/beam/x/beamx" - _ "github.com/apache/beam/sdks/v2/go/pkg/beam/x/debug" + "context" + "github.com/apache/beam/sdks/v2/go/pkg/beam" + "github.com/apache/beam/sdks/v2/go/pkg/beam/io/bigqueryio" + "github.com/apache/beam/sdks/v2/go/pkg/beam/log" + "github.com/apache/beam/sdks/v2/go/pkg/beam/transforms/top" + "github.com/apache/beam/sdks/v2/go/pkg/beam/x/beamx" + "github.com/apache/beam/sdks/v2/go/pkg/beam/x/debug" + + "cloud.google.com/go/bigquery" internal_log "log" - _ "reflect" - "time" + "reflect" ) -type Comment struct { - ID int `bigquery:"id"` - By string `bigquery:"by"` - Author string `bigquery:"author"` - Time int `bigquery:"time"` - TimeTS time.Time `bigquery:"time_ts"` - Text string `bigquery:"text"` - Parent int `bigquery:"parent"` - Deleted bool `bigquery:"deleted"` - Dead bool `bigquery:"dead"` - Ranking float64 `bigquery:"ranking"` +type Game struct { + GameID bigquery.NullString `bigquery:"gameId"` + GameNumber bigquery.NullInt64 `bigquery:"gameNumber"` + SeasonID bigquery.NullString `bigquery:"seasonId"` + Year bigquery.NullInt64 `bigquery:"year"` + Type bigquery.NullString `bigquery:"type"` + DayNight bigquery.NullString `bigquery:"dayNight"` + Duration bigquery.NullString `bigquery:"duration"` } -// rows := bigqueryio.Read(s, project, "bigquery-public-data:hacker_news.comments", reflect.TypeOf(Comment{})) -// reads data from the specified BigQuery table and produces a PCollection where each element is a Comment. -// The reflect.TypeOf(Comment{}) is used to tell BigQuery the schema of the data. - -// debug.Print(s, rows) prints the elements of the PCollection to stdout for debugging purposes. - func main() { internal_log.Println("Running Task") - /* - ctx := context.Background() - p := beam.NewPipeline() - s := p.Root() - project := "tess-372508" - // Build a PCollection by querying BigQuery. - rows := bigqueryio.Read(s, project, "bigquery-public-data:hacker_news.comments", reflect.TypeOf(Comment{})) + ctx := context.Background() + p := beam.NewPipeline() + s := p.Root() + project := "apache-beam-testing" - debug.Print(s, rows) + // Build a PCollection by querying BigQuery. + rows := bigqueryio.Read(s, project, "bigquery-public-data:baseball.schedules", reflect.TypeOf(Game{})) - // Now that the pipeline is fully constructed, we execute it. - if err := beamx.Run(ctx, p); err != nil { - log.Exitf(ctx, "Failed to execute job: %v", err) - }*/ + fixedSizeLines := top.Largest(s, rows, 5, less) + + debug.Print(s, fixedSizeLines) + // Now that the pipeline is fully constructed, we execute it. + if err := beamx.Run(ctx, p); err != nil { + log.Exitf(ctx, "Failed to execute job: %v", err) + } +} +func less(a, b Game) bool { + return true } diff --git a/learning/tour-of-beam/learning-content/io/big-query-io/read-table/java-example/Task.java b/learning/tour-of-beam/learning-content/io/big-query-io/read-table/java-example/Task.java index 0ec28d151f5d..206a0c0b8ee0 100644 --- a/learning/tour-of-beam/learning-content/io/big-query-io/read-table/java-example/Task.java +++ b/learning/tour-of-beam/learning-content/io/big-query-io/read-table/java-example/Task.java @@ -20,6 +20,8 @@ // name: read-table // description: BigQueryIO read table example. // multifile: false +// never_run: true +// always_run: true // context_line: 56 // categories: // - Quickstart @@ -33,11 +35,16 @@ import org.apache.beam.sdk.io.gcp.bigquery.BigQueryOptions; import org.apache.beam.sdk.options.PipelineOptions; import org.apache.beam.sdk.options.PipelineOptionsFactory; -import org.apache.beam.sdk.transforms.DoFn; +import org.apache.beam.sdk.transforms.Flatten; +import org.apache.beam.sdk.transforms.PTransform; import org.apache.beam.sdk.transforms.ParDo; +import org.apache.beam.sdk.transforms.DoFn; +import org.apache.beam.sdk.transforms.Sample; import org.apache.beam.sdk.values.PCollection; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.apache.beam.sdk.io.gcp.bigquery.BigQueryIO.TypedRead; + public class Task { @@ -45,26 +52,29 @@ public class Task { public static void main(String[] args) { LOG.info("Running Task"); - System.setProperty("GOOGLE_APPLICATION_CREDENTIALS", "to\\path\\credential.json"); PipelineOptions options = PipelineOptionsFactory.fromArgs(args).create(); - options.setTempLocation("gs://bucket"); - options.as(BigQueryOptions.class).setProject("project-id"); + options.as(BigQueryOptions.class).setProject("apache-beam-testing"); Pipeline pipeline = Pipeline.create(options); /* - * BigQueryIO.readTableRows().from("bucket.project-id.table") reads from the specified BigQuery table, and outputs a - * PCollection of TableRow objects. Each TableRow represents a row in the BigQuery table. - * The .apply("Log words", ParDo.of(new LogOutput<>())) line applies a ParDo transform that logs each row. This is done using the LogOutput class, a custom DoFn (element-wise function). - * LogOutput class: This is a custom DoFn that logs each element in the input PCollection. This is used to inspect the data in the pipeline for debugging or monitoring purposes. - */ -/* + * BigQueryIO.readTableRows().from("bucket.project-id.table") reads from the specified BigQuery table, and outputs a + * PCollection of TableRow objects. Each TableRow represents a row in the BigQuery table. + * The .apply("Log words", ParDo.of(new LogOutput<>())) line applies a ParDo transform that logs each row. This is done using the LogOutput class, a custom DoFn (element-wise function). + * LogOutput class: This is a custom DoFn that logs each element in the input PCollection. This is used to inspect the data in the pipeline for debugging or monitoring purposes. + */ + PCollection pCollection = pipeline - .apply("ReadFromBigQuery", BigQueryIO.readTableRows().from("bucket.project-id.table")); + .apply("ReadFromBigQuery", BigQueryIO.readTableRows().from("clouddataflow-readonly:samples.weather_stations").withMethod(TypedRead.Method.DIRECT_READ)); - pCollection + final PTransform, PCollection>> sample = Sample.fixedSizeGlobally(5); + + PCollection limitedPCollection = pCollection.apply(sample).apply(Flatten.iterables()); + + + limitedPCollection .apply("Log words", ParDo.of(new LogOutput<>())); -*/ + pipeline.run(); diff --git a/learning/tour-of-beam/learning-content/io/big-query-io/read-table/python-example/task.py b/learning/tour-of-beam/learning-content/io/big-query-io/read-table/python-example/task.py index c8fcccbe9e9b..e89779e5a26b 100644 --- a/learning/tour-of-beam/learning-content/io/big-query-io/read-table/python-example/task.py +++ b/learning/tour-of-beam/learning-content/io/big-query-io/read-table/python-example/task.py @@ -14,10 +14,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -# beam-playground-broken: +# beam-playground: # name: read-table -# description: TextIO read table example. +# description: BigQueryIO read table example. # multifile: false +# never_run: true +# always_run: true # context_line: 34 # categories: # - Quickstart @@ -27,34 +29,36 @@ import argparse import apache_beam as beam -from apache_beam.io import ReadFromText -from apache_beam.io import WriteToBigQuery -from apache_beam.options.pipeline_options import PipelineOptions -from apache_beam.options.pipeline_options import SetupOptions +from apache_beam.options.pipeline_options import PipelineOptions, GoogleCloudOptions, SetupOptions +class WeatherData: + def __init__(self, station_number, wban_number, year, month, day): + self.station_number = station_number + self.wban_number = wban_number + self.year = year + self.month = month + self.day = day + + def __str__(self): + return f"Weather Data: Station {self.station_number} (WBAN {self.wban_number}), Date: {self.year}-{self.month}-{self.day}" def run(argv=None): parser = argparse.ArgumentParser() - parser.add_argument('--input', - dest='input', - default='gs://bucket', - help='Input file to process.') known_args, pipeline_args = parser.parse_known_args(argv) pipeline_options = PipelineOptions(pipeline_args) - pipeline_options.view_as(SetupOptions).save_main_session = True + pipeline_options.view_as(PipelineOptions) - # ReadFromBigQuery: This operation reads from a BigQuery table and outputs a PCollection of dictionaries. Each - # dictionary represents a row in the BigQuery table, where the keys are the BigQuery column names. beam.Map: This - # operation applies a function to each element in the PCollection, here, it selects a specific field from each row. - with beam.Pipeline(options=pipeline_options) as p: - (p #| 'ReadTable' >> beam.io.ReadFromBigQuery(table='project-id.dataset.table') - # Each row is a dictionary where the keys are the BigQuery columns - #| beam.Map(lambda elem: elem['field']) - ) + with beam.Pipeline(options=pipeline_options, argv=argv) as p: + (p | 'ReadFromBigQuery' >> beam.io.ReadFromBigQuery(table='apache-beam-testing:clouddataflow_samples.weather_stations', + method=beam.io.ReadFromBigQuery.Method.DIRECT_READ) + | beam.combiners.Sample.FixedSizeGlobally(5) + | beam.FlatMap(lambda line: line) + | beam.Map(lambda element: WeatherData(element['station_number'],element['wban_number'],element['year'],element['month'],element['day'])) + | beam.Map(print)) if __name__ == '__main__': - run() + run() diff --git a/learning/tour-of-beam/learning-content/splittable-dofn/module-info.yaml b/learning/tour-of-beam/learning-content/splittable-dofn/module-info.yaml new file mode 100644 index 000000000000..33573926150f --- /dev/null +++ b/learning/tour-of-beam/learning-content/splittable-dofn/module-info.yaml @@ -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. +# + +sdk: + - Java + - Python + - Go +id: splittable-dofn +name: Splittable doFn +complexity: ADVANCED +content: +- splittable + + diff --git a/learning/tour-of-beam/learning-content/splittable-dofn/splittable/description.md b/learning/tour-of-beam/learning-content/splittable-dofn/splittable/description.md new file mode 100644 index 000000000000..9cc8f1ba2f30 --- /dev/null +++ b/learning/tour-of-beam/learning-content/splittable-dofn/splittable/description.md @@ -0,0 +1,129 @@ + +### Splittable DoFn + +A `Splittable DoFn` is a type of transform in Apache Beam that allows for parallel processing of a large input collection by dividing it into smaller, independent chunks. + +When using a regular `DoFn`, the input collection is processed by a single worker, which can lead to performance bottlenecks and slow processing times for very large inputs. With a `Splittable DoFn`, the input collection is divided into smaller, independent chunks that can be processed by multiple workers in parallel, allowing for faster and more efficient processing. + +`Splittable DoFn`s are designed to work with sources that can be efficiently divided into chunks, such as files or databases. When using a `Splittable DoFn`, the input source is first divided into a set of splits, each of which can be processed independently by a worker. The number of splits is determined dynamically based on the size of the input collection and the available resources. + +Overall, `Splittable DoFn`s are a powerful tool for processing large datasets in parallel, and are an important component of many Apache Beam data processing pipelines. + + +{{if (eq .Sdk "go")}} +To implement `Splittable DoFn` in the Go SDK, we need to create a `struct` with methods. There are basic methods that should be implemented. + +* `CreateInitialRestriction` function is used to create an initial restriction for a Splittable DoFn. function takes a `DoFn` instance, an input element, and a `Restriction` instance, and returns an initial restriction for the input element. +* `SplitRestriction` is a method that is used in `Splittable DoFn` in Apache Beam to split a restriction into smaller sub-restrictions for parallel processing. +* `RestrictionSize` is a method used in `Splittable DoFn` in Apache Beam to specify the size of a restriction. +* `CreateTracker` is a method, creates a `LockRTrackers` tracker that wraps the `offsetRange.NewTracker` for each restriction. +* `ProcessElement` is a user-defined function that is executed for each element in a `PCollection`. It is typically used in a `ParDo` transform, which applies a user-defined function to each element in the input `PCollection`, producing zero or more output elements for each input element. +``` +type readFn struct { +} + +func (fn *readFn) CreateInitialRestriction(_ string, size int64) offsetrange.Restriction { + return offsetrange.Restriction{ + Start: 0, + End: size, + } +} + +func (fn *readFn) SplitRestriction(_ string, _ int64, rest offsetrange.Restriction) []offsetrange.Restriction { + ... + return splits +} + +func (fn *readFn) RestrictionSize(_ string, _ int64, rest offsetrange.Restriction) float64 { + return rest.Size() +} + +func (fn *readFn) CreateTracker(rest offsetrange.Restriction) *sdf.LockRTracker { + return sdf.NewLockRTracker(offsetrange.NewTracker(rest)) +} + +func (fn *readFn) ProcessElement(ctx context.Context, rt *sdf.LockRTracker, filename string, _ int64, emit func(string)) error { + log.Infof(ctx, "Reading from %v", filename) + ... +} +``` +{{end}} +{{if (eq .Sdk "java")}} +To implement `Splittable DoFn` in the Java SDK, we need to create a class with annotated methods which extend `DoFn`. There are basic annotated that should be implemented. + +* `@ProcessElement` is a method-level annotation in Apache Beam that is used to indicate that a method should be executed for each element of an input `PCollection` in a `ParDo` transform. +* `@GetInitialRestriction` is a method-level annotation in Apache Beam that is used to indicate that a method should be executed to generate the initial set of restrictions for a `Splittable DoFn`. +* `@GetRestrictionCoder` -is a method-level annotation in Apache Beam that is used in `Splittable DoFn` to indicate a method that returns a `Coder` for the restriction type of a `DoFn`. A `Splittable DoFn` processes an input collection by dividing it into smaller, independent chunks called restrictions that can be processed in parallel. Each restriction is encoded and decoded by a coder, which is responsible for serializing and deserializing the restriction between workers. +* `@SplitRestriction` is a method-level annotation in Apache Beam that is used in `Splittable DoFn` to indicate a method that splits a restriction into multiple sub-restrictions for parallel processing. +``` +static class SplitLinesFn extends DoFn> { + + @ProcessElement + public void process(ProcessContext c, RestrictionTracker tracker) { + ... + } + + @GetInitialRestriction + public OffsetRange getInitialRestriction(@Element String e) { + ... + } + + @GetRestrictionCoder + public Coder getRestrictionCoder() { + return OffsetRange.Coder.of(); + } + + @SplitRestriction + public void splitRestriction(@Element String input, @Restriction OffsetRange restriction, OutputReceiver receiver) throws Exception { + ... + } +} +``` +{{end}} +{{if (eq .Sdk "python")}} +To implement `Splittable DoFn` in the Python SDK, we need to create a class with methods which extend `DoFn`. In the `process` method, you need to add the `RestrictionParam` parameter which accepts `RestrictionProvider`. There are basic methods that should be implemented. + +* `create_tracker` - is a method used in Apache Beam's `Splittable DoFn` API to create a tracker object for tracking the progress of processing elements within a bundle. +* `initial_restriction` function is used to create an initial restriction for a Splittable DoFn. function takes a `DoFn` instance, an input element, and a `OffsetRestrictionTracker` instance, and returns an initial restriction for the input element. +* `restriction_size` is a method used in `Splittable DoFn` in Apache Beam to specify the size of a restriction. +* `split` - is a method that is used in `Splittable DoFn` in Apache Beam to split a restriction into smaller sub-restrictions for parallel processing. +* `process` is a user-defined function that is executed for each element in a `PCollection`. It is typically used in a `ParDo` transform, which applies a user-defined function to each element in the input `PCollection`, producing zero or more output elements for each input element. +``` +class SplitLinesFn(beam.RestrictionProvider): + def create_tracker(self, restriction): + ... + + def initial_restriction(self, element): + ... + + def restriction_size(self, element, restriction): + ... + + def split(self, element, restriction): + ... + +class MyFileSource(beam.DoFn): + def process(self, element, restriction_tracker=DoFn.RestrictionParam(SplitLinesFn())): + input = element.split() + cur = restriction_tracker.current_restriction().start + while restriction_tracker.try_claim(cur): + yield cur, input[cur] + cur += 1 +``` +{{end}} + +### Playground exercise + +You can implement `Splittable DoFn` for processing for big data. For example, databases. Write a program that reads the database using apache beam using `Splittable DoFn`. diff --git a/learning/tour-of-beam/learning-content/splittable-dofn/splittable/go-example/main.go b/learning/tour-of-beam/learning-content/splittable-dofn/splittable/go-example/main.go new file mode 100644 index 000000000000..42549f4c51c0 --- /dev/null +++ b/learning/tour-of-beam/learning-content/splittable-dofn/splittable/go-example/main.go @@ -0,0 +1,225 @@ +/* + * 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. + */ + +// beam-playground: +// name: splittable-dofn +// description: Splittable DoFn example +// multifile: false +// context_line: 55 +// categories: +// - Quickstart +// complexity: ADVANCED +// tags: +// - hellobeam + +package main + +import ( + "bufio" + "context" + "fmt" + "github.com/apache/beam/sdks/v2/go/pkg/beam" + "github.com/apache/beam/sdks/v2/go/pkg/beam/core/sdf" + "github.com/apache/beam/sdks/v2/go/pkg/beam/io/filesystem" + "github.com/apache/beam/sdks/v2/go/pkg/beam/io/rtrackers/offsetrange" + "github.com/apache/beam/sdks/v2/go/pkg/beam/log" + "github.com/apache/beam/sdks/v2/go/pkg/beam/transforms/filter" + "github.com/apache/beam/sdks/v2/go/pkg/beam/x/beamx" + "github.com/apache/beam/sdks/v2/go/pkg/beam/x/debug" + "io" + "reflect" + "strings" +) + +func init() { + beam.RegisterType(reflect.TypeOf((*readFn)(nil)).Elem()) + beam.RegisterFunction(sizeFn) + beam.RegisterFunction(expandFn) +} + +func main() { + ctx := context.Background() + + p, s := beam.NewPipelineWithRoot() + + file := Read(s, "gs://apache-beam-samples/counts-00000-of-00003") + + lines := getLines(s, file) + + debug.Print(s, lines) + + err := beamx.Run(ctx, p) + + if err != nil { + log.Exitf(context.Background(), "Failed to execute job: %v", err) + } +} + +func getLines(s beam.Scope, input beam.PCollection) beam.PCollection { + return filter.Include(s, input, func(element string) bool { + return element != "" + }) +} + +func Read(s beam.Scope, glob string) beam.PCollection { + s = s.Scope("Read") + filesystem.ValidateScheme(glob) + + return read(s, beam.Create(s, glob)) +} + +func read(s beam.Scope, col beam.PCollection) beam.PCollection { + files := beam.ParDo(s, expandFn, col) + sized := beam.ParDo(s, sizeFn, files) + return beam.ParDo(s, &readFn{}, sized) +} + +func expandFn(ctx context.Context, glob string, emit func(string)) error { + if strings.TrimSpace(glob) == "" { + return nil // ignore empty string elements here + } + + fs, err := filesystem.New(ctx, glob) + if err != nil { + return err + } + defer fs.Close() + + files, err := fs.List(ctx, glob) + if err != nil { + return err + } + for _, filename := range files { + emit(filename) + } + return nil +} + +func sizeFn(ctx context.Context, filename string) (string, int64, error) { + fs, err := filesystem.New(ctx, filename) + if err != nil { + return "", -1, err + } + defer fs.Close() + + size, err := fs.Size(ctx, filename) + if err != nil { + return "", -1, err + } + return filename, size, nil +} + +type readFn struct { +} + +func (fn *readFn) CreateInitialRestriction(_ string, size int64) offsetrange.Restriction { + return offsetrange.Restriction{ + Start: 0, + End: size, + } +} + +const ( + blockSize int64 = 64 * 1024 * 1024 // 64 MB + tooSmall = blockSize / 4 +) + +func (fn *readFn) SplitRestriction(_ string, _ int64, rest offsetrange.Restriction) []offsetrange.Restriction { + splits := rest.SizedSplits(blockSize) + numSplits := len(splits) + if numSplits > 1 { + last := splits[numSplits-1] + if last.End-last.Start <= tooSmall { + // Last restriction is too small, so merge it with previous one. + splits[numSplits-2].End = last.End + splits = splits[:numSplits-1] + } + } + return splits +} + +func (fn *readFn) RestrictionSize(_ string, _ int64, rest offsetrange.Restriction) float64 { + return rest.Size() +} + +// CreateTracker creates sdf.LockRTrackers wrapping offsetRange.Trackers for +// each restriction. +func (fn *readFn) CreateTracker(rest offsetrange.Restriction) *sdf.LockRTracker { + return sdf.NewLockRTracker(offsetrange.NewTracker(rest)) +} + +func (fn *readFn) ProcessElement(ctx context.Context, rt *sdf.LockRTracker, filename string, _ int64, emit func(string)) error { + log.Infof(ctx, "Reading from %v", filename) + + fs, err := filesystem.New(ctx, filename) + if err != nil { + return err + } + defer fs.Close() + + fd, err := fs.OpenRead(ctx, filename) + if err != nil { + return err + } + defer fd.Close() + + rd := bufio.NewReader(fd) + + i := rt.GetRestriction().(offsetrange.Restriction).Start + if i > 0 { + i-- + n, err := rd.Discard(int(i)) // Scan to just before restriction. + if err == io.EOF { + return fmt.Errorf("TextIO restriction lies outside the file being read. "+ + "Restriction begins at %v bytes, but file is only %v bytes.", i+1, n) + } + if err != nil { + return err + } + line, err := rd.ReadString('\n') // Read until the first line within the restriction. + if err == io.EOF { + // No lines start in the restriction but it's still valid, so + // finish claiming before returning to avoid errors. + rt.TryClaim(rt.GetRestriction().(offsetrange.Restriction).End) + return nil + } + if err != nil { + return err + } + i += int64(len(line)) + } + + // Claim each line until we claim a line outside the restriction. + for rt.TryClaim(i) { + line, err := rd.ReadString('\n') + if err == io.EOF { + if len(line) != 0 { + emit(strings.TrimSuffix(line, "\n")) + } + // Finish claiming restriction before breaking to avoid errors. + rt.TryClaim(rt.GetRestriction().(offsetrange.Restriction).End) + break + } + if err != nil { + return err + } + emit(strings.TrimSuffix(line, "\n")) + i += int64(len(line)) + } + return nil +} \ No newline at end of file diff --git a/learning/tour-of-beam/learning-content/splittable-dofn/splittable/java-example/Task.java b/learning/tour-of-beam/learning-content/splittable-dofn/splittable/java-example/Task.java new file mode 100644 index 000000000000..6ac6cec6e909 --- /dev/null +++ b/learning/tour-of-beam/learning-content/splittable-dofn/splittable/java-example/Task.java @@ -0,0 +1,122 @@ +/* + * 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. + */ + +// beam-playground: +// name: splittable-dofn +// description: Splittable DoFn example. +// multifile: false +// context_line: 48 +// categories: +// - Quickstart +// complexity: ADVANCED +// tags: +// - hellobeam + +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.coders.Coder; +import org.apache.beam.sdk.io.range.OffsetRange; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +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.splittabledofn.RestrictionTracker; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.sdk.values.PCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class Task { + + + public static void main(String[] args) { + PipelineOptions options = PipelineOptionsFactory.fromArgs(args).create(); + + Pipeline pipeline = Pipeline.create(options); + + PCollection input = pipeline.apply(Create.of("Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.")); + + + input + .apply(ParDo.of(new SplitLinesFn())) + .apply(ParDo.of(new LogOutput<>())); + + + pipeline.run().waitUntilFinish(); + } + + + static class SplitLinesFn extends DoFn> { + private static final Integer batchSize = 5; + + @ProcessElement + public void process(ProcessContext c, RestrictionTracker tracker) { + String[] words = c.element().split(" "); + for (long i = tracker.currentRestriction().getFrom(); tracker.tryClaim(i); ++i) { + c.output(KV.of(i, words[(int) i])); + } + } + + @GetInitialRestriction + public OffsetRange getInitialRestriction(@Element String e) { + return new OffsetRange(0, e.split(" ").length); + } + + @GetRestrictionCoder + public Coder getRestrictionCoder() { + return OffsetRange.Coder.of(); + } + + @SplitRestriction + public void splitRestriction(@Element String input, @Restriction OffsetRange restriction, OutputReceiver receiver) throws Exception { + long start = restriction.getFrom(); + long size = restriction.getTo(); + long splitSizeBytes = size / batchSize; + + while (start < size) { + long splitEnd = start + splitSizeBytes; + if (splitEnd >= size) { + splitEnd = size; + } + receiver.output(new OffsetRange(start, splitEnd)); + start = splitEnd; + } + } + } + + static class LogOutput extends DoFn { + + private static final Logger LOG = LoggerFactory.getLogger(Task.class); + + private final String prefix; + + LogOutput() { + this.prefix = "Processing element"; + } + + LogOutput(String prefix) { + this.prefix = prefix; + } + + @ProcessElement + public void processElement(ProcessContext c) throws Exception { + LOG.info(prefix + ": {}", c.element()); + } + } +} \ No newline at end of file diff --git a/learning/tour-of-beam/learning-content/splittable-dofn/splittable/python-example/task.py b/learning/tour-of-beam/learning-content/splittable-dofn/splittable/python-example/task.py new file mode 100644 index 000000000000..890048c46ec5 --- /dev/null +++ b/learning/tour-of-beam/learning-content/splittable-dofn/splittable/python-example/task.py @@ -0,0 +1,74 @@ +# 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. + +# beam-playground: +# name: splittable-dofn +# description: Splittable DoFn example. +# multifile: false +# context_line: 64 +# categories: +# - Quickstart +# complexity: BASIC +# tags: +# - hellobeam + +import apache_beam as beam +from apache_beam import DoFn +from apache_beam.io import restriction_trackers +from apache_beam.io.restriction_trackers import OffsetRange + + +class SplitLinesFn(beam.RestrictionProvider): + def create_tracker(self, restriction): + return restriction_trackers.OffsetRestrictionTracker(restriction) + + def initial_restriction(self, element): + return OffsetRange(0, len(element.split())) + + def restriction_size(self, element, restriction): + return restriction.size() + + def split(self, element, restriction): + start = restriction.start + size = restriction.stop - restriction.start + split_size_bytes = size // 5 + while start < restriction.stop: + split_end = start + split_size_bytes + if split_end >= restriction.stop: + split_end = restriction.stop + yield OffsetRange(start, split_end) + start = split_end + +class MyFileSource(beam.DoFn): + def process(self, element, restriction_tracker=DoFn.RestrictionParam(SplitLinesFn())): + input = element.split() + cur = restriction_tracker.current_restriction().start + while restriction_tracker.try_claim(cur): + yield cur, input[cur] + cur += 1 + + +with beam.Pipeline() as p: + lines = (p | 'Create' >> beam.Create(["Lorem Ipsum is simply dummy text of the printing and typesetting industry. " + "Lorem Ipsum has been the industry's standard dummy text ever since the " + "1500s, when an unknown printer took a galley of type and scrambled it to " + "make a type specimen book. It has survived not only five centuries, " + "but also the leap into electronic typesetting, remaining essentially " + "unchanged. It was popularised in the 1960s with the release of Letraset " + "sheets containing Lorem Ipsum passages, and more recently with desktop " + "publishing software like Aldus PageMaker including versions of Lorem Ipsum."]) + | beam.ParDo(MyFileSource()) + | 'Print' >> beam.Map(print)) diff --git a/learning/tour-of-beam/learning-content/splittable-dofn/splittable/unit-info.yaml b/learning/tour-of-beam/learning-content/splittable-dofn/splittable/unit-info.yaml new file mode 100644 index 000000000000..c657dc64c351 --- /dev/null +++ b/learning/tour-of-beam/learning-content/splittable-dofn/splittable/unit-info.yaml @@ -0,0 +1,27 @@ +# +# 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. +# + +sdk: + - Java + - Python + - Go +id: splittable +name: Splittable doFn +complexity: ADVANCED +taskName: splittable-dofn diff --git a/learning/tour-of-beam/terraform/build.gradle.kts b/learning/tour-of-beam/terraform/build.gradle.kts index 8c320dd242a7..30d30309273c 100644 --- a/learning/tour-of-beam/terraform/build.gradle.kts +++ b/learning/tour-of-beam/terraform/build.gradle.kts @@ -49,7 +49,7 @@ tasks.register("terraformRef") { tasks.register("terraformApplyBackend") { group = "backend-deploy" - + val pg_router_host = if (project.extensions.extraProperties.has("pg_router_host")) { project.extensions.extraProperties["pg_router_host"] as String } else { @@ -64,7 +64,7 @@ tasks.register("terraformApplyBackend") { "-var=project_id=$(gcloud config get-value project)", "-var-file=./common.tfvars" ) - + tasks.getByName("uploadLearningMaterials").mustRunAfter(this) } @@ -174,7 +174,7 @@ tasks.register("firebaseHostingCreate") { }.assertNormalExitValue() println("Firebase hosting site has been added to project $projectId.") } - + exec { executable("firebase") args("target:apply", "hosting", webapp_id , webapp_id) @@ -184,12 +184,12 @@ tasks.register("firebaseHostingCreate") { val file = project.file("../frontend/firebase.json") val content = file.readText() - + val oldContent = """"public": "build/web",""" val newContent = """"public": "build/web", "target": "$webapp_id",""" val updatedContent = content.replace(oldContent, newContent) - + file.writeText(updatedContent) } } diff --git a/local-env-setup.sh b/local-env-setup.sh index f6195ce43d3a..6cd1092023a5 100755 --- a/local-env-setup.sh +++ b/local-env-setup.sh @@ -24,7 +24,7 @@ darwin_install_pip3_packages() { install_go_packages(){ echo "Installing goavro" - go get github.com/linkedin/goavro + go get github.com/linkedin/goavro/v2 # As we are using bash, we are assuming .bashrc exists. grep -qxF "export GOPATH=${PWD}/sdks/go/examples/.gogradle/project_gopath" ~/.bashrc gopathExists=$? @@ -55,7 +55,7 @@ if [ "$kernelname" = "Linux" ]; then exit fi - for ver in 3.7 3.8 3.9 3.10 3; do + for ver in 3.8 3.9 3.10 3.11 3; do apt install --yes python$ver-venv done @@ -89,7 +89,7 @@ elif [ "$kernelname" = "Darwin" ]; then echo "Installing openjdk@8" brew install openjdk@8 fi - for ver in 3.7 3.8 3.9; do + for ver in 3.8 3.9 3.10 3.11; do if brew ls --versions python@$ver > /dev/null; then echo "python@$ver already installed. Skipping" brew info python@$ver diff --git a/model/fn-execution/src/main/proto/org/apache/beam/model/fn_execution/v1/beam_fn_api.proto b/model/fn-execution/src/main/proto/org/apache/beam/model/fn_execution/v1/beam_fn_api.proto index ec6c176e5a37..66d144ab2310 100644 --- a/model/fn-execution/src/main/proto/org/apache/beam/model/fn_execution/v1/beam_fn_api.proto +++ b/model/fn-execution/src/main/proto/org/apache/beam/model/fn_execution/v1/beam_fn_api.proto @@ -46,6 +46,52 @@ import "google/protobuf/struct.proto"; import "google/protobuf/timestamp.proto"; import "google/protobuf/duration.proto"; + +// Describes transforms necessary to execute Beam over the FnAPI but are +// implementation details rather than part of the core model. +message FnApiTransforms { + enum Runner { + // DataSource is a Root Transform, and a source of data for downstream + // transforms in the same ProcessBundleDescriptor. + // It represents a stream of values coming in from an external source/over + // a data channel, typically from the runner. It's not the PCollection itself + // but a description of how to get the portion of the PCollection for a given + // bundle. + // + // The DataSource transform is implemented in each SDK and not explicitly + // provided during pipeline construction. A runner inserts the transform + // in ProcessBundleDescriptors to indicate where the bundle + // can retrieve data for an associated ProcessBundleRequest. + // Data for the same request will be retrieved with the matching instruction ID, + // and transform ID determined by the runner. + // + // The DataSource transform will take a stream of bytes from the remote + // source for the matching instruction ID and decode them as windowed + // values using the provided coder ID, which must be a windowed value coder. + // + // Payload: RemoteGrpcPort + DATA_SOURCE = 0 [(org.apache.beam.model.pipeline.v1.beam_urn) = "beam:runner:source:v1"]; + + // DataSink is a transform that sends PCollection elements to a remote + // port using the Data API. + // + // The DataSink transform is implemented in each SDK and not explicitly + // provided during pipeline construction. A runner inserts the transform in + // ProcessBundleDescriptors to indicate where the bundle can send + // data for each associated ProcessBundleRequest. Data for the same + // request will be sent with the matching instruction ID and transform ID. + // Each PCollection that exits the ProcessBundleDescriptor subgraph will have + // it's own DataSink, keyed by a transform ID determined by the runner. + // + // The DataSink will take in a stream of elements for a given instruction ID + // and encode them for transmission to the remote sink. The coder ID must be + // for a windowed value coder. + // + // Payload: RemoteGrpcPort + DATA_SINK = 1 [(org.apache.beam.model.pipeline.v1.beam_urn) = "beam:runner:sink:v1"]; + } +} + // A descriptor for connecting to a remote port using the Beam Fn Data API. // Allows for communication between two environments (for example between the // runner and the SDK). @@ -155,20 +201,32 @@ message SampleDataRequest { repeated string pcollection_ids = 1; } - // An element sampled when the SDK is processing a bundle. This is a proto // message to allow for additional per-element metadata. message SampledElement { - // Required. Sampled raw bytes for an element. This is a + // (Required) Sampled raw bytes for an element. This is a // single encoded element in the nested context. bytes element = 1; - // FUTURE WORK: Capture lull detections and exceptions. - // - // Optional. Present if there was an exception - // processing the above element. - // - // LogEntry exception_entry = 2; + // (Required) Timestamp of when the sample was taken. + google.protobuf.Timestamp sample_timestamp = 2; + + message Exception { + // (Required) The instruction ID of the associated ProcessBundleRequest. + string instruction_id = 1; + + // (Required) The transform ID of the executing PTransform during the + // exception. + string transform_id = 2; + + // (Required) The error message to be displayed to the user. Can use the + // other fields to query for contextual logs. + string error = 3; + } + + // (Optional) This will be set if this element was sampled because of a user + // exception. + Exception exception = 3; } // If supported, the `SampleDataResponse` will contain samples from PCollections @@ -181,27 +239,6 @@ message SampleDataResponse { // Map from PCollection id to sampled elements. map element_samples = 1; - - // FUTURE WORK: Investigate ways of storing multiple interesting types of - // sampled elements. There are two ways of accomplishing this: - // 1) Maps of typed elements: include multiple maps here with typed element - // proto messages, ex. - // - // message SlowElement {...} - // message ErroredElement {...} - // map slow_elements - // map errored_elements - // - // However, this forces an element into a single category. It disallows - // classification across multiple characteristics (like a slow and errored - // element). - // - // 2) Compositional types: allow for URN and payloads on the base - // SampledElement message for interesting characteristics. The base class - // can then be queried for specific URNs. This allows for multiple - // attributes on the same element. - // - // For a longer conversation, see https://github.com/apache/beam/pull/25065. } // A request to provide full MonitoringInfo associated with the entire SDK diff --git a/ownership/JAVA_DEPENDENCY_OWNERS.yaml b/ownership/JAVA_DEPENDENCY_OWNERS.yaml index 063b2bcc145f..0f4ada248f64 100644 --- a/ownership/JAVA_DEPENDENCY_OWNERS.yaml +++ b/ownership/JAVA_DEPENDENCY_OWNERS.yaml @@ -84,11 +84,6 @@ deps: artifact: stream owners: - com.commercehub.gradle.plugin:gradle-avro-plugin: - group: com.commercehub.gradle.plugin - artifact: gradle-avro-plugin - owners: - com.datastax.cassandra:cassandra-driver-core: group: com.datastax.cassandra artifact: cassandra-driver-core @@ -144,9 +139,9 @@ deps: artifact: jackson-module-scala_2.11 owners: - com.github.ben-manes:gradle-versions-plugin: - group: com.github.ben-manes - artifact: gradle-versions-plugin + com.github.davidmc24.gradle-avro-plugin:gradle-avro-plugin: + group: com.github.davidmc24.gradle-avro-plugin + artifact: gradle-avro-plugin owners: com.github.jengelman.gradle.plugins:shadow: diff --git a/playground/CI.md b/playground/CI.md deleted file mode 100644 index 232fb9e850f4..000000000000 --- a/playground/CI.md +++ /dev/null @@ -1,118 +0,0 @@ - - -# Apache Beam Playground - -## GitHub Actions - -### Pull request run - -Those runs are results of PR from the forks made by contributors. Most builds for Apache Beam fall -into this category. They are executed in the context of the "Fork", not main -Beam Code Repository which means that they have only "read" permission to all the GitHub resources -(container registry, code repository). This is necessary as the code in those PRs (including CI job -definition) might be modified by people who are not committers for the Apache Beam Code Repository. - -The main purpose of those jobs is to check if PR builds cleanly, if the test run properly and if -the PR is ready to review and merge. - -### Direct Push/Merge Run - -Those runs are results of direct pushes done by the committers or as result of merge of a Pull Request -by the committers. Those runs execute in the context of the Apache Beam Code Repository and have also -write permission for GitHub resources (container registry, code repository). -The main purpose for the run is to check if the code after merge still holds all the assertions - like -whether it still builds, all tests are green. - -This is needed because some of the conflicting changes from multiple PRs might cause build and test failures -after merge even if they do not fail in isolation. - -### Workflows - -#### Build And Deploy Playground Backend Application - [build_playground_backend.yml](.github/workflows/build_playground_backend.yml) - -| Job | Description | Pull Request Run | Direct Push/Merge Run | Requires GCP Credentials | -|-------------------------------------|---------------------------------------------------------------------|------------------|-----------------------|--------------------------| -| Check out the repo | GitHub Action used to check-out a repository. | Yes | Yes | No | -| setup-java | Install Java. | Yes | Yes | No | -| setup-go | Install Go. | Yes | Yes | No | -| maven config clean | Clean maven settings | Yes | Yes | No | -| set up cloud sdk and its components | Setting up cloud client and its components for tests | Yes | Yes | No | -| playground:backend:precommit | Pre commit playground. | Yes | Yes | No | -| npm install | Install nmp package. | Yes | Yes | No | -| lint dockerfile | Install and lint docker file. | Yes | Yes | No | -| setup-terraform | Install terraform. | Yes | Yes | No | -| Docker Tag | Add tag , if it not set. | Yes | Yes | No | -| GCP account | Connect to Gcp. | Yes | Yes | Yes | -| Login to Docker | Login to docker repository. | Yes | Yes | Yes | -| Deploy Backend | Build docker container, push it to repository, deploy it to Gcp. | Yes | Yes | Yes | - -#### Build And Deploy Playground Frontend Application - [build_playground_frontend.yml](.github/workflows/build_playground_frontend.yml) - -| Job | Description | Pull Request Run | Direct Push/Merge Run | Requires GCP Credentials | -|----------------------------------------|----------------------------------------------------------------------|------------------|-----------------------|--------------------------| -| Check out the repo | GitHub Action used to check-out a repository. | Yes | Yes | No | -| setup-java | Install Java. | Yes | Yes | No | -| install flutter | Install flutter package. | Yes | Yes | No | -| maven config clean | Clean maven settings | Yes | Yes | No | -| install npm | Install nmp package. | Yes | Yes | No | -| lint dockerfile | Install and lint docker file. | Yes | Yes | No | -| setup-terraform | Install terraform. | Yes | Yes | No | -| Docker Tag | Add tag , if it not set. | Yes | Yes | No | -| GCP account | Connect to Gcp. | Yes | Yes | Yes | -| Login to Docker | Login to docker repository. | Yes | Yes | Yes | -| Deploy Frontend | Config and build, push docker container to repository, deploy to Gcp.| Yes | Yes | Yes | - -#### Collect And Deploy Playground Examples - [playground_deploy_examples.yml](.github/workflows/playground_deploy_examples.yml) - -| Job | Description | Pull Request Run | Direct Push/Merge Run | Requires GCP Credentials | -|----------------------------------------|----------------------------------------------------------------------|------------------|-----------------------|--------------------------| -| Check out the repo | GitHub Action used to check-out a repository. | Yes | Yes | No | -| setup-python | Install Python. | Yes | Yes | No | -| setup-java | Install Java. | Yes | Yes | No | -| Install kubectl | Install tool kubectl for kubernetes cloud | Yes | Yes | No | -| Install helm | Install Help plugin | Yes | Yes | No | -| Set up Cloud SDK | Install GCP Cloud client | Yes | Yes | No | -| install deps | Add packages: | Yes | Yes | No | -| | grpcio-tools,grpcio,mock,protobuf, pytest,pytest-mock, | | | | -| | PyYAML,google-cloud-storage,tqdm | | | | -| maven config clean | Clean maven settings | Yes | Yes | No | -| GCP account | Connect to Gcp. | Yes | Yes | Yes | -| Docker Tag | Add tag , if it not set. | Yes | Yes | No | -| Get K8s Config | Get config for kubectl | Yes | Yes | Yes | -| Login to Docker | Login to docker repository. | Yes | Yes | Yes | -| Build And Push Apps | Build and push docker containers for app | Yes | Yes | Yes | -| Install helm chart | Deploy app to kubernetes cloud | Yes | Yes | Yes | -| Run Python Examples CI | Prepare examples for Python | Yes | Yes | Yes | -| Run Python Examples CD | Execute examples for Python | Yes | Yes | Yes | -| Run Go Examples CI | Prepare examples for Go | Yes | Yes | Yes | -| Run Go Examples CD | Execute examples for Go | Yes | Yes | Yes | -| Run Java Examples CI | Prepare examples for Java | Yes | Yes | Yes | -| Run Java Examples CD | Execute examples for Java | Yes | Yes | Yes | -| Delete Helm Chart | Drop kubernetes cloud | Yes | Yes | Yes | - -#### Secrets for action - - - GCP_PLAYGROUND_REGION - gcp main region location cloud (default:us-central1) - - GCP_PLAYGROUND_SA_EMAIL - gcp service account id (default:playground-deploy@apache-beam-testing.iam.gserviceaccount.com) - - GCP_PLAYGROUND_PROJECT_ID - gcp project id (default:apache-beam-testing) - - PLAYGROUND_REGISTRY_NAME - gcp docker registry address (default:us-central1-docker.pkg.dev) - - GCP_PLAYGROUND_SA_KEY - gcp private key file, it export from service account and encode to Base64 - - diff --git a/playground/README.md b/playground/README.md index 6d4c153fcab5..6f69a59d0551 100644 --- a/playground/README.md +++ b/playground/README.md @@ -17,214 +17,211 @@ under the License. --> -# Playground - The Beam Playground is a web application to run Beam code snippets in a modern browser. This directory holds code to build, test, and deploy the frontend and backend services. -# Development Requirements - -The following requirements are needed for development, testing, and deploying. - -- [go 1.18+](https://golang.org) -- [flutter](https://flutter.dev/) -- Go protobuf dependencies (See [Go gRPC Quickstart](https://grpc.io/docs/languages/go/quickstart/)) -- Dart protobuf dependencies (See [Dart gRPC Quickstart](https://grpc.io/docs/languages/dart/)) -- [buf](https://docs.buf.build/installation) -- [Docker](https://docs.docker.com/desktop/) -- [Docker Compose](https://docs.docker.com/compose/install/) -- [gcloud CLI](https://cloud.google.com/sdk/docs/install) -- [gcloud Beta Commands](https://cloud.google.com/sdk/gcloud/reference/components/install) -- [Cloud Datastore Emulator](https://cloud.google.com/datastore/docs/tools/datastore-emulator) -- [sbt](https://www.scala-sbt.org/1.x/docs/Installing-sbt-on-Linux.html) - -### Google Cloud Shell Prerequisites Installation -Google Cloud Shell already has most of the prerequisites installed. Only few tools need to be installed separately - -#### Flutter +- [Setup development prerequisites](#setup-development-prerequisites) +- [Common tasks](#common-tasks) +- [Run Beam Playground locally](#run-beam-playground-locally) + - [Configure frontend to use local backend](#configure-frontend-to-use-local-backend) + - [Run local deployment using Gradle task](#run-local-deployment-using-gradle-task) + - [Deploy examples](#deploy-examples) +- [How to add your own example](#how-to-add-your-own-example) +- [Deployment guide](#deployment-guide) + - [Manual deployment](#manual-deployment) + - [Manual CloudBuild setup](#manual-cloudbuild-setup) +- [Project structure](#project-structure) +- [Contribution guide](#contribution-guide) + +# Setup development prerequisites +> ***Google Cloud Shell note***: Google Cloud Shell already has most of the prerequisites installed. Only the following has to be installed manually: +> - Flutter - run `flutter precache` +> - Go protobuf dependencies +> - Dart protobuf dependencies +> - buf +> - sbt + +1. Install Go 1.18+ + + **Ubuntu 22.04 and newer:** + ```shell + sudo apt install golang` + ``` + + **Other Linux variants:** Follow manual at https://go.dev/doc/install +1. Install [flutter](https://docs.flutter.dev/get-started/install/linux) + + **Ubuntu 22.04 or newer:** + ```shell + sudo apt install flutter + ``` + + **Other Linux variants:** Follow manual at https://flutter.dev/docs/get-started/install/linux + +1. Install [protoc](https://grpc.io/docs/protoc-installation/) + + **Ubuntu 22.04 or newer/Debian 11 or newer:** + ```shell + sudo apt install protobuf-compiler + ``` + **Other Linux variants:** Follow manual at https://grpc.io/docs/protoc-installation/ + +1. Install Go protobuf dependencies: [Go gRPC Quickstart](https://grpc.io/docs/languages/go/quickstart/) + > Do not forget to update your `PATH` environment variable +1. Install Dart protobuf dependencies: [Dart gRPC Quickstart](https://grpc.io/docs/languages/dart/quickstart/) + > Do not forget to update your `PATH` environment variable +1. Install npm + **Ubuntu 22.04 and newer/Debian 11 and newer:** + ```shell + sudo apt install npm + ``` + **Other Linux variants:** Follow manual at https://docs.npmjs.com/downloading-and-installing-node-js-and-npm +1. Install [buf](https://docs.buf.build/installation) + ```shell + npm install -g @bufbuild/buf + ``` +1. Install Docker + **Ubuntu 22.04 and newer/Debian 11 and newer:** + ```shell + sudo apt install docker.io + ``` + **Other Linux variants:** Follow manual at https://docs.docker.com/engine/install/ + + To verify your docker installation, run: + ```shell + docker ps + ``` + It should finish without any errors. If you get a permission denied error, you need to add your user to the docker group: + ```shell + sudo usermod -aG docker $USER + ``` + Then, log out and log back in to apply the changes. +1. Install Docker Compose + **Ubuntu 22.04 and newer/Debian 11 and newer:** + ```shell + sudo apt install docker-compose + ``` + **Other Linux variants:** Follow manual at https://docs.docker.com/compose/install/ +1. Install gcloud CLI by following the [manual](https://cloud.google.com/sdk/docs/install) for your system +1. Install Cloud Datastore Emulator + ```shell + gcloud components install cloud-datastore-emulator + ``` + or, if you have install gcloud CLI using APT: + ```shell + sudo apt install google-cloud-cli-datastore-emulator + ``` +1. Install `sbt` following instruction at https://www.scala-sbt.org/1.x/docs/Installing-sbt-on-Linux.html + > **Optional**: Run `sbt` comamnd once after installation to let it cache its dependencies +1. Make sure that you have the full installation of Python 3.8 or newer. On Debian or Ubuntu it can be installed using `sudo apt install python3-full`. + +# Common tasks +To get an overview of common tasks, see [TASKS.md](TASKS.md) + +# Run Beam Playground locally +## Configure frontend to use local backend +> **Note:** Follow this step only if you want to have a local deployment of Playground. Skip this step entirely if you want to deploy Playground to Google Cloud. + +Uncommend lines after `// Uncomment the following lines to use local backend.` in [frontend/playground_components/lib/src/constants/backend_urls.dart](/playground/frontend/playground_components/lib/src/constants/backend_urls.dart) + +## Run local deployment using Gradle task +> For more information read the corresponding section in [TASKS.md](./TASKS.md#router-runners-and-frontend) + +Run the deployment script: ```shell -git config --global --add safe.directory /google/flutter -flutter doctor -``` - -#### Protobuf -```shell -go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28 -go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2 -dart pub global activate protoc_plugin -npm install -g @bufbuild/buf -``` - -#### sbt -```shell -echo "deb https://repo.scala-sbt.org/scalasbt/debian all main" | sudo tee /etc/apt/sources.list.d/sbt.list -echo "deb https://repo.scala-sbt.org/scalasbt/debian /" | sudo tee /etc/apt/sources.list.d/sbt_old.list -curl -sL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x2EE0EA64E40A89B84B2DF73499E82A75642AC823" | sudo -H gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/scalasbt-release.gpg --import -sudo chmod 644 /etc/apt/trusted.gpg.d/scalasbt-release.gpg -sudo apt-get update -sudo apt-get install sbt -``` - -# Available Gradle Tasks - -## Perform overall pre-commit checks - -``` -cd beam -./gradlew playgroundPrecommit -``` - -## To see available gradle tasks for playground: - -``` -cd beam -./gradlew playground:tasks -``` - -## Re-generate protobuf - -``` -cd beam -./gradlew playground:generateProto -``` - -## Run local environment using docker compose - -### Router only - -Start: - -```bash -cd beam -./gradlew playground:backend:containers:router:dockerComposeLocalUp -``` - -Stop: - -```bash -cd beam -./gradlew playground:backend:containers:router:dockerComposeLocalDown -``` - -### Router, runners, and frontend - -1. Edit `/playground/frontend/playground_components/lib/src/constants/backend_urls.dart` -to override backend URLs with yours found in `/playground/docker-compose.local.yaml`. -2. To start, run: - -```bash -cd beam -./gradlew playground:dockerComposeLocalUp -``` - -3. To stop, run: - -```bash -cd beam -./gradlew playground:dockerComposeLocalDown -``` - -This way of running may not work in all environments because it is not maintained. -It is used occasionally by the Frontend team to test complex tasks against -a not-yet-deployed backend. -The full start may take ~30 minutes and is demanding, so you should likely enable -only one backend runner for the SDK you need. - -If you do not need particular runners, comment out: -1. Dependencies on them in `/playground/build.gradle.kts` in `dockerComposeLocalUp` task. -2. Their Docker image configurations in `/playground/docker-compose.local.yaml`. - -See also [Backend Lookup](frontend/README.md#backend-lookup) in the Frontend. - -## Removing old snippets - -Run the method to remove unused code snippets from the Cloud Datastore. Unused snippets are snippets that are out of date. If the last visited date property less or equals than the current date minus dayDiff parameter then a snippet is out of date - -``` -cd beam -./gradlew playground:backend:removeUnusedSnippet -DdayDiff={int} -DprojectId={string} -Dnamespace={datastore namespace} -``` - -## Removing a specific snippet - -Run the method to remove a specific code snippet from the Cloud Datastore. - +./gradlew :playground:dockerComposeLocalUp ``` -cd beam -./gradlew playground:backend:removeSnippet -DsnippetId={string} -DprojectId={string} -Dnamespace={datastore namespace} -``` - -## Run playground tests without cache - -``` -cd beam - ./gradlew playground:backend:testWithoutCache -``` - -# Deployment - -See [terraform](./terraform/README.md) for details on how to build and deploy -the application and its dependent infrastructure. - -# Manual Example deployment - -The following requirements are needed for deploying examples manually: - -1. GCP project with deployed Playground backend -2. Python (3.9.x) -3. Login into GCP (gcloud default login or using service account key) - -## Run example deployment script -Example deployment scripts uses following environment variables: - -- GOOGLE_CLOUD_PROJECT - GCP project id where Playground backend is deployed -- BEAM_ROOT_DIR - root folder to search for playground examples -- SDK_CONFIG - location of sdk and default example configuration file -- BEAM_EXAMPLE_CATEGORIES - location of example category configuration file -- BEAM_USE_WEBGRPC - use grpc-Web instead of grpc (default) -- GRPC_TIMEOUT - timeout for grpc calls (defaults to 10 sec) -- BEAM_CONCURRENCY - number of eaxmples to run in parallel (defaults to 10) -- SERVER_ADDRESS - address of the backend runnner service for a particular SDK - -``` -usage: ci_cd.py [-h] --step {CI,CD} [--namespace NAMESPACE] --datastore-project DATASTORE_PROJECT --sdk {SDK_JAVA,SDK_GO,SDK_PYTHON,SDK_SCIO} --origin {PG_EXAMPLES,TB_EXAMPLES} --subdirs SUBDIRS [SUBDIRS ...] - -CI/CD Steps for Playground objects - -optional arguments: - -h, --help show this help message and exit - --step {CI,CD} CI step to verify all beam examples/tests/katas. CD step to save all beam examples/tests/katas and their outputs on the GCD - --namespace NAMESPACE - Datastore namespace to use when saving data (default: Playground) - --datastore-project DATASTORE_PROJECT - Datastore project to use when saving data - --sdk {SDK_JAVA,SDK_GO,SDK_PYTHON,SDK_SCIO} - Supported SDKs - --origin {PG_EXAMPLES,TB_EXAMPLES} - ORIGIN field of pg_examples/pg_snippets - --subdirs SUBDIRS [SUBDIRS ...] - limit sub directories to walk through, relative to BEAM_ROOT_DIR -``` - -Helper script to deploy examples for all supported sdk's: +To shut down the playground, run: ```shell -cd playground/infrastructure - -export BEAM_ROOT_DIR="../../" -export SDK_CONFIG="../../playground/sdks.yaml" -export BEAM_EXAMPLE_CATEGORIES="../categories.yaml" -export BEAM_USE_WEBGRPC=yes -export BEAM_CONCURRENCY=4 -export PLAYGROUND_DNS_NAME="your registered dns name for Playground" - -for sdk in go java python scio; do - export SDK=$sdk && - export SERVER_ADDRESS=https://${SDK}.$PLAYGROUND_DNS_NAME && - - python3 ci_cd.py --datastore-project $GOOGLE_CLOUD_PROJECT \ - --step CD --sdk SDK_${SDK^^} \ - --origin PG_EXAMPLES \ - --subdirs ./learning/katas ./examples ./sdks -done -``` +./gradlew :playground:dockerComposeLocalDown +``` + +## Deploy examples +1. Go to `/playground/infrastucture` directory + ```shell + cd playground/infrastucture + ``` +1. Setup python venv + ```shell + python3 -m venv venv + ``` +1. Activate venv + ```shell + source venv/bin/activate + ``` +1. Install dependencies + ```shell + pip install -r requirements.txt + ``` +1. Setup the environment variables + ```shell + export BEAM_ROOT_DIR=$(realpath ../../) + export SDK_CONFIG="../../playground/sdks.yaml" + export BEAM_EXAMPLE_CATEGORIES="../categories.yaml" + export BEAM_USE_WEBGRPC=yes + export BEAM_CONCURRENCY=4 + export DATASTORE_EMULATOR_HOST=localhost:8081 + ``` + +1. Run the `ci_cd.py` script + + ```shell + export SERVER_ADDRESS= # see the note below + python ci_cd.py --step CD \ + --sdk \ # SDK_GO, SDK_JAVA, SDK_PYTHON, SDK_SCIO + --namespace Playground \ + --datastore-project test \ + --origin PG_EXAMPLES \ + --subdirs $BEAM_ROOT_DIR/sdks $BEAM_ROOT_DIR/examples $BEAM_ROOT_DIR/learning/katas # For SCIO examples see note below + ``` + > **Note:** The `SERVER_ADDRESS` variable should be set to the address of the runner server for the particular SDK. For the local deployment the default values are: + > | SDK | Address | + > | --- | --- | + > | Go | `localhost:8084` | + > | Java | `localhost:8086` | + > | Python | `localhost:8088` | + > | SCIO | `localhost:8090` | + + > **Note:** SCIO examples are not committed to the Beam tree. You will need to use [`fetch_scala_examples.py`](infrastructure/fetch_scala_examples.py) script to download them to some directory and then use `--subdirs` option to point to that directory. For example: + > ```shell + > python fetch_scala_examples.py --output-dir /tmp/scio-examples + > python ci_cd.py --step CD \ + > --sdk SDK_SCIO \ + > --namespace Playground \ + > --datastore-project test \ + > --origin PG_EXAMPLES \ + > --subdirs /tmp/scio-examples + > ``` + > See [this section](TASKS.md##obtaining-scio-examples) for more information. + +# How to add your own example +Please refer to [this document](load_your_code.md). + +# Deployment guide +## Manual deployment +See deployment guide at [terraform/README.md](/playground/terraform/README.md) +## Manual CloudBuild setup +To set up CloudBuild triggers manually please refer to [this guide](/playground/terraform/infrastructure/cloudbuild-manual-setup/README.md) + +# Project structure + +Several directories in this repository are used for the Beam Playground project. The list of the directories used can be seen below. + +| Directory | Purpose | +|-----------|---------| +| [`/examples`](/examples) | Contains code of the examples for Java SDK. The examples are getting loaded into the main catalog. | +| [`/learning/beamdoc`](/learning/beamdoc) | Contains code of the examples which should not be available in the main Playground catalog. | +| [`/learning/katas`](/learning/katas) | Containes small code examples, loaded into main catalog. +| [`/playground`](/playground) | Root of Playground sources. | +| [`/playground/api`](/playground/api) | Protobuf definitions for the Playground gRPC API. | +| [`/playground/backend`](/playground/backend) | Root of Playground backend sources. See [this document](/playground/backend/CONTRIBUTE.md) for detailed description. | +| [`/playground/frontend`](/playground/frontend) | Root of Playground frontend sources. See [this document](/playground/frontend/CONTRIBUTE.md) for detailed description. | +| [`/playground/infrastructure`](/playground/infrastructure) | Scripts used in Playground CI/CD pipelines for verifying and uploading examples. | +| [`/playground/kafka-emulator`](/playground/kafka-emulator) | Sources of a Kafka emulator used for demonstrating KafkaIO examples. | +| [`/playground/terraform`](/playground/terraform) | Terraform configuration files for Playground deployment to Google Cloud Platform. | +| [`/sdks`](/sdks) | Source of the BEAM SDKs. Used by Playground as a source of examples for Go and Python SDKs. | + +# Contribution guide +- Backend: see [backend/README.md](/playground/backend/README.md) and [backend/CONTRIBUTE.md](/playground/backend/CONTRIBUTE.md) +- Frontend: see [frontend/README.md](/playground/frontend/README.md) and [frontend/CONTRIBUTE.md](/playground/frontend/CONTRIBUTE.md) \ No newline at end of file diff --git a/playground/TASKS.md b/playground/TASKS.md new file mode 100644 index 000000000000..6b942fbf3144 --- /dev/null +++ b/playground/TASKS.md @@ -0,0 +1,272 @@ + + +- [Available Gradle Tasks](#available-gradle-tasks) + - [Perform overall pre-commit checks](#perform-overall-pre-commit-checks) + - [To see available gradle tasks for playground:](#to-see-available-gradle-tasks-for-playground) + - [Re-generate protobuf](#re-generate-protobuf) + - [Run local environment using docker compose](#run-local-environment-using-docker-compose) + - [Router only](#router-only) + - [Router, runners, and frontend](#router-runners-and-frontend) + - [Removing old snippets](#removing-old-snippets) + - [Removing a specific snippet](#removing-a-specific-snippet) + - [Run playground tests without cache](#run-playground-tests-without-cache) +- [Updating dependencies](#updating-dependencies) + - [Referenced Beam SDK update](#referenced-beam-sdk-update) + - [Update Go version](#update-go-version) + - [Update Python version](#update-python-version) + - [Update Java version](#update-java-version) + - [Update Flutter version](#update-flutter-version) +- [Deployment](#deployment) +- [Obtaining SCIO examples](#obtaining-scio-examples) +- [Manual Example deployment](#manual-example-deployment) + - [Run example deployment script](#run-example-deployment-script) + + +# Available Gradle Tasks + +## Perform overall pre-commit checks + +``` +cd beam +./gradlew playgroundPrecommit +``` + +## To see available gradle tasks for playground: + +``` +cd beam +./gradlew playground:tasks +``` + +## Re-generate protobuf + +``` +cd beam +./gradlew playground:generateProto +``` + +## Run local environment using docker compose + +### Router only + +Start: + +```bash +cd beam +./gradlew playground:backend:containers:router:dockerComposeLocalUp +``` + +Stop: + +```bash +cd beam +./gradlew playground:backend:containers:router:dockerComposeLocalDown +``` + +### Router, runners, and frontend + +1. Edit `/playground/frontend/playground_components/lib/src/constants/backend_urls.dart` +to override backend URLs with yours found in `/playground/docker-compose.local.yaml`. +2. To start, run: + +```bash +cd beam +./gradlew playground:dockerComposeLocalUp +``` + +3. To stop, run: + +```bash +cd beam +./gradlew playground:dockerComposeLocalDown +``` + +This way of running may not work in all environments because it is not maintained. +It is used occasionally by the Frontend team to test complex tasks against +a not-yet-deployed backend. +The full start may take ~30 minutes and is demanding, so you should likely enable +only one backend runner for the SDK you need. + +If you do not need particular runners, comment out: +1. Dependencies on them in `/playground/build.gradle.kts` in `dockerComposeLocalUp` task. +2. Their Docker image configurations in `/playground/docker-compose.local.yaml`. + +See also [Backend Lookup](frontend/README.md#backend-lookup) in the Frontend. + +## Removing old snippets + +Run the method to remove unused code snippets from the Cloud Datastore. Unused snippets are snippets that are out of date. If the last visited date property less or equals than the current date minus dayDiff parameter then a snippet is out of date + +``` +cd beam +./gradlew playground:backend:removeUnusedSnippet -DdayDiff={int} -DprojectId={string} -Dnamespace={datastore namespace} +``` + +## Removing a specific snippet + +Run the method to remove a specific code snippet from the Cloud Datastore. + +``` +cd beam +./gradlew playground:backend:removeSnippet -DsnippetId={string} -DprojectId={string} -Dnamespace={datastore namespace} +``` + +## Run playground tests without cache + +``` +cd beam + ./gradlew playground:backend:testWithoutCache +``` + +# Updating dependencies +## Referenced Beam SDK update +1. Update default `BEAM_VERSION` values in Java contianer [Dockerfile](/playground/backend/containers/java/Dockerfile) +2. Update `default_beam_version` in [Java container `build.gradle`](/playground/backend/containers/java/build.gradle) +3. Update `default_beam_version` in [Python container `build.gradle`](/playground/backend/containers/python/build.gradle) +4. Update SDK version in CI GitHub workflow: + - [playground_examples_ci_reusable.yml](/.github/workflows/playground_examples_ci_reusable.yml) +5. Update `-Psdk-tag=` in ["Deploy Playground to Kubernetes" section of the deployment guide](/playground/terraform/README.md#deploy-playground-to-kubernetes) +6. Update `_BEAM_VERSION` in + - [playground_ci_stable.yaml](/playground/infrastructure/cloudbuild/playground_ci_stable.yaml) + - [playground_cd_stable.yaml](/playground/infrastructure/cloudbuild/playground_cd_stable.yaml) + +## Update Go version + +1. Update Go version in [`go.mod`](backend/go.mod) +2. Run `go mod download` and `go mod tidy` in [`backend`](backend) directory +3. Update `BASE_IMAGE` parameter in [router Dockerfile](backend/containers/router/Dockerfile) and [`build.gradle`](backend/containers/router/build.gradle) +4. Update `GO_BASE_IMAGE` parameter in [Python Dockerfile](backend/containers/python/Dockerfile) and [`build.gradle`](backend/containers/python/build.gradle) +5. Update `GO_BASE_IMAGE` parameter in [Java Dockerfile](backend/containers/java/Dockerfile) and [`build.gradle`](backend/containers/java/build.gradle) +6. Update `GO_BASE_IMAGE` parameter in [SCIO Dockerfile](backend/containers/scio/Dockerfile) and [`build.gradle`](backend/containers/scio/build.gradle) +7. Update `BASE_IMAGE` for `buildArgs` argument in [Go runner `build.gradle`](backend/containers/go/build.gradle) + +## Update Python version + +Update `BASE_IMAGE` in [Python Dockerfile](backend/containers/python/Dockerfile) + +## Update Java version + +1. Update base images version in `FROM maven:3.8.6-openjdk-11 as dep` and `FROM apache/beam_java11_sdk:$BEAM_VERSION` lines in [Java Dockerfile](backend/containers/java/Dockerfile) +2. Update `BASE_IMAGE` in [SCIO Dockerfile](backend/containers/scio/Dockerfile) and [`build.gradle`](backend/containers/scio/build.gradle) + +## Update Flutter version + +Update the version in the following locations: + +### Project files that declare minimal required versions as we desire, one per Flutter project + +- [frontend/playground_components/pubspec.yaml](frontend/playground_components/pubspec.yaml), the line with `flutter: '>=x.x.x'`. +- [frontend/playground_components_dev/pubspec.yaml](frontend/playground_components_dev/pubspec.yaml), the line with `flutter: '>=x.x.x'`. +- [frontend/pubspec.yaml](frontend/pubspec.yaml), the line with `flutter: '>=x.x.x'`. +- In Tour of Beam: [../learning/tour-of-beam/frontend/pubspec.yaml](../learning/tour-of-beam/frontend/pubspec.yaml), the line with `flutter: '>=x.x.x'`. + +### Generated project files with computed minimal versions given the package requirements, one per runnable Flutter app + +Run `dart pub get` in all of these directories for these files to be updated. +Verify and merge the changes. + +- Playground: [frontend/pubspec.lock](frontend/pubspec.lock), the line with `flutter: ">=x.x.x"`. +- Tour of Beam: [../learning/tour-of-beam/frontend/pubspec.lock](../learning/tour-of-beam/frontend/pubspec.lock), the line with `flutter: ">=x.x.x"`. + +### CI + +- [frontend/Dockerfile](frontend/Dockerfile), the line with `ARG FLUTTER_VERSION=x.x.x`. +- [/.github/workflows/build_playground_frontend.yml](../.github/workflows/build_playground_frontend.yml), the line with `FLUTTER_VERSION: x.x.x`. +- [/.github/workflows/playground_frontend_test.yml](../.github/workflows/playground_frontend_test.yml), the line with `FLUTTER_VERSION: x.x.x`. +- [/.github/workflows/tour_of_beam_frontend_test.yml](../.github/workflows/tour_of_beam_frontend_test.yml), the line with `FLUTTER_VERSION: x.x.x`. + +# Deployment + +See [this guide](./terraform/README.md) for details on how to build and deploy +the application and its dependent infrastructure. + +# Obtaining SCIO examples + +SCIO examples are based on examples found in the upstream SCIO [repository](https://github.com/spotify/scio). To obtain the examples, use [`fetch_scala_examples.py`](infrastructure/fetch_scala_examples.py) script: + +```shell +python fetch_scala_examples.py --output_dir +``` +this will download all supported SCIO examples into ``. + +To add a new example, add it to the list of examples in the script [`fetch_scala_examples.py`](infrastructure/fetch_scala_examples.py). You will need to provide the path to the example in the `scio` git repository, the name of the example, description, run options, categories and tags. + +# Manual Example deployment + +The following requirements are needed for deploying examples manually: + +1. GCP project with deployed Playground backend +2. Python (3.9.x) +3. Login into GCP (gcloud default login or using service account key) + +## Run example deployment script +Example deployment scripts uses following environment variables: + +- GOOGLE_CLOUD_PROJECT - GCP project id where Playground backend is deployed +- BEAM_ROOT_DIR - root folder to search for playground examples +- SDK_CONFIG - location of sdk and default example configuration file +- BEAM_EXAMPLE_CATEGORIES - location of example category configuration file +- BEAM_USE_WEBGRPC - use grpc-Web instead of grpc (default) +- GRPC_TIMEOUT - timeout for grpc calls (defaults to 10 sec) +- BEAM_CONCURRENCY - number of eaxmples to run in parallel (defaults to 10) +- SERVER_ADDRESS - address of the backend runnner service for a particular SDK + +``` +usage: ci_cd.py [-h] --step {CI,CD} [--namespace NAMESPACE] --datastore-project DATASTORE_PROJECT --sdk {SDK_JAVA,SDK_GO,SDK_PYTHON,SDK_SCIO} --origin {PG_EXAMPLES,TB_EXAMPLES} --subdirs SUBDIRS [SUBDIRS ...] + +CI/CD Steps for Playground objects + +optional arguments: + -h, --help show this help message and exit + --step {CI,CD} CI step to verify all beam examples/tests/katas. CD step to save all beam examples/tests/katas and their outputs on the GCD + --namespace NAMESPACE + Datastore namespace to use when saving data (default: Playground) + --datastore-project DATASTORE_PROJECT + Datastore project to use when saving data + --sdk {SDK_JAVA,SDK_GO,SDK_PYTHON,SDK_SCIO} + Supported SDKs + --origin {PG_EXAMPLES,TB_EXAMPLES} + ORIGIN field of pg_examples/pg_snippets + --subdirs SUBDIRS [SUBDIRS ...] + limit sub directories to walk through, relative to BEAM_ROOT_DIR +``` + +Helper script to deploy examples for all supported sdk's: + +```shell +cd playground/infrastructure + +export BEAM_ROOT_DIR="../../" +export SDK_CONFIG="../../playground/sdks.yaml" +export BEAM_EXAMPLE_CATEGORIES="../categories.yaml" +export BEAM_USE_WEBGRPC=yes +export BEAM_CONCURRENCY=4 +export PLAYGROUND_DNS_NAME="your registered dns name for Playground" + +for sdk in go java python scio; do + export SDK=$sdk && + export SERVER_ADDRESS=https://${SDK}.$PLAYGROUND_DNS_NAME && + + python3 ci_cd.py --datastore-project $GOOGLE_CLOUD_PROJECT \ + --step CD --sdk SDK_${SDK^^} \ + --origin PG_EXAMPLES \ + --subdirs ./learning/katas ./examples ./sdks +done +``` diff --git a/playground/backend/CONTRIBUTE.md b/playground/backend/CONTRIBUTE.md index a11873acee52..cc095c3df98e 100644 --- a/playground/backend/CONTRIBUTE.md +++ b/playground/backend/CONTRIBUTE.md @@ -26,36 +26,47 @@ This guide consists of: - [Code processing pipeline](#code-processing-pipeline) - [How to add a new supported language](#how-to-add-a-new-supported-language) +See also: +- [Database schema](SCHEMA.md) + ## Project structure ``` backend/ -├── cmd # set up and start backend application -├── configs # config files for each SDK -├── containers # set up and build backend images -├── internal # backend business logic -│ ├── api # generated grpc API files -│ ├── cache # logic of work with cache -│ ├── code_processing # logic of processing the received code -│ ├── components # logic of work for more difficult processes using several packages -│ ├── constants # application constants to use them anywhere in the application -│ ├── db # logic of work with database, e.g. the Cloud Datastore -│ ├── environment # backend environments e.g. SDK of the instance -│ ├── errors # custom errors to send them to the client -│ ├── executors # logic of work with code executors -│ ├── fs_tool # logic of work with a file system of code processing to prepare required files/folders -│ ├── logger # custom logger -│ ├── preparers # logic of preparing code before execution -│ ├── setup_tools # logic of set up of executors and file systems by SDK requirements -│ ├── streaming # logic of saving execution output as a stream -│ ├── tests # logic of work with unit/integration tests in the application, e.g. testing scripts to download mock data to database -│ ├── utils # different useful tools -│ └── validators # logic of validation code before execution -├── go.mod # define backend go module and contain all project's dependencies -├── logging.properties # config file to set up log for Java code -├── properties.yaml # property file consists of application properties required for the operation logic -├── start_datastore_emulator.sh # shell script to run the datastore emulator for local deployment or testing -├── stop_datastore_emulator.sh # shell script to stop the datastore emulator +├── cmd +│ ├── migration_tool # tool to apply database migrations +│ ├── remove_unused_snippets # tool to remove old snippets manually +│ └── server # entry point to the backend application +├── configs # config files for each SDK +├── containers # set up and build backend docker images +├── datasets # datasets for examples using Kafka emulator +├── internal # backend logic +│ ├── api # generated grpc API files +│ ├── cache # logic for working with cache +│ ├── code_processing # logic for processing the received code +│ ├── components # backend components +│ ├── constants # code constants used in the application +│ ├── db # logic for working with database, e.g. the Cloud Datastore +│ ├── emulators # logic for starting various emulators, e.g. Kafka +│ ├── environment # tools for working with application environment settings +│ ├── errors # custom errors +│ ├── executors # logic used to run the user submitted code +│ ├── external_functions # logic for calling Google Cloud Functions +│ ├── fs_tool # logic for woking with filesystem operations during run preparation +│ ├── logger # cusotm logger +│ ├── preparers # logic for preparing the user submitted code before execution +│ ├── setup_tools # logic for setting up executors +│ ├── streaming # implementation of run output streamer +│ ├── tasks # periodic tasks scheduler +│ ├── tests # common testing logic +│ ├── utils # miscellaneous tools +│ └── validators # logic for pre-execution code validation +├── playground_functions # Google Cloud Functions for write access to the database +├── functions.go # entry point for Cloud Functions +├── go.mod # Go project build configuration +├── logging.properties # configuration for Java runner logger +├── new_scio_project.sh # script for creating new SCIO project, used by SCIO runner +└── properties.yaml # application properties ... ``` @@ -148,7 +159,7 @@ enum Sdk { dataset: { dataset_1 } datasets: { dataset_1 }: - location: { local | GCS } + location: local format: { json | avro } ``` 5. Create a PR to the [Apache Beam Repository](https://github.com/apache/beam) diff --git a/playground/backend/SCHEMA.md b/playground/backend/SCHEMA.md new file mode 100644 index 000000000000..cabdbca86af9 --- /dev/null +++ b/playground/backend/SCHEMA.md @@ -0,0 +1,185 @@ + + +- [Database](#database) + - [Datastore namespaces](#datastore-namespaces) + - [Migrations](#migrations) + - [Datastore schema](#datastore-schema) + - [pg\_schema\_versions](#pg_schema_versions) + - [pg\_sdks](#pg_sdks) + - [pg\_examples](#pg_examples) + - [pg\_snippets](#pg_snippets) + - [DatasetNestedEntity](#datasetnestedentity) + - [pg\_datasets](#pg_datasets) + - [pg\_files](#pg_files) + - [pg\_pc\_objects](#pg_pc_objects) + - [Datastore indexes](#datastore-indexes) +- [Redis](#redis) + +# Database + +Beam Playground uses Google Cloud Platform Datastore for storing examples and snippets. Redis is used for caching catalog reads from Datastore to avoid having to enumerate all of the exmaples on each catalog request. + +## Datastore namespaces +Playground can use custom namespace to store entities in Datastore to support simultaneous deployment of several backend instances in the same GCP project. By default `Playground` namespace is used. custom namespace can be selected by setting `DATASTORE_NAMESPACE` environment variable. + +## Migrations +If a breaking change to DB schema is made, it's adviced to implement a migration procedure to handle the data change in the Datastore. There are no formalized rules on when a migration should be implemented, but in general the following should be considered: +- all examples and precompiled objects are recreated during the deployment process and are not modified during the application runtime +- user code snippets do survive application update and may require data migration + +In order to implement a migration a new Go file wtih name like `migration_xxx.go` should be created under the `internal/db/schema/migration` path. The file should contain a structure which implements the following interface: +```go +type Version interface { + // GetVersion returns the version string of the schema + GetVersion() string + // GetDescription returns the description of the schema version + GetDescription() string + // InitiateData initializes the data for the schema or performs a migration + InitiateData(args *DBArgs) error +} +``` + +After implementing the migration logic inside of the `InitiateData()` function it should be covered by tests and the new migration should be added to the list of exisitng migrations in the `cmd/server/server.go` file inside of `setupDBStructure()` function. + +## Datastore schema +There are several entity kinds in Datastore: +| Entity kind | Description | Corresponding Go struct | +|-------------|-------------|-------------------------| +| [`pg_schema_versions`](#pg_schema_versions) | Schema version entity | `entity.SchemaEntity` | +| [`pg_sdks`](#pg_sdks) | SDK entity | `entity.SDKEntity` | +| [`pg_examples`](#pg_examples) | Example entity | `entity.ExampleEntity` | +| [`pg_snippets`](#pg_snippets) | Snippet entity | `entity.SnippetEntity` | +| [`pg_datasets`](#pg_datasets) | Dataset entity | `entity.DatasetEntity` | +| [`pg_files`](#pg_files) | File entity | `entity.FileEntity` | +| [`pg_pc_objects`](#pg_pc_objects) | Precompiled object entity | `entity.PrecompiledObjectEntity` | + +### pg_schema_versions +This entity kind is used to store schema version and description of changes. +| Field name | Description | Type | +|------------|-------------|------| +| Name/ID | Schema version | `Key` | +| `descr` | Description of changes | `string` | + +### pg_sdks +This entity kind is used to store information about each supported SDK. + +| Field name | Description | Type | +|------------|-------------|------| +| Name/ID | SDK name | `Key` | +| `defaultExample` | Name of the default example for this SDK | `string` | + +### pg_examples +This entity kind is used to store example catalog items. + +| Field name | Description | Type | +|------------|-------------|------| +| Name/ID | Example ID. Has form of `_` | `Key` | +| `name` | Example name | `string` | +| `sdk` | SDK ID | `Key` | +| `descr` | Example description | `string` | +| `tags` | Example tags | `[]string` | +| `cats` | Example categories | `[]string` | +| `path` | Url of the example on Github | `string` | +| `type` | Type of the example. Possible values are `PRECOMPILED_OBJECT_TYPE_UNSPECIFIED`, `PRECOMPILED_OBJECT_TYPE_EXAMPLE`, `PRECOMPILED_OBJECT_TYPE_KATA`, `PRECOMPILED_OBJECT_TYPE_UNIT_TEST` | `string` | +| `origin` | `PG_EXAMPLES` for Playground examples, `TB_EXAMPLES` for Tour of Beam examples | `string` | +| `schVer` | Schema version | `Key` | +| `urlVCS` | Url of the example on Github | `string` | +| `urlNotebook` | Url to a Collab notebook which has the example code | `string` | +| `alwaysRun` | If true, frontend will ignore any precompiled objects assosciated with the example and run it always | `bool` | + +### pg_snippets +This entity kind is used to store snippets. + +| Field name | Description | Type | +|------------|-------------|------| +| Name/ID | Snippet ID. For shared user code the ID is computed based on the snippet content hash, for the snippets containing examples code the ID is the same as for the related example | `Key` | +| `ownerId` | ***Cannot find any usage***| `string` | +| `sdk` | SDK ID | `Key` | +| `pipeOpts` | Pipeline options | `string` | +| `created` | Creation time | `time.Time` | +| `lVisited` | Last visit time | `time.Time` | +| `origin` | `PG_SNIPPETS` for Playground examples, `TB_SNIPPETS` for Tour of Beam examples, `PG_USER` for snippets with code shared by users, `TB_USER` for snippets created by Tour Of Beam users | `string` | +| `visitCount` | Number of times the snippet was visited | `int` | +| `schVer` | Schema version | `Key` | +| `numberOfFiles` | Number of files in the snippet. Used to derive file keys. | `int` | +| `complexity` | Complexity of the snippet. Possible values are `COMPLEXITY_UNSPECIFIED`, `COMPLEXITY_BASIC`, `COMPLEXITY_MEDIUM`, `COMPLEXITY_ADVANCED` | `string` | +| `persistenceKey` | Used to track snippets created with Tour of Beam. When Tour of Beam user save a new snippet, all other snippets with the same persistenceKey are removed. | `string` | +| `datasets` | Contains an array of `DatasetNestedEntity` objects which describe datasets and emulators assosciated with the snippet | `[]DatasetNestedEntity` | + +#### DatasetNestedEntity +| Field name | Description | Type | +|------------|-------------|------| +| `config` | A JSON serialized `map[string]string` object which contains emulator configuration | `string` | +| `dataset` | Dataset ID | `Key` | +| `emulator` | Emulator name. Currently only `kafka` is supported | `string` | + +### pg_datasets +| Field name | Description | Type | +|------------|-------------|------| +| Name/ID | Name of the dataset | Key | +| `path` | Path to the dataset file on the runner filesystem under path specified in `DATASETS_PATH` environment variable (`/opt/playground/backend/datasets` by default) | `string` | + +### pg_files +| Field name | Description | Type | +|------------|-------------|------| +| Name/ID | This field is constructed by concatenating snippet ID with an underscore (`_`) and an ordinal number of the file in the snippet. For example, if snippet `SDK_JAVA_Example` has `numberOfFiles` set to `2` then there will be two `pg_files` entities with `SDK_JAVA_Example_0` and `SDK_JAVA_Example_1` keys. | Key | +| `content` | Content of the file | `string` | +| `cntxLine` | Line number on which frontend will initially focus the text editor cursor when the file is being displayed | `int32` | +| `isMain` | Whether the file is the main file in the snippet. There can only be one main file in the snippet | `bool` | +| `name` | Name of the file which will shown to the user by the frontend | `string` | + +### pg_pc_objects +These entities contain pre-compiled (cached) outputs of examples. There are three types of precompiled objects: +- `OUTPUT`, containing example's run output +- `LOG`, contianing example's log output +- `GRAPH`, containing example's execution graph output +All of these precompiled objects share the same schema + +| Field name | Description | Type | +|------------|-------------|------| +| Name/ID | Key is constructed by concatenating example's ID with precompiled object type, e.g. `SDK_GO_WordCount_OUTPUT`, `SDK_GO_WordCount_LOG`, `SDK_GO_WordCount_GRAPH` | Key | +| `content` | Saved output of the example's run | `string` | + +## Datastore indexes +Indexes are defined in [`index.yaml`](../index.yaml) file. The file is used during deployment to create indexes in the Datastore. + +# Redis + +Playground uses Redis as a cache for examples catalog to avoid having to re-enumerate all exmaples upon each request, as a temporary storage for examples output (logs, graphs, etc.) and as a message bus to relay events like a user request for pipeline cancellation. + +Each pipeline run uses pipleine id as a Redis key, with the following subkeys ([source](internal/cache/cache.go)): +| Key | Subkey | Description | +|-----|--------|-------------| +| Pipeline Id | `STATUS` | Pipeline status. Possible values can be found in [`api.proto`](../api/v1/api.proto) in `Status` enum. | +| Pipeline Id | `RUN_OUTPUT` | Pipeline run output. | +| Pipeline Id | `RUN_ERROR` | Pipeline run error message. | +| Pipeline Id | `VALIDATION_OUTPUT` | Pipeline validation step output. | +| Pipeline Id | `PREPARATION_OUTPUT` | Pipeline preparation step output. | +| Pipeline Id | `COMPILE_OUTPUT` | Pipeline compilation step output. | +| Pipeline Id | `CANCELED` | Used to signal that user has requested pipeline cancellation. Runner periodically polls the cache to check if this key has been set to `true` and cancels the pipeline if it has. | +| Pipeline Id | `RUN_OUTPUT_INDEX` | Index of the start of the run step's output. Upon each request of the pipeline execution logs this value is set to the end of the returned log and used in subsequent requests to skip already sent log fragment. | +| Pipeline Id | `LOGS` | Pipeline execution logs. | + +Additionally there are keys used globally by the Playground: +| Key | Subkey | Description | +|-----|--------|-------------| +| `EXAMPLES_CATALOG` | None | Used to store cached version of examples catalog. | +| `SDKS_CATALOG` | None | Used to store cached version of supported SDKS list with list of names of default examples. | +| `DEFAULT_PRECOMPILED_OBJECTS` | Sdk | Used to store a default example metadata in cache. | diff --git a/playground/backend/containers/java/Dockerfile b/playground/backend/containers/java/Dockerfile index 02b009001cc9..6cd16fab4e7c 100644 --- a/playground/backend/containers/java/Dockerfile +++ b/playground/backend/containers/java/Dockerfile @@ -63,6 +63,10 @@ ENV SERVER_PORT=8080 ENV APP_WORK_DIR=/opt/playground/backend/ ENV BEAM_SDK="SDK_JAVA" ENV PROPERTY_PATH=/opt/playground/backend/properties.yaml +ARG CALCITE_VERSION=1_28_0 +ARG BYTEBUDDY_VERSION=1.12.14 +ARG FASTJSON_VERSION=1.2.69 +ARG JANINO_VERSION=3.0.11 # Copy build result COPY --from=build /go/bin/server_java_backend /opt/playground/backend/ @@ -88,6 +92,26 @@ RUN wget https://repo1.maven.org/maven2/org/springframework/spring-core/$SPRING_ # Install Spring JCL RUN wget https://repo1.maven.org/maven2/org/springframework/spring-jcl/$SPRING_VERSION/spring-jcl-$SPRING_VERSION.jar &&\ mv spring-jcl-$SPRING_VERSION.jar /opt/apache/beam/jars/spring-jcl.jar + +# Install sql extensions service and dependencies for Beam +RUN wget https://repo1.maven.org/maven2/org/apache/beam/beam-sdks-java-extensions-sql/$BEAM_VERSION/beam-sdks-java-extensions-sql-$BEAM_VERSION.jar &&\ + mv beam-sdks-java-extensions-sql-$BEAM_VERSION.jar /opt/apache/beam/jars/beam-sdks-java-extensions-sql.jar + +RUN wget https://repo1.maven.org/maven2/org/apache/beam/beam-vendor-calcite-$CALCITE_VERSION/0.2/beam-vendor-calcite-$CALCITE_VERSION-0.2.jar &&\ + mv beam-vendor-calcite-$CALCITE_VERSION-0.2.jar /opt/apache/beam/jars/beam-vendor-calcite-$CALCITE_VERSION.jar + +RUN wget https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy/$BYTEBUDDY_VERSION/byte-buddy-$BYTEBUDDY_VERSION.jar &&\ + mv byte-buddy-$BYTEBUDDY_VERSION.jar /opt/apache/beam/jars/byte-buddy-$BYTEBUDDY_VERSION.jar + +RUN wget https://repo1.maven.org/maven2/com/alibaba/fastjson/$FASTJSON_VERSION/fastjson-$FASTJSON_VERSION.jar &&\ + mv fastjson-$FASTJSON_VERSION.jar /opt/apache/beam/jars/fastjson-$FASTJSON_VERSION.jar + +RUN wget https://repo1.maven.org/maven2/org/codehaus/janino/janino/$JANINO_VERSION/janino-$JANINO_VERSION.jar &&\ + mv janino-$JANINO_VERSION.jar /opt/apache/beam/jars/janino-$JANINO_VERSION.jar + +RUN wget https://repo1.maven.org/maven2/org/codehaus/janino/commons-compiler/$JANINO_VERSION/commons-compiler-$JANINO_VERSION.jar &&\ + mv commons-compiler-$JANINO_VERSION.jar /opt/apache/beam/jars/commons-compiler-$JANINO_VERSION.jar + # Install Java Katas Utils COPY katas /go/src/katas RUN cd /go/src/katas &&\ diff --git a/playground/backend/containers/python/build.gradle b/playground/backend/containers/python/build.gradle index 30ead18f8618..9b11b19b16b7 100644 --- a/playground/backend/containers/python/build.gradle +++ b/playground/backend/containers/python/build.gradle @@ -23,7 +23,7 @@ apply from: "$project.rootDir/playground/backend/containers/git-functions.gradle applyDockerNature() def playgroundJobServerProject = "${project.path.replace('-container', '')}" - +def default_beam_version = "2.44.0" description = project(playgroundJobServerProject).description + " :: Container" configurations { @@ -77,7 +77,7 @@ docker { project.rootProject["go-base-image"] : "golang:1.18-bullseye", 'SDK_TAG' : project.rootProject.hasProperty(["sdk-tag"]) ? - project.rootProject["sdk-tag"] : project.rootProject.sdk_version, + project.rootProject["sdk-tag"] : default_beam_version, 'GIT_COMMIT' : getGitCommitHash(), 'GIT_TIMESTAMP': getGitCommitTimestamp()]) } diff --git a/playground/backend/containers/scio/build.gradle b/playground/backend/containers/scio/build.gradle index e4afb763992b..affb3c778cfe 100644 --- a/playground/backend/containers/scio/build.gradle +++ b/playground/backend/containers/scio/build.gradle @@ -71,7 +71,7 @@ docker { buildArgs( ['BASE_IMAGE' : project.rootProject.hasProperty(["base-image"]) ? project.rootProject["base-image"] : - "openjdk:8", + "openjdk:11", 'GIT_COMMIT' : getGitCommitHash(), 'GIT_TIMESTAMP': getGitCommitTimestamp()]) } diff --git a/playground/backend/datasets/NYCTaxi1000Avro.avro b/playground/backend/datasets/NYCTaxi1000Avro.avro new file mode 100644 index 0000000000000000000000000000000000000000..a2ca5ec8b1cbe0f71bbe29a054bd91e8128b8a78 GIT binary patch literal 76451 zcmbWg50sbZbsqTp7c!Y(MUKa|qN);+T^l8``*OnBO$|+k97W!Fo zWeG_*s|fpKN{ouNEJI`>!<0^^g0RG^GtrSrigUE;WJDEA2bPdIfLWFUlt9$Qz?{ojY@Av7?eWBiZ&+6ZN?2!*Ye%}N4e{uD( zpIv|Ry5CxR|IJHoe(e7H9(iod&9~nC@aiw}|Nhixe&wFkPdr%u;PJJq@8eI`KD7F` zKK!}+SAX%ttMQWu?*H&3k9{8hO6S4*A6oPH%}f5t`ta*3?|*pBBai)q+wuP_{{s&` zyzb_&+#3Idb!+cm``NV*-uKVGwDz-WRsCJu5#ztrdFYYV6^8EyllMKc z=Kh}`)8p$NdF=kru6}sUXFLB3{yemrx+%r?65aWaKKaOftJgjF$iqK@2Og{)g9nR{m4*zi8y_tR`L{z4*c7?|g0Q(dT#l^>@DTjoZiGvFGAXH$KqU?j8J4yBGgk&~7j3 z>s`_wus`cx(pNNUwc5uTjZfX(Zq;gAm+}A7KVv&~d~|Hbx0hK;{ryV@s+2&w0QJV< znOm2E(wXM=251f6R;6`#X5DR;R(o(s-y*|RFSzP$9iI6lx!T+sYk}dcL{hc=s&}>h_S}`I{5l(RK4=m>1?^JWq82v8Co=5s%!s^ z8_Cx*jj85UWVE#U`j_-CHuMX4P`mN=!kwfw)f^{ZZ$#ZIUx#PrJH86=WoZo*OZtn( z==58pHQPK$S__PfhiCeozKQ{ulHrRw9BOnre@uN{|3fWUm&4bfH_>Wk`tBnI>Yirb&S_JiHX%*n2w<00T z4H{eo2|rA{In;a-%9_8tR)N%_c;|9^h`j?#`Ym*U)nc%_Jj9dDXQ}w9$W}1=zg%W% zL7ZL-H~j-k+I`)Z?pi@@ZD|SI+!@ss3}TJbJn*2X!ZSqdhw{7E_gq6-XPS%}*Ev$R zI#O*QYE@h9B?Xk<-?(Yx|3p&z>c@DB4@6o4QN8~FJ=^Vy=G!>JB?Ilosa%L zRM*x>EBNA=vr}M1zg5=&e5${zR$E3|(~aGLYS?PP>s_d4q${cgbEM?q`0 zIZMAz))kKN+x{34Wvh4tFIa@g+ueQQ*U8sxbDVsQM84*U)vxc_u5QelD~CE``OxzGBHhU&wHFHfE^%g;DpxRzK(L zs{l|{Wdv+6ii5AO@f=S#FO#p+kyfzP*W5V*CJJj4h#SD??i2S>#>vL%ImZp4o;}At z=&--B;@l5utEV;mCtD3jc+uG^{IS>SzQEZo4q4pk<|OqsVeD(;>wn{D5vr{2;oE&f zh(SN4`VzZuM}4X8-(L8T(--Wr&&D9oF9sXup6ns5HycNYIf+*Aq2F}0`jMAZX@U46 z>Z|+2dx`c(niuP!mEiv8#UF3lIFO4%4x;-8kxRf1B)c4IJV$*cTvZuswR^pN;ruP; zfY;t3bt40*~nL;o0ylz!xN!*h9OYXw32)uZ^@+U%9jw z7~OB<5Mn^l3*VNC133<5OmQg4_+=+!KXhLWkHBc?khEr&g0F)Op|vd9eZYHozKLJJ zXjh*NAe0Z#hv<)_1sSIzt>BOI9bfPlQzhUWVfV~cB^^K5*hJkQHM9=T^fH#J;lj8zUJ71x(2Gz5gr8cLtQh-%I04 z5(a0y!I6R?nO1^GI8d}E?>MI*@d7oUXa!Kc-O$4C^(`r?Y~g49_;KsfUHj?Sll93u z6U3=nt@iKq4{YUSg!HMZ(a(_n#-tv!gWxqX@LVsk9atzKY`U9C-O-{2!!+HjXPC9_0c|tw z>v+8nq&7wK>Mkqomz{YbmvAP5xP;i)>2%1}k>*Qu?TIL2F#GQ~^Xf$nWkHpyXO1IS zf1!SfA`V8rG>>C-WaBJU-*1l*alDVYy@p4Bdy@sn!=ZFCuU?-{sn=PT=SoF1S+W5~t+G3_EnZ%vTagh86Jz8c=5w`JDquy@MKeJ&;<3Wt-~`nI9k+9RrBz3)>#ls za^6!-aUUDaio!=Tv^-r0nxSN%abnjS%x|{UrHwPZOiwVJB2Lml1Uusny86+MVQxvy zZ)r)uJ{xK2Dc-W`CU0E`^wxjS*K7A9VE=E_*G}{sA@4qC5w99ruyD|FRuBK|Z}d$5 zH2FH#Jj4)`lhOJj>fpjAIIyl_F!T~u3ZlMXM9j5kQ9hZ{1&I<8i8kGuY@Je*n2NLl z+@Kh-ri5~%$`(w5aMmi#Yg*Iiony1jIuM|1+_n;wR&H2=#K>nQLri(4 z`OWfwoEgr6c#I0qV>`ZYjuDX&FlfDzExIC@D$9Qy9)vFEsIwBh(-*Rxt?;~Wtg7dJM(j=(?}rCqW+%Bbhq=}bCWD8<_L9N~`8{Vl70 zo3t+L5GR4X>g(?Po)$t-pVb$51z)R1ZziqhnqR$IYusif(q^$XhfHOl(dj%zS{v$b zGBoB!3D#Bt6R!1w^B5?)%644WQ6A%jJH||ug(+2&UZ|ec8O&a)?4vqKNL6+~)%QD8 zMfcy7R8krDaz-dscGq5pptF%J1+T+1*Ev#bdOGlegbdh1YHy;c)fVfb%qoxMr&C(dP7QrY;O$xXlBz& zQzaYB;dVz0Z28&@!K@D`_${(^NE^LJo#ubw(HSUJHB+FonCaM#cd`+;4NXwmR+RCY zvaz(#rAip5I#CTaj;VH1R#UnO6&&7HKbxzw^Waf=b4 zg$8t)#I2NkFgar|)m2VJII%B_p{{FW6<`rrLzurJl&0sw? zIAVWLbiXO;UTJkYzAsMms=6bXg1h%KGSXC^L(iD*7-?xDad_sUJ4Ymc9wzAS*anf_ z|G|dT#cLz2fc6_aEyOMxgaA2c#FeyWk&A<`WM3h<+~R2A{5`BPrr{iKrHqG~=Lui; zM!r;EwVJ0T6Lp*5(1&36pCK*QRNyfsUO~pE92BzGY+ajs1Or`|6p+^NG*zE-ZHv%c zWvG&Z%yiMNRio$W+S6KO&qej@lvK+gm;_9Y3qrEgbFlFy`C4Yw#j&wPXq2-Cq2UK? z2r$E;h;KHwH((wkkycQbM`-ZnI$k&q;Y+$fr_?0QI(PhgjxXe??W(@$i>%m7*FJWWA^aaNkMkU5n(K3X2u|AVT^|a>o zwMZ-Q&S|$i8Y5@S!2LaaN7~ z60_({jVEDVwdMG8#Xe|J{FF!#wLVZL;pnwNjtJ?!+Z8twTN3pgA}S%AiHuHDaILF3x1 zJBeqPfzTDFnA@I};8g($s1G*RhS6i-!4g{7$e@? zOA(c=vO-(uj0>3RR)iSO7Ndvr*XoPUFa}*4jZ0NOdB=cLJ$i92g=Q;xFFbTe zV^kSA4YKCNalNI5qiwgl_TTuADC2m2f)12&9L0!pPwsSl!Bm}j5oZ@+X8bg1P1G+C zyHX4aj_p_W*w3gAB@oPjgF|RR3l3hWi(?-(GUnD)+4HKp5bYFp(tTprcJg(hE>-&r z@f;VH!;%j<`+|x4);KEDMcuco`a|k|OKT<6bvCl4cynTxZCar5C zUn(QA9|wcX8mb{1xCmYsH(q(`0iNSZ88%Kuwp8`G-X*t|99ux=cI%b5p5QT_!NP0f z$_S)Quch6)Tm(Wd)}@wQQXIl$=}*bl<)#e&Q}kDO9-aQUqlL(2_=0(%ieH3G{Nv>7 zl2*nkGA6!k;swYvnFP*|2|CnWBdyEL=a}Kl1yW%W-mg(L_M!2znY7AgTuOQM7<2tu zRO}}6f{kDR-4~KL(t_?&lQ2}-`&|0W{%rLep)X`T?a&Y^`I<`;hr{`5qAJn9zi2J( z{yxufx*`4SlzFLr9iGWHXkDd;Nv~YL)L7d6(>z9wOQ8BxoT;huevmaU3{OpsAl`^X6|DmHXAeMK;A=R# zV?eJRIk0zQ9QM=(0^)Em4!))$E#-^5pq4L~l53VAm<+UQMKO9Cwp2DXq}Q9aR5bA# z+wr>&31!E^L=Ku)yna@i*F@wi$e2MwH1=#l$RM{E<(VvSmS&%14CdvVI7}p~rV1D0 zniupXjjEDXGS#53hn&8^gSkEfi~tPv^0pCe;(T3pXYX_w;TlJayVKQvHuz#w4elso z&_ilpNna`>698+gM0*>BkV>FGdt%qML*7#tZbuwecK7!nD)t3&vy-2ayA1Rp~)94OuqMp{mt=&b-iP#bQEvj+7DS zaBbu(=*#copq=eE3DL%hm$S>rF%|7A=*uGxTK4X?5n9PuKrbWhEN)a|3Vk-x3VgM^ zzECLGb0pfwOh&0NH#pFjaAhcyLN0O2wTn}5N6@N8eJQQ%&Nxe9qkER7F`#Mb zXxYl`XTcj?{O2Ya+c<)RXPU#%*22hDFs_d{<6={)3OEuPd)p!PI;|ln(YkurKpN-A z|19{hlPK4g2++{haMZl=m76WWSv=q%?d`*`WGPQ^r#=Rez)NY3?eMn<0MO3rG2=$s zyR`cRX^rc3&>W~*>jL1IbO}}uW9<(qjxKs9>{4~*Zf0?`RK-E)iWwA7QL6-LCZsCi zJ<>0^Y2#*BC7=P|GF3Pz#%Cp_?ygTYfH%2}&|)ea$l)NG0=U#uZcChMN(*`-nwK^J zI-MDBUOcjj(L-G*LV1I8imIP&?xjg2eW?SjIQOfL7SaY&Rk72D%q~UYmkLIi(T{v%0561TMbXPNSD!)^&Qe;^vfd~wEePrldXyhuQtwqy@B zGzpJ1CzxE$C7R*)OtTkY!$<>vjch3?h7F5@oGn$Y3x+C7oaI(x*Cx7kf(Rvbc;?FvZrD?; z7VHeWOnJ*Kl}+^xY}qHH4_hj;PV?x4x(5k3&Fn+2w4WBSQr3-Y<`8ptmU-34q9AW; z4Yk(yd{h))KT6}uiD=y#(Z(1(d=V8@|GY<+{sw6sMGG40N@;31#0^G7{2prmDqqOy zIQ2ru{_7eU$EmIq88zkIz4j~48Ig(mrE%Fw-1s_fOkpo>A-MYa<+ZYuRj!J{yEW{= zC2)wl{r#=-Rf$7-!#ihNPFv_cRO2G;780UMHJ^t#t&Lvm)_3ne zqf4)+=2s3^OiQEnxhH3g-uWxG{fwW%Mh54t@A)wMsl#iatHe|A9seo|>Jzi=D#bxx ze-{?B$sD!#co@Qqg?wm&;EiHO!lJZ9^%$KL|xxN^A{sJ@qvz zeNyw&oa;DnV5Bio490*fY-N%((GZVLd}%~HJhR40h{N*vDcmq7Z%6PP4(PrSK}#|I z@XSJYgp55^qyce;3~t0zTZfu^u7;)7NU3FKq&UZ3BsTk~uRYC4x?$3n^2O@M(n34e zB$YrwCSj-z#0`Jr2*c}pmIpsnD=ms&b{@@;RmEjV!7;?f9Z-sRupzIg*uryZ_aAuG zqrkIBgK&X`CHNs}9k0`QQa!9}jqUg|M+)Of=hDa^(10tq8jmZO4n|82r?|?|g63V_ z2@Uoy4sD?E`b$(-vaXPx`X(dB#U}Q^sWC4c!YaZJI`!qI&>D``rEXoT?ROy&am+Na z;RbAfp|lvGMU->K1c55!==8gtj0AaWsa$Md1dxA)s{b)E2*6Elyl%ab^}Y3M=&<0u z2I1?ZHtG{!0lKnb-;KmkF7)?xmHPu*bWwjK>PuxTiobCBqSafJ;E-epDLr4zP9UTaLU1heXVn}WRz~u3pk6uMtP@XOY7)d+n>BW zYIVN$Y6<^>*1;tX0`)CT0p zxOiB)dCQ1i{0Du1;zw?DlWjaRYlU@5oZZ{_Ay3g-L{WU&S?X0bgD@^G>x?~UAYdtL zE}qS#sM<({bulwXlLR8;#Y2IBH0F zMTLCLsyC){R9dS>Kk8`V932uOp~fC)iO?@KWC1FjqtY7N;Ufpo*zd!$s{q6)gfEyq zTxe>U+G(&=c~Hxs9^`R|!~IuYrIK~t%eq@X5p{p{W*3mq%9Hfln$R_3(Ie5q1c3e<>rf06Ma(9EvXBH-Cm(?f)RD~O{?w2i`m6A*( zv)4j)Y{$18DKvddpcSx}i?cF=n{Be(cp_?EwZ%2Ex>}!Nwp!{dZ~1JTG5ZRX=;H&^N{bK*TE}&pcY(3g zjj#W%%OzNdRc|!_pqb-P^Wz;01nbi z?t#oBtyB6w;on3h{5=7VrV_cpk*gA*{i1K)*pA;K zt&>feSmt^g*60x=T#7@dqUz=D=1FaK4aZ|t8DTK)7~y!{8Iej*MoCpqsf<&GR&K9B z%3uR%m;>qCZZwJVRq%;OD-@xA%E&9;SD322h0bft5pZ}R4mOeaQg_UODmod)RAKhe zJui4kbMSy(7f-2|>Z?|}==8-E!fJX6lmOaNDOhRRtisqNAWf4DT;W!{xVxj=|v-r*WlXGB40L*KRy5@A`nL`knwz7=BP==kiuPX zv=C%X1cLW4eF80sK;?`v@ulaOy+%cFvF8DFUWE49Hlp)P<08wTsi-gYM81=26C5DD zUksM9#@h?;Wf%KmeK|vE!Y-HW-Di;K7uP%%=BG{bLS>8*=R8eDjwh$Prs)xGx zRtR{hk*!b2j$V4RS*?q2*E$KAVi|2=rhw}tk1l;uoKY_;S)9*Z+GNYCih*Jg*uGiX z{g0`6x9_K?$l;XpAb^CkdfqT%r=EQ6s}s5IjM@rtnt^82c~(SDh6d)9wHY!vkeZ72 z5I``ShP$R7_X!4&-H0!4XuZm4oyw^Yt^Ilg48m=bAc7-#est->Jj9)iez5i7<-xX; z6mZ+yR_@j_a`OmXuQra6t+P?Y;MN`@xR`2fi<^VIRWDP)V@;V~zZo^Jv^t$1J3Hkh z*9Cqcbb+q;78-)nli_+bQx&#}{0k@BHqfotD>0QZ!S(PV9Qop&*+s)==33i`OG& zbzx>Mxifs&y%CQ&Q!yBx19j_IPe`L=Y{yrfc>$e`?x8~*EnAKMh59v{!)B3K6T9mQ?As~3)c0lR~P0hHprqTmV3OvPSszi4};X&$WvR1J%o&_AgN)wgpd@k8CR_~?gezot{5C{rIv5H&gg3fsg4c4=#8GUYAc~^ zd*MdC-2U8GmyTZYYgK&ikwqrlmKM?oEEl8W!b5yXyGm0LBa~M5DjY`i7U(&^9>8;; za;@&XUaPZ(MsAEsL#@(+zF=_uVT`&Dmk{9C_r_z?G-BiHJDf$Z2(zIdeBlL^G95gv zU8R%`sxuy*x!0W|icd2+Lt4je6}+)LsE#cc2bM*?)Fxhe>#L3y(umxs7;_~AM$+1@ zHt|HH6-?FlT;Rke1c|=z%0jswai+P6Kxhk%+&UJzN-ihCI<~xdDsz%D9qclE?k)SK7M{`V>Lm~g)R(VF+b}z};~%QJuK1)IT0t&_gNVgqd?IES)un4X|`9%hQdg^i$vnm+F*TeamRgnvF(148cj=;-u2 zd=bQDo60dFjR4lS@yf#gMG>b3yUrSIbvoa3)`bzT?=zwsun3!^KSj;I*5C^SIYf1- z5)@;(!qguPiP7mlB3I@6R-$;RK27uwkjHL>8(G5Iz$!1o%hZ26T5#YiIglDe?$!Y2 zN4{_o7+l|TBSkzZPqADVwWWu6%c@U1ZJ}ax0SN6Oj4appOj5+VWhr$o+M?T8GiCF0 z0CxudkX+5`M}CqkYEfLPU2trnuVwNs*cM>}wsn?l?bH{RhoguJH!O->A)DEe05ZyJ zP46OKrB%Zn2NXgPdbI@HaW=n_qnxc%)*a@84*V69A-h<#RRedo9R_u~bHICOM z$l5%@m+MqkX3-zs-ixcUqtw@%4cU=68}$`}SMma>zshhbSDVr5ZRiJf z_4Re*GK}Jlq!C-A)$1wd7X4vet|5V_0joc;YpnoIwsV$aE1L|WPqLVb7gB3rX6Xn` zD7zx9og zLqslG2%vV!diY#M&S;x?+=8{S%XmpG>mtjasi^soL-=Pqfi0O!&0v`n zw6;cVDXr`WpEDbcFgKKoB`tn-5bBzUw8AO+wlloPs0+A-^ogC=1(b1I-%T4dGIAfw zc{TW|VxXuVxK-ZX*;l8{rz9dcqF+_wjHXHoY#|kF!+Ye*9c#F)MP8Afqm2& z1orJJbq_?2T3X!1 ziXWIgulubNPWS#{7-S<31>x%Q8FyJqIj>*ZIBRI-9>_#S@3LK9%Hslp(0WsAmYUJm z;hAM#UoN8;o4}@Dxy&%D%OA;swEp2oo2-4I*=C$kYAJc9;Vd2KxW4!}mnvAqO?y8+G8U(5$-b!Is$qGp1t(CJ~wN>0eceGGo zU)hV0eKVzX_x?{&MlQI3ucR;K3tu>JD1mOCK?y)T#RNeA9%-Fwo@I6LL_9}@iQHFV z*iy1E!ET}KbyHuLu`LT)3nQ(-*GC**TrRVAFMVw^QvW~FS}AY2Sl7n2aYu?b{Hj0* zlK>DhFz%sK5N)wzr~st*|Lzs`*mCI=zzS#}GGi^p_9=YWZ z9#)>mB<=z}*$IpIQKY4s$Gf=BBG^>2@CN~hf%2Ek)7oKvDH1Z*W_}_idE-2p zY3ifeGep^MayZx;2XgSlhe&Ftu60>jue{|KQnO8Z^kjKI>;pGLZ0dY70BZH zKt!{4cnW#4AvXqc1(gjNs6Ne7H;fCp1#|IR$=Au|FfQE;8jE1@X-Q#d=i(3J2tS1+ z6~dZf*jDnxfDgAiO0akz`0+Dd-;s-q!=#i0X3G=M&Tm*EosQ2S5AP!Y9*sbwOyvei z$dZl03jm@ZE?2|3;SXBL-~%nc!oxLl8xn#00Op#8vAswk@b?8#?ZJ7l0%%Z$RfThD z^sm{A_!b>;_UcarT3VQJxp#d~70D;+rMxb0G0sIsbf;Wu18al6%CLV)%GjLhts}yU zeBw+IalvnZB3{q0!A-bB^leYHP)!tLEed?aBXw(N?nku5dm<`c4>5NY15ABgpfVt#Ly9vPetqA$RwksjdS+oJGuQp3(bPcRE`B z^Q{E=YS704G6lo1?88+2@wz-gF&EXNE$BMCs78S__&xxG{xFA9*G8@a{`EVEN8M=} zH^5~H7l0*dYgk^4&NUdVWwGs0ZJ~k`_sm*7lfTc{dZ76|Dt^s!IHnA^)ET{bw zut}35A#vk^Md$+U)Q196@KN0}3AB6>18qVH+>)gTDetIzoa0E;z3MA>E1YfbYLX<; zRaS0(m6kfL*HDsQE3NfCU+{co+Lh9Q0Y*r8eYyTJ@n$OW72?ldI-5ZJ@g*$c4_BR~ z19u!gm=m z;jgJ*sn>Rk;{7huMVr&b46rJoy#HM*{G}_pwC8N;06T68PR?#vyrD;Pq#p8 zIMUKX%&H61 zGKUeI^Yf~JtYEK{PD>6VEGag*s$mhhh_K5pgxnq3qs_P3D5CC7jZXhpRaX=dKFtO* zAvOLCRRIGB*8AT>b)C_1dV;}VU1js_%HM-_Bm!OWGeXy33y-8xUDFL2r#}$+3NZL( z!xwu5rMj-5MVBgCZ!g?QzMj#sREmtD`1z)D#oYCBPE2B2`HXgx-iTHoWW-S0gd2E} zX^%kn=q4@3^1~mHuM2f)R;EQ6l@Z_ZbhKDV*>J`xV<33r-FygcBytr%5dR&+6@y0A zBH)Xtwc`iU+cLwOilo#|b5jUzNLO)7;}5^w+TkId)>t-|ycvh+FJB?8WTQo}x$HQf zjeG@z$TV#*ps6ZL@Dx*sa<+IzKhv3Zu+$*IK>N}>N++2~r@{c(4UNW^`mj(wEH)EAGj z{9r+XLFJ1dp0Hs9(Z)BznOWlU$lp+3V_K;v7*r49e9_W^N%%}$cHj5kxRJD;(ZNBY z74$XVnHSR=dyWio{D!rlMArq@Eob8~s!0^ZO^y_khH9&lp^Wp4q9`x5NM|>JL{OK% zAj6Gci>Vx!@jke)RTdjlhOZo`GV!aLy%eAQz5FJ#s!NKExu}admQ@!)Vi7t@;zC#X zta(xV-_GpWFRki}{==S9+4(F#bT<)YRDEUVKW#=2}F7`5){|&?Z*>TvXsw)3bYbH2UviHF?Lk9VsM|CKnf&kZ&JLKwBf@va9B)SM1aACQ7y3fOR3g;G<-c zE^#6Vwo)n);%o*~(G0iNg_Hm@o1*xa1pArBk6C`EhyC;vQ8YWvV=m=Zl!+X1cwNq= z&PMA}R6RU%oukF_%*sg5ri@aquapnB%*BC_8JT?sSO_MLY^=XVLoM0ril?Y-)oPg? z7dT#(EyP*IUV<0Zg?>LYpVAVog5+yP75nC*sNK*z$y$0ga8N-T#$5ZNs;nKr8vQb|cO`c_}BKiLsLKVpV42>vhr^gHMB2&K#_+ zfa$LN35=DSHnXI4tobrmKck-6b=KX{9@M8N@Az|P50ZNrKL^yHky@hG zL0!nt#U5KQ^1?^e6A>`*zoC%7jcZdWHK;-d!LKOs0)vf-7=t2*DA%T^HFchf`U>Xd zn@aE%w*rUr=pCGQ)5h1S`(yeDujMN@o99rliV;Y5fT)Ae{lB8__u)&ju(i49o`be3 zEu16D4{m!%KEh9<;_o9-Mzx9DdOy1)&hFtw#IA2p#&QUha%ZKLd)kbBlIn~Ee8E=v zeeTCpMtSjOd$h06MDXkH$URK7mLvkZ4C{NYr)!_YQxA~wVx$$S^>;eo=9t>@#SIQ_ zr0 K<3+fJ%aW7Z~U601-o}qLmJ!I{E#jj%VO|l;cN1apYgtp;ck^L2#qzrAv8cg zOMPu=F~mL*MNHdt)`bw6{XJVQ;)ZCwRY+OuDhlt}09B(cXdZ(!j)A1g8-sGK|obLVmxF8}$MCc9%h9(A=k!NnOp+J#(NlZo>o{f5uf zGScB6HPl?e$fdHX;t_!;Hnb%Lsi72D$z9{}*AG0}OHnecIc$YaA>yq#0f}^#11X_2F032+sms7@BeZBpG zs4oSau^s-CEdX{?0Kx1z>B4QbcMxzc)Hl$v6X57M^74V@i{5DMo~vwEln0{w1gfE@ zhs4w9hFcpJpxM)5aw?0A{45>#N(rIT%I!`gH!^`%5&-1%<(2U9#%oNNa_x1OFu_)> z4N4X_Z}Z3(&cHQw*wAyN7@bO!Ld}P5C%r%6e7zqtpJ)btKR(Ddgyc_*FKR zBsh*3AId%K1332f1^Pq8LT1og@NG2M#IT{2dwddD=r)YF48`f7WaHC~1AGBF(F*vL zX_UBR0?OhQefaje+q&5ne}+D^b~)@-{<%>T@^3xs@E%h|mzbbr!xl)Hke461&7Gt5 zAz-23d_qX0zC`yWt+`+hea|)y}6IedK5`jFYp*XJHkC=6m<>G$bF zmz%Psyg$+km^1BYp$G1k>Oddw%HO?TzVdKPAC5|V1s_`HXu%&{tYvSZx2wFQbXwno zv$)zb`3;9(nCQAiQa;cWSM+A}BcvnCU=UX<&d9*eVj<#$P440ED6GnJJcx}Y;MWU| zR(Z!Fjyq9;B9W{5HjExQIk(Q_?#Hp_3j8&xUeg=~0DFw`%9>>rF3OiSK0wGBX^pV{ z-|E=PJSz`~ws4PJ7%5ZvE$oq&T(P(=nuJ15Zb60hUIwD&^XQ)>U**N{iOAR0!#2N! zYSo2J?_v<2dAPFXNHQv|PUnnE0niWfrYd=F`3~=_zIXdXlrda>f7zKA`$5(u0AE;~ zL0>~(0oQs=g@vJ{+#*nTQ6{V&4Nu_>z`F z+t}t!kydkizW89-0)jek#7F{}NqNO$T8H(?85n&kZXJR`@+ zC}TjJ^NugBs90K#;T#> z5aEpc%<5f~@N#oAG2-Usq^*A#HH+eduGnKU!AdCYS~Oo|i)~9w)=Cx_Z5^KR?MCqB zrs5oKEXI4}l9wFQ$CM|WjD9&4&ghy|oaqgr2py-ZhEDzW2h=Rb>nFE~txa{S&e^ zi_i$ZmPNkQ=xKj}z8TZR9tW7^A%@ZjEuaa^mBCV z@%lwVYOX+Yv~X&+2nBsO^y38pDQ?+ zj9b8AYkUCDD*c}FCG)OCOTCfb=eB(Da&tA4V0J^0xM|~m+@B4(i)b0a7AQGJ&4zx zZCZj*?`B@iE&1S+>^7X%7<6r<6{gSY94+*S9eQ#4+#6bGTUyUjM2k4N{F!TBRS}^s zL9cSmTfTYQ75P#bFWuGe`O4h$!#oDwSb9+T{6LaX(LUF5L>cUN8zlahe9huRgOG8d z;R}t1+bnv?{TSnpY%g(U{FLSrG6y|t5QonXSXxr2RA_+^>V^U{)o;@zj@QM7UW$Ba zt+&4CubjTnLiN|yiH_kM%RAjkUm=-zzoUg65`*?QN7!5+W@s`eJk}J1&Lt++R=Isx zbs<1KA}wE4{1Ih5U%wlwPhhVi76l%Ouc!vU1`(}!fmJ-pxRslCyPCavZPumcNwo3vX?KW`Jxda z)fd??i1-z&qfk7wWgRHHCjqvq{U977B5fSTjq8=vxi~gNG@7S1@D>%mn@7zbuU~AU z7dI0PHDLX5XI$J4wg$mdjD_(<{hWC%(o&G<;9+cQ5i<0wSP29~Qau1nl^Wq<{RQ@* zFGgD7vl#DmCc&meH7!BVK(fypY;x13973lQS^;NtdRLAw)1QU)qRM7(e1zszeip;V z*<8BBRKhh&7<bK z;}*KeHezVyZa<-RHF=5n5Qg?;$#Gfxjmx5asf^4eEZDR2QawlJ`t1Lg-<~Y{vnekL z3BWy$7S7D|py>;|BK|l*^^#r%SsVG%9OvAV7%Nx&1vZX8rPVzFy1;yCHP5kp($0A;-HG^|xBARf6_o=%G+a(XH@9RuKH;q1PeQp$VA~Q*2{?`G&?3rJf}BNI z&*t>nwo71f;Hy;EmXIyjfRzycx+vkky7^|I zW^u2)^}MrGG~Qe;LCp_v&dwR(0nGKl*KpK)kkQZe5I2lPlvyH@UWxywnx{x>)>s6J z7iSS%ma#a9#ycz(NiX?2)s&ijB=V&ok$V9L1(X>|Xx!jpk6f=iqzUvw!&mN2H{hUa zOEB4wAGtA#2IOK6|&d&Tb z&W$hBC0Ct_w3M&h+nwAAsd_dV+{if>hat`pEzl+mt=wz;%r9*^j@^rbyO-akXJ5vR zG1x?kvnu1^ncJPd*n_U-(6BGWOD+=%5~9aJT1O*a!B&6Z^o28XxfgOMPf+Nky9n^CfIRCWo^8d|w}7JYV8HzL20 zkbUW{zoqKO>vAbBnZ2eF3nc)VeRa6c&@8+;&& zsBGnKpCRjYQ!lxZhUwBLNa`Nx&!$9G9f&)t40014lXV*zCg4%Ytz057rB@%kPX$JaSp z9-xsfdA=YcA6eQ%>)O+Nx&>OvA_8CY9e8CIFVH2F=YB{FF9*Sa5?di|_&XQCb@yHq za|!O^2uN(IA7p=afpH-DF14vQxMgp#9!}NQ7t~dLcP;T1MD*%H{p2!ejuM!R3txND zH-?N|QT1x6Me%D+T^Q{7A_2JyAASCHTI$pKMeN~7EAW+Rs%EU7?@_WD_dBFDUgzvG zIgt7y*Z*t+4QFxXKid*468@E1y-b&q)xSr&UN>#r>{=Wg5?T*})ytZlgtHeKym~%i zPBGW?;$+;C0^G=#vEk8rjM~*LKm;M+5*@NIkHZLa{lG)G2gSh)q4QBvV zWcGZF;4`$;X{oaBjBJHtT;tiwM@CsVmc(m2p7Da}7e-nkY<$kq0@gdWP&i1HEk(lK z@+0ZSRQc%$=Rv6ct%yui>Dce0h!^i|wlmUvqIGW?t4Ekx8IITV6Qg`V3?|>SR3SbkA9T##GTbE@dpg z1)KO%cg!}SnPpW10NfFc9e%*|RqB3HJ1=`9U%|CAH!tveRlY!rSxNXH+z~V!A!Bmw zV5{qVE&&9!L5KL0>;8Y5H!3YC(}{@8%XB!PF4pXz^-H96xhcEe$+gu~ zC-3lEW9Ukmn{lXTsY1|NNp(#(o?@I$7utf^-{O#v@!6TGT%9dq8%jZXi4 zcZ@iGv&8}0urNLt{2H^%34NkGp+qo=Uvs94-*W+tfr+Sk3q?Gr*KyiWM5UFx&jyq5 z&t0J5C{KEjFSc=r_U;({&MWWPxy)YD%k@1+Nb3OVGtf#h2E@6+$%ur;tY^c8fc68Z z8`o3DaeXBzjh8|c$~@_T@sFz;`Lpn-)R`uqa7;lcuyw0riwi-{>cQ4xyz;x0BA&s! zKQM`8^=hfzC;q}MLNWiV0yIpExddqapQN=@Z(h{mF)A%AyE(p)#~Dk7y5NunKOsSH zd{y5B9d^g)yM)|~v|!J)H-0v9x-r4v_@l^|>MQsBFwN4^LJ^8*IKn6aZwTS=t$p<=wm7aed>x+gBYT>X?Ot-e5U)Y+)6ZE zsi=EB$FUvnbjbwH-*gEjXv=qIzD~0*X{Cs!uHEUp>}-O;KBIf+Yt`tB;zD(PCUC1! z7xOsVOJI3nN%3d$h)@k|ZD?+gE>09Nn8f2%v!^{&({cHb0lzcDm-%I=dcH0Iom8*t z;)i{$>PgN9M|S(TdC{SWN16v2XcJ0=GU1QC>d`N$=Dkoo$1x0!q;(MAvjna5Dvr`B zidUSzfc9<}hdfS(suxLXZ(|d061?Da|0j+wj$SOPvf0bBYBS9X-8k}fXQZViTBozk z(L&HRTlONORL64Bezv)l`f4q&g%Yj2Y5y}WkpoP)h(?=;z?gbYzrUgi`3IsrxteF@Y6^R&El?sjB6RxoSU3 zA!vl|_yE}IUe2S?KYA_U=Uh&RF^kFLkl4wH15G8Smzx?tq);RQH5UM6Q;0wt_FGivNnIi6~OCEQ@sH@Y-?AfuW zZcKvRUh*XklbyQJp7_#q{P4^cXZGA@tRf-&ljUA$6CSVYyHbuXkE%4wDlG_zGPI4c z>L;nM%gqaOHG7lCy&r zwL$w!Bay8DI8Qqd!ZNn&RdH9L7t|CXFTlE>uhWs1<~WZo?RMye=8Fp)dheyQh%Q+Yveio`x0je{ z$3b0)8|4^h9QzUg)kG_RSC2D#s;e5$;6T{zC}5~ROHke0xCf->f?ZrCtU|rCIOK@~ z$p}}+O5Xt7IaF;H8CC7w=d{Ml}39iH)cDjsZN8Dnfr zyAI`7UUI9F@L<#5U=U$pT=s*GH=beqnM+{|^LFVCC$=0)e4AdqUkbfcxCG#O)~O4? z6#bLgGJdGY2y0-UH|)-?Jjh%y*=cH9TK|C^x#xNizcGF;*;+a0 zEgS&4DT3QkNP8KAY`~ z9&DND1GZRv@WnW?RoX1lVGQ0hMQl|t3x?*}6xae#v?94Ts9$ewH-XQL#Y zV;HeN@A$&`yS63H5x38~(a8*JdTdkBU7+-CwNBZM~E#sf@5bCnNN1a#R2zhG%@8TB?@vPH*BXG;sdX zH4&Ie*ucTBmc^&_$MwmDqfy2{>)p;)`KXAMkvile?tIEPtuHuU7j+-NKI7X+ys9}p zWR%K()#!7~mdfSX6#bPiJcs4@Vm4!CQa~${vAy1AHWED_DfD7jcTF0s?x;guOh)HN&veBwz5KPdc9H!_~elJ2${ayecWF z^RPT1Xx+Lfyj#O0UBd;#w1LGSC1!d=XS|!DszQ+crc*mEYPy0LJLK47*tzRp&YP#x7_g>T&cV&j=V zsyh|3&1fPO)QS~_(dj=@@052YEo!{-mfuKOPsC22Ind)M zig&ntKjKFp!L5}#=VU$uw_N$ z&33CU0+(%^zbk7zT4>nH?T_;kQ#Fdv zu()|t+SXoui*_*53JyBr4FW|&l@>BFW}A)jZ^2PV5?Xw3z5y1yE?{F-_0S&^YP`Vk3zU%?J}|F|=s_Xj@zXE1 zHmWcv$Joo;oTmvlV-5Mv+l1rGM@!yVtSAedTGYOcu zA1NSlE%2o9Uy;_9mL!`wZ?ran0>tPG2Mg8~g{?1s*b98+qNOVuG9wriOL$tXtVwaZ zicoJcHT#MQpuXCA6uwXxl`o>6YD#z2#>?D`s6;)BILLai8&Za|>4rY%Qg+&WjDm zUc-vdrRMM)kCDCgs=9H^qT1Dd!aKIDM(jp{m%x(IyD zrP;*04i*VfTcW-#>yI;dEDW>~+6Nc^p+NY%W6 zswj;5aargnX&q?D9nAfXmTySo7)?C`y)&IiLpixzl@KSW>j$n>ri|9SP}ZY_N9jnu z4&mKV{yp-gL7VTPS|sE^)S^Ax0dZ67w7$Vqi?o7C^mtm#>`gMxvYwqj8LrM~37^hU zBUU$vUwuEO-jeXNS8x)>jpzK3Ril@B^B?QS}o z;3YPTs)!uum6r>hn>C`PD5Sby-}9S}mTwzEKt`t4rMpg&FFbw;vtJNJ463&^f+RU+ zMvkAM6SD|ksvKuox@L_S2NKsSioZ*D?RUmS1GmP-d)hq2=c)Kfy%2pda-{+m#ZS4c z7nO@s7HHvWNYCW|P5}?-{e)$aR*(=St1%=r@J*OSRu5(IQLgWj7P4L%eM%()Ex%HT zo`i8AFiK~KjMAr=)rYi3B3~+Ft>z#2!tlhER9tN0YfiE(G>-3Qg0CkGt)lohPDVJf zn}9)wSnw%3FvE||!oY?f!*!V?%ljlgj&ZCD9T3d~bGHWyT z1zU3QjEik;_O3{4U;T$naV8=y1+Uzgf-_!MCNRGU_O%CJvIk%HCK;vo%hb!-Jb!)=9M5dkb1^J7kVYev&Dnji{`z(@HDkG zEXxVkMFCY=Sa5cvkPo`S0um@BUYG9LE~I2lyUUPzd*MeMDQQxfa|NKn7jIehbHuLl z%Xo>cfDyJ=3u(~Xt^z%Nh7y4`FXb6;qG#;k?S(&b^A0vHZOV%v-n+QFyglA!`Wp&2 zCvrtLv{f|+1aOEr&^0>!7JXa3-zX<6Jd5O$jF(@(@;+~rRP3x zIgIU!v*&~&>6kls|Iv^pN4w5xtn}l<7mChg+=UcIDK&>8o#};W`@3)Qq&;g z?M_69W2$07L3uG*AYul`2(|{Dx<2VtpPPtE&k#?0$u;yhwc(XiujZAzw#UIjb#)At zKN=o<6XG9JU0YiBK*YqBlFB`y!6BygYZRXlvFvxPlnFvIE+s|%SwIEaIK?9uz~#98 zH@=%(ZP(81!l*5!mF@E4_bgjjw8p~M((d=t==r5lXg)bmfCxXdf{3mFf{3`Pg1tng zB^M^o8jLtRDgobeqXqNWE&l@{-pTEAwAQbkl4J)kiz$Q{?)OGl%+^ccr> zc)Vdtq$(n40V5W7Kf3gK@^!f>%XZ09gN(lA!Zf1Fmy|%bOHj@>%IC`yUy7+WZNy{U z2D^yQw%vshxvUg?hI}2RI|(S6dF(#oaIm?F4!T+XOin#tGa+j4s;?U#nm*}EM)qbhb`1J*0= z?7xpzzojK8u{D~6sy_F;Byt&JUJ}mG$Sz-K+1xtLv@0bg!6f`+Z?g4ljuuG?l4s=M zOb7Yda;SbJ@};y`0a^57chKfaa0PjnNV;&(=%?(hd5uoL+nEppn35F z8vJ`SuOMT;qlJpm+=LRW$Le00iJ#Wb?06adt^@T|g$cG&5#tQ438$~`xT=_UFPy$m zVfR6c6pPj1{u9;Q_t13MB{8f2TO{oGLT4o1+(`<7o;U_TZltOoj!EYA>5)UN5qc*7%+ccNrsWGNL|Rh5wDTM? zLeQE^iUT)xGRleqRKJks)yH=nl5y#E2@D0C=Gi8zY97WV6PLp?6Z+7OOhD5^JF0o` z>~c%?tev(XH5XRJP}wgAUoS)l3Rr)wiIO7gVIHP;VY2>1y+UY#!Xz@m{ zjc4q4#P1Sb&^eUM8_7g%XaU)a=u<}qMbFWKe5YpH<&B=ZWnU>-odWY=%?iqH0cFR zwfS>TUT`)K&A5oo)rNN0W{MGP;Fyi3FEm3M@At*fFfB{;r4|8QI=%>lHh~5V_6>E%&p6A(Wg@C8;7#W1KdkBuU#ujH?pNO0%P?DB zCm1%g*kE^%iX*c!!b%2u(F{6CeI00QroNt!`s$Xqm)7@WE<&LKwbL6MtvqKpNPUgh zC+LkyM%7pDQ`L~i)j{w^JTHM)RY_|?){MF$TT1FGeK=pt0wfk=;qG@SV%HG{|K!)I zdA$1JPZ33(3$h57{Pv$<#PHKxMo5MlNM*)AP?k-f;Xl1?Y#o1s0+w$j&L!_6MA&%E z%WPZ(k*7=WfEM{mMj!Zk+d%~PZLEm6nvk}84>jfS-w|V6xhuk`r(G~(TF*y`=Tq~1 zo)rd>@Fu{Z&q=tRXpNq|Ik|qJ#wFjDxHejZ(#l=+Msv%QF3bkt2;z$Y24i! z{-r~h!hc95zT)a2*o3QHxO>K@UZsb_*Cj#s-pE%N%OcS*01D7Ewh9^1xNOghV_8`a zwP3$$)VBz8r7_3kZGhK1X!mPm9+AooHPu|_5;4N$sbGso+v+|cUxXNMEQf@D8zody z*`^+T(?UJHeF!)xY3gL-Syp<yb2!4)t3eag_vRtPzOX4DSF|K^r7dgr2gt{GXxVOSb!mG@{iHF}_~2cqhO zy1wkxMIdy$2*4bI*DExL2_5mKwHckc+_LIFJ6cSPEZD;$dI#oVf1I?=H04_ya}g2S zb!Mjo1t|I_ylyP-8=TVbE(}K*l`p=jW&sB>8os1*LBU>*i}&djrUYJU68ylC-LC%s E0f$CFfB*mh literal 0 HcmV?d00001 diff --git a/playground/backend/datasets/NYCTaxi1000Json.json b/playground/backend/datasets/NYCTaxi1000Json.json new file mode 100644 index 000000000000..afbc9d77b30e --- /dev/null +++ b/playground/backend/datasets/NYCTaxi1000Json.json @@ -0,0 +1,18964 @@ +[ + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:21:05", + "tpep_dropoff_datetime": "2018-01-01 00:24:23", + "passenger_count": 1, + "trip_distance": 0.50, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 41, + "DOLocationID": 24, + "payment_type": 2, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:44:55", + "tpep_dropoff_datetime": "2018-01-01 01:03:05", + "passenger_count": 1, + "trip_distance": 2.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 140, + "payment_type": 2, + "fare_amount": 14, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:08:26", + "tpep_dropoff_datetime": "2018-01-01 00:14:21", + "passenger_count": 2, + "trip_distance": 0.80, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 262, + "DOLocationID": 141, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:20:22", + "tpep_dropoff_datetime": "2018-01-01 00:52:51", + "passenger_count": 1, + "trip_distance": 10.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 140, + "DOLocationID": 257, + "payment_type": 2, + "fare_amount": 33.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 34.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:09:18", + "tpep_dropoff_datetime": "2018-01-01 00:27:06", + "passenger_count": 2, + "trip_distance": 2.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 246, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 12.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.75, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16.55 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:29:29", + "tpep_dropoff_datetime": "2018-01-01 00:32:48", + "passenger_count": 3, + "trip_distance": 0.50, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 143, + "DOLocationID": 143, + "payment_type": 2, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:38:08", + "tpep_dropoff_datetime": "2018-01-01 00:48:24", + "passenger_count": 2, + "trip_distance": 1.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 50, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.05, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.35 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:49:29", + "tpep_dropoff_datetime": "2018-01-01 00:51:53", + "passenger_count": 1, + "trip_distance": 0.70, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 238, + "payment_type": 1, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:56:38", + "tpep_dropoff_datetime": "2018-01-01 01:01:05", + "passenger_count": 1, + "trip_distance": 1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 24, + "payment_type": 1, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.7, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.5 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:17:04", + "tpep_dropoff_datetime": "2018-01-01 00:22:24", + "passenger_count": 1, + "trip_distance": 0.70, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 170, + "DOLocationID": 170, + "payment_type": 2, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:41:03", + "tpep_dropoff_datetime": "2018-01-01 00:46:49", + "passenger_count": 1, + "trip_distance": 0.60, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 162, + "DOLocationID": 229, + "payment_type": 1, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.35, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.15 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:52:54", + "tpep_dropoff_datetime": "2018-01-01 01:17:33", + "passenger_count": 1, + "trip_distance": 3.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 113, + "payment_type": 2, + "fare_amount": 16.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:17:54", + "tpep_dropoff_datetime": "2018-01-01 00:22:05", + "passenger_count": 1, + "trip_distance": 1.04, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 137, + "DOLocationID": 224, + "payment_type": 2, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:24:47", + "tpep_dropoff_datetime": "2018-01-01 00:34:20", + "passenger_count": 1, + "trip_distance": 1.22, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 224, + "DOLocationID": 79, + "payment_type": 2, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:37:57", + "tpep_dropoff_datetime": "2018-01-01 00:53:43", + "passenger_count": 1, + "trip_distance": 1.92, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 234, + "DOLocationID": 100, + "payment_type": 2, + "fare_amount": 10, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:35:53", + "tpep_dropoff_datetime": "2018-01-01 00:52:59", + "passenger_count": 1, + "trip_distance": 5.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 13, + "DOLocationID": 189, + "payment_type": 1, + "fare_amount": 19, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4.05, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 24.35 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:30:47", + "tpep_dropoff_datetime": "2018-01-01 01:13:20", + "passenger_count": 1, + "trip_distance": 3.74, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 236, + "payment_type": 1, + "fare_amount": 25.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 6.7, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 33.5 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:21:45", + "tpep_dropoff_datetime": "2018-01-01 00:25:58", + "passenger_count": 2, + "trip_distance": 0.60, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 163, + "DOLocationID": 162, + "payment_type": 1, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.7, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.5 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:31:11", + "tpep_dropoff_datetime": "2018-01-01 01:07:56", + "passenger_count": 1, + "trip_distance": 10.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 61, + "payment_type": 2, + "fare_amount": 35, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 36.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:15:42", + "tpep_dropoff_datetime": "2018-01-01 00:21:38", + "passenger_count": 5, + "trip_distance": 1.22, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 75, + "payment_type": 2, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:25:19", + "tpep_dropoff_datetime": "2018-01-01 00:45:02", + "passenger_count": 5, + "trip_distance": 3.13, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 263, + "DOLocationID": 143, + "payment_type": 2, + "fare_amount": 13, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:51:36", + "tpep_dropoff_datetime": "2018-01-01 01:04:13", + "passenger_count": 5, + "trip_distance": 2.22, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 24, + "payment_type": 2, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:09:11", + "tpep_dropoff_datetime": "2018-01-01 00:30:24", + "passenger_count": 1, + "trip_distance": 2.93, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 90, + "DOLocationID": 233, + "payment_type": 1, + "fare_amount": 14.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:32:00", + "tpep_dropoff_datetime": "2018-01-01 00:58:50", + "passenger_count": 1, + "trip_distance": 3.52, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 233, + "DOLocationID": 125, + "payment_type": 2, + "fare_amount": 18, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 19.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:41:49", + "tpep_dropoff_datetime": "2018-01-01 00:54:44", + "passenger_count": 4, + "trip_distance": 3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 161, + "DOLocationID": 146, + "payment_type": 1, + "fare_amount": 12, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.65, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.95 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:17:15", + "tpep_dropoff_datetime": "2018-01-01 00:21:49", + "passenger_count": 5, + "trip_distance": 0.25, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 234, + "DOLocationID": 234, + "payment_type": 2, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:24:54", + "tpep_dropoff_datetime": "2018-01-01 00:46:55", + "passenger_count": 5, + "trip_distance": 3.31, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 234, + "DOLocationID": 143, + "payment_type": 1, + "fare_amount": 16, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.46, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 20.76 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:48:40", + "tpep_dropoff_datetime": "2018-01-01 00:51:30", + "passenger_count": 5, + "trip_distance": 0.57, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.06, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.36 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:24:42", + "tpep_dropoff_datetime": "2018-01-01 00:31:56", + "passenger_count": 2, + "trip_distance": 0.70, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 170, + "DOLocationID": 162, + "payment_type": 2, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:36:09", + "tpep_dropoff_datetime": "2018-01-01 00:43:06", + "passenger_count": 1, + "trip_distance": 1.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 233, + "DOLocationID": 263, + "payment_type": 2, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:49:20", + "tpep_dropoff_datetime": "2018-01-01 00:57:58", + "passenger_count": 2, + "trip_distance": 1.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 237, + "payment_type": 2, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:13:37", + "tpep_dropoff_datetime": "2018-01-01 00:23:52", + "passenger_count": 1, + "trip_distance": 2.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 166, + "payment_type": 1, + "fare_amount": 10.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.35, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.15 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:33:29", + "tpep_dropoff_datetime": "2018-01-01 01:18:08", + "passenger_count": 2, + "trip_distance": 4.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 249, + "payment_type": 2, + "fare_amount": 27.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 28.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:15:34", + "tpep_dropoff_datetime": "2018-01-01 00:22:43", + "passenger_count": 1, + "trip_distance": 0.89, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 151, + "DOLocationID": 238, + "payment_type": 2, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:25:52", + "tpep_dropoff_datetime": "2018-01-01 00:29:24", + "passenger_count": 1, + "trip_distance": 0.49, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 238, + "payment_type": 1, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.45, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.25 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:32:10", + "tpep_dropoff_datetime": "2018-01-01 00:36:07", + "passenger_count": 2, + "trip_distance": 0.80, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 151, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.26, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.56 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:45:07", + "tpep_dropoff_datetime": "2018-01-01 00:58:29", + "passenger_count": 1, + "trip_distance": 2.09, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 143, + "payment_type": 1, + "fare_amount": 11, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.46, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.76 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:31:23", + "tpep_dropoff_datetime": "2018-01-01 00:45:38", + "passenger_count": 1, + "trip_distance": 2.32, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 186, + "DOLocationID": 231, + "payment_type": 1, + "fare_amount": 11, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.08, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.38 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:47:03", + "tpep_dropoff_datetime": "2018-01-01 01:26:24", + "passenger_count": 1, + "trip_distance": 9.49, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 231, + "DOLocationID": 116, + "payment_type": 1, + "fare_amount": 35, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 9.08, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 45.38 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:21:19", + "tpep_dropoff_datetime": "2018-01-01 00:28:33", + "passenger_count": 2, + "trip_distance": 2.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 145, + "payment_type": 1, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.7, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.5 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:32:45", + "tpep_dropoff_datetime": "2018-01-01 00:47:19", + "passenger_count": 1, + "trip_distance": 4.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 145, + "DOLocationID": 263, + "payment_type": 1, + "fare_amount": 15.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4.2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 21 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:54:40", + "tpep_dropoff_datetime": "2018-01-01 01:03:54", + "passenger_count": 1, + "trip_distance": 3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 146, + "payment_type": 2, + "fare_amount": 10.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:23:44", + "tpep_dropoff_datetime": "2018-01-01 00:52:12", + "passenger_count": 1, + "trip_distance": 7.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 90, + "DOLocationID": 82, + "payment_type": 1, + "fare_amount": 26.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 5.76, + "improvement_surcharge": 0.3, + "total_amount": 34.56 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:04:17", + "tpep_dropoff_datetime": "2018-01-01 00:15:59", + "passenger_count": 1, + "trip_distance": 1.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 144, + "DOLocationID": 234, + "payment_type": 1, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.05, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.35 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:17:41", + "tpep_dropoff_datetime": "2018-01-01 00:41:31", + "passenger_count": 1, + "trip_distance": 0.80, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 234, + "DOLocationID": 164, + "payment_type": 2, + "fare_amount": 14.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:42:46", + "tpep_dropoff_datetime": "2018-01-01 00:44:41", + "passenger_count": 1, + "trip_distance": 0.10, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 164, + "DOLocationID": 164, + "payment_type": 2, + "fare_amount": 3, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 4.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:48:05", + "tpep_dropoff_datetime": "2018-01-01 00:55:15", + "passenger_count": 2, + "trip_distance": 0.20, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 164, + "DOLocationID": 164, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.45, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.75 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:58:08", + "tpep_dropoff_datetime": "2018-01-01 01:05:33", + "passenger_count": 1, + "trip_distance": 1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 164, + "DOLocationID": 68, + "payment_type": 1, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.5, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:19:12", + "tpep_dropoff_datetime": "2018-01-01 00:34:49", + "passenger_count": 2, + "trip_distance": 1.13, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 161, + "payment_type": 2, + "fare_amount": 10.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:36:55", + "tpep_dropoff_datetime": "2018-01-01 00:51:58", + "passenger_count": 4, + "trip_distance": 0.41, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 161, + "DOLocationID": 170, + "payment_type": 1, + "fare_amount": 10, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.26, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.56 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:17:28", + "tpep_dropoff_datetime": "2018-01-01 00:37:38", + "passenger_count": 1, + "trip_distance": 2.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 48, + "payment_type": 2, + "fare_amount": 14.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:55:41", + "tpep_dropoff_datetime": "2018-01-01 01:05:35", + "passenger_count": 1, + "trip_distance": 1.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 68, + "DOLocationID": 68, + "payment_type": 1, + "fare_amount": 8, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.85, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.15 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:32:46", + "tpep_dropoff_datetime": "2018-01-01 00:49:10", + "passenger_count": 1, + "trip_distance": 1.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 234, + "DOLocationID": 90, + "payment_type": 1, + "fare_amount": 11, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.7, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:22:51", + "tpep_dropoff_datetime": "2018-01-01 00:30:34", + "passenger_count": 1, + "trip_distance": 2.09, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 263, + "DOLocationID": 233, + "payment_type": 1, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:56:42", + "tpep_dropoff_datetime": "2018-01-01 01:00:17", + "passenger_count": 1, + "trip_distance": 0.79, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.26, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.56 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:13:17", + "tpep_dropoff_datetime": "2018-01-01 00:30:22", + "passenger_count": 2, + "trip_distance": 2.84, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 234, + "DOLocationID": 13, + "payment_type": 1, + "fare_amount": 13, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.86, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.16 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:32:59", + "tpep_dropoff_datetime": "2018-01-01 00:43:19", + "passenger_count": 4, + "trip_distance": 1.56, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 13, + "DOLocationID": 148, + "payment_type": 2, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:51:26", + "tpep_dropoff_datetime": "2018-01-01 01:00:53", + "passenger_count": 2, + "trip_distance": 1.76, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 144, + "DOLocationID": 88, + "payment_type": 1, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.45, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.25 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 01:02:39", + "tpep_dropoff_datetime": "2018-01-01 01:04:02", + "passenger_count": 2, + "trip_distance": 0.09, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 87, + "DOLocationID": 87, + "payment_type": 4, + "fare_amount": -3, + "extra": -0.5, + "mta_tax": -0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": -0.3, + "total_amount": -4.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 01:02:39", + "tpep_dropoff_datetime": "2018-01-01 01:04:02", + "passenger_count": 2, + "trip_distance": 0.09, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 87, + "DOLocationID": 87, + "payment_type": 2, + "fare_amount": 3, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 4.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:23:47", + "tpep_dropoff_datetime": "2018-01-01 00:34:28", + "passenger_count": 1, + "trip_distance": 6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 247, + "DOLocationID": 213, + "payment_type": 2, + "fare_amount": 17.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:38:57", + "tpep_dropoff_datetime": "2018-01-01 00:39:00", + "passenger_count": 1, + "trip_distance": 6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 213, + "DOLocationID": 213, + "payment_type": 2, + "fare_amount": 2.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 3.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:48:59", + "tpep_dropoff_datetime": "2018-01-01 00:49:00", + "passenger_count": 1, + "trip_distance": 6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 213, + "DOLocationID": 213, + "payment_type": 2, + "fare_amount": 2.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 3.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:20:53", + "tpep_dropoff_datetime": "2018-01-01 00:20:53", + "passenger_count": 1, + "trip_distance": 0.00, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 161, + "DOLocationID": 264, + "payment_type": 2, + "fare_amount": 14.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:08:50", + "tpep_dropoff_datetime": "2018-01-01 00:12:03", + "passenger_count": 6, + "trip_distance": 1.43, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 75, + "DOLocationID": 74, + "payment_type": 2, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:21:18", + "tpep_dropoff_datetime": "2018-01-01 00:24:27", + "passenger_count": 6, + "trip_distance": 0.60, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 262, + "DOLocationID": 236, + "payment_type": 1, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:26:54", + "tpep_dropoff_datetime": "2018-01-01 00:29:52", + "passenger_count": 6, + "trip_distance": 0.49, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 263, + "payment_type": 1, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.06, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.36 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:55:15", + "tpep_dropoff_datetime": "2018-01-01 01:04:17", + "passenger_count": 2, + "trip_distance": 1.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 114, + "DOLocationID": 224, + "payment_type": 1, + "fare_amount": 8, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.86, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.16 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:17:15", + "tpep_dropoff_datetime": "2018-01-01 00:37:37", + "passenger_count": 1, + "trip_distance": 4.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 107, + "DOLocationID": 25, + "payment_type": 1, + "fare_amount": 17, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 5.45, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 23.75 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:54:59", + "tpep_dropoff_datetime": "2018-01-01 00:58:41", + "passenger_count": 1, + "trip_distance": 0.90, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 231, + "DOLocationID": 158, + "payment_type": 2, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:11:46", + "tpep_dropoff_datetime": "2018-01-01 00:24:29", + "passenger_count": 1, + "trip_distance": 2.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 114, + "DOLocationID": 246, + "payment_type": 1, + "fare_amount": 11.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:26:48", + "tpep_dropoff_datetime": "2018-01-01 00:42:22", + "passenger_count": 1, + "trip_distance": 4.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 50, + "DOLocationID": 12, + "payment_type": 1, + "fare_amount": 15.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 19 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:47:32", + "tpep_dropoff_datetime": "2018-01-01 01:06:51", + "passenger_count": 3, + "trip_distance": 6.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 209, + "DOLocationID": 263, + "payment_type": 1, + "fare_amount": 21, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.5, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 25.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:23:24", + "tpep_dropoff_datetime": "2018-01-01 00:27:32", + "passenger_count": 2, + "trip_distance": 0.23, + "RatecodeID": 2, + "store_and_fwd_flag": "N", + "PULocationID": 186, + "DOLocationID": 164, + "payment_type": 2, + "fare_amount": 52, + "extra": 0, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 52.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:27:58", + "tpep_dropoff_datetime": "2018-01-01 00:58:10", + "passenger_count": 1, + "trip_distance": 3.02, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 164, + "DOLocationID": 142, + "payment_type": 1, + "fare_amount": 18.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 20.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:15:00", + "tpep_dropoff_datetime": "2018-01-01 00:23:01", + "passenger_count": 1, + "trip_distance": 1.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 24, + "payment_type": 1, + "fare_amount": 8, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.85, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.15 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:27:07", + "tpep_dropoff_datetime": "2018-01-01 00:36:21", + "passenger_count": 1, + "trip_distance": 1.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 24, + "DOLocationID": 263, + "payment_type": 1, + "fare_amount": 8, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.3, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.6 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:40:25", + "tpep_dropoff_datetime": "2018-01-01 00:47:22", + "passenger_count": 1, + "trip_distance": 2.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 162, + "payment_type": 2, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:58:14", + "tpep_dropoff_datetime": "2018-01-01 01:15:34", + "passenger_count": 1, + "trip_distance": 3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 224, + "payment_type": 1, + "fare_amount": 13, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.85, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.15 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:01:22", + "tpep_dropoff_datetime": "2018-01-01 00:02:35", + "passenger_count": 1, + "trip_distance": 0.47, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 74, + "DOLocationID": 75, + "payment_type": 2, + "fare_amount": 3.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 4.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:08:20", + "tpep_dropoff_datetime": "2018-01-01 00:14:36", + "passenger_count": 1, + "trip_distance": 1.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 263, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 7, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.66, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.96 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:20:16", + "tpep_dropoff_datetime": "2018-01-01 00:53:04", + "passenger_count": 2, + "trip_distance": 4.43, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 224, + "payment_type": 1, + "fare_amount": 22.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 24.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 01:00:12", + "tpep_dropoff_datetime": "2018-01-01 01:01:44", + "passenger_count": 1, + "trip_distance": 0.53, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 233, + "DOLocationID": 229, + "payment_type": 2, + "fare_amount": 3.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 4.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:18:31", + "tpep_dropoff_datetime": "2018-01-01 00:23:38", + "passenger_count": 2, + "trip_distance": 0.70, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 43, + "DOLocationID": 236, + "payment_type": 1, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.35, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.15 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:28:40", + "tpep_dropoff_datetime": "2018-01-01 00:33:10", + "passenger_count": 1, + "trip_distance": 1.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 162, + "payment_type": 2, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:44:11", + "tpep_dropoff_datetime": "2018-01-01 01:14:59", + "passenger_count": 2, + "trip_distance": 2.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 161, + "DOLocationID": 68, + "payment_type": 1, + "fare_amount": 18.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.95, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 23.75 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:27:24", + "tpep_dropoff_datetime": "2018-01-01 00:37:55", + "passenger_count": 1, + "trip_distance": 2.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 143, + "DOLocationID": 166, + "payment_type": 1, + "fare_amount": 10.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.5, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:43:39", + "tpep_dropoff_datetime": "2018-01-01 01:09:38", + "passenger_count": 1, + "trip_distance": 6.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 151, + "DOLocationID": 79, + "payment_type": 1, + "fare_amount": 24.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 5.15, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 30.95 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:06:47", + "tpep_dropoff_datetime": "2018-01-01 00:09:13", + "passenger_count": 1, + "trip_distance": 0.47, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 238, + "payment_type": 2, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:12:29", + "tpep_dropoff_datetime": "2018-01-01 00:16:56", + "passenger_count": 1, + "trip_distance": 0.88, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 166, + "payment_type": 1, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.36, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.16 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:21:33", + "tpep_dropoff_datetime": "2018-01-01 00:39:57", + "passenger_count": 1, + "trip_distance": 6.31, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 151, + "DOLocationID": 249, + "payment_type": 2, + "fare_amount": 20.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 21.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:44:01", + "tpep_dropoff_datetime": "2018-01-01 01:02:55", + "passenger_count": 1, + "trip_distance": 3.99, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 249, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 15.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 5.04, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 21.84 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:11:27", + "tpep_dropoff_datetime": "2018-01-01 00:21:57", + "passenger_count": 1, + "trip_distance": 2.54, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 209, + "DOLocationID": 66, + "payment_type": 2, + "fare_amount": 10, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:29:24", + "tpep_dropoff_datetime": "2018-01-01 00:48:55", + "passenger_count": 1, + "trip_distance": 4.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 65, + "DOLocationID": 186, + "payment_type": 2, + "fare_amount": 16.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:08:10", + "tpep_dropoff_datetime": "2018-01-01 00:12:53", + "passenger_count": 4, + "trip_distance": 0.70, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 4, + "DOLocationID": 232, + "payment_type": 2, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:19:39", + "tpep_dropoff_datetime": "2018-01-01 00:31:58", + "passenger_count": 2, + "trip_distance": 1.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 232, + "DOLocationID": 79, + "payment_type": 2, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:35:41", + "tpep_dropoff_datetime": "2018-01-01 00:44:15", + "passenger_count": 1, + "trip_distance": 0.80, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 4, + "DOLocationID": 148, + "payment_type": 1, + "fare_amount": 7, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.25, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.55 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:46:56", + "tpep_dropoff_datetime": "2018-01-01 00:52:52", + "passenger_count": 1, + "trip_distance": 0.80, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 148, + "DOLocationID": 4, + "payment_type": 1, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.35, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.15 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:57:14", + "tpep_dropoff_datetime": "2018-01-01 01:02:57", + "passenger_count": 2, + "trip_distance": 1.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 4, + "DOLocationID": 224, + "payment_type": 2, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:12:01", + "tpep_dropoff_datetime": "2018-01-01 00:28:32", + "passenger_count": 2, + "trip_distance": 2.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 79, + "DOLocationID": 233, + "payment_type": 1, + "fare_amount": 12.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:36:27", + "tpep_dropoff_datetime": "2018-01-01 00:56:17", + "passenger_count": 2, + "trip_distance": 6.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 233, + "DOLocationID": 13, + "payment_type": 2, + "fare_amount": 21.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 22.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:58:07", + "tpep_dropoff_datetime": "2018-01-01 01:08:41", + "passenger_count": 3, + "trip_distance": 1.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 13, + "DOLocationID": 249, + "payment_type": 2, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:31:07", + "tpep_dropoff_datetime": "2018-01-01 00:47:11", + "passenger_count": 1, + "trip_distance": 1.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 234, + "DOLocationID": 170, + "payment_type": 2, + "fare_amount": 11, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:58:26", + "tpep_dropoff_datetime": "2018-01-01 01:04:32", + "passenger_count": 1, + "trip_distance": 1.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 263, + "payment_type": 2, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:49:19", + "tpep_dropoff_datetime": "2018-01-01 01:11:58", + "passenger_count": 2, + "trip_distance": 9.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 138, + "DOLocationID": 238, + "payment_type": 1, + "fare_amount": 28, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 7, + "tolls_amount": 5.76, + "improvement_surcharge": 0.3, + "total_amount": 42.06 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:38:33", + "tpep_dropoff_datetime": "2018-01-01 00:41:13", + "passenger_count": 1, + "trip_distance": 0.61, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 141, + "payment_type": 1, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.06, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.36 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:45:13", + "tpep_dropoff_datetime": "2018-01-01 00:50:47", + "passenger_count": 1, + "trip_distance": 0.98, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 263, + "DOLocationID": 75, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.82, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.12 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:59:59", + "tpep_dropoff_datetime": "2018-01-01 01:05:00", + "passenger_count": 1, + "trip_distance": 0.93, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 237, + "payment_type": 1, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.36, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.16 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:09:10", + "tpep_dropoff_datetime": "2018-01-01 00:26:33", + "passenger_count": 2, + "trip_distance": 3.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 87, + "DOLocationID": 189, + "payment_type": 1, + "fare_amount": 15, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:43:46", + "tpep_dropoff_datetime": "2018-01-01 00:54:18", + "passenger_count": 1, + "trip_distance": 1.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 144, + "DOLocationID": 234, + "payment_type": 2, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:57:29", + "tpep_dropoff_datetime": "2018-01-01 01:24:38", + "passenger_count": 2, + "trip_distance": 3.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 234, + "DOLocationID": 142, + "payment_type": 2, + "fare_amount": 17.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:08:46", + "tpep_dropoff_datetime": "2018-01-01 00:24:07", + "passenger_count": 2, + "trip_distance": 3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 43, + "DOLocationID": 162, + "payment_type": 2, + "fare_amount": 12.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:28:57", + "tpep_dropoff_datetime": "2018-01-01 00:36:34", + "passenger_count": 2, + "trip_distance": 1.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 263, + "payment_type": 1, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:38:43", + "tpep_dropoff_datetime": "2018-01-01 00:51:39", + "passenger_count": 1, + "trip_distance": 2.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 263, + "DOLocationID": 170, + "payment_type": 1, + "fare_amount": 13, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4.25, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.55 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:27:43", + "tpep_dropoff_datetime": "2018-01-01 00:39:13", + "passenger_count": 2, + "trip_distance": 5.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 264, + "DOLocationID": 264, + "payment_type": 4, + "fare_amount": 17.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:45:05", + "tpep_dropoff_datetime": "2018-01-01 00:51:23", + "passenger_count": 3, + "trip_distance": 0.40, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 264, + "DOLocationID": 264, + "payment_type": 2, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:18:40", + "tpep_dropoff_datetime": "2018-01-01 00:19:55", + "passenger_count": 2, + "trip_distance": 0.40, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 262, + "DOLocationID": 262, + "payment_type": 1, + "fare_amount": 3.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:21:08", + "tpep_dropoff_datetime": "2018-01-01 00:30:31", + "passenger_count": 1, + "trip_distance": 1.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 262, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.05, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.35 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:36:24", + "tpep_dropoff_datetime": "2018-01-01 01:02:06", + "passenger_count": 2, + "trip_distance": 2.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 170, + "payment_type": 1, + "fare_amount": 17, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.75, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 21.05 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:08:49", + "tpep_dropoff_datetime": "2018-01-01 00:35:14", + "passenger_count": 2, + "trip_distance": 5.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 209, + "DOLocationID": 164, + "payment_type": 1, + "fare_amount": 22, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 5.8, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 29.1 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:37:13", + "tpep_dropoff_datetime": "2018-01-01 00:59:59", + "passenger_count": 3, + "trip_distance": 2.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 164, + "DOLocationID": 158, + "payment_type": 2, + "fare_amount": 15, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:32:51", + "tpep_dropoff_datetime": "2018-01-01 00:50:22", + "passenger_count": 2, + "trip_distance": 2.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 234, + "DOLocationID": 229, + "payment_type": 1, + "fare_amount": 13, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.55, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.85 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:51:19", + "tpep_dropoff_datetime": "2018-01-01 01:10:28", + "passenger_count": 2, + "trip_distance": 2.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 113, + "payment_type": 1, + "fare_amount": 13.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.95, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.75 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:25:58", + "tpep_dropoff_datetime": "2018-01-01 00:46:34", + "passenger_count": 1, + "trip_distance": 3.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 224, + "payment_type": 2, + "fare_amount": 15.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:34:46", + "tpep_dropoff_datetime": "2018-01-01 00:52:55", + "passenger_count": 4, + "trip_distance": 2.16, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 161, + "payment_type": 1, + "fare_amount": 12.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:53:46", + "tpep_dropoff_datetime": "2018-01-01 01:18:43", + "passenger_count": 4, + "trip_distance": 1.77, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 161, + "DOLocationID": 164, + "payment_type": 2, + "fare_amount": 15, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:17:12", + "tpep_dropoff_datetime": "2018-01-01 00:36:26", + "passenger_count": 2, + "trip_distance": 0.50, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 164, + "DOLocationID": 186, + "payment_type": 1, + "fare_amount": 12, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.65, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.95 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:40:10", + "tpep_dropoff_datetime": "2018-01-01 01:03:24", + "passenger_count": 1, + "trip_distance": 3.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 186, + "DOLocationID": 140, + "payment_type": 3, + "fare_amount": 16, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:17:50", + "tpep_dropoff_datetime": "2018-01-01 00:25:26", + "passenger_count": 2, + "trip_distance": 1.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 229, + "payment_type": 1, + "fare_amount": 7, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.05, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.35 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:29:06", + "tpep_dropoff_datetime": "2018-01-01 00:31:21", + "passenger_count": 1, + "trip_distance": 0.40, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 140, + "payment_type": 1, + "fare_amount": 3.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.4, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.2 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:36:50", + "tpep_dropoff_datetime": "2018-01-01 00:46:24", + "passenger_count": 1, + "trip_distance": 2.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 238, + "payment_type": 1, + "fare_amount": 10, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.35, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.65 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:48:19", + "tpep_dropoff_datetime": "2018-01-01 00:56:39", + "passenger_count": 2, + "trip_distance": 1.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 8, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.85, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.15 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:59:28", + "tpep_dropoff_datetime": "2018-01-01 01:05:02", + "passenger_count": 1, + "trip_distance": 1.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 238, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.5, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:14:34", + "tpep_dropoff_datetime": "2018-01-01 00:24:56", + "passenger_count": 1, + "trip_distance": 2.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 263, + "DOLocationID": 170, + "payment_type": 1, + "fare_amount": 10.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:32:46", + "tpep_dropoff_datetime": "2018-01-01 00:51:05", + "passenger_count": 1, + "trip_distance": 4.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 170, + "DOLocationID": 202, + "payment_type": 1, + "fare_amount": 16.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 5.3, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 23.1 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:35:15", + "tpep_dropoff_datetime": "2018-01-01 01:10:21", + "passenger_count": 2, + "trip_distance": 5.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 144, + "DOLocationID": 239, + "payment_type": 2, + "fare_amount": 24, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 25.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:15:32", + "tpep_dropoff_datetime": "2018-01-01 00:20:17", + "passenger_count": 1, + "trip_distance": 0.90, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 144, + "DOLocationID": 231, + "payment_type": 1, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.35, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.15 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:23:33", + "tpep_dropoff_datetime": "2018-01-01 00:43:25", + "passenger_count": 2, + "trip_distance": 4.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 231, + "DOLocationID": 143, + "payment_type": 1, + "fare_amount": 17, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.65, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 21.95 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:55:42", + "tpep_dropoff_datetime": "2018-01-01 00:57:32", + "passenger_count": 1, + "trip_distance": 0.40, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 238, + "payment_type": 1, + "fare_amount": 3.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0.96, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.76 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:09:38", + "tpep_dropoff_datetime": "2018-01-01 00:24:14", + "passenger_count": 2, + "trip_distance": 1.15, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 79, + "DOLocationID": 164, + "payment_type": 2, + "fare_amount": 10, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:26:22", + "tpep_dropoff_datetime": "2018-01-01 00:42:54", + "passenger_count": 1, + "trip_distance": 1.17, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 164, + "DOLocationID": 79, + "payment_type": 2, + "fare_amount": 11, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:46:30", + "tpep_dropoff_datetime": "2018-01-01 00:59:23", + "passenger_count": 2, + "trip_distance": 3.74, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 114, + "DOLocationID": 88, + "payment_type": 1, + "fare_amount": 14, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.06, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.36 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:32:15", + "tpep_dropoff_datetime": "2018-01-01 00:59:44", + "passenger_count": 1, + "trip_distance": 10.66, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 132, + "DOLocationID": 61, + "payment_type": 1, + "fare_amount": 32, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 33.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:07:53", + "tpep_dropoff_datetime": "2018-01-01 00:31:27", + "passenger_count": 1, + "trip_distance": 3.21, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 211, + "DOLocationID": 162, + "payment_type": 2, + "fare_amount": 16, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:32:30", + "tpep_dropoff_datetime": "2018-01-01 00:59:24", + "passenger_count": 1, + "trip_distance": 1.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 162, + "DOLocationID": 107, + "payment_type": 1, + "fare_amount": 16, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.6, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 19.9 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:30:55", + "tpep_dropoff_datetime": "2018-01-01 00:51:04", + "passenger_count": 1, + "trip_distance": 2.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 249, + "DOLocationID": 50, + "payment_type": 1, + "fare_amount": 13.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.95, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.75 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:59:57", + "tpep_dropoff_datetime": "2018-01-01 01:07:59", + "passenger_count": 1, + "trip_distance": 1.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 50, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:37:31", + "tpep_dropoff_datetime": "2018-01-01 01:24:24", + "passenger_count": 1, + "trip_distance": 22.07, + "RatecodeID": 5, + "store_and_fwd_flag": "N", + "PULocationID": 132, + "DOLocationID": 265, + "payment_type": 1, + "fare_amount": 113, + "extra": 0, + "mta_tax": 0, + "tip_amount": 24.76, + "tolls_amount": 10.5, + "improvement_surcharge": 0.3, + "total_amount": 148.56 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:04:06", + "tpep_dropoff_datetime": "2018-01-01 00:13:04", + "passenger_count": 3, + "trip_distance": 1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 148, + "DOLocationID": 113, + "payment_type": 2, + "fare_amount": 7, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:36:26", + "tpep_dropoff_datetime": "2018-01-01 00:50:40", + "passenger_count": 2, + "trip_distance": 3.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 42, + "payment_type": 1, + "fare_amount": 13.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:40:13", + "tpep_dropoff_datetime": "2018-01-01 01:31:28", + "passenger_count": 2, + "trip_distance": 16.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 186, + "DOLocationID": 205, + "payment_type": 2, + "fare_amount": 54, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 5.76, + "improvement_surcharge": 0.3, + "total_amount": 61.06 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:14:09", + "tpep_dropoff_datetime": "2018-01-01 00:25:27", + "passenger_count": 1, + "trip_distance": 1.87, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 79, + "DOLocationID": 137, + "payment_type": 1, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.03, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.33 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:27:43", + "tpep_dropoff_datetime": "2018-01-01 00:40:27", + "passenger_count": 1, + "trip_distance": 2.62, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 233, + "DOLocationID": 262, + "payment_type": 2, + "fare_amount": 11.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:49:39", + "tpep_dropoff_datetime": "2018-01-01 00:57:36", + "passenger_count": 1, + "trip_distance": 1.52, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 263, + "payment_type": 2, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:14:05", + "tpep_dropoff_datetime": "2018-01-01 00:17:30", + "passenger_count": 2, + "trip_distance": 0.58, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 148, + "DOLocationID": 79, + "payment_type": 1, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.06, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.36 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:19:15", + "tpep_dropoff_datetime": "2018-01-01 00:36:00", + "passenger_count": 4, + "trip_distance": 3.33, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 79, + "DOLocationID": 80, + "payment_type": 1, + "fare_amount": 15, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.26, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 19.56 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:37:06", + "tpep_dropoff_datetime": "2018-01-01 00:55:46", + "passenger_count": 1, + "trip_distance": 4.32, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 80, + "DOLocationID": 114, + "payment_type": 2, + "fare_amount": 16.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:56:18", + "tpep_dropoff_datetime": "2018-01-01 01:02:59", + "passenger_count": 2, + "trip_distance": 1.17, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 114, + "DOLocationID": 107, + "payment_type": 1, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:08:11", + "tpep_dropoff_datetime": "2018-01-01 00:40:09", + "passenger_count": 5, + "trip_distance": 4.77, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 114, + "DOLocationID": 141, + "payment_type": 1, + "fare_amount": 22, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 20, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 43.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:50:16", + "tpep_dropoff_datetime": "2018-01-01 00:57:26", + "passenger_count": 5, + "trip_distance": 1.37, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 263, + "DOLocationID": 43, + "payment_type": 1, + "fare_amount": 7, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.49, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.79 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:14:05", + "tpep_dropoff_datetime": "2018-01-01 00:25:20", + "passenger_count": 4, + "trip_distance": 1.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 113, + "DOLocationID": 164, + "payment_type": 2, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:34:05", + "tpep_dropoff_datetime": "2018-01-01 00:57:56", + "passenger_count": 3, + "trip_distance": 8.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 170, + "DOLocationID": 181, + "payment_type": 1, + "fare_amount": 26.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 6.95, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 34.75 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:18:09", + "tpep_dropoff_datetime": "2018-01-01 00:28:23", + "passenger_count": 4, + "trip_distance": 1.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 112, + "DOLocationID": 255, + "payment_type": 3, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:32:47", + "tpep_dropoff_datetime": "2018-01-01 00:51:23", + "passenger_count": 4, + "trip_distance": 4.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 255, + "DOLocationID": 7, + "payment_type": 2, + "fare_amount": 16.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:17:58", + "tpep_dropoff_datetime": "2018-01-01 00:20:30", + "passenger_count": 1, + "trip_distance": 0.58, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 170, + "DOLocationID": 107, + "payment_type": 2, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:28:18", + "tpep_dropoff_datetime": "2018-01-01 00:35:07", + "passenger_count": 1, + "trip_distance": 0.90, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 234, + "DOLocationID": 113, + "payment_type": 2, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:44:05", + "tpep_dropoff_datetime": "2018-01-01 01:28:48", + "passenger_count": 1, + "trip_distance": 12.01, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 249, + "DOLocationID": 126, + "payment_type": 1, + "fare_amount": 41, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 8.46, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 50.76 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:26:54", + "tpep_dropoff_datetime": "2018-01-01 00:34:22", + "passenger_count": 2, + "trip_distance": 0.90, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 137, + "DOLocationID": 170, + "payment_type": 2, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:20:32", + "tpep_dropoff_datetime": "2018-01-01 00:25:04", + "passenger_count": 1, + "trip_distance": 0.40, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 43, + "DOLocationID": 43, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.25, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.55 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:28:25", + "tpep_dropoff_datetime": "2018-01-01 01:04:03", + "passenger_count": 1, + "trip_distance": 2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 43, + "DOLocationID": 164, + "payment_type": 2, + "fare_amount": 20.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 21.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:40:59", + "tpep_dropoff_datetime": "2018-01-01 00:48:06", + "passenger_count": 1, + "trip_distance": 0.67, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 68, + "DOLocationID": 90, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.46, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.76 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:49:47", + "tpep_dropoff_datetime": "2018-01-01 01:15:10", + "passenger_count": 1, + "trip_distance": 2.99, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 90, + "DOLocationID": 114, + "payment_type": 1, + "fare_amount": 16.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:12:15", + "tpep_dropoff_datetime": "2018-01-01 00:17:45", + "passenger_count": 1, + "trip_distance": 0.50, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 89, + "DOLocationID": 89, + "payment_type": 2, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:58:09", + "tpep_dropoff_datetime": "2018-01-01 01:35:58", + "passenger_count": 2, + "trip_distance": 24, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 132, + "DOLocationID": 220, + "payment_type": 1, + "fare_amount": 65.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 18.1, + "tolls_amount": 5.76, + "improvement_surcharge": 0.3, + "total_amount": 90.66 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:08:12", + "tpep_dropoff_datetime": "2018-01-01 00:11:03", + "passenger_count": 2, + "trip_distance": 0.90, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 141, + "payment_type": 2, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:20:55", + "tpep_dropoff_datetime": "2018-01-01 00:44:00", + "passenger_count": 1, + "trip_distance": 12.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 140, + "DOLocationID": 133, + "payment_type": 2, + "fare_amount": 35.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 36.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:13:03", + "tpep_dropoff_datetime": "2018-01-01 00:18:17", + "passenger_count": 1, + "trip_distance": 0.91, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 43, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.82, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.12 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:22:55", + "tpep_dropoff_datetime": "2018-01-01 00:40:00", + "passenger_count": 2, + "trip_distance": 3.89, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 249, + "payment_type": 1, + "fare_amount": 15, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4.08, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 20.38 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:41:53", + "tpep_dropoff_datetime": "2018-01-01 00:54:49", + "passenger_count": 1, + "trip_distance": 1.51, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 249, + "DOLocationID": 246, + "payment_type": 1, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.06, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.36 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:55:55", + "tpep_dropoff_datetime": "2018-01-01 01:17:16", + "passenger_count": 1, + "trip_distance": 3.09, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 246, + "DOLocationID": 229, + "payment_type": 1, + "fare_amount": 15, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4.08, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 20.38 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:51:43", + "tpep_dropoff_datetime": "2018-01-01 01:00:46", + "passenger_count": 2, + "trip_distance": 2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 249, + "DOLocationID": 209, + "payment_type": 2, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:08:32", + "tpep_dropoff_datetime": "2018-01-01 00:24:52", + "passenger_count": 2, + "trip_distance": 4.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 264, + "DOLocationID": 264, + "payment_type": 2, + "fare_amount": 16, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:29:13", + "tpep_dropoff_datetime": "2018-01-01 00:52:32", + "passenger_count": 2, + "trip_distance": 3.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 264, + "DOLocationID": 264, + "payment_type": 1, + "fare_amount": 17.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.75, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 22.55 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:57:25", + "tpep_dropoff_datetime": "2018-01-01 01:19:30", + "passenger_count": 2, + "trip_distance": 2.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 264, + "DOLocationID": 264, + "payment_type": 2, + "fare_amount": 15.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:47:26", + "tpep_dropoff_datetime": "2018-01-01 01:02:43", + "passenger_count": 2, + "trip_distance": 1.93, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 161, + "DOLocationID": 237, + "payment_type": 1, + "fare_amount": 11.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:28:42", + "tpep_dropoff_datetime": "2018-01-01 00:33:51", + "passenger_count": 1, + "trip_distance": 1.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 13, + "DOLocationID": 87, + "payment_type": 2, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:21:16", + "tpep_dropoff_datetime": "2018-01-01 00:31:23", + "passenger_count": 1, + "trip_distance": 1.54, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 249, + "DOLocationID": 90, + "payment_type": 2, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:38:09", + "tpep_dropoff_datetime": "2018-01-01 01:02:09", + "passenger_count": 1, + "trip_distance": 2.11, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 234, + "DOLocationID": 170, + "payment_type": 1, + "fare_amount": 14, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.5, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:16:31", + "tpep_dropoff_datetime": "2018-01-01 00:18:27", + "passenger_count": 1, + "trip_distance": 0.20, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 162, + "DOLocationID": 237, + "payment_type": 2, + "fare_amount": 3.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 4.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:28:07", + "tpep_dropoff_datetime": "2018-01-01 00:34:45", + "passenger_count": 2, + "trip_distance": 0.90, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 162, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:52:28", + "tpep_dropoff_datetime": "2018-01-01 01:28:50", + "passenger_count": 0, + "trip_distance": 17.9, + "RatecodeID": 2, + "store_and_fwd_flag": "N", + "PULocationID": 132, + "DOLocationID": 262, + "payment_type": 1, + "fare_amount": 52, + "extra": 0, + "mta_tax": 0.5, + "tip_amount": 20, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 72.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:15:34", + "tpep_dropoff_datetime": "2018-01-01 00:19:33", + "passenger_count": 1, + "trip_distance": 0.70, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 264, + "DOLocationID": 264, + "payment_type": 2, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:23:41", + "tpep_dropoff_datetime": "2018-01-01 00:28:27", + "passenger_count": 1, + "trip_distance": 1.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 264, + "DOLocationID": 264, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.5, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:40:06", + "tpep_dropoff_datetime": "2018-01-01 00:54:27", + "passenger_count": 2, + "trip_distance": 2.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 264, + "DOLocationID": 264, + "payment_type": 1, + "fare_amount": 11.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:28:36", + "tpep_dropoff_datetime": "2018-01-01 00:45:51", + "passenger_count": 2, + "trip_distance": 2.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 113, + "DOLocationID": 161, + "payment_type": 2, + "fare_amount": 13, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:52:14", + "tpep_dropoff_datetime": "2018-01-01 00:56:50", + "passenger_count": 2, + "trip_distance": 0.80, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 170, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.25, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.55 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:13:02", + "tpep_dropoff_datetime": "2018-01-01 00:25:34", + "passenger_count": 1, + "trip_distance": 2.26, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 262, + "payment_type": 2, + "fare_amount": 10, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:29:21", + "tpep_dropoff_datetime": "2018-01-01 00:37:30", + "passenger_count": 1, + "trip_distance": 1.82, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 262, + "DOLocationID": 229, + "payment_type": 1, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:48:13", + "tpep_dropoff_datetime": "2018-01-01 00:58:06", + "passenger_count": 1, + "trip_distance": 0.50, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 163, + "DOLocationID": 161, + "payment_type": 2, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:27:29", + "tpep_dropoff_datetime": "2018-01-01 00:40:56", + "passenger_count": 1, + "trip_distance": 2.74, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 166, + "payment_type": 1, + "fare_amount": 12, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.66, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.91 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:46:22", + "tpep_dropoff_datetime": "2018-01-01 00:56:19", + "passenger_count": 1, + "trip_distance": 2.16, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 151, + "DOLocationID": 263, + "payment_type": 1, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:30:01", + "tpep_dropoff_datetime": "2018-01-01 00:36:37", + "passenger_count": 1, + "trip_distance": 0.60, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 141, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.45, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.75 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:59:41", + "tpep_dropoff_datetime": "2018-01-01 01:03:30", + "passenger_count": 1, + "trip_distance": 0.80, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 263, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0.88, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.18 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:02:16", + "tpep_dropoff_datetime": "2018-01-01 00:17:26", + "passenger_count": 2, + "trip_distance": 1.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 234, + "DOLocationID": 224, + "payment_type": 1, + "fare_amount": 11, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.05, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.35 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:18:43", + "tpep_dropoff_datetime": "2018-01-01 00:35:07", + "passenger_count": 2, + "trip_distance": 3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 224, + "DOLocationID": 140, + "payment_type": 1, + "fare_amount": 13.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:42:42", + "tpep_dropoff_datetime": "2018-01-01 00:57:36", + "passenger_count": 2, + "trip_distance": 1.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 164, + "payment_type": 1, + "fare_amount": 11, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.45, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.75 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:14:24", + "tpep_dropoff_datetime": "2018-01-01 00:50:17", + "passenger_count": 2, + "trip_distance": 13.31, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 132, + "DOLocationID": 25, + "payment_type": 1, + "fare_amount": 39.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 8.16, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 48.96 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:59:09", + "tpep_dropoff_datetime": "2018-01-01 01:16:32", + "passenger_count": 2, + "trip_distance": 4.64, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 52, + "DOLocationID": 255, + "payment_type": 1, + "fare_amount": 17, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.74, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 22.99 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:17:16", + "tpep_dropoff_datetime": "2018-01-01 00:17:49", + "passenger_count": 1, + "trip_distance": 1.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 142, + "payment_type": 2, + "fare_amount": 2.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 3.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:24:43", + "tpep_dropoff_datetime": "2018-01-01 00:37:58", + "passenger_count": 1, + "trip_distance": 2.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 143, + "payment_type": 2, + "fare_amount": 11, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:42:16", + "tpep_dropoff_datetime": "2018-01-01 00:44:29", + "passenger_count": 2, + "trip_distance": 0.50, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 143, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.05, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.35 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:46:32", + "tpep_dropoff_datetime": "2018-01-01 00:57:52", + "passenger_count": 2, + "trip_distance": 1.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 142, + "payment_type": 2, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:06:56", + "tpep_dropoff_datetime": "2018-01-01 00:12:08", + "passenger_count": 1, + "trip_distance": 1.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 263, + "DOLocationID": 229, + "payment_type": 1, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.95, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.75 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:22:01", + "tpep_dropoff_datetime": "2018-01-01 00:38:24", + "passenger_count": 1, + "trip_distance": 4.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 152, + "payment_type": 1, + "fare_amount": 15, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.25, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 19.55 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:40:59", + "tpep_dropoff_datetime": "2018-01-01 00:54:03", + "passenger_count": 1, + "trip_distance": 1.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 166, + "DOLocationID": 74, + "payment_type": 2, + "fare_amount": 10, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:59:09", + "tpep_dropoff_datetime": "2018-01-01 01:07:13", + "passenger_count": 1, + "trip_distance": 2.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 263, + "DOLocationID": 229, + "payment_type": 2, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:09:20", + "tpep_dropoff_datetime": "2018-01-01 00:15:45", + "passenger_count": 1, + "trip_distance": 1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 170, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.45, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.75 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:23:45", + "tpep_dropoff_datetime": "2018-01-01 00:32:28", + "passenger_count": 1, + "trip_distance": 1.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 170, + "DOLocationID": 229, + "payment_type": 4, + "fare_amount": 7, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:42:56", + "tpep_dropoff_datetime": "2018-01-01 00:58:02", + "passenger_count": 1, + "trip_distance": 4.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 42, + "payment_type": 1, + "fare_amount": 15, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 10, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 26.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:10:35", + "tpep_dropoff_datetime": "2018-01-01 00:44:11", + "passenger_count": 6, + "trip_distance": 1.88, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 114, + "DOLocationID": 164, + "payment_type": 1, + "fare_amount": 19.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 20.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:48:19", + "tpep_dropoff_datetime": "2018-01-01 01:17:54", + "passenger_count": 6, + "trip_distance": 1.35, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 230, + "DOLocationID": 186, + "payment_type": 2, + "fare_amount": 17.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:15:46", + "tpep_dropoff_datetime": "2018-01-01 00:19:58", + "passenger_count": 1, + "trip_distance": 0.97, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 262, + "DOLocationID": 236, + "payment_type": 2, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:21:34", + "tpep_dropoff_datetime": "2018-01-01 00:25:02", + "passenger_count": 1, + "trip_distance": 1.05, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 237, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.26, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.56 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:26:12", + "tpep_dropoff_datetime": "2018-01-01 00:34:44", + "passenger_count": 1, + "trip_distance": 1.56, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 142, + "payment_type": 1, + "fare_amount": 8, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.86, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.16 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:15:58", + "tpep_dropoff_datetime": "2018-01-01 00:20:57", + "passenger_count": 1, + "trip_distance": 0.60, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 43, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.85, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.15 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:22:13", + "tpep_dropoff_datetime": "2018-01-01 00:35:47", + "passenger_count": 1, + "trip_distance": 1.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 48, + "payment_type": 2, + "fare_amount": 10.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:51:22", + "tpep_dropoff_datetime": "2018-01-01 01:03:10", + "passenger_count": 2, + "trip_distance": 2.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 140, + "payment_type": 1, + "fare_amount": 10.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.95, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.75 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:28:49", + "tpep_dropoff_datetime": "2018-01-01 00:31:00", + "passenger_count": 1, + "trip_distance": 0.41, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 142, + "payment_type": 1, + "fare_amount": 3.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0.96, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.76 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:32:01", + "tpep_dropoff_datetime": "2018-01-01 00:39:32", + "passenger_count": 1, + "trip_distance": 0.74, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 143, + "payment_type": 2, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:42:35", + "tpep_dropoff_datetime": "2018-01-01 00:53:27", + "passenger_count": 1, + "trip_distance": 1.68, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 143, + "DOLocationID": 238, + "payment_type": 2, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:59:29", + "tpep_dropoff_datetime": "2018-01-01 01:10:14", + "passenger_count": 1, + "trip_distance": 2.16, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 24, + "payment_type": 1, + "fare_amount": 10, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.26, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.56 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:32:19", + "tpep_dropoff_datetime": "2018-01-01 01:06:22", + "passenger_count": 1, + "trip_distance": 20.8, + "RatecodeID": 2, + "store_and_fwd_flag": "N", + "PULocationID": 132, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 52, + "extra": 0, + "mta_tax": 0.5, + "tip_amount": 11.7, + "tolls_amount": 5.76, + "improvement_surcharge": 0.3, + "total_amount": 70.26 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:41:02", + "tpep_dropoff_datetime": "2018-01-01 00:48:54", + "passenger_count": 1, + "trip_distance": 1.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 82, + "DOLocationID": 160, + "payment_type": 4, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:21:20", + "tpep_dropoff_datetime": "2018-01-01 00:55:02", + "passenger_count": 2, + "trip_distance": 2.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 107, + "payment_type": 1, + "fare_amount": 20, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4.25, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 25.55 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:59:32", + "tpep_dropoff_datetime": "2018-01-01 01:13:53", + "passenger_count": 2, + "trip_distance": 1.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 234, + "DOLocationID": 148, + "payment_type": 1, + "fare_amount": 10, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.13, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.43 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:16:28", + "tpep_dropoff_datetime": "2018-01-01 00:32:41", + "passenger_count": 2, + "trip_distance": 2.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 236, + "payment_type": 1, + "fare_amount": 12.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.76, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16.56 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:36:04", + "tpep_dropoff_datetime": "2018-01-01 00:53:45", + "passenger_count": 2, + "trip_distance": 3.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 116, + "payment_type": 1, + "fare_amount": 14.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.15, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.95 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:22:19", + "tpep_dropoff_datetime": "2018-01-01 00:37:23", + "passenger_count": 1, + "trip_distance": 2.82, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 179, + "DOLocationID": 82, + "payment_type": 2, + "fare_amount": 12.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:52:02", + "tpep_dropoff_datetime": "2018-01-01 01:04:54", + "passenger_count": 1, + "trip_distance": 2.33, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 226, + "DOLocationID": 7, + "payment_type": 1, + "fare_amount": 10.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.95, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.75 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:24:51", + "tpep_dropoff_datetime": "2018-01-01 00:32:56", + "passenger_count": 1, + "trip_distance": 1.46, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 113, + "DOLocationID": 231, + "payment_type": 2, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:39:25", + "tpep_dropoff_datetime": "2018-01-01 00:56:41", + "passenger_count": 1, + "trip_distance": 2.23, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 211, + "DOLocationID": 170, + "payment_type": 1, + "fare_amount": 12.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.76, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16.56 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:32:59", + "tpep_dropoff_datetime": "2018-01-01 00:53:27", + "passenger_count": 3, + "trip_distance": 5.96, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 50, + "DOLocationID": 74, + "payment_type": 2, + "fare_amount": 20, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 21.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:57:01", + "tpep_dropoff_datetime": "2018-01-01 01:05:26", + "passenger_count": 3, + "trip_distance": 1.35, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 74, + "DOLocationID": 41, + "payment_type": 2, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:09:07", + "tpep_dropoff_datetime": "2018-01-01 00:24:29", + "passenger_count": 2, + "trip_distance": 8.69, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 138, + "DOLocationID": 140, + "payment_type": 1, + "fare_amount": 24.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 6.31, + "tolls_amount": 5.76, + "improvement_surcharge": 0.3, + "total_amount": 37.87 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:07:25", + "tpep_dropoff_datetime": "2018-01-01 00:12:01", + "passenger_count": 1, + "trip_distance": 0.91, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 231, + "DOLocationID": 144, + "payment_type": 2, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:12:47", + "tpep_dropoff_datetime": "2018-01-01 00:15:58", + "passenger_count": 1, + "trip_distance": 0.62, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 144, + "DOLocationID": 211, + "payment_type": 1, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.74, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.54 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:18:13", + "tpep_dropoff_datetime": "2018-01-01 00:44:45", + "passenger_count": 1, + "trip_distance": 7.65, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 211, + "DOLocationID": 75, + "payment_type": 2, + "fare_amount": 27, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 28.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:53:55", + "tpep_dropoff_datetime": "2018-01-01 00:57:38", + "passenger_count": 1, + "trip_distance": 0.80, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 236, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.26, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.56 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:40:42", + "tpep_dropoff_datetime": "2018-01-01 00:53:18", + "passenger_count": 1, + "trip_distance": 5.38, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 132, + "DOLocationID": 203, + "payment_type": 2, + "fare_amount": 16.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:20:47", + "tpep_dropoff_datetime": "2018-01-01 00:28:29", + "passenger_count": 1, + "trip_distance": 0.90, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 4, + "DOLocationID": 232, + "payment_type": 2, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:34:01", + "tpep_dropoff_datetime": "2018-01-01 00:54:18", + "passenger_count": 1, + "trip_distance": 2.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 4, + "DOLocationID": 68, + "payment_type": 2, + "fare_amount": 14.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:55:53", + "tpep_dropoff_datetime": "2018-01-01 01:22:03", + "passenger_count": 1, + "trip_distance": 4.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 68, + "DOLocationID": 65, + "payment_type": 1, + "fare_amount": 20, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 5.3, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 26.6 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:08:52", + "tpep_dropoff_datetime": "2018-01-01 00:19:12", + "passenger_count": 1, + "trip_distance": 1.44, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 43, + "DOLocationID": 170, + "payment_type": 2, + "fare_amount": 8, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:27:04", + "tpep_dropoff_datetime": "2018-01-01 00:47:39", + "passenger_count": 2, + "trip_distance": 2.97, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 68, + "DOLocationID": 232, + "payment_type": 1, + "fare_amount": 14.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:48:25", + "tpep_dropoff_datetime": "2018-01-01 01:07:54", + "passenger_count": 3, + "trip_distance": 3.41, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 232, + "DOLocationID": 246, + "payment_type": 2, + "fare_amount": 15, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 01:00:04", + "tpep_dropoff_datetime": "2018-01-01 01:30:20", + "passenger_count": 1, + "trip_distance": 18.4, + "RatecodeID": 2, + "store_and_fwd_flag": "N", + "PULocationID": 132, + "DOLocationID": 79, + "payment_type": 1, + "fare_amount": 52, + "extra": 0, + "mta_tax": 0.5, + "tip_amount": 10.56, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 63.36 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:23:27", + "tpep_dropoff_datetime": "2018-01-01 00:55:14", + "passenger_count": 2, + "trip_distance": 11.62, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 20, + "payment_type": 2, + "fare_amount": 36.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 37.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:34:58", + "tpep_dropoff_datetime": "2018-01-01 00:41:44", + "passenger_count": 2, + "trip_distance": 0.89, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 161, + "payment_type": 2, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:43:32", + "tpep_dropoff_datetime": "2018-01-01 00:47:20", + "passenger_count": 2, + "trip_distance": 0.55, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 161, + "DOLocationID": 237, + "payment_type": 1, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.16, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.96 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:18:08", + "tpep_dropoff_datetime": "2018-01-01 00:50:52", + "passenger_count": 2, + "trip_distance": 2.41, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 43, + "DOLocationID": 48, + "payment_type": 1, + "fare_amount": 20, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4.26, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 25.56 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:52:26", + "tpep_dropoff_datetime": "2018-01-01 00:57:08", + "passenger_count": 3, + "trip_distance": 0.17, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 50, + "payment_type": 2, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:58:40", + "tpep_dropoff_datetime": "2018-01-01 01:17:24", + "passenger_count": 4, + "trip_distance": 3.72, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 50, + "DOLocationID": 236, + "payment_type": 1, + "fare_amount": 15.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.36, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 20.16 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:19:57", + "tpep_dropoff_datetime": "2018-01-01 00:31:48", + "passenger_count": 2, + "trip_distance": 2.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 24, + "payment_type": 1, + "fare_amount": 11, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.65, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.95 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:48:07", + "tpep_dropoff_datetime": "2018-01-01 00:56:54", + "passenger_count": 2, + "trip_distance": 1.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 151, + "DOLocationID": 142, + "payment_type": 1, + "fare_amount": 8, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:31:05", + "tpep_dropoff_datetime": "2018-01-01 00:41:35", + "passenger_count": 1, + "trip_distance": 2.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 144, + "DOLocationID": 65, + "payment_type": 1, + "fare_amount": 11, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:50:35", + "tpep_dropoff_datetime": "2018-01-01 00:57:34", + "passenger_count": 1, + "trip_distance": 1.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 231, + "DOLocationID": 234, + "payment_type": 1, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.75, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.55 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:07:23", + "tpep_dropoff_datetime": "2018-01-01 00:30:15", + "passenger_count": 1, + "trip_distance": 3.72, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 211, + "payment_type": 2, + "fare_amount": 16.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:31:42", + "tpep_dropoff_datetime": "2018-01-01 00:41:11", + "passenger_count": 1, + "trip_distance": 1.41, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 211, + "DOLocationID": 87, + "payment_type": 1, + "fare_amount": 8, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.86, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.16 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:45:20", + "tpep_dropoff_datetime": "2018-01-01 01:26:04", + "passenger_count": 1, + "trip_distance": 11.62, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 45, + "DOLocationID": 167, + "payment_type": 1, + "fare_amount": 37.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 42.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:44:41", + "tpep_dropoff_datetime": "2018-01-01 01:10:07", + "passenger_count": 1, + "trip_distance": 3.68, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 164, + "DOLocationID": 151, + "payment_type": 1, + "fare_amount": 17.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0.38, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 21.13 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:56:14", + "tpep_dropoff_datetime": "2018-01-01 01:28:59", + "passenger_count": 1, + "trip_distance": 2.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 107, + "DOLocationID": 48, + "payment_type": 1, + "fare_amount": 19.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4.15, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 24.95 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:11:32", + "tpep_dropoff_datetime": "2018-01-01 00:24:36", + "passenger_count": 2, + "trip_distance": 2.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 107, + "DOLocationID": 232, + "payment_type": 1, + "fare_amount": 11.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:31:12", + "tpep_dropoff_datetime": "2018-01-01 00:45:47", + "passenger_count": 2, + "trip_distance": 1.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 79, + "DOLocationID": 158, + "payment_type": 1, + "fare_amount": 11, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.05, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.35 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:49:53", + "tpep_dropoff_datetime": "2018-01-01 00:51:59", + "passenger_count": 4, + "trip_distance": 0.30, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 249, + "DOLocationID": 158, + "payment_type": 1, + "fare_amount": 3.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0.95, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.75 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:55:21", + "tpep_dropoff_datetime": "2018-01-01 01:02:16", + "passenger_count": 4, + "trip_distance": 1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 249, + "DOLocationID": 246, + "payment_type": 1, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.56, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.36 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:00:03", + "tpep_dropoff_datetime": "2018-01-01 00:21:06", + "passenger_count": 1, + "trip_distance": 6.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 255, + "DOLocationID": 236, + "payment_type": 2, + "fare_amount": 20.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 21.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:25:07", + "tpep_dropoff_datetime": "2018-01-01 00:31:37", + "passenger_count": 2, + "trip_distance": 1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 262, + "payment_type": 2, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:34:15", + "tpep_dropoff_datetime": "2018-01-01 00:36:42", + "passenger_count": 4, + "trip_distance": 0.40, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 263, + "DOLocationID": 262, + "payment_type": 1, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.3, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.6 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:45:25", + "tpep_dropoff_datetime": "2018-01-01 00:54:29", + "passenger_count": 4, + "trip_distance": 0.90, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 140, + "payment_type": 2, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:57:35", + "tpep_dropoff_datetime": "2018-01-01 01:12:05", + "passenger_count": 4, + "trip_distance": 2.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 140, + "DOLocationID": 238, + "payment_type": 1, + "fare_amount": 12.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.5, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:11:03", + "tpep_dropoff_datetime": "2018-01-01 00:19:44", + "passenger_count": 1, + "trip_distance": 3.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 263, + "DOLocationID": 168, + "payment_type": 2, + "fare_amount": 11, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:33:17", + "tpep_dropoff_datetime": "2018-01-01 00:42:30", + "passenger_count": 1, + "trip_distance": 2.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 263, + "DOLocationID": 151, + "payment_type": 1, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.7, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.5 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:45:23", + "tpep_dropoff_datetime": "2018-01-01 01:17:47", + "passenger_count": 1, + "trip_distance": 6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 151, + "DOLocationID": 113, + "payment_type": 1, + "fare_amount": 24.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 6.45, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 32.25 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:38:41", + "tpep_dropoff_datetime": "2018-01-01 00:42:12", + "passenger_count": 2, + "trip_distance": 0.48, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 79, + "DOLocationID": 113, + "payment_type": 2, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:43:18", + "tpep_dropoff_datetime": "2018-01-01 01:09:13", + "passenger_count": 2, + "trip_distance": 2.92, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 113, + "DOLocationID": 48, + "payment_type": 1, + "fare_amount": 17.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 20 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:32:38", + "tpep_dropoff_datetime": "2018-01-01 00:46:20", + "passenger_count": 4, + "trip_distance": 3.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 148, + "DOLocationID": 255, + "payment_type": 2, + "fare_amount": 12.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:57:13", + "tpep_dropoff_datetime": "2018-01-01 01:06:20", + "passenger_count": 5, + "trip_distance": 1.47, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 232, + "DOLocationID": 107, + "payment_type": 1, + "fare_amount": 8, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.86, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.16 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:46:47", + "tpep_dropoff_datetime": "2018-01-01 01:04:34", + "passenger_count": 2, + "trip_distance": 1.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 186, + "payment_type": 2, + "fare_amount": 12, + "extra": 0, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:06:56", + "tpep_dropoff_datetime": "2018-01-01 00:18:52", + "passenger_count": 1, + "trip_distance": 1.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 148, + "DOLocationID": 125, + "payment_type": 1, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.15, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.95 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:26:54", + "tpep_dropoff_datetime": "2018-01-01 00:34:09", + "passenger_count": 1, + "trip_distance": 0.80, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 211, + "DOLocationID": 148, + "payment_type": 3, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:50:56", + "tpep_dropoff_datetime": "2018-01-01 01:15:53", + "passenger_count": 1, + "trip_distance": 7.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 79, + "DOLocationID": 129, + "payment_type": 3, + "fare_amount": 26, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 5.76, + "improvement_surcharge": 0.3, + "total_amount": 33.06 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:46:41", + "tpep_dropoff_datetime": "2018-01-01 01:10:55", + "passenger_count": 1, + "trip_distance": 2.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 234, + "DOLocationID": 186, + "payment_type": 2, + "fare_amount": 16, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:10:02", + "tpep_dropoff_datetime": "2018-01-01 00:25:01", + "passenger_count": 1, + "trip_distance": 1.69, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 114, + "DOLocationID": 137, + "payment_type": 1, + "fare_amount": 10.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:10:56", + "tpep_dropoff_datetime": "2018-01-01 00:25:31", + "passenger_count": 1, + "trip_distance": 0.90, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 161, + "DOLocationID": 170, + "payment_type": 1, + "fare_amount": 10, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:45:18", + "tpep_dropoff_datetime": "2018-01-01 00:58:18", + "passenger_count": 1, + "trip_distance": 1.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 170, + "DOLocationID": 113, + "payment_type": 1, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.11, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.91 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:26:25", + "tpep_dropoff_datetime": "2018-01-01 00:34:36", + "passenger_count": 1, + "trip_distance": 1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 158, + "DOLocationID": 90, + "payment_type": 1, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.55, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.35 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:36:33", + "tpep_dropoff_datetime": "2018-01-01 00:42:59", + "passenger_count": 1, + "trip_distance": 0.70, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 234, + "DOLocationID": 107, + "payment_type": 2, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:58:23", + "tpep_dropoff_datetime": "2018-01-01 01:27:41", + "passenger_count": 1, + "trip_distance": 3.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 249, + "DOLocationID": 143, + "payment_type": 1, + "fare_amount": 20, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4.25, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 25.55 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:33:42", + "tpep_dropoff_datetime": "2018-01-01 00:50:59", + "passenger_count": 5, + "trip_distance": 1.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 264, + "DOLocationID": 79, + "payment_type": 2, + "fare_amount": 11.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:55:10", + "tpep_dropoff_datetime": "2018-01-01 01:03:22", + "passenger_count": 1, + "trip_distance": 1.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 79, + "DOLocationID": 232, + "payment_type": 2, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:16:59", + "tpep_dropoff_datetime": "2018-01-01 00:22:33", + "passenger_count": 1, + "trip_distance": 1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 238, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.46, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.76 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:25:05", + "tpep_dropoff_datetime": "2018-01-01 00:41:18", + "passenger_count": 1, + "trip_distance": 4.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 43, + "DOLocationID": 158, + "payment_type": 1, + "fare_amount": 16, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 5.15, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 22.45 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:53:15", + "tpep_dropoff_datetime": "2018-01-01 01:17:11", + "passenger_count": 1, + "trip_distance": 2.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 234, + "DOLocationID": 50, + "payment_type": 2, + "fare_amount": 15.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:24:35", + "tpep_dropoff_datetime": "2018-01-01 00:42:12", + "passenger_count": 1, + "trip_distance": 4.09, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 181, + "DOLocationID": 148, + "payment_type": 1, + "fare_amount": 16, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.46, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 20.76 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:45:24", + "tpep_dropoff_datetime": "2018-01-01 00:53:25", + "passenger_count": 1, + "trip_distance": 1.55, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 148, + "DOLocationID": 107, + "payment_type": 1, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.76, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.56 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:57:31", + "tpep_dropoff_datetime": "2018-01-02 00:53:25", + "passenger_count": 1, + "trip_distance": 0.00, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 107, + "DOLocationID": 107, + "payment_type": 1, + "fare_amount": 2.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0.76, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 4.56 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:57:00", + "tpep_dropoff_datetime": "2018-01-01 01:01:37", + "passenger_count": 1, + "trip_distance": 1.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 143, + "payment_type": 2, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:52:50", + "tpep_dropoff_datetime": "2018-01-01 01:07:33", + "passenger_count": 1, + "trip_distance": 4.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 132, + "DOLocationID": 139, + "payment_type": 2, + "fare_amount": 16.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:13:58", + "tpep_dropoff_datetime": "2018-01-01 00:21:57", + "passenger_count": 2, + "trip_distance": 2.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 238, + "payment_type": 1, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.5, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:26:15", + "tpep_dropoff_datetime": "2018-01-01 00:36:51", + "passenger_count": 1, + "trip_distance": 2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 262, + "payment_type": 1, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.15, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.95 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:44:41", + "tpep_dropoff_datetime": "2018-01-01 01:00:32", + "passenger_count": 3, + "trip_distance": 3.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 152, + "payment_type": 1, + "fare_amount": 14.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:15:17", + "tpep_dropoff_datetime": "2018-01-01 00:16:57", + "passenger_count": 1, + "trip_distance": 0.40, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 236, + "payment_type": 1, + "fare_amount": 3.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.4, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.2 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:22:59", + "tpep_dropoff_datetime": "2018-01-01 00:29:11", + "passenger_count": 1, + "trip_distance": 1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 262, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.45, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.75 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:31:48", + "tpep_dropoff_datetime": "2018-01-01 00:35:38", + "passenger_count": 1, + "trip_distance": 0.70, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 262, + "DOLocationID": 141, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:38:31", + "tpep_dropoff_datetime": "2018-01-01 00:43:42", + "passenger_count": 1, + "trip_distance": 1.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 229, + "payment_type": 2, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:47:00", + "tpep_dropoff_datetime": "2018-01-01 00:50:36", + "passenger_count": 1, + "trip_distance": 0.80, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 162, + "DOLocationID": 141, + "payment_type": 1, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.45, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.25 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:51:47", + "tpep_dropoff_datetime": "2018-01-01 01:10:40", + "passenger_count": 1, + "trip_distance": 3.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 79, + "payment_type": 1, + "fare_amount": 14, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.8, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 19.1 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:23:47", + "tpep_dropoff_datetime": "2018-01-01 00:33:45", + "passenger_count": 2, + "trip_distance": 2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 236, + "payment_type": 1, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:36:51", + "tpep_dropoff_datetime": "2018-01-01 01:09:27", + "passenger_count": 1, + "trip_distance": 4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 113, + "payment_type": 2, + "fare_amount": 21.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 22.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:21:36", + "tpep_dropoff_datetime": "2018-01-01 00:41:16", + "passenger_count": 1, + "trip_distance": 3.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 249, + "DOLocationID": 87, + "payment_type": 2, + "fare_amount": 15, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:58:04", + "tpep_dropoff_datetime": "2018-01-01 01:07:22", + "passenger_count": 1, + "trip_distance": 3.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 209, + "DOLocationID": 107, + "payment_type": 1, + "fare_amount": 12.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.75, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16.55 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:06:02", + "tpep_dropoff_datetime": "2018-01-01 00:36:45", + "passenger_count": 2, + "trip_distance": 1.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 48, + "payment_type": 1, + "fare_amount": 18, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.85, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 23.15 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:46:07", + "tpep_dropoff_datetime": "2018-01-01 00:49:47", + "passenger_count": 3, + "trip_distance": 0.70, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 50, + "DOLocationID": 48, + "payment_type": 1, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.45, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.25 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:53:32", + "tpep_dropoff_datetime": "2018-01-01 00:56:34", + "passenger_count": 1, + "trip_distance": 0.60, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 50, + "payment_type": 2, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:59:36", + "tpep_dropoff_datetime": "2018-01-01 01:23:58", + "passenger_count": 1, + "trip_distance": 4.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 143, + "DOLocationID": 42, + "payment_type": 1, + "fare_amount": 19, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 6, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 26.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:57:02", + "tpep_dropoff_datetime": "2018-01-01 01:10:16", + "passenger_count": 1, + "trip_distance": 1.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 151, + "DOLocationID": 236, + "payment_type": 1, + "fare_amount": 10, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.5, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:33:21", + "tpep_dropoff_datetime": "2018-01-01 00:49:27", + "passenger_count": 1, + "trip_distance": 1.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 162, + "DOLocationID": 170, + "payment_type": 1, + "fare_amount": 10.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.5, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:23:51", + "tpep_dropoff_datetime": "2018-01-01 00:51:40", + "passenger_count": 2, + "trip_distance": 6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 107, + "DOLocationID": 223, + "payment_type": 1, + "fare_amount": 22.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 5, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 28.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:33:29", + "tpep_dropoff_datetime": "2018-01-01 00:40:57", + "passenger_count": 1, + "trip_distance": 1.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 237, + "payment_type": 2, + "fare_amount": 7, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:42:45", + "tpep_dropoff_datetime": "2018-01-01 00:54:50", + "passenger_count": 1, + "trip_distance": 1.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 161, + "payment_type": 2, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:22:32", + "tpep_dropoff_datetime": "2018-01-01 00:53:57", + "passenger_count": 2, + "trip_distance": 5.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 113, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 22.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4.75, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 28.55 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:57:15", + "tpep_dropoff_datetime": "2018-01-01 01:06:59", + "passenger_count": 2, + "trip_distance": 2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 236, + "payment_type": 1, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.03, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.33 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:20:33", + "tpep_dropoff_datetime": "2018-01-01 00:25:36", + "passenger_count": 1, + "trip_distance": 1.16, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 166, + "DOLocationID": 116, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.19, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.49 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:31:26", + "tpep_dropoff_datetime": "2018-01-01 01:08:29", + "passenger_count": 1, + "trip_distance": 13.51, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 116, + "DOLocationID": 33, + "payment_type": 1, + "fare_amount": 41, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 8.46, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 52.71 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:13:32", + "tpep_dropoff_datetime": "2018-01-01 00:54:16", + "passenger_count": 1, + "trip_distance": 3.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 170, + "payment_type": 1, + "fare_amount": 23.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 26 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:35:12", + "tpep_dropoff_datetime": "2018-01-01 01:08:33", + "passenger_count": 1, + "trip_distance": 8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 37, + "DOLocationID": 141, + "payment_type": 1, + "fare_amount": 27.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 5.76, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 34.56 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:33:25", + "tpep_dropoff_datetime": "2018-01-01 00:48:48", + "passenger_count": 1, + "trip_distance": 3.91, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 79, + "DOLocationID": 141, + "payment_type": 1, + "fare_amount": 14, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.06, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.36 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:49:54", + "tpep_dropoff_datetime": "2018-01-01 00:53:28", + "passenger_count": 1, + "trip_distance": 0.84, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 263, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.26, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.56 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:29:39", + "tpep_dropoff_datetime": "2018-01-01 00:47:56", + "passenger_count": 2, + "trip_distance": 2.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 90, + "DOLocationID": 48, + "payment_type": 1, + "fare_amount": 13, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:50:05", + "tpep_dropoff_datetime": "2018-01-01 00:55:55", + "passenger_count": 3, + "trip_distance": 0.90, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 143, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.45, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.75 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:25:53", + "tpep_dropoff_datetime": "2018-01-01 00:32:15", + "passenger_count": 3, + "trip_distance": 1.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 257, + "DOLocationID": 227, + "payment_type": 2, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:13:13", + "tpep_dropoff_datetime": "2018-01-01 00:47:12", + "passenger_count": 1, + "trip_distance": 14.89, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 26, + "payment_type": 1, + "fare_amount": 43.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 44.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:15:32", + "tpep_dropoff_datetime": "2018-01-01 00:24:37", + "passenger_count": 1, + "trip_distance": 1.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 163, + "DOLocationID": 233, + "payment_type": 2, + "fare_amount": 7, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:27:22", + "tpep_dropoff_datetime": "2018-01-01 01:16:31", + "passenger_count": 1, + "trip_distance": 5.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 233, + "DOLocationID": 231, + "payment_type": 2, + "fare_amount": 30.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 31.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:24:27", + "tpep_dropoff_datetime": "2018-01-01 00:31:13", + "passenger_count": 1, + "trip_distance": 1.11, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 24, + "payment_type": 1, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:36:46", + "tpep_dropoff_datetime": "2018-01-01 00:46:35", + "passenger_count": 1, + "trip_distance": 1.83, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 166, + "DOLocationID": 74, + "payment_type": 1, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.58, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.88 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 01:00:00", + "tpep_dropoff_datetime": "2018-01-01 01:05:09", + "passenger_count": 1, + "trip_distance": 0.83, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 238, + "payment_type": 2, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:22:56", + "tpep_dropoff_datetime": "2018-01-01 00:43:38", + "passenger_count": 1, + "trip_distance": 5.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 249, + "payment_type": 1, + "fare_amount": 19, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.03, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 22.33 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:26:55", + "tpep_dropoff_datetime": "2018-01-01 00:43:12", + "passenger_count": 2, + "trip_distance": 3.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 170, + "DOLocationID": 238, + "payment_type": 2, + "fare_amount": 14.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:48:37", + "tpep_dropoff_datetime": "2018-01-01 00:52:38", + "passenger_count": 6, + "trip_distance": 0.60, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 237, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 60, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 66.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:57:46", + "tpep_dropoff_datetime": "2018-01-01 01:04:20", + "passenger_count": 1, + "trip_distance": 1.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 238, + "payment_type": 1, + "fare_amount": 8, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.85, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.15 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:51:57", + "tpep_dropoff_datetime": "2018-01-01 01:13:41", + "passenger_count": 1, + "trip_distance": 4.56, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 7, + "DOLocationID": 80, + "payment_type": 2, + "fare_amount": 17.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:20:11", + "tpep_dropoff_datetime": "2018-01-01 00:41:28", + "passenger_count": 2, + "trip_distance": 3.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 114, + "DOLocationID": 48, + "payment_type": 2, + "fare_amount": 15, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:43:03", + "tpep_dropoff_datetime": "2018-01-01 01:04:09", + "passenger_count": 2, + "trip_distance": 2.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 162, + "payment_type": 1, + "fare_amount": 14.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.95, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 19.75 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:53:47", + "tpep_dropoff_datetime": "2018-01-01 01:00:46", + "passenger_count": 1, + "trip_distance": 1.43, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 166, + "DOLocationID": 239, + "payment_type": 2, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:22:01", + "tpep_dropoff_datetime": "2018-01-01 00:28:49", + "passenger_count": 2, + "trip_distance": 1.37, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 90, + "DOLocationID": 125, + "payment_type": 1, + "fare_amount": 7, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.66, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.96 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:33:41", + "tpep_dropoff_datetime": "2018-01-01 00:40:17", + "passenger_count": 2, + "trip_distance": 0.95, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 158, + "DOLocationID": 113, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.46, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.76 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:44:04", + "tpep_dropoff_datetime": "2018-01-01 00:47:35", + "passenger_count": 2, + "trip_distance": 0.67, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 113, + "DOLocationID": 90, + "payment_type": 1, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.16, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.96 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:48:34", + "tpep_dropoff_datetime": "2018-01-01 01:07:44", + "passenger_count": 2, + "trip_distance": 2.41, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 90, + "DOLocationID": 161, + "payment_type": 1, + "fare_amount": 13.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4.44, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 19.24 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:35:33", + "tpep_dropoff_datetime": "2018-01-01 00:47:43", + "passenger_count": 4, + "trip_distance": 1.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 143, + "payment_type": 1, + "fare_amount": 10, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.25, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.55 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:15:20", + "tpep_dropoff_datetime": "2018-01-01 00:29:07", + "passenger_count": 2, + "trip_distance": 2.88, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 229, + "payment_type": 1, + "fare_amount": 12, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.32, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16.62 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:31:08", + "tpep_dropoff_datetime": "2018-01-01 00:50:47", + "passenger_count": 2, + "trip_distance": 3.36, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 140, + "DOLocationID": 239, + "payment_type": 2, + "fare_amount": 15.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:52:53", + "tpep_dropoff_datetime": "2018-01-01 01:07:23", + "passenger_count": 2, + "trip_distance": 2.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 68, + "payment_type": 1, + "fare_amount": 12.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.76, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16.56 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:25:32", + "tpep_dropoff_datetime": "2018-01-01 00:37:21", + "passenger_count": 1, + "trip_distance": 0.90, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 161, + "payment_type": 2, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:46:53", + "tpep_dropoff_datetime": "2018-01-01 01:04:50", + "passenger_count": 1, + "trip_distance": 2.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 163, + "DOLocationID": 48, + "payment_type": 2, + "fare_amount": 13, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2017-12-31 12:12:14", + "tpep_dropoff_datetime": "2017-12-31 12:27:26", + "passenger_count": 1, + "trip_distance": 2.91, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 143, + "DOLocationID": 141, + "payment_type": 1, + "fare_amount": 12.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.38, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.18 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2017-12-31 12:33:49", + "tpep_dropoff_datetime": "2017-12-31 12:47:42", + "passenger_count": 1, + "trip_distance": 2.21, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 107, + "payment_type": 1, + "fare_amount": 10.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.54, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.34 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2017-12-31 12:52:15", + "tpep_dropoff_datetime": "2018-01-01 12:13:05", + "passenger_count": 1, + "trip_distance": 1.95, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 107, + "DOLocationID": 68, + "payment_type": 2, + "fare_amount": 13.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:20:17", + "tpep_dropoff_datetime": "2018-01-01 00:51:01", + "passenger_count": 1, + "trip_distance": 10.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 132, + "DOLocationID": 36, + "payment_type": 2, + "fare_amount": 34, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 35.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:45:44", + "tpep_dropoff_datetime": "2018-01-01 00:48:22", + "passenger_count": 1, + "trip_distance": 0.90, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 262, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.25, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.55 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:50:57", + "tpep_dropoff_datetime": "2018-01-01 01:01:19", + "passenger_count": 2, + "trip_distance": 1.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 262, + "DOLocationID": 236, + "payment_type": 1, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.55, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.85 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:44:39", + "tpep_dropoff_datetime": "2018-01-01 00:51:37", + "passenger_count": 5, + "trip_distance": 1.28, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 74, + "DOLocationID": 41, + "payment_type": 2, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:17:39", + "tpep_dropoff_datetime": "2018-01-01 00:40:39", + "passenger_count": 1, + "trip_distance": 4.11, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 164, + "DOLocationID": 75, + "payment_type": 1, + "fare_amount": 17.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.76, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 22.56 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:47:31", + "tpep_dropoff_datetime": "2018-01-01 00:53:09", + "passenger_count": 1, + "trip_distance": 1.44, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 263, + "DOLocationID": 162, + "payment_type": 1, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.56, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.36 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:07:54", + "tpep_dropoff_datetime": "2018-01-01 00:24:30", + "passenger_count": 1, + "trip_distance": 7.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 170, + "DOLocationID": 65, + "payment_type": 1, + "fare_amount": 21.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4.55, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 27.35 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:30:36", + "tpep_dropoff_datetime": "2018-01-01 00:44:43", + "passenger_count": 1, + "trip_distance": 3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 65, + "DOLocationID": 113, + "payment_type": 1, + "fare_amount": 13, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:46:24", + "tpep_dropoff_datetime": "2018-01-01 01:05:44", + "passenger_count": 1, + "trip_distance": 3.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 114, + "DOLocationID": 229, + "payment_type": 2, + "fare_amount": 14, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:19:42", + "tpep_dropoff_datetime": "2018-01-01 00:26:51", + "passenger_count": 1, + "trip_distance": 1.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 236, + "payment_type": 2, + "fare_amount": 7, + "extra": 0, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:38:39", + "tpep_dropoff_datetime": "2018-01-01 00:45:36", + "passenger_count": 1, + "trip_distance": 1.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 43, + "DOLocationID": 142, + "payment_type": 1, + "fare_amount": 7.5, + "extra": 0, + "mta_tax": 0.5, + "tip_amount": 2.05, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.35 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:48:33", + "tpep_dropoff_datetime": "2018-01-01 01:18:47", + "passenger_count": 1, + "trip_distance": 10.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 220, + "payment_type": 2, + "fare_amount": 32, + "extra": 0, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 2.64, + "improvement_surcharge": 0.3, + "total_amount": 35.44 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:37:08", + "tpep_dropoff_datetime": "2018-01-01 01:29:00", + "passenger_count": 5, + "trip_distance": 1.62, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 161, + "DOLocationID": 48, + "payment_type": 2, + "fare_amount": 28, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 29.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:11:59", + "tpep_dropoff_datetime": "2018-01-01 00:23:56", + "passenger_count": 1, + "trip_distance": 2.08, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 179, + "DOLocationID": 7, + "payment_type": 2, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:55:38", + "tpep_dropoff_datetime": "2018-01-01 01:02:27", + "passenger_count": 1, + "trip_distance": 1.42, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 140, + "payment_type": 1, + "fare_amount": 7, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.66, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.96 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2017-12-31 23:57:13", + "tpep_dropoff_datetime": "2018-01-01 00:31:56", + "passenger_count": 1, + "trip_distance": 6.11, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 140, + "DOLocationID": 236, + "payment_type": 2, + "fare_amount": 17.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:34:13", + "tpep_dropoff_datetime": "2018-01-01 00:43:05", + "passenger_count": 1, + "trip_distance": 2.47, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 42, + "payment_type": 1, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.16, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.96 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:49:32", + "tpep_dropoff_datetime": "2018-01-01 00:59:52", + "passenger_count": 1, + "trip_distance": 1.36, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 41, + "DOLocationID": 74, + "payment_type": 2, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:24:32", + "tpep_dropoff_datetime": "2018-01-01 00:50:35", + "passenger_count": 1, + "trip_distance": 5.49, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 234, + "DOLocationID": 151, + "payment_type": 1, + "fare_amount": 21.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 5.7, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 28.5 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:56:01", + "tpep_dropoff_datetime": "2018-01-01 01:17:31", + "passenger_count": 1, + "trip_distance": 1.75, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 68, + "payment_type": 1, + "fare_amount": 14, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.06, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.36 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:25:07", + "tpep_dropoff_datetime": "2018-01-01 00:44:14", + "passenger_count": 2, + "trip_distance": 2.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 48, + "payment_type": 1, + "fare_amount": 13.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.95, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.75 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:44:54", + "tpep_dropoff_datetime": "2018-01-01 00:51:49", + "passenger_count": 2, + "trip_distance": 1.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:55:47", + "tpep_dropoff_datetime": "2018-01-01 00:58:26", + "passenger_count": 2, + "trip_distance": 0.60, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 239, + "payment_type": 2, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:41:42", + "tpep_dropoff_datetime": "2018-01-01 01:16:25", + "passenger_count": 4, + "trip_distance": 19.91, + "RatecodeID": 2, + "store_and_fwd_flag": "N", + "PULocationID": 132, + "DOLocationID": 151, + "payment_type": 1, + "fare_amount": 52, + "extra": 0, + "mta_tax": 0.5, + "tip_amount": 14.64, + "tolls_amount": 5.76, + "improvement_surcharge": 0.3, + "total_amount": 73.2 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:16:51", + "tpep_dropoff_datetime": "2018-01-01 00:38:32", + "passenger_count": 1, + "trip_distance": 4.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 90, + "DOLocationID": 217, + "payment_type": 1, + "fare_amount": 17, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 19.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:50:38", + "tpep_dropoff_datetime": "2018-01-01 01:11:31", + "passenger_count": 1, + "trip_distance": 9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 256, + "DOLocationID": 89, + "payment_type": 1, + "fare_amount": 27, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 7.05, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 35.35 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:13:46", + "tpep_dropoff_datetime": "2018-01-01 00:16:14", + "passenger_count": 1, + "trip_distance": 0.59, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 236, + "payment_type": 1, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0.53, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.83 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:20:25", + "tpep_dropoff_datetime": "2018-01-01 00:22:41", + "passenger_count": 1, + "trip_distance": 0.43, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 75, + "payment_type": 1, + "fare_amount": 3.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:24:42", + "tpep_dropoff_datetime": "2018-01-01 00:40:45", + "passenger_count": 1, + "trip_distance": 4.54, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 75, + "DOLocationID": 137, + "payment_type": 2, + "fare_amount": 16.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:42:06", + "tpep_dropoff_datetime": "2018-01-01 00:49:51", + "passenger_count": 1, + "trip_distance": 1.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 137, + "DOLocationID": 107, + "payment_type": 1, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.64, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.44 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:57:36", + "tpep_dropoff_datetime": "2018-01-01 01:08:27", + "passenger_count": 1, + "trip_distance": 1.92, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 79, + "DOLocationID": 162, + "payment_type": 1, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.58, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.88 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:25:19", + "tpep_dropoff_datetime": "2018-01-01 00:34:31", + "passenger_count": 1, + "trip_distance": 0.28, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 186, + "DOLocationID": 186, + "payment_type": 2, + "fare_amount": 7, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:46:20", + "tpep_dropoff_datetime": "2018-01-01 01:38:22", + "passenger_count": 1, + "trip_distance": 11.04, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 61, + "payment_type": 2, + "fare_amount": 41, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 42.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:25:02", + "tpep_dropoff_datetime": "2018-01-01 00:29:41", + "passenger_count": 5, + "trip_distance": 0.72, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 140, + "payment_type": 2, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:38:59", + "tpep_dropoff_datetime": "2018-01-01 00:44:39", + "passenger_count": 5, + "trip_distance": 0.88, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 262, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.46, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.76 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:50:34", + "tpep_dropoff_datetime": "2018-01-01 01:17:22", + "passenger_count": 5, + "trip_distance": 3.39, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 113, + "payment_type": 1, + "fare_amount": 18, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 21.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:24:55", + "tpep_dropoff_datetime": "2018-01-01 00:31:14", + "passenger_count": 1, + "trip_distance": 0.94, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 143, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.46, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.76 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:44:39", + "tpep_dropoff_datetime": "2018-01-01 00:53:37", + "passenger_count": 1, + "trip_distance": 0.69, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 50, + "payment_type": 1, + "fare_amount": 7, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.66, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.96 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:56:11", + "tpep_dropoff_datetime": "2018-01-01 01:26:25", + "passenger_count": 1, + "trip_distance": 4.49, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 50, + "DOLocationID": 148, + "payment_type": 1, + "fare_amount": 21, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 23.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:06:41", + "tpep_dropoff_datetime": "2018-01-01 00:11:53", + "passenger_count": 6, + "trip_distance": 0.91, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 79, + "DOLocationID": 144, + "payment_type": 1, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:43:45", + "tpep_dropoff_datetime": "2018-01-01 00:49:20", + "passenger_count": 6, + "trip_distance": 1.08, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 113, + "DOLocationID": 137, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.46, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.76 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:18:08", + "tpep_dropoff_datetime": "2018-01-01 00:29:18", + "passenger_count": 1, + "trip_distance": 5.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 263, + "DOLocationID": 4, + "payment_type": 1, + "fare_amount": 18, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 21.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:32:10", + "tpep_dropoff_datetime": "2018-01-01 00:51:51", + "passenger_count": 1, + "trip_distance": 4.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 4, + "DOLocationID": 246, + "payment_type": 2, + "fare_amount": 16.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:00:25", + "tpep_dropoff_datetime": "2018-01-01 00:20:37", + "passenger_count": 1, + "trip_distance": 7.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 116, + "payment_type": 2, + "fare_amount": 24, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 25.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:35:11", + "tpep_dropoff_datetime": "2018-01-01 00:38:49", + "passenger_count": 1, + "trip_distance": 0.70, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 166, + "DOLocationID": 151, + "payment_type": 2, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:40:03", + "tpep_dropoff_datetime": "2018-01-01 00:44:26", + "passenger_count": 1, + "trip_distance": 0.70, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 151, + "DOLocationID": 238, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.25, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.55 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:50:10", + "tpep_dropoff_datetime": "2018-01-01 01:03:54", + "passenger_count": 1, + "trip_distance": 2.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 143, + "DOLocationID": 263, + "payment_type": 2, + "fare_amount": 11.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:30:06", + "tpep_dropoff_datetime": "2018-01-01 00:51:31", + "passenger_count": 1, + "trip_distance": 2.23, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 90, + "DOLocationID": 50, + "payment_type": 1, + "fare_amount": 14, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:54:56", + "tpep_dropoff_datetime": "2018-01-01 01:02:20", + "passenger_count": 1, + "trip_distance": 0.47, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 50, + "DOLocationID": 50, + "payment_type": 2, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:15:07", + "tpep_dropoff_datetime": "2018-01-01 00:40:17", + "passenger_count": 3, + "trip_distance": 9.09, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 144, + "DOLocationID": 226, + "payment_type": 2, + "fare_amount": 29, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 30.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:53:36", + "tpep_dropoff_datetime": "2018-01-01 00:59:24", + "passenger_count": 2, + "trip_distance": 1.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 170, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.46, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.76 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:19:03", + "tpep_dropoff_datetime": "2018-01-01 00:36:34", + "passenger_count": 1, + "trip_distance": 3.44, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 148, + "DOLocationID": 80, + "payment_type": 2, + "fare_amount": 15, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:39:05", + "tpep_dropoff_datetime": "2018-01-01 00:52:45", + "passenger_count": 1, + "trip_distance": 3.62, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 80, + "DOLocationID": 193, + "payment_type": 1, + "fare_amount": 13.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.96, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.76 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:57:01", + "tpep_dropoff_datetime": "2018-01-01 01:23:14", + "passenger_count": 1, + "trip_distance": 4.48, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 193, + "DOLocationID": 50, + "payment_type": 2, + "fare_amount": 20, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 21.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:16:59", + "tpep_dropoff_datetime": "2018-01-01 00:38:16", + "passenger_count": 1, + "trip_distance": 12.31, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 3, + "payment_type": 1, + "fare_amount": 34, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 5, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 40.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:22:08", + "tpep_dropoff_datetime": "2018-01-01 00:27:45", + "passenger_count": 1, + "trip_distance": 1.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 43, + "DOLocationID": 238, + "payment_type": 2, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:30:43", + "tpep_dropoff_datetime": "2018-01-01 00:35:49", + "passenger_count": 1, + "trip_distance": 1.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 236, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.45, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.75 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:40:46", + "tpep_dropoff_datetime": "2018-01-01 00:49:12", + "passenger_count": 2, + "trip_distance": 1.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 143, + "payment_type": 1, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.5, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:53:53", + "tpep_dropoff_datetime": "2018-01-01 01:09:55", + "passenger_count": 1, + "trip_distance": 2.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 246, + "payment_type": 1, + "fare_amount": 12.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.75, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16.55 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:24:40", + "tpep_dropoff_datetime": "2018-01-01 00:30:14", + "passenger_count": 2, + "trip_distance": 0.80, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 68, + "DOLocationID": 234, + "payment_type": 1, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.35, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.15 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:36:30", + "tpep_dropoff_datetime": "2018-01-01 00:41:16", + "passenger_count": 2, + "trip_distance": 0.70, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 113, + "DOLocationID": 113, + "payment_type": 2, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:46:11", + "tpep_dropoff_datetime": "2018-01-01 00:54:06", + "passenger_count": 2, + "trip_distance": 1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 113, + "DOLocationID": 186, + "payment_type": 2, + "fare_amount": 7, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:55:38", + "tpep_dropoff_datetime": "2018-01-01 01:05:22", + "passenger_count": 1, + "trip_distance": 1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 186, + "DOLocationID": 68, + "payment_type": 1, + "fare_amount": 8, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.75, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.05 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:21:42", + "tpep_dropoff_datetime": "2018-01-01 00:35:59", + "passenger_count": 1, + "trip_distance": 3.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 170, + "DOLocationID": 79, + "payment_type": 1, + "fare_amount": 13.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.7, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.5 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:47:05", + "tpep_dropoff_datetime": "2018-01-01 01:17:29", + "passenger_count": 2, + "trip_distance": 7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 107, + "DOLocationID": 80, + "payment_type": 1, + "fare_amount": 27, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 7.05, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 35.35 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:07:14", + "tpep_dropoff_datetime": "2018-01-01 00:11:45", + "passenger_count": 2, + "trip_distance": 0.76, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 239, + "payment_type": 2, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:13:07", + "tpep_dropoff_datetime": "2018-01-01 00:14:47", + "passenger_count": 2, + "trip_distance": 0.45, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 3.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.44, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.24 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:23:33", + "tpep_dropoff_datetime": "2018-01-02 00:14:47", + "passenger_count": 2, + "trip_distance": 3.23, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 236, + "payment_type": 2, + "fare_amount": 13.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:45:59", + "tpep_dropoff_datetime": "2018-01-01 01:00:11", + "passenger_count": 3, + "trip_distance": 4.67, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 112, + "payment_type": 1, + "fare_amount": 15.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 5.04, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 21.84 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:30:38", + "tpep_dropoff_datetime": "2018-01-01 00:45:47", + "passenger_count": 1, + "trip_distance": 1.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 249, + "DOLocationID": 186, + "payment_type": 1, + "fare_amount": 10.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:21:50", + "tpep_dropoff_datetime": "2018-01-01 00:31:08", + "passenger_count": 1, + "trip_distance": 1.98, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 43, + "DOLocationID": 263, + "payment_type": 1, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.54, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.84 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:34:09", + "tpep_dropoff_datetime": "2018-01-01 01:18:11", + "passenger_count": 1, + "trip_distance": 5.21, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 263, + "DOLocationID": 68, + "payment_type": 1, + "fare_amount": 28, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 29.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:21:56", + "tpep_dropoff_datetime": "2018-01-01 00:27:08", + "passenger_count": 1, + "trip_distance": 0.50, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 170, + "DOLocationID": 233, + "payment_type": 2, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:31:23", + "tpep_dropoff_datetime": "2018-01-01 00:36:05", + "passenger_count": 1, + "trip_distance": 1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 233, + "DOLocationID": 141, + "payment_type": 2, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:38:54", + "tpep_dropoff_datetime": "2018-01-01 00:51:42", + "passenger_count": 1, + "trip_distance": 1.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 229, + "payment_type": 1, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:14:36", + "tpep_dropoff_datetime": "2018-01-01 00:27:04", + "passenger_count": 1, + "trip_distance": 3.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 116, + "payment_type": 2, + "fare_amount": 12.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:32:16", + "tpep_dropoff_datetime": "2018-01-01 00:36:53", + "passenger_count": 1, + "trip_distance": 1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 116, + "DOLocationID": 166, + "payment_type": 2, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:42:25", + "tpep_dropoff_datetime": "2018-01-01 00:52:15", + "passenger_count": 1, + "trip_distance": 2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 24, + "DOLocationID": 263, + "payment_type": 2, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:59:34", + "tpep_dropoff_datetime": "2018-01-01 01:05:30", + "passenger_count": 1, + "trip_distance": 1.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 263, + "DOLocationID": 162, + "payment_type": 2, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:23:53", + "tpep_dropoff_datetime": "2018-01-01 00:26:11", + "passenger_count": 1, + "trip_distance": 0.65, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.06, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.36 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:28:10", + "tpep_dropoff_datetime": "2018-01-01 00:52:35", + "passenger_count": 1, + "trip_distance": 10.51, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 25, + "payment_type": 1, + "fare_amount": 31, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 5, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 37.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:31:04", + "tpep_dropoff_datetime": "2018-01-01 00:40:00", + "passenger_count": 1, + "trip_distance": 0.70, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 90, + "DOLocationID": 107, + "payment_type": 2, + "fare_amount": 7, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:41:20", + "tpep_dropoff_datetime": "2018-01-01 01:00:51", + "passenger_count": 2, + "trip_distance": 2.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 107, + "DOLocationID": 163, + "payment_type": 2, + "fare_amount": 14, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:17:18", + "tpep_dropoff_datetime": "2018-01-01 00:19:10", + "passenger_count": 1, + "trip_distance": 0.39, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 236, + "payment_type": 1, + "fare_amount": 3.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.44, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.24 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:21:13", + "tpep_dropoff_datetime": "2018-01-01 00:30:25", + "passenger_count": 1, + "trip_distance": 2.36, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 143, + "payment_type": 1, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.7, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.5 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:33:12", + "tpep_dropoff_datetime": "2018-01-01 00:39:05", + "passenger_count": 1, + "trip_distance": 0.87, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 143, + "DOLocationID": 50, + "payment_type": 2, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:39:27", + "tpep_dropoff_datetime": "2018-01-01 00:52:04", + "passenger_count": 1, + "trip_distance": 2.21, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 50, + "DOLocationID": 68, + "payment_type": 1, + "fare_amount": 11, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.46, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.76 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:27:32", + "tpep_dropoff_datetime": "2018-01-01 01:02:49", + "passenger_count": 1, + "trip_distance": 8.41, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 114, + "DOLocationID": 74, + "payment_type": 1, + "fare_amount": 31.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 32.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:13:48", + "tpep_dropoff_datetime": "2018-01-01 00:30:53", + "passenger_count": 1, + "trip_distance": 4.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 45, + "DOLocationID": 62, + "payment_type": 2, + "fare_amount": 16, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:18:12", + "tpep_dropoff_datetime": "2018-01-01 00:22:38", + "passenger_count": 1, + "trip_distance": 0.80, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 209, + "DOLocationID": 144, + "payment_type": 1, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:29:13", + "tpep_dropoff_datetime": "2018-01-01 00:39:29", + "passenger_count": 1, + "trip_distance": 1.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 114, + "DOLocationID": 234, + "payment_type": 1, + "fare_amount": 8, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0.93, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.23 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:33:11", + "tpep_dropoff_datetime": "2018-01-01 00:51:35", + "passenger_count": 1, + "trip_distance": 3.06, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 50, + "payment_type": 1, + "fare_amount": 14, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.06, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.36 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:56:40", + "tpep_dropoff_datetime": "2018-01-01 01:12:15", + "passenger_count": 1, + "trip_distance": 3.69, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 116, + "payment_type": 1, + "fare_amount": 14, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.82, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 19.12 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:11:59", + "tpep_dropoff_datetime": "2018-01-01 00:24:19", + "passenger_count": 4, + "trip_distance": 2.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 151, + "payment_type": 1, + "fare_amount": 11, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.5, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:26:02", + "tpep_dropoff_datetime": "2018-01-01 00:59:30", + "passenger_count": 3, + "trip_distance": 8.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 151, + "DOLocationID": 232, + "payment_type": 2, + "fare_amount": 29, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 30.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:50:58", + "tpep_dropoff_datetime": "2018-01-01 01:03:39", + "passenger_count": 1, + "trip_distance": 2.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 48, + "payment_type": 3, + "fare_amount": 11.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:01:54", + "tpep_dropoff_datetime": "2018-01-01 00:14:38", + "passenger_count": 1, + "trip_distance": 1.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 50, + "DOLocationID": 48, + "payment_type": 2, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:27:50", + "tpep_dropoff_datetime": "2018-01-01 00:37:53", + "passenger_count": 1, + "trip_distance": 0.30, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 48, + "payment_type": 2, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:40:21", + "tpep_dropoff_datetime": "2018-01-01 00:46:37", + "passenger_count": 1, + "trip_distance": 0.90, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 90, + "payment_type": 2, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:54:12", + "tpep_dropoff_datetime": "2018-01-01 01:00:20", + "passenger_count": 1, + "trip_distance": 0.40, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 107, + "DOLocationID": 107, + "payment_type": 2, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:15:16", + "tpep_dropoff_datetime": "2018-01-01 00:28:00", + "passenger_count": 1, + "trip_distance": 2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 148, + "DOLocationID": 233, + "payment_type": 1, + "fare_amount": 10, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.25, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.55 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:30:18", + "tpep_dropoff_datetime": "2018-01-01 00:38:36", + "passenger_count": 1, + "trip_distance": 1.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 170, + "DOLocationID": 161, + "payment_type": 2, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:48:49", + "tpep_dropoff_datetime": "2018-01-01 00:53:12", + "passenger_count": 1, + "trip_distance": 1.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 140, + "payment_type": 2, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:43:23", + "tpep_dropoff_datetime": "2018-01-01 00:50:20", + "passenger_count": 1, + "trip_distance": 1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 246, + "DOLocationID": 50, + "payment_type": 2, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:14:07", + "tpep_dropoff_datetime": "2018-01-01 00:18:36", + "passenger_count": 2, + "trip_distance": 0.71, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 13, + "DOLocationID": 13, + "payment_type": 2, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:25:20", + "tpep_dropoff_datetime": "2018-01-01 00:43:32", + "passenger_count": 2, + "trip_distance": 3.57, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 231, + "DOLocationID": 246, + "payment_type": 1, + "fare_amount": 15.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:48:58", + "tpep_dropoff_datetime": "2018-01-01 01:13:10", + "passenger_count": 2, + "trip_distance": 4.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 75, + "payment_type": 2, + "fare_amount": 18, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 19.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:12:49", + "tpep_dropoff_datetime": "2018-01-01 00:29:03", + "passenger_count": 2, + "trip_distance": 2.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 231, + "DOLocationID": 79, + "payment_type": 1, + "fare_amount": 12, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.65, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.95 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:34:01", + "tpep_dropoff_datetime": "2018-01-01 00:53:20", + "passenger_count": 1, + "trip_distance": 1.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 137, + "DOLocationID": 90, + "payment_type": 1, + "fare_amount": 13, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.85, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.15 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:18:10", + "tpep_dropoff_datetime": "2018-01-01 00:22:25", + "passenger_count": 1, + "trip_distance": 0.68, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 107, + "DOLocationID": 170, + "payment_type": 2, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:32:55", + "tpep_dropoff_datetime": "2018-01-01 00:46:39", + "passenger_count": 1, + "trip_distance": 0.38, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 48, + "payment_type": 1, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:55:03", + "tpep_dropoff_datetime": "2018-01-01 01:19:29", + "passenger_count": 1, + "trip_distance": 3.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 141, + "payment_type": 2, + "fare_amount": 16.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:35:45", + "tpep_dropoff_datetime": "2018-01-01 01:14:20", + "passenger_count": 2, + "trip_distance": 20.71, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 226, + "DOLocationID": 117, + "payment_type": 1, + "fare_amount": 57, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 58.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:42:28", + "tpep_dropoff_datetime": "2018-01-01 00:56:46", + "passenger_count": 1, + "trip_distance": 1.78, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 246, + "DOLocationID": 50, + "payment_type": 1, + "fare_amount": 11, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.46, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.76 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:59:28", + "tpep_dropoff_datetime": "2018-01-01 01:00:52", + "passenger_count": 1, + "trip_distance": 0.18, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 143, + "payment_type": 2, + "fare_amount": 3, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 4.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:31:26", + "tpep_dropoff_datetime": "2018-01-01 00:39:34", + "passenger_count": 1, + "trip_distance": 0.70, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 79, + "DOLocationID": 107, + "payment_type": 1, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.55, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.35 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:46:50", + "tpep_dropoff_datetime": "2018-01-01 00:58:24", + "passenger_count": 2, + "trip_distance": 2.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 107, + "DOLocationID": 141, + "payment_type": 2, + "fare_amount": 10.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:13:37", + "tpep_dropoff_datetime": "2018-01-01 00:21:46", + "passenger_count": 2, + "trip_distance": 2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 142, + "payment_type": 2, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:22:32", + "tpep_dropoff_datetime": "2018-01-01 00:33:09", + "passenger_count": 2, + "trip_distance": 1.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 151, + "payment_type": 1, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.7, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.5 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:48:43", + "tpep_dropoff_datetime": "2018-01-01 00:50:43", + "passenger_count": 1, + "trip_distance": 0.50, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 143, + "payment_type": 1, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.3, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.6 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:51:52", + "tpep_dropoff_datetime": "2018-01-01 01:03:01", + "passenger_count": 1, + "trip_distance": 3.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 143, + "DOLocationID": 236, + "payment_type": 1, + "fare_amount": 12, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.33, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.63 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:49:03", + "tpep_dropoff_datetime": "2018-01-01 00:55:38", + "passenger_count": 2, + "trip_distance": 1.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 95, + "DOLocationID": 95, + "payment_type": 2, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:15:56", + "tpep_dropoff_datetime": "2018-01-01 00:28:06", + "passenger_count": 2, + "trip_distance": 1.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 107, + "DOLocationID": 186, + "payment_type": 1, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.7, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:44:39", + "tpep_dropoff_datetime": "2018-01-01 00:52:57", + "passenger_count": 1, + "trip_distance": 1.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 114, + "DOLocationID": 88, + "payment_type": 2, + "fare_amount": 8, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:54:00", + "tpep_dropoff_datetime": "2018-01-01 01:15:35", + "passenger_count": 2, + "trip_distance": 12, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 261, + "DOLocationID": 21, + "payment_type": 2, + "fare_amount": 34, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 5.75, + "improvement_surcharge": 0.3, + "total_amount": 41.05 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:38:07", + "tpep_dropoff_datetime": "2018-01-01 00:44:11", + "passenger_count": 1, + "trip_distance": 1.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 40, + "DOLocationID": 33, + "payment_type": 1, + "fare_amount": 7, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.45, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.75 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:58:10", + "tpep_dropoff_datetime": "2018-01-01 01:00:16", + "passenger_count": 2, + "trip_distance": 0.30, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 261, + "DOLocationID": 261, + "payment_type": 1, + "fare_amount": 3.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.4, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.2 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:12:28", + "tpep_dropoff_datetime": "2018-01-01 00:24:11", + "passenger_count": 1, + "trip_distance": 2.46, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 13, + "DOLocationID": 249, + "payment_type": 1, + "fare_amount": 11, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.46, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.76 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:30:40", + "tpep_dropoff_datetime": "2018-01-01 00:47:13", + "passenger_count": 1, + "trip_distance": 1.35, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 249, + "DOLocationID": 107, + "payment_type": 1, + "fare_amount": 11, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.11, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.41 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:52:52", + "tpep_dropoff_datetime": "2018-01-01 01:12:06", + "passenger_count": 1, + "trip_distance": 2.43, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 107, + "DOLocationID": 246, + "payment_type": 1, + "fare_amount": 13.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.96, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.76 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2017-12-31 23:57:19", + "tpep_dropoff_datetime": "2018-01-01 00:01:11", + "passenger_count": 1, + "trip_distance": 0.81, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 237, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:06:37", + "tpep_dropoff_datetime": "2018-01-01 00:16:28", + "passenger_count": 1, + "trip_distance": 1.83, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 43, + "DOLocationID": 233, + "payment_type": 2, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:45:51", + "tpep_dropoff_datetime": "2018-01-01 01:22:43", + "passenger_count": 1, + "trip_distance": 5.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 211, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 26.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4.17, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 31.97 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2017-12-31 21:59:12", + "tpep_dropoff_datetime": "2017-12-31 22:11:14", + "passenger_count": 3, + "trip_distance": 2.35, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 75, + "payment_type": 1, + "fare_amount": 10.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.95, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.75 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2017-12-31 22:10:05", + "tpep_dropoff_datetime": "2017-12-31 22:33:08", + "passenger_count": 2, + "trip_distance": 1.49, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 161, + "DOLocationID": 137, + "payment_type": 2, + "fare_amount": 14.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2017-12-31 22:35:37", + "tpep_dropoff_datetime": "2017-12-31 22:54:03", + "passenger_count": 2, + "trip_distance": 4.88, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 137, + "DOLocationID": 238, + "payment_type": 1, + "fare_amount": 16.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.56, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 21.36 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:10:56", + "tpep_dropoff_datetime": "2018-01-01 00:19:06", + "passenger_count": 1, + "trip_distance": 1.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 137, + "DOLocationID": 229, + "payment_type": 1, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:58:53", + "tpep_dropoff_datetime": "2018-01-01 01:27:07", + "passenger_count": 0, + "trip_distance": 5.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 114, + "DOLocationID": 236, + "payment_type": 2, + "fare_amount": 21.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 22.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:11:56", + "tpep_dropoff_datetime": "2018-01-01 00:14:35", + "passenger_count": 2, + "trip_distance": 0.30, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 41, + "DOLocationID": 41, + "payment_type": 2, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:22:31", + "tpep_dropoff_datetime": "2018-01-01 00:27:30", + "passenger_count": 1, + "trip_distance": 1.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 24, + "DOLocationID": 238, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.45, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.75 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:28:40", + "tpep_dropoff_datetime": "2018-01-01 00:33:08", + "passenger_count": 2, + "trip_distance": 0.90, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 142, + "payment_type": 2, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:35:29", + "tpep_dropoff_datetime": "2018-01-01 00:43:11", + "passenger_count": 2, + "trip_distance": 1.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 239, + "payment_type": 2, + "fare_amount": 7, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:47:46", + "tpep_dropoff_datetime": "2018-01-01 01:15:14", + "passenger_count": 2, + "trip_distance": 2.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 164, + "payment_type": 1, + "fare_amount": 17.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 21.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:24:23", + "tpep_dropoff_datetime": "2018-01-01 00:29:38", + "passenger_count": 1, + "trip_distance": 0.80, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 249, + "DOLocationID": 158, + "payment_type": 2, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:36:56", + "tpep_dropoff_datetime": "2018-01-01 00:46:53", + "passenger_count": 2, + "trip_distance": 1.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 158, + "DOLocationID": 249, + "payment_type": 1, + "fare_amount": 8, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.85, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.15 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:48:13", + "tpep_dropoff_datetime": "2018-01-01 01:25:57", + "passenger_count": 2, + "trip_distance": 7.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 249, + "DOLocationID": 41, + "payment_type": 1, + "fare_amount": 30, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 6.25, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 37.55 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:06:41", + "tpep_dropoff_datetime": "2018-01-01 00:25:31", + "passenger_count": 2, + "trip_distance": 7.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 255, + "payment_type": 1, + "fare_amount": 24, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 5.05, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 30.35 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:28:46", + "tpep_dropoff_datetime": "2018-01-01 00:40:31", + "passenger_count": 2, + "trip_distance": 3.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 112, + "DOLocationID": 17, + "payment_type": 1, + "fare_amount": 12.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.75, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16.55 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:56:13", + "tpep_dropoff_datetime": "2018-01-01 01:00:18", + "passenger_count": 2, + "trip_distance": 0.60, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 148, + "DOLocationID": 79, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.25, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.55 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:09:19", + "tpep_dropoff_datetime": "2018-01-01 00:10:34", + "passenger_count": 1, + "trip_distance": 0.50, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 140, + "DOLocationID": 263, + "payment_type": 2, + "fare_amount": 3.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 4.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:14:51", + "tpep_dropoff_datetime": "2018-01-01 00:27:38", + "passenger_count": 1, + "trip_distance": 3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 262, + "DOLocationID": 142, + "payment_type": 2, + "fare_amount": 11.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:29:28", + "tpep_dropoff_datetime": "2018-01-01 01:07:47", + "passenger_count": 2, + "trip_distance": 10.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 181, + "payment_type": 1, + "fare_amount": 34, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 8.2, + "tolls_amount": 5.76, + "improvement_surcharge": 0.3, + "total_amount": 49.26 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:42:12", + "tpep_dropoff_datetime": "2018-01-01 01:07:27", + "passenger_count": 2, + "trip_distance": 2.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 264, + "DOLocationID": 264, + "payment_type": 1, + "fare_amount": 16.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:16:36", + "tpep_dropoff_datetime": "2018-01-01 00:23:09", + "passenger_count": 1, + "trip_distance": 1.89, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 233, + "payment_type": 1, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:28:26", + "tpep_dropoff_datetime": "2018-01-01 00:37:21", + "passenger_count": 1, + "trip_distance": 1.04, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 137, + "DOLocationID": 233, + "payment_type": 2, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:38:09", + "tpep_dropoff_datetime": "2018-01-01 00:45:53", + "passenger_count": 2, + "trip_distance": 1.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 4, + "DOLocationID": 114, + "payment_type": 1, + "fare_amount": 7, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.65, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.95 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:47:17", + "tpep_dropoff_datetime": "2018-01-01 01:14:08", + "passenger_count": 1, + "trip_distance": 3.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 114, + "DOLocationID": 163, + "payment_type": 2, + "fare_amount": 17.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:05:41", + "tpep_dropoff_datetime": "2018-01-01 00:11:46", + "passenger_count": 1, + "trip_distance": 1.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 79, + "DOLocationID": 107, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.45, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.75 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:15:33", + "tpep_dropoff_datetime": "2018-01-01 00:22:41", + "passenger_count": 3, + "trip_distance": 1.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 137, + "DOLocationID": 141, + "payment_type": 2, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:24:19", + "tpep_dropoff_datetime": "2018-01-01 00:25:56", + "passenger_count": 1, + "trip_distance": 0.60, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 141, + "payment_type": 1, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.55, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.85 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:30:57", + "tpep_dropoff_datetime": "2018-01-01 00:34:37", + "passenger_count": 1, + "trip_distance": 0.80, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 263, + "payment_type": 2, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:37:05", + "tpep_dropoff_datetime": "2018-01-01 00:39:59", + "passenger_count": 2, + "trip_distance": 0.50, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 263, + "DOLocationID": 237, + "payment_type": 2, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:44:04", + "tpep_dropoff_datetime": "2018-01-01 00:59:23", + "passenger_count": 4, + "trip_distance": 2.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 170, + "payment_type": 2, + "fare_amount": 12, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:19:59", + "tpep_dropoff_datetime": "2018-01-01 00:27:14", + "passenger_count": 4, + "trip_distance": 1.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 151, + "payment_type": 2, + "fare_amount": 8, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:31:26", + "tpep_dropoff_datetime": "2018-01-01 00:35:43", + "passenger_count": 2, + "trip_distance": 1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 143, + "payment_type": 2, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:36:59", + "tpep_dropoff_datetime": "2018-01-01 00:38:38", + "passenger_count": 1, + "trip_distance": 0.40, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 143, + "DOLocationID": 143, + "payment_type": 2, + "fare_amount": 3.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 4.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:40:58", + "tpep_dropoff_datetime": "2018-01-01 00:43:37", + "passenger_count": 1, + "trip_distance": 0.50, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 143, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:47:07", + "tpep_dropoff_datetime": "2018-01-01 01:18:33", + "passenger_count": 2, + "trip_distance": 4.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 113, + "payment_type": 1, + "fare_amount": 22.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 7.1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 30.9 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:20:59", + "tpep_dropoff_datetime": "2018-01-01 00:34:35", + "passenger_count": 1, + "trip_distance": 1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 170, + "DOLocationID": 170, + "payment_type": 1, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.15, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.95 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:28:49", + "tpep_dropoff_datetime": "2018-01-01 00:51:13", + "passenger_count": 1, + "trip_distance": 4.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 148, + "DOLocationID": 50, + "payment_type": 1, + "fare_amount": 18, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.86, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 23.16 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:54:37", + "tpep_dropoff_datetime": "2018-01-01 01:14:21", + "passenger_count": 1, + "trip_distance": 3.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 50, + "DOLocationID": 162, + "payment_type": 2, + "fare_amount": 14.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:20:12", + "tpep_dropoff_datetime": "2018-01-01 00:24:24", + "passenger_count": 1, + "trip_distance": 0.90, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 116, + "DOLocationID": 166, + "payment_type": 1, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 5, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:26:06", + "tpep_dropoff_datetime": "2018-01-01 00:48:05", + "passenger_count": 1, + "trip_distance": 4.85, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 166, + "DOLocationID": 127, + "payment_type": 2, + "fare_amount": 19.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 20.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:17:47", + "tpep_dropoff_datetime": "2018-01-01 00:24:17", + "passenger_count": 1, + "trip_distance": 1.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 236, + "payment_type": 1, + "fare_amount": 7, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.25, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.55 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:30:42", + "tpep_dropoff_datetime": "2018-01-01 00:39:54", + "passenger_count": 1, + "trip_distance": 1.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 43, + "DOLocationID": 161, + "payment_type": 2, + "fare_amount": 8, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:46:05", + "tpep_dropoff_datetime": "2018-01-01 00:53:58", + "passenger_count": 1, + "trip_distance": 1.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 236, + "payment_type": 1, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.95, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.75 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:55:42", + "tpep_dropoff_datetime": "2018-01-01 01:09:28", + "passenger_count": 1, + "trip_distance": 3.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 48, + "payment_type": 1, + "fare_amount": 12.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4.1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.9 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:06:44", + "tpep_dropoff_datetime": "2018-01-01 00:28:23", + "passenger_count": 1, + "trip_distance": 8.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 74, + "DOLocationID": 174, + "payment_type": 2, + "fare_amount": 27.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 28.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:32:34", + "tpep_dropoff_datetime": "2018-01-01 00:42:04", + "passenger_count": 1, + "trip_distance": 2.32, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 18, + "DOLocationID": 20, + "payment_type": 2, + "fare_amount": 10, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:19:12", + "tpep_dropoff_datetime": "2018-01-01 00:53:07", + "passenger_count": 2, + "trip_distance": 11.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 26, + "payment_type": 2, + "fare_amount": 36, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 5.76, + "improvement_surcharge": 0.3, + "total_amount": 43.06 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:08:24", + "tpep_dropoff_datetime": "2018-01-01 00:22:57", + "passenger_count": 1, + "trip_distance": 7.97, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 138, + "DOLocationID": 262, + "payment_type": 2, + "fare_amount": 22.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 5.76, + "improvement_surcharge": 0.3, + "total_amount": 29.56 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:32:17", + "tpep_dropoff_datetime": "2018-01-01 00:46:22", + "passenger_count": 1, + "trip_distance": 2.03, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 170, + "payment_type": 2, + "fare_amount": 8, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:59:03", + "tpep_dropoff_datetime": "2018-01-01 01:31:44", + "passenger_count": 1, + "trip_distance": 6.65, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 233, + "DOLocationID": 223, + "payment_type": 2, + "fare_amount": 24, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 25.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:08:30", + "tpep_dropoff_datetime": "2018-01-01 00:27:11", + "passenger_count": 1, + "trip_distance": 0.60, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 48, + "payment_type": 2, + "fare_amount": 11.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:33:52", + "tpep_dropoff_datetime": "2018-01-01 00:42:18", + "passenger_count": 5, + "trip_distance": 0.20, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 48, + "payment_type": 2, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:45:41", + "tpep_dropoff_datetime": "2018-01-01 01:40:59", + "passenger_count": 2, + "trip_distance": 8.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 198, + "payment_type": 2, + "fare_amount": 39, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 40.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:18:31", + "tpep_dropoff_datetime": "2018-01-01 00:23:04", + "passenger_count": 1, + "trip_distance": 1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 263, + "payment_type": 1, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.36, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.16 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:29:10", + "tpep_dropoff_datetime": "2018-01-01 00:37:44", + "passenger_count": 1, + "trip_distance": 1.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 140, + "payment_type": 2, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:46:21", + "tpep_dropoff_datetime": "2018-01-01 00:50:08", + "passenger_count": 1, + "trip_distance": 0.86, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 262, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.26, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.56 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:18:28", + "tpep_dropoff_datetime": "2018-01-01 00:53:44", + "passenger_count": 2, + "trip_distance": 2.83, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 114, + "DOLocationID": 161, + "payment_type": 1, + "fare_amount": 20.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4.36, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 26.16 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:39:59", + "tpep_dropoff_datetime": "2018-01-01 00:53:09", + "passenger_count": 2, + "trip_distance": 1.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 164, + "DOLocationID": 107, + "payment_type": 1, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.15, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.95 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:55:42", + "tpep_dropoff_datetime": "2018-01-01 01:11:19", + "passenger_count": 3, + "trip_distance": 1.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 79, + "DOLocationID": 246, + "payment_type": 1, + "fare_amount": 11, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.45, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.75 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:20:29", + "tpep_dropoff_datetime": "2018-01-01 00:26:43", + "passenger_count": 2, + "trip_distance": 0.91, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 161, + "DOLocationID": 233, + "payment_type": 2, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:31:11", + "tpep_dropoff_datetime": "2018-01-01 00:46:18", + "passenger_count": 3, + "trip_distance": 1.84, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 233, + "DOLocationID": 234, + "payment_type": 1, + "fare_amount": 11, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.46, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.76 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:54:14", + "tpep_dropoff_datetime": "2018-01-01 01:21:08", + "passenger_count": 2, + "trip_distance": 4.91, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 90, + "DOLocationID": 255, + "payment_type": 1, + "fare_amount": 20.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4.36, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 26.16 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:53:14", + "tpep_dropoff_datetime": "2018-01-01 00:56:32", + "passenger_count": 1, + "trip_distance": 0.50, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 137, + "DOLocationID": 170, + "payment_type": 1, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:11:51", + "tpep_dropoff_datetime": "2018-01-01 00:21:47", + "passenger_count": 1, + "trip_distance": 1.18, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 137, + "DOLocationID": 90, + "payment_type": 1, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.76, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.56 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:22:35", + "tpep_dropoff_datetime": "2018-01-01 00:50:04", + "passenger_count": 1, + "trip_distance": 3.79, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 90, + "DOLocationID": 236, + "payment_type": 1, + "fare_amount": 19, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 23.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:51:06", + "tpep_dropoff_datetime": "2018-01-01 01:14:49", + "passenger_count": 1, + "trip_distance": 9.63, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 231, + "payment_type": 1, + "fare_amount": 29, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 6, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 36.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:03:35", + "tpep_dropoff_datetime": "2018-01-01 00:33:15", + "passenger_count": 1, + "trip_distance": 19.55, + "RatecodeID": 2, + "store_and_fwd_flag": "N", + "PULocationID": 132, + "DOLocationID": 262, + "payment_type": 1, + "fare_amount": 52, + "extra": 0, + "mta_tax": 0.5, + "tip_amount": 10, + "tolls_amount": 5.76, + "improvement_surcharge": 0.3, + "total_amount": 68.56 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:39:12", + "tpep_dropoff_datetime": "2018-01-01 00:44:39", + "passenger_count": 1, + "trip_distance": 1.49, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 140, + "DOLocationID": 263, + "payment_type": 1, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0.78, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.58 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:45:15", + "tpep_dropoff_datetime": "2018-01-01 01:04:49", + "passenger_count": 1, + "trip_distance": 3.49, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 263, + "DOLocationID": 48, + "payment_type": 1, + "fare_amount": 15.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 5.04, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 21.84 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:09:44", + "tpep_dropoff_datetime": "2018-01-01 00:42:08", + "passenger_count": 1, + "trip_distance": 3.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 264, + "DOLocationID": 48, + "payment_type": 1, + "fare_amount": 20.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4.35, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 26.15 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:45:35", + "tpep_dropoff_datetime": "2018-01-01 01:15:04", + "passenger_count": 1, + "trip_distance": 3.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 140, + "payment_type": 1, + "fare_amount": 19.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4.15, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 24.95 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:13:06", + "tpep_dropoff_datetime": "2018-01-01 00:38:37", + "passenger_count": 1, + "trip_distance": 17.2, + "RatecodeID": 2, + "store_and_fwd_flag": "N", + "PULocationID": 132, + "DOLocationID": 141, + "payment_type": 1, + "fare_amount": 52, + "extra": 0, + "mta_tax": 0.5, + "tip_amount": 7.6, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 60.4 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:53:04", + "tpep_dropoff_datetime": "2018-01-01 00:58:52", + "passenger_count": 1, + "trip_distance": 1.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 237, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.45, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.75 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:36:55", + "tpep_dropoff_datetime": "2018-01-01 00:45:35", + "passenger_count": 1, + "trip_distance": 1.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 148, + "DOLocationID": 249, + "payment_type": 1, + "fare_amount": 8, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.9, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.2 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:47:12", + "tpep_dropoff_datetime": "2018-01-01 00:50:26", + "passenger_count": 2, + "trip_distance": 0.30, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 249, + "DOLocationID": 113, + "payment_type": 2, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:52:56", + "tpep_dropoff_datetime": "2018-01-01 01:04:29", + "passenger_count": 1, + "trip_distance": 1.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 90, + "DOLocationID": 137, + "payment_type": 1, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.05, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.35 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:22:32", + "tpep_dropoff_datetime": "2018-01-01 00:28:14", + "passenger_count": 2, + "trip_distance": 0.60, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 170, + "DOLocationID": 233, + "payment_type": 1, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.35, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.15 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:34:47", + "tpep_dropoff_datetime": "2018-01-01 00:39:33", + "passenger_count": 2, + "trip_distance": 0.70, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 137, + "DOLocationID": 107, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.55, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.85 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:43:20", + "tpep_dropoff_datetime": "2018-01-01 00:53:37", + "passenger_count": 2, + "trip_distance": 1.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 137, + "DOLocationID": 161, + "payment_type": 2, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:29:55", + "tpep_dropoff_datetime": "2018-01-01 00:50:16", + "passenger_count": 1, + "trip_distance": 2.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 170, + "DOLocationID": 142, + "payment_type": 1, + "fare_amount": 14.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.15, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.95 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:46:49", + "tpep_dropoff_datetime": "2018-01-01 01:18:06", + "passenger_count": 1, + "trip_distance": 8.83, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 114, + "DOLocationID": 257, + "payment_type": 1, + "fare_amount": 29, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 30.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:09:46", + "tpep_dropoff_datetime": "2018-01-01 00:17:17", + "passenger_count": 1, + "trip_distance": 1.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 233, + "payment_type": 1, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.6, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.4 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:30:11", + "tpep_dropoff_datetime": "2018-01-01 00:38:04", + "passenger_count": 2, + "trip_distance": 2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 143, + "payment_type": 1, + "fare_amount": 8, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.75, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.05 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:40:42", + "tpep_dropoff_datetime": "2018-01-01 00:53:28", + "passenger_count": 1, + "trip_distance": 7.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 143, + "DOLocationID": 243, + "payment_type": 2, + "fare_amount": 21.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 22.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:12:55", + "tpep_dropoff_datetime": "2018-01-01 00:21:19", + "passenger_count": 6, + "trip_distance": 2.27, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 151, + "DOLocationID": 237, + "payment_type": 1, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.09, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.39 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:29:24", + "tpep_dropoff_datetime": "2018-01-01 00:37:29", + "passenger_count": 6, + "trip_distance": 1.25, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 142, + "payment_type": 2, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:39:09", + "tpep_dropoff_datetime": "2018-01-01 00:46:19", + "passenger_count": 6, + "trip_distance": 0.98, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 239, + "payment_type": 2, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:56:37", + "tpep_dropoff_datetime": "2018-01-01 01:11:06", + "passenger_count": 6, + "trip_distance": 2.35, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 236, + "payment_type": 1, + "fare_amount": 11.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.56, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.36 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:08:10", + "tpep_dropoff_datetime": "2018-01-01 00:10:52", + "passenger_count": 1, + "trip_distance": 0.60, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 236, + "payment_type": 1, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.5, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:15:46", + "tpep_dropoff_datetime": "2018-01-01 00:18:19", + "passenger_count": 1, + "trip_distance": 0.30, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 263, + "DOLocationID": 236, + "payment_type": 1, + "fare_amount": 3.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.4, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.2 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:36:16", + "tpep_dropoff_datetime": "2018-01-01 00:40:23", + "passenger_count": 1, + "trip_distance": 0.20, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 161, + "DOLocationID": 162, + "payment_type": 3, + "fare_amount": 3.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 4.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:41:51", + "tpep_dropoff_datetime": "2018-01-01 01:09:42", + "passenger_count": 2, + "trip_distance": 15.3, + "RatecodeID": 5, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 265, + "payment_type": 1, + "fare_amount": 60, + "extra": 0, + "mta_tax": 0, + "tip_amount": 15.05, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 75.35 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:12:51", + "tpep_dropoff_datetime": "2018-01-01 00:19:39", + "passenger_count": 1, + "trip_distance": 1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 264, + "DOLocationID": 264, + "payment_type": 2, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:22:18", + "tpep_dropoff_datetime": "2018-01-01 00:35:09", + "passenger_count": 1, + "trip_distance": 0.60, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 264, + "DOLocationID": 264, + "payment_type": 2, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:38:03", + "tpep_dropoff_datetime": "2018-01-01 00:58:20", + "passenger_count": 1, + "trip_distance": 2.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 264, + "DOLocationID": 264, + "payment_type": 1, + "fare_amount": 14, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.8, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 19.1 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:23:33", + "tpep_dropoff_datetime": "2018-01-01 00:57:48", + "passenger_count": 2, + "trip_distance": 5.18, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 249, + "DOLocationID": 263, + "payment_type": 2, + "fare_amount": 23, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 24.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:07:54", + "tpep_dropoff_datetime": "2018-01-01 00:23:29", + "passenger_count": 4, + "trip_distance": 3.73, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 233, + "DOLocationID": 238, + "payment_type": 2, + "fare_amount": 14, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:29:04", + "tpep_dropoff_datetime": "2018-01-01 00:46:01", + "passenger_count": 4, + "trip_distance": 3.62, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 170, + "payment_type": 1, + "fare_amount": 14.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.16, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.96 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:01:48", + "tpep_dropoff_datetime": "2018-01-01 00:04:23", + "passenger_count": 1, + "trip_distance": 0.30, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 170, + "DOLocationID": 164, + "payment_type": 1, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:33:39", + "tpep_dropoff_datetime": "2018-01-01 00:39:44", + "passenger_count": 1, + "trip_distance": 0.60, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 164, + "DOLocationID": 90, + "payment_type": 2, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2017-12-31 23:59:17", + "tpep_dropoff_datetime": "2018-01-01 00:21:20", + "passenger_count": 1, + "trip_distance": 7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 233, + "DOLocationID": 36, + "payment_type": 1, + "fare_amount": 23, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4.7, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 29 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:32:15", + "tpep_dropoff_datetime": "2018-01-01 00:35:40", + "passenger_count": 1, + "trip_distance": 0.65, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 256, + "DOLocationID": 256, + "payment_type": 2, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:40:41", + "tpep_dropoff_datetime": "2018-01-01 00:51:37", + "passenger_count": 1, + "trip_distance": 2.11, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 256, + "DOLocationID": 112, + "payment_type": 1, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.7, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.5 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:18:25", + "tpep_dropoff_datetime": "2018-01-01 00:21:52", + "passenger_count": 2, + "trip_distance": 0.80, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 236, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.55, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.85 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:37:57", + "tpep_dropoff_datetime": "2018-01-01 00:41:38", + "passenger_count": 4, + "trip_distance": 0.50, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 137, + "DOLocationID": 170, + "payment_type": 1, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.15, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.95 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:06:54", + "tpep_dropoff_datetime": "2018-01-01 00:24:49", + "passenger_count": 1, + "trip_distance": 3.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 234, + "DOLocationID": 262, + "payment_type": 1, + "fare_amount": 15.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 7, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 23.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:32:39", + "tpep_dropoff_datetime": "2018-01-01 00:40:01", + "passenger_count": 1, + "trip_distance": 1.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 238, + "payment_type": 1, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.75, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.55 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:47:54", + "tpep_dropoff_datetime": "2018-01-01 01:06:16", + "passenger_count": 1, + "trip_distance": 2.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 50, + "payment_type": 1, + "fare_amount": 13, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.85, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.15 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:57:24", + "tpep_dropoff_datetime": "2018-01-01 01:23:52", + "passenger_count": 2, + "trip_distance": 5.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 90, + "DOLocationID": 74, + "payment_type": 1, + "fare_amount": 21.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 5.7, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 28.5 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:09:04", + "tpep_dropoff_datetime": "2018-01-01 00:25:06", + "passenger_count": 1, + "trip_distance": 3.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 161, + "DOLocationID": 238, + "payment_type": 1, + "fare_amount": 14.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:26:24", + "tpep_dropoff_datetime": "2018-01-01 00:42:25", + "passenger_count": 1, + "trip_distance": 9.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 241, + "payment_type": 1, + "fare_amount": 27, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 28.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:12:24", + "tpep_dropoff_datetime": "2018-01-01 00:16:06", + "passenger_count": 2, + "trip_distance": 0.60, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 13, + "DOLocationID": 13, + "payment_type": 2, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:27:11", + "tpep_dropoff_datetime": "2018-01-01 00:29:23", + "passenger_count": 1, + "trip_distance": 0.50, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 249, + "DOLocationID": 249, + "payment_type": 2, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:32:17", + "tpep_dropoff_datetime": "2018-01-01 01:05:48", + "passenger_count": 1, + "trip_distance": 13.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 249, + "DOLocationID": 70, + "payment_type": 2, + "fare_amount": 40.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 41.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:20:24", + "tpep_dropoff_datetime": "2018-01-01 00:30:42", + "passenger_count": 1, + "trip_distance": 2.69, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 263, + "DOLocationID": 233, + "payment_type": 2, + "fare_amount": 10, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:32:23", + "tpep_dropoff_datetime": "2018-01-01 00:35:47", + "passenger_count": 1, + "trip_distance": 0.98, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 233, + "DOLocationID": 229, + "payment_type": 2, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:37:31", + "tpep_dropoff_datetime": "2018-01-01 00:45:59", + "passenger_count": 1, + "trip_distance": 1.24, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 141, + "payment_type": 1, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.76, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.56 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:52:18", + "tpep_dropoff_datetime": "2018-01-01 01:38:01", + "passenger_count": 1, + "trip_distance": 6.61, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 13, + "payment_type": 1, + "fare_amount": 30.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 32.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:05:58", + "tpep_dropoff_datetime": "2018-01-01 00:11:52", + "passenger_count": 1, + "trip_distance": 0.89, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 107, + "DOLocationID": 186, + "payment_type": 2, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:23:28", + "tpep_dropoff_datetime": "2018-01-01 00:35:41", + "passenger_count": 1, + "trip_distance": 3.43, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 234, + "DOLocationID": 263, + "payment_type": 1, + "fare_amount": 12, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.66, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.96 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:37:26", + "tpep_dropoff_datetime": "2018-01-01 00:51:12", + "passenger_count": 1, + "trip_distance": 2.79, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 263, + "DOLocationID": 48, + "payment_type": 2, + "fare_amount": 11.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:52:26", + "tpep_dropoff_datetime": "2018-01-01 01:17:01", + "passenger_count": 1, + "trip_distance": 2.75, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 263, + "payment_type": 1, + "fare_amount": 16.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.56, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 21.36 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:32:17", + "tpep_dropoff_datetime": "2018-01-01 00:38:18", + "passenger_count": 1, + "trip_distance": 1.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 233, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.15, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.45 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:49:54", + "tpep_dropoff_datetime": "2018-01-01 00:55:16", + "passenger_count": 1, + "trip_distance": 0.60, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 140, + "DOLocationID": 229, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0.63, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.93 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:56:53", + "tpep_dropoff_datetime": "2018-01-01 01:08:11", + "passenger_count": 1, + "trip_distance": 2.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 262, + "payment_type": 1, + "fare_amount": 10, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.25, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.55 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:12:29", + "tpep_dropoff_datetime": "2018-01-01 00:15:49", + "passenger_count": 1, + "trip_distance": 0.70, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 107, + "DOLocationID": 137, + "payment_type": 1, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:24:58", + "tpep_dropoff_datetime": "2018-01-01 00:51:30", + "passenger_count": 1, + "trip_distance": 8.95, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 79, + "DOLocationID": 116, + "payment_type": 1, + "fare_amount": 29, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 30.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:21:10", + "tpep_dropoff_datetime": "2018-01-01 00:24:47", + "passenger_count": 1, + "trip_distance": 0.61, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.75 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:26:40", + "tpep_dropoff_datetime": "2018-01-01 00:33:08", + "passenger_count": 1, + "trip_distance": 1.04, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 238, + "payment_type": 2, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:36:14", + "tpep_dropoff_datetime": "2018-01-01 00:42:15", + "passenger_count": 1, + "trip_distance": 1.17, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 166, + "payment_type": 1, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.95, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.75 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:49:11", + "tpep_dropoff_datetime": "2018-01-01 01:20:59", + "passenger_count": 1, + "trip_distance": 7.11, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 151, + "DOLocationID": 79, + "payment_type": 2, + "fare_amount": 27, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 28.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:22:12", + "tpep_dropoff_datetime": "2018-01-01 00:25:01", + "passenger_count": 2, + "trip_distance": 0.50, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 74, + "DOLocationID": 75, + "payment_type": 2, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:39:54", + "tpep_dropoff_datetime": "2018-01-01 00:57:50", + "passenger_count": 1, + "trip_distance": 3.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 159, + "DOLocationID": 244, + "payment_type": 2, + "fare_amount": 15, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:17:42", + "tpep_dropoff_datetime": "2018-01-01 00:24:19", + "passenger_count": 1, + "trip_distance": 1.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 43, + "DOLocationID": 162, + "payment_type": 1, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.55, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.35 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:36:53", + "tpep_dropoff_datetime": "2018-01-01 00:57:55", + "passenger_count": 1, + "trip_distance": 4.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 166, + "payment_type": 2, + "fare_amount": 18, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 19.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:33:34", + "tpep_dropoff_datetime": "2018-01-01 00:40:34", + "passenger_count": 1, + "trip_distance": 1.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 249, + "DOLocationID": 90, + "payment_type": 1, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:53:34", + "tpep_dropoff_datetime": "2018-01-01 01:16:24", + "passenger_count": 1, + "trip_distance": 4.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 164, + "DOLocationID": 226, + "payment_type": 1, + "fare_amount": 19.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 20.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:34:23", + "tpep_dropoff_datetime": "2018-01-01 00:51:49", + "passenger_count": 1, + "trip_distance": 5.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 170, + "DOLocationID": 87, + "payment_type": 2, + "fare_amount": 17, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:28:44", + "tpep_dropoff_datetime": "2018-01-01 00:40:42", + "passenger_count": 1, + "trip_distance": 2.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 140, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 11, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.65, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.95 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:41:34", + "tpep_dropoff_datetime": "2018-01-01 01:06:45", + "passenger_count": 3, + "trip_distance": 5.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 79, + "payment_type": 1, + "fare_amount": 20.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4.35, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 26.15 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:13:42", + "tpep_dropoff_datetime": "2018-01-01 00:29:17", + "passenger_count": 3, + "trip_distance": 2.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 238, + "payment_type": 1, + "fare_amount": 12.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:30:30", + "tpep_dropoff_datetime": "2018-01-01 00:40:02", + "passenger_count": 1, + "trip_distance": 1.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 263, + "payment_type": 1, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 5, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:44:58", + "tpep_dropoff_datetime": "2018-01-01 00:48:01", + "passenger_count": 2, + "trip_distance": 0.70, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 263, + "DOLocationID": 75, + "payment_type": 1, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.15, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.95 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:56:12", + "tpep_dropoff_datetime": "2018-01-01 01:04:47", + "passenger_count": 1, + "trip_distance": 1.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 238, + "payment_type": 1, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.47, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.27 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:43:48", + "tpep_dropoff_datetime": "2018-01-01 00:55:50", + "passenger_count": 1, + "trip_distance": 1.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 68, + "DOLocationID": 234, + "payment_type": 1, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.05, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.35 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:58:07", + "tpep_dropoff_datetime": "2018-01-01 01:11:52", + "passenger_count": 1, + "trip_distance": 1.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 234, + "DOLocationID": 211, + "payment_type": 1, + "fare_amount": 10.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:13:10", + "tpep_dropoff_datetime": "2018-01-01 00:21:13", + "passenger_count": 1, + "trip_distance": 1.05, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 107, + "DOLocationID": 170, + "payment_type": 2, + "fare_amount": 7, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:41:38", + "tpep_dropoff_datetime": "2018-01-01 01:12:33", + "passenger_count": 1, + "trip_distance": 5.81, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 107, + "DOLocationID": 226, + "payment_type": 1, + "fare_amount": 23.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4.96, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 29.76 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:28:38", + "tpep_dropoff_datetime": "2018-01-01 00:42:12", + "passenger_count": 2, + "trip_distance": 0.70, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 170, + "DOLocationID": 233, + "payment_type": 2, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:43:14", + "tpep_dropoff_datetime": "2018-01-01 01:00:32", + "passenger_count": 2, + "trip_distance": 1.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 233, + "DOLocationID": 79, + "payment_type": 2, + "fare_amount": 11.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:25:34", + "tpep_dropoff_datetime": "2018-01-01 00:55:44", + "passenger_count": 1, + "trip_distance": 7.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 113, + "DOLocationID": 41, + "payment_type": 1, + "fare_amount": 27, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 32.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:58:32", + "tpep_dropoff_datetime": "2018-01-01 01:43:45", + "passenger_count": 1, + "trip_distance": 14.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 41, + "DOLocationID": 112, + "payment_type": 1, + "fare_amount": 41.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 12.1, + "tolls_amount": 5.76, + "improvement_surcharge": 0.3, + "total_amount": 60.66 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:08:30", + "tpep_dropoff_datetime": "2018-01-01 00:13:10", + "passenger_count": 1, + "trip_distance": 0.80, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 237, + "payment_type": 2, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:17:19", + "tpep_dropoff_datetime": "2018-01-01 00:41:54", + "passenger_count": 1, + "trip_distance": 5.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 43, + "DOLocationID": 232, + "payment_type": 2, + "fare_amount": 22.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 23.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:42:41", + "tpep_dropoff_datetime": "2018-01-01 00:52:38", + "passenger_count": 1, + "trip_distance": 1.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 232, + "DOLocationID": 79, + "payment_type": 1, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.95, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.75 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:57:13", + "tpep_dropoff_datetime": "2018-01-01 01:01:22", + "passenger_count": 1, + "trip_distance": 0.50, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 79, + "DOLocationID": 234, + "payment_type": 1, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.15, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.95 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:17:32", + "tpep_dropoff_datetime": "2018-01-01 00:32:25", + "passenger_count": 1, + "trip_distance": 9.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 107, + "DOLocationID": 244, + "payment_type": 3, + "fare_amount": 25.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 26.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:35:24", + "tpep_dropoff_datetime": "2018-01-01 00:43:41", + "passenger_count": 1, + "trip_distance": 1.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 244, + "DOLocationID": 116, + "payment_type": 1, + "fare_amount": 8, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.85, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.15 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:46:18", + "tpep_dropoff_datetime": "2018-01-01 01:27:25", + "passenger_count": 3, + "trip_distance": 6.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 116, + "DOLocationID": 152, + "payment_type": 1, + "fare_amount": 29, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 6.05, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 36.35 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:18:21", + "tpep_dropoff_datetime": "2018-01-01 00:43:23", + "passenger_count": 2, + "trip_distance": 3.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 114, + "DOLocationID": 161, + "payment_type": 1, + "fare_amount": 16.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.67, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 20.47 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:46:37", + "tpep_dropoff_datetime": "2018-01-01 00:53:54", + "passenger_count": 2, + "trip_distance": 1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 162, + "DOLocationID": 170, + "payment_type": 1, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.95, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.75 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:17:45", + "tpep_dropoff_datetime": "2018-01-01 00:23:34", + "passenger_count": 4, + "trip_distance": 1.06, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 143, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:25:43", + "tpep_dropoff_datetime": "2018-01-01 00:28:29", + "passenger_count": 4, + "trip_distance": 0.87, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 143, + "DOLocationID": 142, + "payment_type": 1, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.74, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.54 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:41:05", + "tpep_dropoff_datetime": "2018-01-01 00:50:54", + "passenger_count": 4, + "trip_distance": 1.29, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 246, + "DOLocationID": 68, + "payment_type": 1, + "fare_amount": 8, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.7, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:24:41", + "tpep_dropoff_datetime": "2018-01-01 00:29:33", + "passenger_count": 2, + "trip_distance": 0.80, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 249, + "DOLocationID": 90, + "payment_type": 1, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.7, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.5 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:34:27", + "tpep_dropoff_datetime": "2018-01-01 00:37:28", + "passenger_count": 1, + "trip_distance": 0.50, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 234, + "DOLocationID": 113, + "payment_type": 1, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.3, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.6 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:45:23", + "tpep_dropoff_datetime": "2018-01-01 01:01:43", + "passenger_count": 2, + "trip_distance": 2.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 249, + "DOLocationID": 170, + "payment_type": 1, + "fare_amount": 12, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.65, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.95 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:57:25", + "tpep_dropoff_datetime": "2018-01-01 01:10:19", + "passenger_count": 6, + "trip_distance": 2.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 264, + "DOLocationID": 264, + "payment_type": 1, + "fare_amount": 11, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:28:51", + "tpep_dropoff_datetime": "2018-01-01 00:46:15", + "passenger_count": 1, + "trip_distance": 3.81, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 246, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 15, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.26, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 19.56 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:49:41", + "tpep_dropoff_datetime": "2018-01-01 00:55:43", + "passenger_count": 1, + "trip_distance": 0.88, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.7, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.5 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:29:58", + "tpep_dropoff_datetime": "2018-01-01 01:06:54", + "passenger_count": 3, + "trip_distance": 4.47, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 140, + "DOLocationID": 125, + "payment_type": 1, + "fare_amount": 24.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 5.16, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 30.96 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:18:00", + "tpep_dropoff_datetime": "2018-01-01 00:38:49", + "passenger_count": 1, + "trip_distance": 4.58, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 7, + "payment_type": 2, + "fare_amount": 17, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:34:15", + "tpep_dropoff_datetime": "2018-01-01 00:45:46", + "passenger_count": 1, + "trip_distance": 1.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 170, + "DOLocationID": 137, + "payment_type": 1, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:49:25", + "tpep_dropoff_datetime": "2018-01-01 00:53:41", + "passenger_count": 1, + "trip_distance": 0.80, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 224, + "DOLocationID": 4, + "payment_type": 2, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:08:49", + "tpep_dropoff_datetime": "2018-01-01 00:30:37", + "passenger_count": 1, + "trip_distance": 5.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 125, + "DOLocationID": 262, + "payment_type": 2, + "fare_amount": 19, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 20.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:32:32", + "tpep_dropoff_datetime": "2018-01-01 00:36:07", + "passenger_count": 1, + "trip_distance": 0.70, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 262, + "DOLocationID": 140, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.55, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.85 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:39:16", + "tpep_dropoff_datetime": "2018-01-01 00:43:18", + "passenger_count": 1, + "trip_distance": 0.90, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 140, + "DOLocationID": 263, + "payment_type": 1, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.7, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.5 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:45:38", + "tpep_dropoff_datetime": "2018-01-01 00:49:07", + "passenger_count": 1, + "trip_distance": 0.80, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 263, + "DOLocationID": 263, + "payment_type": 1, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:56:30", + "tpep_dropoff_datetime": "2018-01-01 01:12:26", + "passenger_count": 1, + "trip_distance": 2.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 263, + "DOLocationID": 161, + "payment_type": 2, + "fare_amount": 12.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:06:38", + "tpep_dropoff_datetime": "2018-01-01 00:13:50", + "passenger_count": 5, + "trip_distance": 1.51, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 181, + "DOLocationID": 181, + "payment_type": 1, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.76, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.56 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:26:24", + "tpep_dropoff_datetime": "2018-01-01 00:45:55", + "passenger_count": 5, + "trip_distance": 5.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 181, + "DOLocationID": 26, + "payment_type": 1, + "fare_amount": 19.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 20.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:54:47", + "tpep_dropoff_datetime": "2018-01-01 00:59:23", + "passenger_count": 5, + "trip_distance": 0.98, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 21, + "DOLocationID": 108, + "payment_type": 1, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:09:18", + "tpep_dropoff_datetime": "2018-01-01 00:42:57", + "passenger_count": 6, + "trip_distance": 4.92, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 234, + "payment_type": 2, + "fare_amount": 22.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 23.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:52:16", + "tpep_dropoff_datetime": "2018-01-01 01:16:38", + "passenger_count": 6, + "trip_distance": 2.13, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 90, + "DOLocationID": 148, + "payment_type": 1, + "fare_amount": 16, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4.32, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 21.62 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:11:32", + "tpep_dropoff_datetime": "2018-01-01 00:13:55", + "passenger_count": 2, + "trip_distance": 0.40, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 162, + "DOLocationID": 162, + "payment_type": 2, + "fare_amount": 3.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 4.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:24:30", + "tpep_dropoff_datetime": "2018-01-01 00:58:32", + "passenger_count": 2, + "trip_distance": 6.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 173, + "payment_type": 2, + "fare_amount": 26.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 27.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:44:31", + "tpep_dropoff_datetime": "2018-01-01 00:47:07", + "passenger_count": 1, + "trip_distance": 0.45, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 162, + "payment_type": 1, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.06, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.36 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:48:57", + "tpep_dropoff_datetime": "2018-01-01 01:01:45", + "passenger_count": 1, + "trip_distance": 2.35, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 79, + "payment_type": 2, + "fare_amount": 10.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:18:54", + "tpep_dropoff_datetime": "2018-01-01 00:28:34", + "passenger_count": 2, + "trip_distance": 1.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 164, + "DOLocationID": 113, + "payment_type": 1, + "fare_amount": 8, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.5, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:31:26", + "tpep_dropoff_datetime": "2018-01-01 00:32:59", + "passenger_count": 4, + "trip_distance": 0.10, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 113, + "DOLocationID": 113, + "payment_type": 1, + "fare_amount": 3, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0.01, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 4.31 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:35:55", + "tpep_dropoff_datetime": "2018-01-01 00:42:42", + "passenger_count": 1, + "trip_distance": 0.60, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 114, + "DOLocationID": 79, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.46, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.76 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:22:30", + "tpep_dropoff_datetime": "2018-01-01 00:27:37", + "passenger_count": 4, + "trip_distance": 0.50, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 231, + "DOLocationID": 211, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.25, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.55 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:35:29", + "tpep_dropoff_datetime": "2018-01-01 00:50:39", + "passenger_count": 2, + "trip_distance": 1.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 249, + "DOLocationID": 164, + "payment_type": 2, + "fare_amount": 11, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:52:13", + "tpep_dropoff_datetime": "2018-01-01 00:59:49", + "passenger_count": 2, + "trip_distance": 0.90, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 164, + "DOLocationID": 162, + "payment_type": 2, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:28:43", + "tpep_dropoff_datetime": "2018-01-01 00:41:43", + "passenger_count": 2, + "trip_distance": 2.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 151, + "payment_type": 1, + "fare_amount": 11.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 5, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:47:34", + "tpep_dropoff_datetime": "2018-01-01 00:49:49", + "passenger_count": 1, + "trip_distance": 0.70, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 151, + "DOLocationID": 238, + "payment_type": 2, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:53:56", + "tpep_dropoff_datetime": "2018-01-01 01:00:56", + "passenger_count": 2, + "trip_distance": 1.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 238, + "payment_type": 2, + "fare_amount": 7, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:05:14", + "tpep_dropoff_datetime": "2018-01-01 00:18:49", + "passenger_count": 1, + "trip_distance": 1.94, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 79, + "DOLocationID": 249, + "payment_type": 1, + "fare_amount": 10.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.36, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.16 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:41:19", + "tpep_dropoff_datetime": "2018-01-01 00:59:42", + "passenger_count": 1, + "trip_distance": 1.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 246, + "DOLocationID": 249, + "payment_type": 1, + "fare_amount": 11.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.56, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.36 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:12:44", + "tpep_dropoff_datetime": "2018-01-01 00:18:19", + "passenger_count": 1, + "trip_distance": 0.27, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 161, + "DOLocationID": 170, + "payment_type": 2, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:46:16", + "tpep_dropoff_datetime": "2018-01-01 01:00:07", + "passenger_count": 1, + "trip_distance": 1.34, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 161, + "DOLocationID": 229, + "payment_type": 2, + "fare_amount": 10, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:13:58", + "tpep_dropoff_datetime": "2018-01-01 00:22:06", + "passenger_count": 1, + "trip_distance": 1.37, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 142, + "payment_type": 1, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.64, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.44 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:24:05", + "tpep_dropoff_datetime": "2018-01-01 00:37:24", + "passenger_count": 1, + "trip_distance": 2.37, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 151, + "payment_type": 1, + "fare_amount": 11.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.84, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16.64 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:39:35", + "tpep_dropoff_datetime": "2018-01-01 00:54:37", + "passenger_count": 1, + "trip_distance": 4.01, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 151, + "DOLocationID": 42, + "payment_type": 1, + "fare_amount": 14.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:57:17", + "tpep_dropoff_datetime": "2018-01-01 01:16:36", + "passenger_count": 1, + "trip_distance": 3.17, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 42, + "DOLocationID": 75, + "payment_type": 2, + "fare_amount": 15, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:08:32", + "tpep_dropoff_datetime": "2018-01-01 00:34:07", + "passenger_count": 1, + "trip_distance": 16.55, + "RatecodeID": 2, + "store_and_fwd_flag": "N", + "PULocationID": 132, + "DOLocationID": 137, + "payment_type": 2, + "fare_amount": 52, + "extra": 0, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 5.76, + "improvement_surcharge": 0.3, + "total_amount": 58.56 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:40:12", + "tpep_dropoff_datetime": "2018-01-01 00:56:42", + "passenger_count": 1, + "trip_distance": 3.57, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 107, + "DOLocationID": 262, + "payment_type": 2, + "fare_amount": 13.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:28:27", + "tpep_dropoff_datetime": "2018-01-01 00:41:55", + "passenger_count": 4, + "trip_distance": 1.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 79, + "DOLocationID": 211, + "payment_type": 3, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:45:12", + "tpep_dropoff_datetime": "2018-01-01 00:54:09", + "passenger_count": 4, + "trip_distance": 1.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 211, + "DOLocationID": 261, + "payment_type": 3, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:07:54", + "tpep_dropoff_datetime": "2018-01-01 00:20:00", + "passenger_count": 1, + "trip_distance": 1.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 90, + "payment_type": 1, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:42:02", + "tpep_dropoff_datetime": "2018-01-01 00:42:53", + "passenger_count": 1, + "trip_distance": 1.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 68, + "DOLocationID": 100, + "payment_type": 2, + "fare_amount": 2.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 3.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:33:50", + "tpep_dropoff_datetime": "2018-01-01 00:46:22", + "passenger_count": 4, + "trip_distance": 1.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 163, + "DOLocationID": 233, + "payment_type": 2, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:10:49", + "tpep_dropoff_datetime": "2018-01-01 00:20:51", + "passenger_count": 1, + "trip_distance": 1.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 148, + "DOLocationID": 87, + "payment_type": 1, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.9, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.7 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:23:15", + "tpep_dropoff_datetime": "2018-01-01 00:41:31", + "passenger_count": 1, + "trip_distance": 3.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 261, + "DOLocationID": 79, + "payment_type": 2, + "fare_amount": 14, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:47:17", + "tpep_dropoff_datetime": "2018-01-01 01:00:12", + "passenger_count": 2, + "trip_distance": 4.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 79, + "DOLocationID": 13, + "payment_type": 1, + "fare_amount": 14.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.15, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.95 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:16:45", + "tpep_dropoff_datetime": "2018-01-01 00:43:27", + "passenger_count": 1, + "trip_distance": 19.7, + "RatecodeID": 2, + "store_and_fwd_flag": "N", + "PULocationID": 132, + "DOLocationID": 116, + "payment_type": 1, + "fare_amount": 52, + "extra": 0, + "mta_tax": 0.5, + "tip_amount": 11.7, + "tolls_amount": 5.76, + "improvement_surcharge": 0.3, + "total_amount": 70.26 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:52:22", + "tpep_dropoff_datetime": "2018-01-01 00:56:28", + "passenger_count": 1, + "trip_distance": 0.90, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 152, + "DOLocationID": 41, + "payment_type": 2, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:27:12", + "tpep_dropoff_datetime": "2018-01-01 00:37:17", + "passenger_count": 2, + "trip_distance": 1.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 236, + "payment_type": 2, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:38:20", + "tpep_dropoff_datetime": "2018-01-01 00:43:42", + "passenger_count": 2, + "trip_distance": 0.60, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 140, + "payment_type": 1, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.35, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.15 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:58:46", + "tpep_dropoff_datetime": "2018-01-01 01:17:02", + "passenger_count": 4, + "trip_distance": 3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 143, + "payment_type": 1, + "fare_amount": 14, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4.55, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 19.85 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:26:44", + "tpep_dropoff_datetime": "2018-01-01 00:59:45", + "passenger_count": 1, + "trip_distance": 15.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 170, + "DOLocationID": 197, + "payment_type": 2, + "fare_amount": 46, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 5.76, + "improvement_surcharge": 0.3, + "total_amount": 53.06 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:07:15", + "tpep_dropoff_datetime": "2018-01-01 00:46:04", + "passenger_count": 2, + "trip_distance": 4.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 144, + "payment_type": 1, + "fare_amount": 25, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 5.25, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 31.55 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:48:22", + "tpep_dropoff_datetime": "2018-01-01 00:59:38", + "passenger_count": 2, + "trip_distance": 2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 144, + "DOLocationID": 234, + "payment_type": 2, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:23:56", + "tpep_dropoff_datetime": "2018-01-01 00:36:35", + "passenger_count": 2, + "trip_distance": 3.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 161, + "DOLocationID": 7, + "payment_type": 2, + "fare_amount": 13, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:46:16", + "tpep_dropoff_datetime": "2018-01-01 01:00:26", + "passenger_count": 2, + "trip_distance": 1.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 140, + "DOLocationID": 161, + "payment_type": 1, + "fare_amount": 10.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.35, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.15 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:08:56", + "tpep_dropoff_datetime": "2018-01-01 00:11:41", + "passenger_count": 1, + "trip_distance": 0.40, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 148, + "DOLocationID": 148, + "payment_type": 1, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0.53, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.83 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:14:16", + "tpep_dropoff_datetime": "2018-01-01 00:42:41", + "passenger_count": 1, + "trip_distance": 2.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 148, + "DOLocationID": 164, + "payment_type": 2, + "fare_amount": 18, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 19.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:44:53", + "tpep_dropoff_datetime": "2018-01-01 00:57:19", + "passenger_count": 1, + "trip_distance": 1.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 79, + "DOLocationID": 158, + "payment_type": 1, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.15, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.95 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:33:53", + "tpep_dropoff_datetime": "2018-01-01 00:45:20", + "passenger_count": 1, + "trip_distance": 1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 90, + "DOLocationID": 164, + "payment_type": 2, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:05:12", + "tpep_dropoff_datetime": "2018-01-01 00:22:25", + "passenger_count": 1, + "trip_distance": 8.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 241, + "payment_type": 2, + "fare_amount": 26, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 27.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:38:15", + "tpep_dropoff_datetime": "2018-01-01 00:46:22", + "passenger_count": 1, + "trip_distance": 1.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 166, + "DOLocationID": 116, + "payment_type": 1, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.95, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.75 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:58:19", + "tpep_dropoff_datetime": "2018-01-01 01:18:06", + "passenger_count": 1, + "trip_distance": 6.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 151, + "DOLocationID": 137, + "payment_type": 1, + "fare_amount": 21, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 23.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:58:05", + "tpep_dropoff_datetime": "2018-01-01 01:14:37", + "passenger_count": 2, + "trip_distance": 3.36, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 231, + "DOLocationID": 68, + "payment_type": 2, + "fare_amount": 14, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:03:20", + "tpep_dropoff_datetime": "2018-01-01 00:28:46", + "passenger_count": 1, + "trip_distance": 10.62, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 138, + "DOLocationID": 61, + "payment_type": 1, + "fare_amount": 32, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 6.66, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 39.96 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:08:54", + "tpep_dropoff_datetime": "2018-01-01 00:19:23", + "passenger_count": 1, + "trip_distance": 4.32, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 260, + "payment_type": 1, + "fare_amount": 14, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.06, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.36 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:28:15", + "tpep_dropoff_datetime": "2018-01-01 00:53:45", + "passenger_count": 1, + "trip_distance": 5.34, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 146, + "DOLocationID": 249, + "payment_type": 1, + "fare_amount": 20.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 24.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:57:38", + "tpep_dropoff_datetime": "2018-01-01 01:16:38", + "passenger_count": 1, + "trip_distance": 2.67, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 249, + "DOLocationID": 233, + "payment_type": 1, + "fare_amount": 13, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.86, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.16 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:30:52", + "tpep_dropoff_datetime": "2018-01-01 01:03:20", + "passenger_count": 1, + "trip_distance": 13.43, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 161, + "DOLocationID": 67, + "payment_type": 1, + "fare_amount": 39, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 42.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:20:52", + "tpep_dropoff_datetime": "2018-01-01 00:24:24", + "passenger_count": 1, + "trip_distance": 0.30, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 141, + "payment_type": 1, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.05, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.35 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:26:12", + "tpep_dropoff_datetime": "2018-01-01 00:32:02", + "passenger_count": 1, + "trip_distance": 0.80, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 140, + "payment_type": 2, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:32:19", + "tpep_dropoff_datetime": "2018-01-01 00:34:52", + "passenger_count": 1, + "trip_distance": 0.30, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 140, + "DOLocationID": 262, + "payment_type": 2, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:38:54", + "tpep_dropoff_datetime": "2018-01-01 00:45:48", + "passenger_count": 1, + "trip_distance": 0.90, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 262, + "DOLocationID": 263, + "payment_type": 1, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:48:17", + "tpep_dropoff_datetime": "2018-01-01 01:13:04", + "passenger_count": 1, + "trip_distance": 4.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 263, + "DOLocationID": 114, + "payment_type": 1, + "fare_amount": 19, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 23.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:20:13", + "tpep_dropoff_datetime": "2018-01-01 00:40:48", + "passenger_count": 2, + "trip_distance": 11.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 43, + "DOLocationID": 259, + "payment_type": 1, + "fare_amount": 32.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 10.14, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 43.94 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:03:11", + "tpep_dropoff_datetime": "2018-01-01 00:11:11", + "passenger_count": 1, + "trip_distance": 1.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 80, + "DOLocationID": 80, + "payment_type": 1, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.9, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.7 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:11:22", + "tpep_dropoff_datetime": "2018-01-01 00:23:59", + "passenger_count": 1, + "trip_distance": 2.65, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 164, + "DOLocationID": 141, + "payment_type": 1, + "fare_amount": 11, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.46, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.76 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:26:36", + "tpep_dropoff_datetime": "2018-01-01 00:29:08", + "passenger_count": 1, + "trip_distance": 0.75, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 162, + "payment_type": 2, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:31:17", + "tpep_dropoff_datetime": "2018-01-01 00:40:51", + "passenger_count": 1, + "trip_distance": 1.61, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 162, + "DOLocationID": 142, + "payment_type": 2, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:43:03", + "tpep_dropoff_datetime": "2018-01-01 01:05:25", + "passenger_count": 1, + "trip_distance": 3.93, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 143, + "DOLocationID": 137, + "payment_type": 2, + "fare_amount": 16.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:13:38", + "tpep_dropoff_datetime": "2018-01-01 00:23:38", + "passenger_count": 1, + "trip_distance": 1.83, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 24, + "payment_type": 2, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:33:09", + "tpep_dropoff_datetime": "2018-01-01 00:35:27", + "passenger_count": 1, + "trip_distance": 0.74, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 142, + "payment_type": 1, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.32, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.62 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:37:15", + "tpep_dropoff_datetime": "2018-01-01 00:46:35", + "passenger_count": 1, + "trip_distance": 1.48, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 237, + "payment_type": 1, + "fare_amount": 8, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.86, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.16 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:58:13", + "tpep_dropoff_datetime": "2018-01-01 01:00:33", + "passenger_count": 1, + "trip_distance": 0.28, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 163, + "DOLocationID": 161, + "payment_type": 2, + "fare_amount": 3.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 4.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:30:40", + "tpep_dropoff_datetime": "2018-01-01 00:56:21", + "passenger_count": 1, + "trip_distance": 10.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 161, + "DOLocationID": 208, + "payment_type": 2, + "fare_amount": 31.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 32.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:23:50", + "tpep_dropoff_datetime": "2018-01-01 00:34:56", + "passenger_count": 1, + "trip_distance": 1.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 234, + "DOLocationID": 158, + "payment_type": 1, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:44:09", + "tpep_dropoff_datetime": "2018-01-01 00:55:46", + "passenger_count": 1, + "trip_distance": 1.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 90, + "DOLocationID": 224, + "payment_type": 1, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:05:21", + "tpep_dropoff_datetime": "2018-01-01 00:08:41", + "passenger_count": 1, + "trip_distance": 0.60, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 90, + "DOLocationID": 68, + "payment_type": 2, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:31:17", + "tpep_dropoff_datetime": "2018-01-01 00:38:17", + "passenger_count": 2, + "trip_distance": 0.70, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 264, + "DOLocationID": 264, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.8, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.1 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:46:55", + "tpep_dropoff_datetime": "2018-01-01 01:14:26", + "passenger_count": 1, + "trip_distance": 4.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 264, + "DOLocationID": 264, + "payment_type": 1, + "fare_amount": 20.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 23.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:14:30", + "tpep_dropoff_datetime": "2018-01-01 00:34:46", + "passenger_count": 1, + "trip_distance": 5.58, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 79, + "DOLocationID": 7, + "payment_type": 2, + "fare_amount": 18, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 19.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:43:40", + "tpep_dropoff_datetime": "2018-01-01 00:43:44", + "passenger_count": 1, + "trip_distance": 0.00, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 193, + "DOLocationID": 193, + "payment_type": 2, + "fare_amount": 2.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 3.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 23:58:22", + "tpep_dropoff_datetime": "2018-01-02 00:02:21", + "passenger_count": 1, + "trip_distance": 0.87, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 113, + "DOLocationID": 114, + "payment_type": 1, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.16, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.96 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:23:52", + "tpep_dropoff_datetime": "2018-01-01 00:47:32", + "passenger_count": 2, + "trip_distance": 3.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 231, + "DOLocationID": 100, + "payment_type": 1, + "fare_amount": 16.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 5, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 22.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:48:36", + "tpep_dropoff_datetime": "2018-01-01 01:15:38", + "passenger_count": 1, + "trip_distance": 3.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 100, + "DOLocationID": 229, + "payment_type": 1, + "fare_amount": 17.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 5.6, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 24.4 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:03:00", + "tpep_dropoff_datetime": "2018-01-01 00:18:28", + "passenger_count": 1, + "trip_distance": 7.25, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 148, + "DOLocationID": 260, + "payment_type": 2, + "fare_amount": 22, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 23.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:06:37", + "tpep_dropoff_datetime": "2018-01-01 00:27:35", + "passenger_count": 1, + "trip_distance": 1.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 161, + "DOLocationID": 234, + "payment_type": 1, + "fare_amount": 13, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4.25, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.55 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:32:39", + "tpep_dropoff_datetime": "2018-01-01 01:15:27", + "passenger_count": 1, + "trip_distance": 8.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 234, + "DOLocationID": 72, + "payment_type": 1, + "fare_amount": 33, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 34.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:30:11", + "tpep_dropoff_datetime": "2018-01-01 00:43:46", + "passenger_count": 1, + "trip_distance": 2.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 45, + "DOLocationID": 79, + "payment_type": 1, + "fare_amount": 11, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.46, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.76 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:10:19", + "tpep_dropoff_datetime": "2018-01-01 00:22:14", + "passenger_count": 1, + "trip_distance": 1.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 231, + "DOLocationID": 113, + "payment_type": 1, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.05, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.35 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:32:28", + "tpep_dropoff_datetime": "2018-01-01 00:37:21", + "passenger_count": 2, + "trip_distance": 0.70, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 79, + "DOLocationID": 79, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.25, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.55 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:41:32", + "tpep_dropoff_datetime": "2018-01-01 00:47:55", + "passenger_count": 1, + "trip_distance": 0.90, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 148, + "DOLocationID": 144, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:50:45", + "tpep_dropoff_datetime": "2018-01-01 01:12:18", + "passenger_count": 2, + "trip_distance": 4.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 231, + "DOLocationID": 141, + "payment_type": 1, + "fare_amount": 17, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.75, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 21.05 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:12:50", + "tpep_dropoff_datetime": "2018-01-01 00:15:14", + "passenger_count": 1, + "trip_distance": 0.50, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 236, + "payment_type": 2, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:16:30", + "tpep_dropoff_datetime": "2018-01-01 00:21:11", + "passenger_count": 1, + "trip_distance": 1.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 74, + "payment_type": 2, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:26:01", + "tpep_dropoff_datetime": "2018-01-01 00:30:59", + "passenger_count": 1, + "trip_distance": 0.70, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 74, + "DOLocationID": 75, + "payment_type": 2, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:42:52", + "tpep_dropoff_datetime": "2018-01-01 01:02:49", + "passenger_count": 1, + "trip_distance": 3.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 224, + "payment_type": 2, + "fare_amount": 15, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:12:43", + "tpep_dropoff_datetime": "2018-01-01 00:30:46", + "passenger_count": 2, + "trip_distance": 2.11, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 186, + "DOLocationID": 233, + "payment_type": 2, + "fare_amount": 12.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:56:32", + "tpep_dropoff_datetime": "2018-01-01 01:45:44", + "passenger_count": 1, + "trip_distance": 7.81, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 161, + "DOLocationID": 52, + "payment_type": 2, + "fare_amount": 34.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 35.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:50:22", + "tpep_dropoff_datetime": "2018-01-01 01:21:43", + "passenger_count": 2, + "trip_distance": 20, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 132, + "DOLocationID": 189, + "payment_type": 1, + "fare_amount": 55, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 14.05, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 70.35 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:37:02", + "tpep_dropoff_datetime": "2018-01-01 00:58:02", + "passenger_count": 1, + "trip_distance": 1.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 163, + "DOLocationID": 170, + "payment_type": 3, + "fare_amount": 13, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:46:59", + "tpep_dropoff_datetime": "2018-01-01 01:20:31", + "passenger_count": 6, + "trip_distance": 7.42, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 83, + "DOLocationID": 142, + "payment_type": 2, + "fare_amount": 28.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 29.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:27:24", + "tpep_dropoff_datetime": "2018-01-01 00:41:52", + "passenger_count": 1, + "trip_distance": 3.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 229, + "payment_type": 1, + "fare_amount": 13, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.55, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.85 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:55:57", + "tpep_dropoff_datetime": "2018-01-01 01:33:45", + "passenger_count": 2, + "trip_distance": 4.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 107, + "DOLocationID": 143, + "payment_type": 2, + "fare_amount": 22, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 23.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:30:57", + "tpep_dropoff_datetime": "2018-01-01 00:39:20", + "passenger_count": 2, + "trip_distance": 0.80, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 249, + "DOLocationID": 114, + "payment_type": 2, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:40:20", + "tpep_dropoff_datetime": "2018-01-01 00:47:38", + "passenger_count": 1, + "trip_distance": 1.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 114, + "DOLocationID": 107, + "payment_type": 2, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:48:54", + "tpep_dropoff_datetime": "2018-01-01 01:25:07", + "passenger_count": 2, + "trip_distance": 4.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 107, + "DOLocationID": 239, + "payment_type": 2, + "fare_amount": 23, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 24.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:15:15", + "tpep_dropoff_datetime": "2018-01-01 00:18:24", + "passenger_count": 4, + "trip_distance": 0.70, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 162, + "DOLocationID": 162, + "payment_type": 2, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:25:18", + "tpep_dropoff_datetime": "2018-01-01 00:31:45", + "passenger_count": 1, + "trip_distance": 1.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 262, + "payment_type": 1, + "fare_amount": 7, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.45, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.75 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:48:42", + "tpep_dropoff_datetime": "2018-01-01 01:05:09", + "passenger_count": 2, + "trip_distance": 2.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 43, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 12, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.65, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.95 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2017-12-31 23:57:28", + "tpep_dropoff_datetime": "2018-01-01 00:14:57", + "passenger_count": 1, + "trip_distance": 7.81, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 40, + "payment_type": 1, + "fare_amount": 23, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 10, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 34.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:23:51", + "tpep_dropoff_datetime": "2018-01-01 00:41:46", + "passenger_count": 1, + "trip_distance": 4.08, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 65, + "DOLocationID": 164, + "payment_type": 2, + "fare_amount": 16, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:51:53", + "tpep_dropoff_datetime": "2018-01-01 00:54:41", + "passenger_count": 1, + "trip_distance": 1.06, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 264, + "DOLocationID": 264, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:57:54", + "tpep_dropoff_datetime": "2018-01-01 01:12:40", + "passenger_count": 1, + "trip_distance": 4.48, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 140, + "DOLocationID": 90, + "payment_type": 2, + "fare_amount": 15.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:39:02", + "tpep_dropoff_datetime": "2018-01-01 01:15:42", + "passenger_count": 1, + "trip_distance": 6.46, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 88, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 27.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 5.76, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 34.56 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:28:30", + "tpep_dropoff_datetime": "2018-01-01 00:38:18", + "passenger_count": 1, + "trip_distance": 1.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 4, + "DOLocationID": 137, + "payment_type": 1, + "fare_amount": 8, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.85, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.15 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:45:12", + "tpep_dropoff_datetime": "2018-01-01 00:54:59", + "passenger_count": 1, + "trip_distance": 1.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 79, + "DOLocationID": 148, + "payment_type": 2, + "fare_amount": 8, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:57:50", + "tpep_dropoff_datetime": "2018-01-01 01:29:13", + "passenger_count": 1, + "trip_distance": 8.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 148, + "DOLocationID": 42, + "payment_type": 2, + "fare_amount": 28.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 29.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:17:42", + "tpep_dropoff_datetime": "2018-01-01 00:34:37", + "passenger_count": 2, + "trip_distance": 3.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 43, + "DOLocationID": 166, + "payment_type": 2, + "fare_amount": 13.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:49:27", + "tpep_dropoff_datetime": "2018-01-01 01:07:12", + "passenger_count": 2, + "trip_distance": 3.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 48, + "payment_type": 1, + "fare_amount": 15, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.26, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 19.56 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:12:09", + "tpep_dropoff_datetime": "2018-01-01 00:26:51", + "passenger_count": 2, + "trip_distance": 0.80, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 48, + "payment_type": 2, + "fare_amount": 8, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:31:35", + "tpep_dropoff_datetime": "2018-01-01 01:02:31", + "passenger_count": 1, + "trip_distance": 4.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 148, + "payment_type": 2, + "fare_amount": 22, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 23.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:38:47", + "tpep_dropoff_datetime": "2018-01-01 00:53:46", + "passenger_count": 2, + "trip_distance": 1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 90, + "DOLocationID": 230, + "payment_type": 2, + "fare_amount": 10, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:55:19", + "tpep_dropoff_datetime": "2018-01-01 01:17:37", + "passenger_count": 2, + "trip_distance": 8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 230, + "DOLocationID": 243, + "payment_type": 1, + "fare_amount": 25, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 30.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:28:45", + "tpep_dropoff_datetime": "2018-01-01 00:53:45", + "passenger_count": 1, + "trip_distance": 4.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 151, + "DOLocationID": 229, + "payment_type": 1, + "fare_amount": 19, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4.05, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 24.35 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:54:41", + "tpep_dropoff_datetime": "2018-01-01 00:58:04", + "passenger_count": 1, + "trip_distance": 0.50, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 162, + "payment_type": 1, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.3, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.6 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:12:03", + "tpep_dropoff_datetime": "2018-01-01 00:20:56", + "passenger_count": 1, + "trip_distance": 1.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 171, + "DOLocationID": 73, + "payment_type": 2, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:29:43", + "tpep_dropoff_datetime": "2018-01-01 00:40:15", + "passenger_count": 2, + "trip_distance": 5.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 92, + "DOLocationID": 7, + "payment_type": 2, + "fare_amount": 17.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:51:01", + "tpep_dropoff_datetime": "2018-01-01 00:55:55", + "passenger_count": 1, + "trip_distance": 1.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 7, + "DOLocationID": 7, + "payment_type": 2, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:14:09", + "tpep_dropoff_datetime": "2018-01-01 00:33:40", + "passenger_count": 2, + "trip_distance": 3.71, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 148, + "DOLocationID": 246, + "payment_type": 1, + "fare_amount": 15.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:35:27", + "tpep_dropoff_datetime": "2018-01-01 01:29:15", + "passenger_count": 2, + "trip_distance": 11.39, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 246, + "DOLocationID": 198, + "payment_type": 2, + "fare_amount": 42, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 43.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:53:00", + "tpep_dropoff_datetime": "2018-01-01 01:05:52", + "passenger_count": 3, + "trip_distance": 5.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 132, + "DOLocationID": 216, + "payment_type": 2, + "fare_amount": 17.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:05:58", + "tpep_dropoff_datetime": "2018-01-01 00:13:46", + "passenger_count": 2, + "trip_distance": 1.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 237, + "payment_type": 1, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:22:25", + "tpep_dropoff_datetime": "2018-01-01 00:54:24", + "passenger_count": 2, + "trip_distance": 2.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 43, + "DOLocationID": 164, + "payment_type": 1, + "fare_amount": 19, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 23.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:20:06", + "tpep_dropoff_datetime": "2018-01-01 00:25:53", + "passenger_count": 1, + "trip_distance": 1.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 43, + "DOLocationID": 162, + "payment_type": 2, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:38:36", + "tpep_dropoff_datetime": "2018-01-01 00:49:38", + "passenger_count": 2, + "trip_distance": 2.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 238, + "payment_type": 2, + "fare_amount": 10, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:50:35", + "tpep_dropoff_datetime": "2018-01-01 00:58:51", + "passenger_count": 2, + "trip_distance": 1.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 236, + "payment_type": 2, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:20:56", + "tpep_dropoff_datetime": "2018-01-01 00:26:22", + "passenger_count": 1, + "trip_distance": 0.80, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 170, + "DOLocationID": 79, + "payment_type": 1, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.35, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.15 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:44:12", + "tpep_dropoff_datetime": "2018-01-01 01:03:38", + "passenger_count": 1, + "trip_distance": 5.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 107, + "DOLocationID": 7, + "payment_type": 2, + "fare_amount": 18, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 19.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:16:45", + "tpep_dropoff_datetime": "2018-01-01 00:30:11", + "passenger_count": 2, + "trip_distance": 1.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 114, + "DOLocationID": 249, + "payment_type": 1, + "fare_amount": 10, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.26, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.56 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:44:42", + "tpep_dropoff_datetime": "2018-01-01 01:06:32", + "passenger_count": 1, + "trip_distance": 3.44, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 234, + "DOLocationID": 263, + "payment_type": 1, + "fare_amount": 16, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.46, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 20.76 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:27:50", + "tpep_dropoff_datetime": "2018-01-01 00:30:39", + "passenger_count": 2, + "trip_distance": 0.30, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 162, + "DOLocationID": 162, + "payment_type": 2, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:34:27", + "tpep_dropoff_datetime": "2018-01-01 00:47:23", + "passenger_count": 2, + "trip_distance": 3.09, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 12.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.76, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16.56 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:49:14", + "tpep_dropoff_datetime": "2018-01-01 00:52:15", + "passenger_count": 2, + "trip_distance": 0.68, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 142, + "payment_type": 1, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.16, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.96 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:53:56", + "tpep_dropoff_datetime": "2018-01-01 01:19:49", + "passenger_count": 2, + "trip_distance": 2.91, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 68, + "payment_type": 1, + "fare_amount": 18, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.86, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 23.16 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:29:16", + "tpep_dropoff_datetime": "2018-01-01 00:50:15", + "passenger_count": 1, + "trip_distance": 4.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 234, + "DOLocationID": 263, + "payment_type": 1, + "fare_amount": 16.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.55, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 21.35 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:57:00", + "tpep_dropoff_datetime": "2018-01-01 01:18:57", + "passenger_count": 1, + "trip_distance": 3.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 107, + "payment_type": 1, + "fare_amount": 16, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4.3, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 21.6 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:06:21", + "tpep_dropoff_datetime": "2018-01-01 00:30:01", + "passenger_count": 2, + "trip_distance": 9.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 114, + "DOLocationID": 244, + "payment_type": 1, + "fare_amount": 29, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 9.05, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 39.35 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:31:20", + "tpep_dropoff_datetime": "2018-01-01 00:36:16", + "passenger_count": 1, + "trip_distance": 0.60, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 244, + "DOLocationID": 116, + "payment_type": 2, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:37:05", + "tpep_dropoff_datetime": "2018-01-01 00:48:59", + "passenger_count": 1, + "trip_distance": 3.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 116, + "DOLocationID": 238, + "payment_type": 1, + "fare_amount": 13.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4.4, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 19.2 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:50:02", + "tpep_dropoff_datetime": "2018-01-01 00:53:28", + "passenger_count": 1, + "trip_distance": 0.70, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:55:17", + "tpep_dropoff_datetime": "2018-01-01 01:01:51", + "passenger_count": 2, + "trip_distance": 1.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 143, + "DOLocationID": 238, + "payment_type": 1, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.55, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.35 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:21:25", + "tpep_dropoff_datetime": "2018-01-01 00:31:25", + "passenger_count": 2, + "trip_distance": 2.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 161, + "DOLocationID": 262, + "payment_type": 1, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.7, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.5 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:41:34", + "tpep_dropoff_datetime": "2018-01-01 00:51:43", + "passenger_count": 2, + "trip_distance": 1.27, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 162, + "payment_type": 1, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:53:47", + "tpep_dropoff_datetime": "2018-01-01 01:17:03", + "passenger_count": 3, + "trip_distance": 0.74, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 170, + "DOLocationID": 100, + "payment_type": 2, + "fare_amount": 14, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:24:55", + "tpep_dropoff_datetime": "2018-01-01 00:27:54", + "passenger_count": 1, + "trip_distance": 0.40, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 50, + "DOLocationID": 50, + "payment_type": 2, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:50:53", + "tpep_dropoff_datetime": "2018-01-01 01:02:25", + "passenger_count": 1, + "trip_distance": 0.70, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 50, + "DOLocationID": 48, + "payment_type": 1, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:19:46", + "tpep_dropoff_datetime": "2018-01-01 00:46:42", + "passenger_count": 3, + "trip_distance": 3.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 231, + "payment_type": 1, + "fare_amount": 18, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.85, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 23.15 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:48:22", + "tpep_dropoff_datetime": "2018-01-01 01:11:57", + "passenger_count": 3, + "trip_distance": 3.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 231, + "DOLocationID": 233, + "payment_type": 1, + "fare_amount": 17, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 21.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:04:18", + "tpep_dropoff_datetime": "2018-01-01 00:09:51", + "passenger_count": 1, + "trip_distance": 0.63, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 234, + "DOLocationID": 234, + "payment_type": 2, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:38:19", + "tpep_dropoff_datetime": "2018-01-01 00:55:57", + "passenger_count": 1, + "trip_distance": 0.41, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 68, + "DOLocationID": 68, + "payment_type": 4, + "fare_amount": -11, + "extra": -0.5, + "mta_tax": -0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": -0.3, + "total_amount": -12.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:38:19", + "tpep_dropoff_datetime": "2018-01-01 00:55:57", + "passenger_count": 1, + "trip_distance": 0.41, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 68, + "DOLocationID": 68, + "payment_type": 2, + "fare_amount": 11, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:30:29", + "tpep_dropoff_datetime": "2018-01-01 01:05:59", + "passenger_count": 3, + "trip_distance": 13.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 132, + "DOLocationID": 181, + "payment_type": 2, + "fare_amount": 40, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 41.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:31:35", + "tpep_dropoff_datetime": "2018-01-01 00:48:15", + "passenger_count": 1, + "trip_distance": 3.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 49, + "DOLocationID": 37, + "payment_type": 1, + "fare_amount": 14.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.95, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 19.75 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:28:02", + "tpep_dropoff_datetime": "2018-01-01 00:29:56", + "passenger_count": 1, + "trip_distance": 0.76, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 263, + "DOLocationID": 141, + "payment_type": 1, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.59, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.89 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:32:49", + "tpep_dropoff_datetime": "2018-01-01 00:38:23", + "passenger_count": 1, + "trip_distance": 1.42, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 262, + "payment_type": 1, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.56, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.31 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:56:26", + "tpep_dropoff_datetime": "2018-01-01 01:23:56", + "passenger_count": 1, + "trip_distance": 10.73, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 220, + "payment_type": 1, + "fare_amount": 34, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 35.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:29:37", + "tpep_dropoff_datetime": "2018-01-01 00:40:54", + "passenger_count": 2, + "trip_distance": 2.43, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 158, + "DOLocationID": 148, + "payment_type": 2, + "fare_amount": 10, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:41:36", + "tpep_dropoff_datetime": "2018-01-01 00:47:59", + "passenger_count": 2, + "trip_distance": 1.09, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 148, + "DOLocationID": 4, + "payment_type": 1, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:51:41", + "tpep_dropoff_datetime": "2018-01-01 00:55:45", + "passenger_count": 2, + "trip_distance": 0.69, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 4, + "DOLocationID": 4, + "payment_type": 2, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:56:53", + "tpep_dropoff_datetime": "2018-01-01 01:04:56", + "passenger_count": 1, + "trip_distance": 1.16, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 224, + "DOLocationID": 148, + "payment_type": 1, + "fare_amount": 7, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.08, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.38 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:14:46", + "tpep_dropoff_datetime": "2018-01-01 00:27:29", + "passenger_count": 1, + "trip_distance": 1.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 79, + "DOLocationID": 90, + "payment_type": 1, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:28:59", + "tpep_dropoff_datetime": "2018-01-01 00:40:19", + "passenger_count": 2, + "trip_distance": 1.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 234, + "DOLocationID": 144, + "payment_type": 1, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.06, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.36 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:43:04", + "tpep_dropoff_datetime": "2018-01-01 01:29:01", + "passenger_count": 1, + "trip_distance": 8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 144, + "DOLocationID": 24, + "payment_type": 1, + "fare_amount": 34, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 7.05, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 42.35 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:22:06", + "tpep_dropoff_datetime": "2018-01-01 00:36:49", + "passenger_count": 1, + "trip_distance": 1.71, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 249, + "DOLocationID": 148, + "payment_type": 1, + "fare_amount": 10.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.36, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.16 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:39:17", + "tpep_dropoff_datetime": "2018-01-01 00:54:06", + "passenger_count": 1, + "trip_distance": 2.43, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 148, + "DOLocationID": 170, + "payment_type": 1, + "fare_amount": 11.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:58:37", + "tpep_dropoff_datetime": "2018-01-01 01:10:39", + "passenger_count": 1, + "trip_distance": 2.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 170, + "DOLocationID": 79, + "payment_type": 1, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.24, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.04 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:20:51", + "tpep_dropoff_datetime": "2018-01-01 00:27:39", + "passenger_count": 2, + "trip_distance": 0.93, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 43, + "DOLocationID": 162, + "payment_type": 2, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:30:29", + "tpep_dropoff_datetime": "2018-01-01 00:35:48", + "passenger_count": 2, + "trip_distance": 0.73, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 162, + "DOLocationID": 170, + "payment_type": 2, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 01:01:06", + "tpep_dropoff_datetime": "2018-01-01 01:21:30", + "passenger_count": 1, + "trip_distance": 4.11, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 233, + "DOLocationID": 239, + "payment_type": 2, + "fare_amount": 16, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:28:35", + "tpep_dropoff_datetime": "2018-01-01 00:47:11", + "passenger_count": 2, + "trip_distance": 3.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 90, + "DOLocationID": 141, + "payment_type": 2, + "fare_amount": 15, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 16.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:48:07", + "tpep_dropoff_datetime": "2018-01-01 00:52:15", + "passenger_count": 3, + "trip_distance": 0.60, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 140, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.25, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.55 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:58:09", + "tpep_dropoff_datetime": "2018-01-01 01:10:13", + "passenger_count": 2, + "trip_distance": 6.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 88, + "payment_type": 2, + "fare_amount": 20, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 21.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:24:49", + "tpep_dropoff_datetime": "2018-01-01 00:32:00", + "passenger_count": 1, + "trip_distance": 1.33, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 262, + "payment_type": 2, + "fare_amount": 7, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:36:24", + "tpep_dropoff_datetime": "2018-01-01 00:46:13", + "passenger_count": 1, + "trip_distance": 1.86, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 263, + "DOLocationID": 238, + "payment_type": 1, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.06, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.36 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:49:07", + "tpep_dropoff_datetime": "2018-01-01 01:00:36", + "passenger_count": 1, + "trip_distance": 2.67, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 75, + "payment_type": 2, + "fare_amount": 11, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:27:02", + "tpep_dropoff_datetime": "2018-01-01 00:34:38", + "passenger_count": 4, + "trip_distance": 0.80, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 237, + "payment_type": 1, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.55, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.35 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:39:32", + "tpep_dropoff_datetime": "2018-01-01 01:00:15", + "passenger_count": 2, + "trip_distance": 2.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 137, + "payment_type": 1, + "fare_amount": 14.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.15, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.95 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:27:24", + "tpep_dropoff_datetime": "2018-01-01 01:11:33", + "passenger_count": 1, + "trip_distance": 1.42, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 161, + "DOLocationID": 186, + "payment_type": 2, + "fare_amount": 24, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 25.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:39:37", + "tpep_dropoff_datetime": "2018-01-01 00:58:28", + "passenger_count": 3, + "trip_distance": 2.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 229, + "payment_type": 1, + "fare_amount": 13.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:19:13", + "tpep_dropoff_datetime": "2018-01-01 00:32:05", + "passenger_count": 1, + "trip_distance": 1.05, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 107, + "DOLocationID": 68, + "payment_type": 1, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.16, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.96 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:35:42", + "tpep_dropoff_datetime": "2018-01-01 00:51:37", + "passenger_count": 1, + "trip_distance": 1.83, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 246, + "DOLocationID": 48, + "payment_type": 2, + "fare_amount": 11, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:12:44", + "tpep_dropoff_datetime": "2018-01-01 00:32:16", + "passenger_count": 1, + "trip_distance": 2.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 231, + "DOLocationID": 137, + "payment_type": 1, + "fare_amount": 12.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.07, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.87 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:33:03", + "tpep_dropoff_datetime": "2018-01-01 00:52:58", + "passenger_count": 1, + "trip_distance": 4.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 107, + "DOLocationID": 238, + "payment_type": 2, + "fare_amount": 17.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:45:11", + "tpep_dropoff_datetime": "2018-01-01 00:57:49", + "passenger_count": 2, + "trip_distance": 2.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 141, + "payment_type": 2, + "fare_amount": 10.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:16:02", + "tpep_dropoff_datetime": "2018-01-01 00:50:46", + "passenger_count": 1, + "trip_distance": 5.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 255, + "DOLocationID": 229, + "payment_type": 1, + "fare_amount": 24.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 7.7, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 33.5 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:53:06", + "tpep_dropoff_datetime": "2018-01-01 01:10:24", + "passenger_count": 2, + "trip_distance": 1.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 164, + "payment_type": 2, + "fare_amount": 11.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:20:58", + "tpep_dropoff_datetime": "2018-01-01 00:47:20", + "passenger_count": 2, + "trip_distance": 8.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 249, + "DOLocationID": 116, + "payment_type": 1, + "fare_amount": 27, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0.4, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 28.7 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:52:43", + "tpep_dropoff_datetime": "2018-01-01 00:58:45", + "passenger_count": 4, + "trip_distance": 1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 116, + "DOLocationID": 42, + "payment_type": 2, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:23:07", + "tpep_dropoff_datetime": "2018-01-01 00:43:38", + "passenger_count": 1, + "trip_distance": 3.92, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 79, + "DOLocationID": 237, + "payment_type": 2, + "fare_amount": 16, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:48:24", + "tpep_dropoff_datetime": "2018-01-01 01:12:24", + "passenger_count": 1, + "trip_distance": 6.51, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 162, + "DOLocationID": 173, + "payment_type": 2, + "fare_amount": 23, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 24.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:16:22", + "tpep_dropoff_datetime": "2018-01-01 00:21:29", + "passenger_count": 1, + "trip_distance": 1.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 229, + "payment_type": 2, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:23:01", + "tpep_dropoff_datetime": "2018-01-01 00:37:59", + "passenger_count": 1, + "trip_distance": 3.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 238, + "payment_type": 1, + "fare_amount": 14, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.8, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 19.1 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:40:29", + "tpep_dropoff_datetime": "2018-01-01 00:48:56", + "passenger_count": 1, + "trip_distance": 1.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 166, + "payment_type": 2, + "fare_amount": 8, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:49:56", + "tpep_dropoff_datetime": "2018-01-01 00:55:12", + "passenger_count": 1, + "trip_distance": 1.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 166, + "DOLocationID": 238, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.45, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.75 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:57:50", + "tpep_dropoff_datetime": "2018-01-01 01:10:51", + "passenger_count": 1, + "trip_distance": 5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 244, + "payment_type": 1, + "fare_amount": 17, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 5.45, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 23.75 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:07:33", + "tpep_dropoff_datetime": "2018-01-01 00:11:37", + "passenger_count": 2, + "trip_distance": 0.83, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 262, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.89, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.19 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:22:07", + "tpep_dropoff_datetime": "2018-01-01 00:34:40", + "passenger_count": 2, + "trip_distance": 2.65, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 262, + "DOLocationID": 238, + "payment_type": 1, + "fare_amount": 11, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.08, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.38 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:44:42", + "tpep_dropoff_datetime": "2018-01-01 00:57:02", + "passenger_count": 2, + "trip_distance": 1.69, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 50, + "payment_type": 2, + "fare_amount": 10, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 01:01:57", + "tpep_dropoff_datetime": "2018-01-01 01:03:26", + "passenger_count": 2, + "trip_distance": 0.31, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 50, + "DOLocationID": 50, + "payment_type": 1, + "fare_amount": 3.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0.96, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.76 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:12:21", + "tpep_dropoff_datetime": "2018-01-01 00:59:22", + "passenger_count": 1, + "trip_distance": 5.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 87, + "DOLocationID": 148, + "payment_type": 1, + "fare_amount": 29, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 33.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:41:07", + "tpep_dropoff_datetime": "2018-01-01 00:59:04", + "passenger_count": 2, + "trip_distance": 1.31, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 162, + "DOLocationID": 164, + "payment_type": 2, + "fare_amount": 12, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:05:32", + "tpep_dropoff_datetime": "2018-01-01 00:17:04", + "passenger_count": 1, + "trip_distance": 1.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 148, + "DOLocationID": 234, + "payment_type": 1, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:46:01", + "tpep_dropoff_datetime": "2018-01-01 01:08:24", + "passenger_count": 1, + "trip_distance": 3.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 170, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 16, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.45, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 20.75 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:14:41", + "tpep_dropoff_datetime": "2018-01-01 00:32:20", + "passenger_count": 1, + "trip_distance": 4.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 79, + "DOLocationID": 236, + "payment_type": 1, + "fare_amount": 15.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.35, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 20.15 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:37:45", + "tpep_dropoff_datetime": "2018-01-01 00:41:11", + "passenger_count": 1, + "trip_distance": 0.70, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 263, + "DOLocationID": 140, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.55, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.85 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:47:48", + "tpep_dropoff_datetime": "2018-01-01 00:48:54", + "passenger_count": 1, + "trip_distance": 0.40, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 237, + "payment_type": 1, + "fare_amount": 3.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0.95, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.75 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:52:34", + "tpep_dropoff_datetime": "2018-01-01 00:55:59", + "passenger_count": 2, + "trip_distance": 1.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 75, + "payment_type": 1, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0.5, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:37:21", + "tpep_dropoff_datetime": "2018-01-01 00:57:27", + "passenger_count": 6, + "trip_distance": 8.72, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 231, + "DOLocationID": 67, + "payment_type": 2, + "fare_amount": 26, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 5.76, + "improvement_surcharge": 0.3, + "total_amount": 33.06 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:11:47", + "tpep_dropoff_datetime": "2018-01-01 00:15:05", + "passenger_count": 1, + "trip_distance": 0.80, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 113, + "DOLocationID": 249, + "payment_type": 2, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:17:58", + "tpep_dropoff_datetime": "2018-01-01 00:22:10", + "passenger_count": 3, + "trip_distance": 0.80, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 90, + "DOLocationID": 125, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.85, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.15 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:26:55", + "tpep_dropoff_datetime": "2018-01-01 00:43:03", + "passenger_count": 1, + "trip_distance": 3.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 211, + "DOLocationID": 246, + "payment_type": 2, + "fare_amount": 13.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:47:45", + "tpep_dropoff_datetime": "2018-01-01 01:15:06", + "passenger_count": 2, + "trip_distance": 0.80, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 246, + "DOLocationID": 48, + "payment_type": 2, + "fare_amount": 16, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:22:07", + "tpep_dropoff_datetime": "2018-01-01 00:55:45", + "passenger_count": 2, + "trip_distance": 2.67, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 107, + "DOLocationID": 48, + "payment_type": 2, + "fare_amount": 17, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:56:07", + "tpep_dropoff_datetime": "2018-01-01 01:08:06", + "passenger_count": 3, + "trip_distance": 1.72, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.11, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.91 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:35:14", + "tpep_dropoff_datetime": "2018-01-01 00:45:58", + "passenger_count": 1, + "trip_distance": 1.19, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 142, + "payment_type": 1, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.96, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.76 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:48:15", + "tpep_dropoff_datetime": "2018-01-01 00:57:20", + "passenger_count": 1, + "trip_distance": 2.24, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 151, + "payment_type": 2, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 01:00:07", + "tpep_dropoff_datetime": "2018-01-01 01:04:39", + "passenger_count": 2, + "trip_distance": 0.60, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 151, + "DOLocationID": 238, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.58, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.88 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:11:52", + "tpep_dropoff_datetime": "2018-01-01 00:23:17", + "passenger_count": 5, + "trip_distance": 1.94, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 4, + "DOLocationID": 90, + "payment_type": 1, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.24, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.04 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:25:15", + "tpep_dropoff_datetime": "2018-01-01 00:27:25", + "passenger_count": 4, + "trip_distance": 0.48, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 90, + "DOLocationID": 68, + "payment_type": 2, + "fare_amount": 3.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 4.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:39:49", + "tpep_dropoff_datetime": "2018-01-01 01:05:10", + "passenger_count": 5, + "trip_distance": 2.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 68, + "DOLocationID": 79, + "payment_type": 2, + "fare_amount": 17, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:14:09", + "tpep_dropoff_datetime": "2018-01-01 00:44:06", + "passenger_count": 1, + "trip_distance": 8.77, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 41, + "DOLocationID": 223, + "payment_type": 1, + "fare_amount": 29, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 6.06, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 36.36 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:49:57", + "tpep_dropoff_datetime": "2018-01-01 01:19:59", + "passenger_count": 1, + "trip_distance": 14.29, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 223, + "DOLocationID": 228, + "payment_type": 2, + "fare_amount": 42, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 43.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:16:01", + "tpep_dropoff_datetime": "2018-01-01 00:34:11", + "passenger_count": 1, + "trip_distance": 2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 107, + "payment_type": 1, + "fare_amount": 12.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4.1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.9 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:36:37", + "tpep_dropoff_datetime": "2018-01-01 00:44:45", + "passenger_count": 1, + "trip_distance": 1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 107, + "DOLocationID": 79, + "payment_type": 1, + "fare_amount": 7, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.65, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.95 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:47:52", + "tpep_dropoff_datetime": "2018-01-01 00:54:15", + "passenger_count": 1, + "trip_distance": 0.80, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 107, + "DOLocationID": 234, + "payment_type": 2, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:35:45", + "tpep_dropoff_datetime": "2018-01-01 00:43:32", + "passenger_count": 1, + "trip_distance": 1.68, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 13, + "DOLocationID": 231, + "payment_type": 1, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.76, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.56 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:47:04", + "tpep_dropoff_datetime": "2018-01-01 00:59:53", + "passenger_count": 1, + "trip_distance": 1.84, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 45, + "DOLocationID": 79, + "payment_type": 1, + "fare_amount": 10, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.26, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.56 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:17:40", + "tpep_dropoff_datetime": "2018-01-01 00:21:43", + "passenger_count": 1, + "trip_distance": 0.91, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 151, + "payment_type": 1, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.36, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.16 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:23:14", + "tpep_dropoff_datetime": "2018-01-01 00:29:44", + "passenger_count": 1, + "trip_distance": 1.52, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 151, + "DOLocationID": 166, + "payment_type": 1, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.32, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.12 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:34:34", + "tpep_dropoff_datetime": "2018-01-01 00:49:11", + "passenger_count": 1, + "trip_distance": 3.51, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 151, + "DOLocationID": 141, + "payment_type": 2, + "fare_amount": 13, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:25:30", + "tpep_dropoff_datetime": "2018-01-01 00:52:28", + "passenger_count": 2, + "trip_distance": 10.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 236, + "DOLocationID": 181, + "payment_type": 2, + "fare_amount": 33.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 34.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:06:57", + "tpep_dropoff_datetime": "2018-01-01 01:00:12", + "passenger_count": 1, + "trip_distance": 7.73, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 249, + "DOLocationID": 146, + "payment_type": 2, + "fare_amount": 35.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 36.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:33:14", + "tpep_dropoff_datetime": "2018-01-01 00:50:19", + "passenger_count": 1, + "trip_distance": 0.60, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 50, + "DOLocationID": 230, + "payment_type": 1, + "fare_amount": 11, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:52:03", + "tpep_dropoff_datetime": "2018-01-01 01:04:18", + "passenger_count": 1, + "trip_distance": 2.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 230, + "DOLocationID": 151, + "payment_type": 2, + "fare_amount": 11.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:06:21", + "tpep_dropoff_datetime": "2018-01-01 00:20:51", + "passenger_count": 1, + "trip_distance": 3.31, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 186, + "DOLocationID": 140, + "payment_type": 1, + "fare_amount": 13, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.86, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.16 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:28:00", + "tpep_dropoff_datetime": "2018-01-01 00:39:34", + "passenger_count": 1, + "trip_distance": 3.37, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 263, + "DOLocationID": 42, + "payment_type": 1, + "fare_amount": 11.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.56, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.36 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:50:07", + "tpep_dropoff_datetime": "2018-01-01 00:58:18", + "passenger_count": 1, + "trip_distance": 1.33, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 43, + "DOLocationID": 262, + "payment_type": 1, + "fare_amount": 7.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:16:14", + "tpep_dropoff_datetime": "2018-01-01 00:26:48", + "passenger_count": 1, + "trip_distance": 2.33, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 140, + "DOLocationID": 170, + "payment_type": 1, + "fare_amount": 10.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.36, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.16 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:36:47", + "tpep_dropoff_datetime": "2018-01-01 00:42:31", + "passenger_count": 1, + "trip_distance": 0.59, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 170, + "DOLocationID": 170, + "payment_type": 2, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:50:33", + "tpep_dropoff_datetime": "2018-01-01 00:58:26", + "passenger_count": 1, + "trip_distance": 1.12, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 170, + "DOLocationID": 233, + "payment_type": 1, + "fare_amount": 7, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:22:53", + "tpep_dropoff_datetime": "2018-01-01 00:27:55", + "passenger_count": 3, + "trip_distance": 0.90, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 140, + "DOLocationID": 263, + "payment_type": 2, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:15:02", + "tpep_dropoff_datetime": "2018-01-01 00:26:35", + "passenger_count": 1, + "trip_distance": 2.61, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 43, + "DOLocationID": 137, + "payment_type": 2, + "fare_amount": 10, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:50:30", + "tpep_dropoff_datetime": "2018-01-01 01:15:33", + "passenger_count": 1, + "trip_distance": 6.92, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 234, + "DOLocationID": 226, + "payment_type": 2, + "fare_amount": 23.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 24.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:59:05", + "tpep_dropoff_datetime": "2018-01-01 01:07:06", + "passenger_count": 2, + "trip_distance": 1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 107, + "DOLocationID": 224, + "payment_type": 1, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.3, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.1 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:47:22", + "tpep_dropoff_datetime": "2018-01-01 01:02:27", + "passenger_count": 5, + "trip_distance": 2.41, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 249, + "DOLocationID": 230, + "payment_type": 2, + "fare_amount": 11.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:11:55", + "tpep_dropoff_datetime": "2018-01-01 00:17:14", + "passenger_count": 1, + "trip_distance": 1.6, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 233, + "payment_type": 1, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.17, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.97 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:17:43", + "tpep_dropoff_datetime": "2018-01-01 00:31:16", + "passenger_count": 1, + "trip_distance": 3.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 233, + "DOLocationID": 148, + "payment_type": 1, + "fare_amount": 13.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.95, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.75 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:35:12", + "tpep_dropoff_datetime": "2018-01-01 00:48:28", + "passenger_count": 1, + "trip_distance": 2.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 79, + "DOLocationID": 170, + "payment_type": 1, + "fare_amount": 11, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.45, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.75 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:55:48", + "tpep_dropoff_datetime": "2018-01-01 01:07:52", + "passenger_count": 1, + "trip_distance": 3.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 170, + "DOLocationID": 262, + "payment_type": 1, + "fare_amount": 11.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 14.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:30:54", + "tpep_dropoff_datetime": "2018-01-01 01:04:50", + "passenger_count": 1, + "trip_distance": 7.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 24, + "DOLocationID": 114, + "payment_type": 1, + "fare_amount": 28.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 7.45, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 37.25 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:12:34", + "tpep_dropoff_datetime": "2018-01-01 00:15:52", + "passenger_count": 1, + "trip_distance": 0.64, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 263, + "DOLocationID": 262, + "payment_type": 1, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.74, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.54 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:19:05", + "tpep_dropoff_datetime": "2018-01-01 00:29:36", + "passenger_count": 1, + "trip_distance": 3.57, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 262, + "DOLocationID": 107, + "payment_type": 2, + "fare_amount": 12.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:41:46", + "tpep_dropoff_datetime": "2018-01-01 00:44:58", + "passenger_count": 1, + "trip_distance": 0.43, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 137, + "DOLocationID": 233, + "payment_type": 1, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0.5, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:53:01", + "tpep_dropoff_datetime": "2018-01-01 00:59:42", + "passenger_count": 1, + "trip_distance": 1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 137, + "DOLocationID": 79, + "payment_type": 1, + "fare_amount": 6.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.56, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.36 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:27:00", + "tpep_dropoff_datetime": "2018-01-01 00:36:11", + "passenger_count": 2, + "trip_distance": 2.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 161, + "DOLocationID": 238, + "payment_type": 2, + "fare_amount": 10, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:37:39", + "tpep_dropoff_datetime": "2018-01-01 00:39:46", + "passenger_count": 2, + "trip_distance": 0.60, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 238, + "payment_type": 2, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:41:40", + "tpep_dropoff_datetime": "2018-01-01 00:46:03", + "passenger_count": 2, + "trip_distance": 0.60, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 238, + "payment_type": 2, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:46:51", + "tpep_dropoff_datetime": "2018-01-01 00:58:52", + "passenger_count": 2, + "trip_distance": 3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 141, + "payment_type": 2, + "fare_amount": 11.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:59:44", + "tpep_dropoff_datetime": "2018-01-01 01:04:14", + "passenger_count": 2, + "trip_distance": 0.90, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 140, + "DOLocationID": 237, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:25:20", + "tpep_dropoff_datetime": "2018-01-01 00:29:54", + "passenger_count": 1, + "trip_distance": 0.97, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 238, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.46, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.76 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:38:28", + "tpep_dropoff_datetime": "2018-01-01 01:00:23", + "passenger_count": 1, + "trip_distance": 1.44, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 142, + "DOLocationID": 48, + "payment_type": 2, + "fare_amount": 14, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:41:10", + "tpep_dropoff_datetime": "2018-01-01 00:43:40", + "passenger_count": 4, + "trip_distance": 0.70, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 193, + "DOLocationID": 145, + "payment_type": 2, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:02:22", + "tpep_dropoff_datetime": "2018-01-01 00:09:14", + "passenger_count": 1, + "trip_distance": 2.03, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 170, + "DOLocationID": 141, + "payment_type": 2, + "fare_amount": 8, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:11:38", + "tpep_dropoff_datetime": "2018-01-01 00:23:59", + "passenger_count": 1, + "trip_distance": 6.61, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 87, + "payment_type": 1, + "fare_amount": 19.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4.16, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 24.96 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:25:52", + "tpep_dropoff_datetime": "2018-01-01 00:38:34", + "passenger_count": 1, + "trip_distance": 3.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 209, + "DOLocationID": 181, + "payment_type": 1, + "fare_amount": 13, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.86, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.16 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:44:22", + "tpep_dropoff_datetime": "2018-01-01 00:56:26", + "passenger_count": 1, + "trip_distance": 2.63, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 25, + "DOLocationID": 61, + "payment_type": 1, + "fare_amount": 11.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 10, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 22.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:17:00", + "tpep_dropoff_datetime": "2018-01-01 01:01:37", + "passenger_count": 1, + "trip_distance": 20.1, + "RatecodeID": 2, + "store_and_fwd_flag": "N", + "PULocationID": 132, + "DOLocationID": 239, + "payment_type": 2, + "fare_amount": 52, + "extra": 0, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 52.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:21:28", + "tpep_dropoff_datetime": "2018-01-01 00:25:53", + "passenger_count": 1, + "trip_distance": 0.90, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 238, + "DOLocationID": 166, + "payment_type": 1, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 9 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:28:08", + "tpep_dropoff_datetime": "2018-01-01 00:45:11", + "passenger_count": 2, + "trip_distance": 4.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 166, + "DOLocationID": 246, + "payment_type": 1, + "fare_amount": 17.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.5, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 20.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:08:43", + "tpep_dropoff_datetime": "2018-01-01 00:22:06", + "passenger_count": 1, + "trip_distance": 2.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 114, + "DOLocationID": 68, + "payment_type": 1, + "fare_amount": 11.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.5, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:27:12", + "tpep_dropoff_datetime": "2018-01-01 00:57:00", + "passenger_count": 1, + "trip_distance": 4.5, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 186, + "DOLocationID": 146, + "payment_type": 2, + "fare_amount": 21, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 22.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:58:26", + "tpep_dropoff_datetime": "2018-01-01 01:09:00", + "passenger_count": 1, + "trip_distance": 2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 146, + "DOLocationID": 7, + "payment_type": 2, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:18:12", + "tpep_dropoff_datetime": "2018-01-01 00:26:01", + "passenger_count": 3, + "trip_distance": 0.93, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 162, + "payment_type": 1, + "fare_amount": 7, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.49, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.79 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:30:58", + "tpep_dropoff_datetime": "2018-01-01 00:52:18", + "passenger_count": 4, + "trip_distance": 6.61, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 161, + "DOLocationID": 13, + "payment_type": 1, + "fare_amount": 22.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 4.76, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 28.56 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:57:48", + "tpep_dropoff_datetime": "2018-01-01 01:36:40", + "passenger_count": 4, + "trip_distance": 6.79, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 231, + "DOLocationID": 236, + "payment_type": 1, + "fare_amount": 29.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 6.16, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 36.96 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2017-12-31 23:59:20", + "tpep_dropoff_datetime": "2018-01-01 00:04:31", + "passenger_count": 5, + "trip_distance": 1.01, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 137, + "DOLocationID": 170, + "payment_type": 1, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:25:27", + "tpep_dropoff_datetime": "2018-01-01 00:29:29", + "passenger_count": 5, + "trip_distance": 0.86, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 229, + "payment_type": 2, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:32:28", + "tpep_dropoff_datetime": "2018-01-01 00:34:33", + "passenger_count": 5, + "trip_distance": 0.33, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 162, + "payment_type": 1, + "fare_amount": 3.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0.96, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.76 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:36:00", + "tpep_dropoff_datetime": "2018-01-01 00:58:51", + "passenger_count": 5, + "trip_distance": 6.76, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 162, + "DOLocationID": 198, + "payment_type": 1, + "fare_amount": 21.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 5.71, + "tolls_amount": 5.76, + "improvement_surcharge": 0.3, + "total_amount": 34.27 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:25:39", + "tpep_dropoff_datetime": "2018-01-01 00:30:37", + "passenger_count": 1, + "trip_distance": 0.72, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 79, + "DOLocationID": 144, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.26, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.56 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:34:07", + "tpep_dropoff_datetime": "2018-01-01 00:45:08", + "passenger_count": 1, + "trip_distance": 1.23, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 144, + "DOLocationID": 4, + "payment_type": 1, + "fare_amount": 8.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.96, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 11.76 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:48:57", + "tpep_dropoff_datetime": "2018-01-01 01:05:57", + "passenger_count": 1, + "trip_distance": 4.54, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 4, + "DOLocationID": 231, + "payment_type": 2, + "fare_amount": 17.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:29:31", + "tpep_dropoff_datetime": "2018-01-01 00:59:40", + "passenger_count": 1, + "trip_distance": 4.8, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 48, + "DOLocationID": 261, + "payment_type": 2, + "fare_amount": 22.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 23.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:05:35", + "tpep_dropoff_datetime": "2018-01-01 00:26:10", + "passenger_count": 2, + "trip_distance": 0.79, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 161, + "DOLocationID": 170, + "payment_type": 2, + "fare_amount": 12.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:27:14", + "tpep_dropoff_datetime": "2018-01-01 01:14:51", + "passenger_count": 2, + "trip_distance": 4.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 170, + "DOLocationID": 261, + "payment_type": 2, + "fare_amount": 29.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 30.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:10:31", + "tpep_dropoff_datetime": "2018-01-01 00:13:16", + "passenger_count": 1, + "trip_distance": 0.60, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 161, + "payment_type": 2, + "fare_amount": 4, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:20:38", + "tpep_dropoff_datetime": "2018-01-01 00:31:17", + "passenger_count": 1, + "trip_distance": 2.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 229, + "DOLocationID": 79, + "payment_type": 1, + "fare_amount": 9.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:38:18", + "tpep_dropoff_datetime": "2018-01-01 00:49:52", + "passenger_count": 3, + "trip_distance": 1.4, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 79, + "DOLocationID": 211, + "payment_type": 1, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.05, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 12.35 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:54:55", + "tpep_dropoff_datetime": "2018-01-01 01:10:00", + "passenger_count": 3, + "trip_distance": 4.9, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 144, + "DOLocationID": 112, + "payment_type": 1, + "fare_amount": 16.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 17.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:12:54", + "tpep_dropoff_datetime": "2018-01-01 00:19:39", + "passenger_count": 1, + "trip_distance": 2.2, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 263, + "payment_type": 1, + "fare_amount": 8, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.3 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:28:59", + "tpep_dropoff_datetime": "2018-01-01 00:32:52", + "passenger_count": 1, + "trip_distance": 0.60, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 236, + "payment_type": 2, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 5.8 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:42:42", + "tpep_dropoff_datetime": "2018-01-01 00:48:01", + "passenger_count": 2, + "trip_distance": 0.60, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 141, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.85, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.15 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:51:32", + "tpep_dropoff_datetime": "2018-01-01 01:05:40", + "passenger_count": 2, + "trip_distance": 1.7, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 142, + "payment_type": 1, + "fare_amount": 10.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.77, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.57 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:55:06", + "tpep_dropoff_datetime": "2018-01-01 01:27:07", + "passenger_count": 1, + "trip_distance": 20.5, + "RatecodeID": 2, + "store_and_fwd_flag": "N", + "PULocationID": 132, + "DOLocationID": 231, + "payment_type": 1, + "fare_amount": 52, + "extra": 0, + "mta_tax": 0.5, + "tip_amount": 10.55, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 63.35 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:38:05", + "tpep_dropoff_datetime": "2018-01-01 00:54:03", + "passenger_count": 2, + "trip_distance": 3.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 107, + "DOLocationID": 262, + "payment_type": 1, + "fare_amount": 13.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 5.2, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 20 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:58:38", + "tpep_dropoff_datetime": "2018-01-01 01:03:30", + "passenger_count": 3, + "trip_distance": 0.83, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 141, + "DOLocationID": 141, + "payment_type": 1, + "fare_amount": 5.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.36, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.16 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:11:55", + "tpep_dropoff_datetime": "2018-01-01 00:23:00", + "passenger_count": 1, + "trip_distance": 2.21, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 50, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 10, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.26, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.56 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:29:10", + "tpep_dropoff_datetime": "2018-01-01 01:02:42", + "passenger_count": 2, + "trip_distance": 9.24, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 143, + "DOLocationID": 33, + "payment_type": 1, + "fare_amount": 31, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.5, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 34.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:01:00", + "tpep_dropoff_datetime": "2018-01-01 00:10:39", + "passenger_count": 1, + "trip_distance": 2.02, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 151, + "DOLocationID": 75, + "payment_type": 2, + "fare_amount": 9, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 10.3 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:18:19", + "tpep_dropoff_datetime": "2018-01-01 00:22:27", + "passenger_count": 1, + "trip_distance": 0.81, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 236, + "payment_type": 1, + "fare_amount": 5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.26, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 7.56 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:27:29", + "tpep_dropoff_datetime": "2018-01-01 00:33:27", + "passenger_count": 1, + "trip_distance": 1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 262, + "payment_type": 1, + "fare_amount": 6, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.46, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 8.76 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:39:31", + "tpep_dropoff_datetime": "2018-01-01 00:50:04", + "passenger_count": 1, + "trip_distance": 2.3, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 262, + "DOLocationID": 151, + "payment_type": 1, + "fare_amount": 10, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.26, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.56 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:19:18", + "tpep_dropoff_datetime": "2018-01-01 00:34:09", + "passenger_count": 2, + "trip_distance": 3.44, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 132, + "DOLocationID": 10, + "payment_type": 2, + "fare_amount": 14.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 0, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 15.8 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:20:36", + "tpep_dropoff_datetime": "2018-01-01 00:51:12", + "passenger_count": 3, + "trip_distance": 6.1, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 144, + "DOLocationID": 239, + "payment_type": 1, + "fare_amount": 24.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.87, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 29.67 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:52:14", + "tpep_dropoff_datetime": "2018-01-01 01:02:15", + "passenger_count": 3, + "trip_distance": 2.52, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 239, + "DOLocationID": 152, + "payment_type": 1, + "fare_amount": 10, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 2.26, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 13.56 + }, + { + "VendorID": 2, + "tpep_pickup_datetime": "2018-01-01 00:24:24", + "tpep_dropoff_datetime": "2018-01-01 00:45:11", + "passenger_count": 1, + "trip_distance": 2.12, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 237, + "DOLocationID": 170, + "payment_type": 1, + "fare_amount": 14, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 3.06, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 18.36 + }, + { + "VendorID": 1, + "tpep_pickup_datetime": "2018-01-01 00:20:14", + "tpep_dropoff_datetime": "2018-01-01 00:23:42", + "passenger_count": 1, + "trip_distance": 0.70, + "RatecodeID": 1, + "store_and_fwd_flag": "N", + "PULocationID": 90, + "DOLocationID": 249, + "payment_type": 1, + "fare_amount": 4.5, + "extra": 0.5, + "mta_tax": 0.5, + "tip_amount": 1.15, + "tolls_amount": 0, + "improvement_surcharge": 0.3, + "total_amount": 6.95 + } +] \ No newline at end of file diff --git a/playground/backend/datasets/NYCTaxi1000_simpleAvro.avro b/playground/backend/datasets/NYCTaxi1000_simpleAvro.avro new file mode 100644 index 0000000000000000000000000000000000000000..804b7f6236cd6d8af5febc8b499e99239d39bb7c GIT binary patch literal 2228 zcmZWqOKuZE5DlY|HL@bHL2N;@U={fQ*}?)gumD902t^ZnNR0fGod8jk6R=0DI0Hu@ zd#-@Q9XJ5IPj%1O^vFHkuU@^X?yhOSIDLPoyx)9SFGrj4c{^`@6xa2|)vB!z>vcO` zt|#?Dy=dl~KRHEXU$r)@JIH9*eW(Qt|13j5yQ9MSXLS39DwaX%}bh`eeMkglU`i_U4|l9WN*CxLRD!W_zE% zA0Pex^7{7CuRl+}J^cIe=iRRl3bs>M;B!6(!iJ>r?9W*Md>#qcKs zxw2)&ve;Ktb7K)W2emCGXsFrk3|Y~k6^eSfR<|v#_rO@Iy(YA`yD~9R(>aaIwAVX1 zm?long)V`!vi@taKE#NOVyF5M6-HSE$42H!bT8~QW*Ln&6HH4wuTtl31bxyJ1D)nk zUznmMg25MK;@5c*>@`kIH%_K*guKr|hYr8kK0Vi>^u&wEAsMcDrq~IT6FO9uL_-AT zofKv8*N+U+t${2_jH(pJ3ce|Qr)eiZW2U@qteo~IfPmAtHN>{nkfF`1QlTjhU^o>gr z^N7{CP}z?~6vGJj7G~aNISWyBD;r{OF)c5}H_Vl)3c!#G-b3DRSuw?CguH~vhnQo- ti-K;++PO+C{waEyf{v)HE!R$WGa(IWxkkMKTm_@S6c6V>iemTw{U7ByZBzgN literal 0 HcmV?d00001 diff --git a/playground/backend/datasets/NYCTaxi1000_simpleJson.json b/playground/backend/datasets/NYCTaxi1000_simpleJson.json new file mode 100644 index 000000000000..1f1ad44f122a --- /dev/null +++ b/playground/backend/datasets/NYCTaxi1000_simpleJson.json @@ -0,0 +1,3994 @@ +[ + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 3 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 5 + }, + { + "VendorID": 2, + "passenger_count": 5 + }, + { + "VendorID": 2, + "passenger_count": 5 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 4 + }, + { + "VendorID": 2, + "passenger_count": 5 + }, + { + "VendorID": 2, + "passenger_count": 5 + }, + { + "VendorID": 2, + "passenger_count": 5 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 4 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 4 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 6 + }, + { + "VendorID": 2, + "passenger_count": 6 + }, + { + "VendorID": 2, + "passenger_count": 6 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 3 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 4 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 3 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 3 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 3 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 4 + }, + { + "VendorID": 2, + "passenger_count": 4 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 3 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 4 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 5 + }, + { + "VendorID": 2, + "passenger_count": 5 + }, + { + "VendorID": 1, + "passenger_count": 4 + }, + { + "VendorID": 1, + "passenger_count": 3 + }, + { + "VendorID": 1, + "passenger_count": 4 + }, + { + "VendorID": 1, + "passenger_count": 4 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 0 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 6 + }, + { + "VendorID": 2, + "passenger_count": 6 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 3 + }, + { + "VendorID": 2, + "passenger_count": 3 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 3 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 3 + }, + { + "VendorID": 2, + "passenger_count": 4 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 4 + }, + { + "VendorID": 1, + "passenger_count": 4 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 4 + }, + { + "VendorID": 1, + "passenger_count": 4 + }, + { + "VendorID": 1, + "passenger_count": 4 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 4 + }, + { + "VendorID": 2, + "passenger_count": 5 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 5 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 3 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 3 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 3 + }, + { + "VendorID": 1, + "passenger_count": 3 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 6 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 4 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 5 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 5 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 4 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 5 + }, + { + "VendorID": 2, + "passenger_count": 5 + }, + { + "VendorID": 2, + "passenger_count": 5 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 6 + }, + { + "VendorID": 2, + "passenger_count": 6 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 3 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 3 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 4 + }, + { + "VendorID": 1, + "passenger_count": 3 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 3 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 0 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 3 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 4 + }, + { + "VendorID": 1, + "passenger_count": 4 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 5 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 3 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 3 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 6 + }, + { + "VendorID": 2, + "passenger_count": 6 + }, + { + "VendorID": 2, + "passenger_count": 6 + }, + { + "VendorID": 2, + "passenger_count": 6 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 4 + }, + { + "VendorID": 2, + "passenger_count": 4 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 4 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 3 + }, + { + "VendorID": 1, + "passenger_count": 3 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 3 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 4 + }, + { + "VendorID": 2, + "passenger_count": 4 + }, + { + "VendorID": 2, + "passenger_count": 4 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 6 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 3 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 5 + }, + { + "VendorID": 2, + "passenger_count": 5 + }, + { + "VendorID": 2, + "passenger_count": 5 + }, + { + "VendorID": 2, + "passenger_count": 6 + }, + { + "VendorID": 2, + "passenger_count": 6 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 4 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 4 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 4 + }, + { + "VendorID": 1, + "passenger_count": 4 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 4 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 4 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 6 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 4 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 3 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 3 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 3 + }, + { + "VendorID": 1, + "passenger_count": 3 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 3 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 3 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 4 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 3 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 4 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 6 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 3 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 3 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 5 + }, + { + "VendorID": 2, + "passenger_count": 4 + }, + { + "VendorID": 2, + "passenger_count": 5 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 3 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 5 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 4 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 3 + }, + { + "VendorID": 2, + "passenger_count": 4 + }, + { + "VendorID": 2, + "passenger_count": 4 + }, + { + "VendorID": 2, + "passenger_count": 5 + }, + { + "VendorID": 2, + "passenger_count": 5 + }, + { + "VendorID": 2, + "passenger_count": 5 + }, + { + "VendorID": 2, + "passenger_count": 5 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 3 + }, + { + "VendorID": 1, + "passenger_count": 3 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 2 + }, + { + "VendorID": 1, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 3 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 2, + "passenger_count": 2 + }, + { + "VendorID": 2, + "passenger_count": 3 + }, + { + "VendorID": 2, + "passenger_count": 3 + }, + { + "VendorID": 2, + "passenger_count": 1 + }, + { + "VendorID": 1, + "passenger_count": 1 + } +] \ No newline at end of file diff --git a/playground/backend/go.mod b/playground/backend/go.mod index d1ba16a2d59c..b9f9c653a93a 100644 --- a/playground/backend/go.mod +++ b/playground/backend/go.mod @@ -18,46 +18,47 @@ module beam.apache.org/playground/backend go 1.18 require ( - cloud.google.com/go/datastore v1.9.0 - cloud.google.com/go/logging v1.5.0 + cloud.google.com/go/datastore v1.10.0 + cloud.google.com/go/logging v1.7.0 github.com/GoogleCloudPlatform/functions-framework-go v1.6.1 - github.com/confluentinc/confluent-kafka-go v1.9.2 + github.com/confluentinc/confluent-kafka-go/v2 v2.1.1 github.com/go-redis/redis/v8 v8.11.5 github.com/go-redis/redismock/v8 v8.0.6 github.com/google/go-cmp v0.5.9 github.com/google/uuid v1.3.0 github.com/improbable-eng/grpc-web v0.15.0 - github.com/linkedin/goavro v2.1.0+incompatible + github.com/linkedin/goavro/v2 v2.11.1 github.com/procyon-projects/chrono v1.1.2 github.com/rs/cors v1.8.2 github.com/spf13/viper v1.14.0 - github.com/stretchr/testify v1.8.1 + github.com/stretchr/testify v1.8.2 go.uber.org/goleak v1.2.0 - google.golang.org/grpc v1.51.0 - google.golang.org/protobuf v1.28.1 + google.golang.org/grpc v1.54.0 + google.golang.org/protobuf v1.30.0 gopkg.in/yaml.v3 v3.0.1 ) require ( - cloud.google.com/go v0.104.0 // indirect - cloud.google.com/go/compute v1.12.1 // indirect - cloud.google.com/go/compute/metadata v0.2.1 // indirect - cloud.google.com/go/functions v1.7.0 // indirect - github.com/cenkalti/backoff/v4 v4.1.1 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect + cloud.google.com/go v0.110.0 // indirect + cloud.google.com/go/compute v1.19.0 // indirect + cloud.google.com/go/compute/metadata v0.2.3 // indirect + cloud.google.com/go/functions v1.12.0 // indirect + cloud.google.com/go/longrunning v0.4.1 // indirect + github.com/cenkalti/backoff/v4 v4.1.3 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cloudevents/sdk-go/v2 v2.6.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect + github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.0 // indirect - github.com/googleapis/gax-go/v2 v2.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect + github.com/googleapis/gax-go/v2 v2.7.1 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.11.7 // indirect + github.com/klauspost/compress v1.15.9 // indirect github.com/magiconair/properties v1.8.6 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect @@ -70,21 +71,20 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/subosito/gotenv v1.4.1 // indirect - go.opencensus.io v0.23.0 // indirect + go.opencensus.io v0.24.0 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.8.0 // indirect go.uber.org/zap v1.21.0 // indirect - golang.org/x/net v0.0.0-20221014081412-f15817d10f9b // indirect - golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 // indirect + golang.org/x/net v0.8.0 // indirect + golang.org/x/oauth2 v0.6.0 // indirect golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.0.0-20220908164124-27713097b956 // indirect - golang.org/x/text v0.4.0 // indirect + golang.org/x/sys v0.6.0 // indirect + golang.org/x/text v0.8.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.102.0 // indirect + google.golang.org/api v0.114.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e // indirect + google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633 // indirect gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/linkedin/goavro.v1 v1.0.5 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect nhooyr.io/websocket v1.8.6 // indirect ) diff --git a/playground/backend/go.sum b/playground/backend/go.sum index 1223bc87476b..779dc5a38c1f 100644 --- a/playground/backend/go.sum +++ b/playground/backend/go.sum @@ -1,3 +1,5 @@ +bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +bazil.org/fuse v0.0.0-20200407214033-5883e5a4b512/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -28,41 +30,491 @@ cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+Y cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0 h1:gSmWO7DY1vOm0MVU6DNXM11BWHHsTUmsC5cv1fuW5X8= cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= +cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= +cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= +cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= +cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= +cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= +cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= +cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= +cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= +cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= +cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= +cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= +cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= +cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= +cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= +cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= +cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= +cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= +cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= +cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= +cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= +cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= +cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= +cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= +cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= +cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= +cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= +cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= +cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= +cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= +cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= +cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= +cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= +cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= +cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= +cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= +cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= +cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= +cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= +cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= +cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= +cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= +cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= +cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= +cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= +cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= +cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= +cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= +cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= +cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= +cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= +cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= +cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= +cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= +cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= +cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= +cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= +cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= +cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= +cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= +cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= +cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= +cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= +cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= +cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= +cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= +cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= +cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= +cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= +cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= +cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= +cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= +cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= +cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= +cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= +cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= +cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= +cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= +cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= +cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= +cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= +cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= +cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.12.1 h1:gKVJMEyqV5c/UnpzjjQbo3Rjvvqpr9B1DFSbJC4OXr0= +cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute/metadata v0.2.1 h1:efOwf5ymceDhK6PKMnnrTHP4pppY5L22mle96M1yP48= +cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= +cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute v1.19.0 h1:+9zda3WGgW1ZSTlVppLCYFIr48Pa35q1uG2N1itbCEQ= +cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= +cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= +cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= +cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= +cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= +cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= +cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= +cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= +cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= +cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= +cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= +cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= +cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= +cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= +cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= +cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= +cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= +cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= +cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= +cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= +cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= +cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= +cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= +cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= +cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= +cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= +cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= +cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= +cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= +cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= +cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= +cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= +cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/datastore v1.9.0 h1:s3Gy1QRIwKxcMCCwJJq/4c64VjROZu6tq1DC632hZuo= -cloud.google.com/go/datastore v1.9.0/go.mod h1:yKk5PbPPCtuObGXNWvpQGEyWe+kiMQlTnpMjtltPNTc= +cloud.google.com/go/datastore v1.10.0 h1:4siQRf4zTiAVt/oeH4GureGkApgb2vtPQAtOmhpqQwE= +cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= +cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= +cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= +cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= +cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= +cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= +cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= +cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= +cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= +cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= +cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= +cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= +cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= +cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= +cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= +cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= +cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= +cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= +cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= +cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= +cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= +cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= +cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= +cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= +cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= +cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= +cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= +cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= +cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= +cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= +cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= +cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= +cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= +cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= cloud.google.com/go/functions v1.0.0/go.mod h1:O9KS8UweFVo6GbbbCBKh5yEzbW08PVkg2spe3RfPMd4= -cloud.google.com/go/functions v1.7.0 h1:s3Snbr2O4j4p7CuwImBas8rNNmkHS1YJANcCpKGqQSE= +cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= +cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= +cloud.google.com/go/functions v1.12.0 h1:TtRl25/oNsZyH3e4WfMRSMmFvmHC3YyQZuWaOpKI9+0= +cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= +cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= +cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= +cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= +cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= +cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= +cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= +cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= +cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= +cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= +cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= +cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= +cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= +cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/logging v1.5.0 h1:DcR52smaYLgeK9KPzJlBJyyBYqW/EGKiuRRl8boL1s4= -cloud.google.com/go/logging v1.5.0/go.mod h1:c/57U/aLdzSFuBtvbtFduG1Ii54uSm95HOBnp58P7/U= +cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= +cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= +cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= +cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= +cloud.google.com/go/iam v0.13.0 h1:+CmB+K0J/33d0zSQ9SlFWUeCCEn5XJA0ZMZ3pHE9u8k= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= +cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= +cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= +cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= +cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= +cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= +cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= +cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= +cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= +cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= +cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= +cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= +cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= +cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= +cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= +cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= +cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= +cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/logging v1.7.0 h1:CJYxlNNNNAMkHp9em/YEXcfJg+rPDg7YfwoRpMU+t5I= +cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= +cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= +cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= +cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= +cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= +cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= +cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= +cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= +cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= +cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= +cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= +cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= +cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= +cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= +cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= +cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= +cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= +cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= +cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= +cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= +cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= +cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= +cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= +cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= +cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= +cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= +cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= +cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= +cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= +cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= +cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= +cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= +cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= +cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= +cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= +cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= +cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= +cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= +cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= +cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= +cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= +cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= +cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= +cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= +cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= +cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= +cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= +cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= +cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= +cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= +cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= +cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= +cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= +cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= +cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= +cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= +cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= +cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= +cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= +cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= +cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= +cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= +cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= +cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= +cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= +cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= +cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= +cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= +cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= +cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= +cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= +cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= +cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= +cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= +cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= +cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= +cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= +cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= +cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= +cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= +cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= +cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= +cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= +cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= +cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= +cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= +cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= +cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= +cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= +cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= +cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= +cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= +cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= +cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= +cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= +cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= +cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= +cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= +cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= +cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= +cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= +cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= +cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= +cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= +cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= +cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= +cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= +cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= +cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= +cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= +cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= +cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= +cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= +cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= +cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= +cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= @@ -70,53 +522,219 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= +cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= +cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= +cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= +cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= +cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= +cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= +cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= +cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= +cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= +cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= +cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= +cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= +cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= +cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= +cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= +cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= +cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= +cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= +cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= +cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= +cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= +cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= +cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= +cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= +cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= +cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= +cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= +cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= +cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= +cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= +cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= +cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= +cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= +cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= +cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= +cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= +cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= +cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= +cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= +cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= +cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= +cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg= +github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/GoogleCloudPlatform/functions-framework-go v1.6.1 h1:xy2RD54qi/vya4c+Jrh/3yS5JLcTpK167AY47AI4Tdc= github.com/GoogleCloudPlatform/functions-framework-go v1.6.1/go.mod h1:pq+lZy4vONJ5fjd3q/B6QzWhfHPAbuVweLpxZzMOb9Y= +github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= +github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= +github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= +github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= +github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= +github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= +github.com/Microsoft/hcsshim v0.8.20/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= +github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= +github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg= +github.com/Microsoft/hcsshim v0.9.2/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= +github.com/Microsoft/hcsshim v0.9.4 h1:mnUj0ivWy6UzbB1uLFqKR6F+ZyiDc7j4iGgHTpO+5+I= +github.com/Microsoft/hcsshim v0.9.4/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= +github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= +github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/actgardner/gogen-avro/v10 v10.1.0/go.mod h1:o+ybmVjEa27AAr35FRqU98DJu1fXES56uXniYFv4yDA= github.com/actgardner/gogen-avro/v10 v10.2.1/go.mod h1:QUhjeHPchheYmMDni/Nx7VB0RsT/ee8YIgGY/xpEQgQ= -github.com/actgardner/gogen-avro/v9 v9.1.0/go.mod h1:nyTj6wPqDJoxM3qdnjcLv+EnMDSDFqE0qDpva2QRmKc= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= +github.com/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= +github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= +github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.1.1 h1:G2HAfAmvm/GcKan2oOQpBXOd2tT2G57ZnZGWa1PxPBQ= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= +github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= +github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= +github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= +github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= +github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= +github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= +github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudevents/sdk-go/v2 v2.6.1 h1:yHtzgmeBvc0TZx1nrnvYXov1CSvkQyvhEhNMs8Z5Mmk= @@ -125,34 +743,199 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= +github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/confluentinc/confluent-kafka-go v1.9.2 h1:gV/GxhMBUb03tFWkN+7kdhg+zf+QUM+wVkI9zwh770Q= -github.com/confluentinc/confluent-kafka-go v1.9.2/go.mod h1:ptXNqsuDfYbAE/LBW6pnwWZElUoWxHoV8E43DCrliyo= +github.com/confluentinc/confluent-kafka-go/v2 v2.1.1 h1:qwZtgyGS4OjvebR4TkZPxHAQRN/IbdaxpCQyhDpxeaE= +github.com/confluentinc/confluent-kafka-go/v2 v2.1.1/go.mod h1:mfGzHbxQ6LRc25qqaLotDHkhdYmeZQ3ctcKNlPUjDW4= +github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= +github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= +github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= +github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= +github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= +github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= +github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= +github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= +github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8= +github.com/containerd/cgroups v1.0.4 h1:jN/mbWBEaz+T1pi5OFtnkQ+8qnmEbAr1Oo1FRm5B0dA= +github.com/containerd/cgroups v1.0.4/go.mod h1:nLNQtsF7Sl2HxNebu77i1R0oDlhiTG+kO4JTrUzo6IA= +github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= +github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= +github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= +github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= +github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= +github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= +github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= +github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= +github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s= +github.com/containerd/containerd v1.6.1/go.mod h1:1nJz5xCZPusx6jJU8Frfct988y0NpumIq9ODB0kLtoE= +github.com/containerd/containerd v1.6.8 h1:h4dOFDwzHmqFEP754PgfgTeVXFnLiRc6kiqC7tplDJs= +github.com/containerd/containerd v1.6.8/go.mod h1:By6p5KqPK0/7/CgO/A6t/Gz+CUYUu2zf1hUaaymVXB0= +github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= +github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= +github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= +github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= +github.com/containerd/continuity v0.2.2/go.mod h1:pWygW9u7LtS1o4N/Tn0FoCFDIXZ7rxcMX7HX1Dmibvk= +github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= +github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= +github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= +github.com/containerd/go-cni v1.1.0/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= +github.com/containerd/go-cni v1.1.3/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= +github.com/containerd/go-cni v1.1.6/go.mod h1:BWtoWl5ghVymxu6MBjg79W9NZrCRyHIdUtk4cauMe34= +github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= +github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= +github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= +github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= +github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= +github.com/containerd/imgcrypt v1.1.3/go.mod h1:/TPA1GIDXMzbj01yd8pIbQiLdQxed5ue1wb8bP7PQu4= +github.com/containerd/imgcrypt v1.1.4/go.mod h1:LorQnPtzL/T0IyCeftcsMEO7AqxUDbdO8j/tSUpgxvo= +github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= +github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= +github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= +github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= +github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= +github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= +github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= +github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= +github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= +github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= +github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v1.0.1/go.mod h1:AKuhXbN5EzmD4yTNtfSsX3tPcmtrBI6QcRV0NiNt15Y= +github.com/containernetworking/cni v1.1.1/go.mod h1:sDpYKmGVENF3s6uvMvGgldDWeG8dMxakj/u+i9ht9vw= +github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= +github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= +github.com/containernetworking/plugins v1.0.1/go.mod h1:QHCfGpaTwYTbbH+nZXKVTxNBDZcxSOplJT5ico8/FLE= +github.com/containernetworking/plugins v1.1.1/go.mod h1:Sr5TH/eBsGLXK/h71HeLfX19sZPp3ry5uHSkI4LPxV8= +github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= +github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= +github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= +github.com/containers/ocicrypt v1.1.2/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= +github.com/containers/ocicrypt v1.1.3/go.mod h1:xpdkbVAuaH3WzbEabUd5yDsl9SwJA5pABH85425Es2g= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= +github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= +github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= +github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= +github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= +github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/dnephin/pflag v1.0.7/go.mod h1:uxE91IoWURlOiTUIA8Mq5ZZkAv3dPUfZNaT80Zm7OQE= +github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= +github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= +github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.17+incompatible h1:JYCuMrWaVNophQTOrMMoSwudOVEfcegoZZrleKc1xwE= +github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -163,33 +946,83 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= +github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= +github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.2.2/go.mod h1:Qh/WofXFeiAFII1aEBu529AtJo6Zg2VHscnEsbBnJ20= github.com/frankban/quicktest v1.7.2/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o= github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y= +github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= +github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= +github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14= github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= +github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= +github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= +github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= +github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= +github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= @@ -203,19 +1036,38 @@ github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq github.com/go-redis/redismock/v8 v8.0.6 h1:rtuijPgGynsRB2Y7KDACm09WvjHWS4RaG44Nm7rcj4Y= github.com/go-redis/redismock/v8 v8.0.6/go.mod h1:sDIF73OVsmaKzYe/1FJXGiCQ4+oHYbzjpaL9Vor0sS4= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= +github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -246,8 +1098,9 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -255,6 +1108,8 @@ github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.2.1-0.20190312032427-6f77996f0c42/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -272,11 +1127,15 @@ github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8 github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -289,19 +1148,24 @@ github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20211008130755-947d60d73cc0/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0 h1:y8Yozv7SZtlU//QXbezB6QkpuE6jMD2/gfzk4AftXjs= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= @@ -309,30 +1173,51 @@ github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0 github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.6.0 h1:SXk3ABtQYDT/OH8jAyvEOQ58mgawq5C4o/4/89qN2ZU= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A= +github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= +github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hamba/avro v1.5.6/go.mod h1:3vNT0RLXXpFm2Tb/5KC71ZRJlOroggq1Rcitb6k4Fr8= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= @@ -348,25 +1233,38 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/heetch/avro v0.3.1/go.mod h1:4xn38Oz/+hiEUTpbVfGVLfvOg0yKLlRP7Q9+gJJILgA= +github.com/heetch/avro v0.4.4/go.mod h1:c0whqijPh/C+RwnXzAHFit01tdtf7gMeEHYSbICxJjU= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/invopop/jsonschema v0.4.0/go.mod h1:O9uiLokuu0+MGFlyiaqtWxwqJm41/+8Nj0lD7A36YH0= +github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ= +github.com/invopop/jsonschema v0.7.0/go.mod h1:O9uiLokuu0+MGFlyiaqtWxwqJm41/+8Nj0lD7A36YH0= +github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= +github.com/j-keck/arping v1.0.2/go.mod h1:aJbELhR92bSk7tp79AWM/ftfc90EfEi2bQJrbBFOsPw= github.com/jhump/gopoet v0.0.0-20190322174617-17282ff210b3/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= github.com/jhump/protoreflect v1.11.0/go.mod h1:U7aMIjN0NWq9swDP7xDdoMfRHb35uiuTd3Z9nFXJf5E= -github.com/jhump/protoreflect v1.12.0/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= +github.com/jhump/protoreflect v1.14.1/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -382,20 +1280,33 @@ github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfV github.com/juju/qthttptest v0.1.1/go.mod h1:aTlAv8TYaflIiTDIQYzxnl1QdPjAg8Q8qJMErpKy6A4= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.7 h1:0hzRabrMN4tSTvMfnL3SCv1ZGeAP23ynzodBgaHeMeg= +github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.15.9 h1:wKRjX6JRtDdrE9qwa4b/Cip7ACOshUI4smpCQanqjSY= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= @@ -403,24 +1314,48 @@ github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/linkedin/goavro v2.1.0+incompatible h1:DV2aUlj2xZiuxQyvag8Dy7zjY69ENjS66bWkSfdpddY= -github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= -github.com/linkedin/goavro/v2 v2.10.0/go.mod h1:UgQUb2N/pmueQYH9bfqFioWxzYCZXSfF8Jw03O5sjqA= -github.com/linkedin/goavro/v2 v2.10.1/go.mod h1:UgQUb2N/pmueQYH9bfqFioWxzYCZXSfF8Jw03O5sjqA= +github.com/linkedin/goavro/v2 v2.11.1 h1:4cuAtbDfqkKnBXp9E+tRkIJGa6W6iAjwonwt8O1f4U0= github.com/linkedin/goavro/v2 v2.11.1/go.mod h1:UgQUb2N/pmueQYH9bfqFioWxzYCZXSfF8Jw03O5sjqA= +github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= +github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= @@ -428,6 +1363,23 @@ github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:F github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/sys/mount v0.3.3 h1:fX1SVkXFJ47XWDoeFW4Sq7PdQJnV2QIDZAqjNqgEjUs= +github.com/moby/sys/mount v0.3.3/go.mod h1:PBaEorSNTLG5t/+4EgukEQVlAvVEc6ZjTySwKdqp5K0= +github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= +github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= +github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= +github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= +github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= +github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= +github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -435,10 +1387,16 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= @@ -446,25 +1404,83 @@ github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzE github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/networkplumbing/go-nft v0.2.0/go.mod h1:HnnM+tYvlGAsMU7yoYwXEVLLiDW9gdMmb5HoGcwpuQs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nrwiersma/avro-benchmarks v0.0.0-20210913175520-21aec48c8f76/go.mod h1:iKyFMidsk/sVYONJRE372sJuX/QTRPacU7imPqqsu7g= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48= +github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= +github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.2-0.20211117181255-693428a734f5/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 h1:rc3tiVYb5z54aKaDfakKn0dDjIyPpTtszkjuMzyt7ec= +github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= +github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= +github.com/opencontainers/runc v1.1.0/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= +github.com/opencontainers/runc v1.1.2/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= +github.com/opencontainers/runc v1.1.3 h1:vIXrkId+0/J2Ymu2m7VjGvbSlAId9XNRPhn2p4b+d8w= +github.com/opencontainers/runc v1.1.3/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= +github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= +github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= +github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= +github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= +github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= +github.com/opencontainers/selinux v1.10.1/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -476,93 +1492,162 @@ github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnh github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= +github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/procyon-projects/chrono v1.1.2 h1:Uw7V96Ckl/pOeMBNvaEki7k6Ssgd9OX8b9PY0gpXmoU= github.com/procyon-projects/chrono v1.1.2/go.mod h1:RwQ27W7hRaq+QUWN2yXU3BDG2FUyEQiKds8/M1FI5C8= +github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/clock v0.0.0-20190514195947-2896927a307a/go.mod h1:4r5QyqhjIWCcK8DO4KMclc5Iknq5qVBAlbYYzAbUScQ= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= +github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/santhosh-tekuri/jsonschema/v5 v5.0.0/go.mod h1:FKdcjfQW6rpZSnxxUvEA5H/cDPdvJ/SZJQLWWXWGrZ0= +github.com/santhosh-tekuri/jsonschema/v5 v5.2.0/go.mod h1:FKdcjfQW6rpZSnxxUvEA5H/cDPdvJ/SZJQLWWXWGrZ0= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= +github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= +github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.14.0 h1:Rg7d3Lo706X9tHsJMUjdiwMpHB7W8WnSVOssIY+JElU= github.com/spf13/viper v1.14.0/go.mod h1:WT//axPky3FdvXHzGw33dNdXXXfFQqmEalje+egj8As= +github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -572,27 +1657,74 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= +github.com/testcontainers/testcontainers-go v0.14.0 h1:h0D5GaYG9mhOWr2qHdEKDXpkce/VlvaYOCzTRi6UBi8= +github.com/testcontainers/testcontainers-go v0.14.0/go.mod h1:hSRGJ1G8Q5Bw2gXgPulJOLlEBaYJHeBSOkQM5JLG+JQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= +github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= +go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= +go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= +go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= +go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -601,20 +1733,44 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= go.opentelemetry.io/otel v0.19.0/go.mod h1:j9bF567N9EfomkSidSfmMwIwIBuP37AMAIzVW85OxSg= +go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= +go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= +go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= go.opentelemetry.io/otel/metric v0.19.0/go.mod h1:8f9fglJPRnXuskQmKpnad31lcLJ2VmNNqIsx/uIwBSc= +go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= go.opentelemetry.io/otel/oteltest v0.19.0/go.mod h1:tI4yxwh8U21v7JD6R3BcA/2+RBoTKFexE/PJ/nSO7IA= +go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= +go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= +go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= +go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= go.opentelemetry.io/otel/trace v0.19.0/go.mod h1:4IXiNextNOpPnRlI4ryK69mn5iC84bjBWZQA5DXz/qg= +go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= +go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= +go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= @@ -625,22 +1781,37 @@ go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95a go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= @@ -648,8 +1819,20 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= +golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -674,9 +1857,15 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -688,12 +1877,16 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -711,6 +1904,7 @@ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -721,16 +1915,34 @@ golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b h1:tvrvnPFcdzp294diPnrdZZZ8XUt2Tyj7svb7X52iDuU= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -751,8 +1963,15 @@ golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 h1:nt+Q6cXKz4MosCSpnbMtqiQ8Oz0pxTef2B4Vca2lvfk= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= +golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= +golang.org/x/oauth2 v0.6.0 h1:Lh8GPgSKBfWSwFvtuWOfeI3aAAnbXTSutYxJiOJFgIw= +golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -765,6 +1984,9 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -781,24 +2003,39 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -807,36 +2044,62 @@ golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -844,15 +2107,35 @@ golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220405210540-1e041c57c461/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956 h1:XeJjHH1KiLpKGb6lvMiksZ9l0fVUh+AmGcm0nOMEBOY= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -862,16 +2145,32 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -881,13 +2180,19 @@ golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -911,16 +2216,21 @@ golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= @@ -928,7 +2238,12 @@ golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= +golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -938,6 +2253,15 @@ golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNq golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= +google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -975,11 +2299,28 @@ google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/S google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.102.0 h1:JxJl2qQ85fRMPNvlZY/enexbxpCjLwGhZUtgfGeQ51I= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= +google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= +google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= +google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= +google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= +google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -989,11 +2330,13 @@ google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= @@ -1003,6 +2346,7 @@ google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvx google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -1017,12 +2361,15 @@ google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -1063,20 +2410,67 @@ google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2 google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220503193339-ba3ae3f07e29/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e h1:S9GbmC1iCgvbLyAokVCwiO6tVIrU9Y7c5oMx1V/ki/Y= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= +google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= +google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= +google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= +google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633 h1:0BOZf6qNozI3pkN3fJLwNubheHJYHhMh91GRFOWWK08= +google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1086,6 +2480,7 @@ google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ij google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= @@ -1109,13 +2504,21 @@ google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnD google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.51.0 h1:E1eGv1FTqoLIdnBCZufiSHgKjlqG6fKFf6pPWtMTh8U= +google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= +google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/grpc v1.54.0 h1:EhTqbhiYeixwWQtAEZAxmV9MGqcjEU2mFx52xCzNyag= +google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -1131,28 +2534,37 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/avro.v0 v0.0.0-20171217001914-a730b5802183/go.mod h1:FvqrFXt+jCsyQibeRv4xxEJBL5iG2DDW5aeJwzDiq4A= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v1 v1.0.0/go.mod h1:CxwszS/Xz1C49Ucd2i6Zil5UToP1EmyrFhKaMVbg1mk= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/httprequest.v1 v1.2.1/go.mod h1:x2Otw96yda5+8+6ZeWwHIJTFkEHWP/qP8pJOzqEtWPM= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/linkedin/goavro.v1 v1.0.5 h1:BJa69CDh0awSsLUmZ9+BowBdokpduDZSM9Zk8oKHfN4= -gopkg.in/linkedin/goavro.v1 v1.0.5/go.mod h1:Aw5GdAbizjOEl0kAMHV9iHmA8reZzW/OKuJAl4Hb9F0= gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/retry.v1 v1.0.3/go.mod h1:FJkXmWiMaAo7xB+xhvDF59zhfjDWyzmyAxiT4dB688g= +gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= @@ -1168,9 +2580,15 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools/gotestsum v1.8.2/go.mod h1:6JHCiN6TEjA7Kaz23q1bH0e2Dc3YJjDUZ0DmctFZf+w= +gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= +gotest.tools/v3 v3.3.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1179,10 +2597,97 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= +k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= +k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= +k8s.io/api v0.22.5/go.mod h1:mEhXyLaSD1qTOf40rRiKXkc+2iCem09rWLlFwhCEiAs= +k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= +k8s.io/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= +k8s.io/apimachinery v0.22.5/go.mod h1:xziclGKwuuJ2RM5/rSFQSYAj0zdbci3DH8kj+WvyN0U= +k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= +k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= +k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= +k8s.io/apiserver v0.22.5/go.mod h1:s2WbtgZAkTKt679sYtSudEQrTGWUSQAPe6MupLnlmaQ= +k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= +k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= +k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= +k8s.io/client-go v0.22.5/go.mod h1:cs6yf/61q2T1SdQL5Rdcjg9J1ElXSwbjSrW2vFImM4Y= +k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= +k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= +k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= +k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= +k8s.io/component-base v0.22.5/go.mod h1:VK3I+TjuF9eaa+Ln67dKxhGar5ynVbwnGrUiNF4MqCI= +k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= +k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= +k8s.io/cri-api v0.23.1/go.mod h1:REJE3PSU0h/LOV1APBrupxrEJqnoxZC8KWzkBUHwrK4= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= +k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= +k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= +k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= +k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= +k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= +modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= +modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= +modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= +modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= +modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= +modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= +modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/playground/backend/internal/cache/redis/redis_cache.go b/playground/backend/internal/cache/redis/redis_cache.go index 909cd28403a0..71baa635da02 100644 --- a/playground/backend/internal/cache/redis/redis_cache.go +++ b/playground/backend/internal/cache/redis/redis_cache.go @@ -121,7 +121,7 @@ func (rc *Cache) SetCatalog(ctx context.Context, catalog []*pb.Categories) error func (rc *Cache) GetCatalog(ctx context.Context) ([]*pb.Categories, error) { value, err := rc.Get(ctx, cache.ExamplesCatalog).Result() if err != nil { - logger.Errorf("Redis Cache: get catalog: error during Get operation for key: %s, err: %s\n", cache.ExamplesCatalog, err.Error()) + logger.Warnf("Redis Cache: get catalog: error during Get operation for key: %s, err: %s\n", cache.ExamplesCatalog, err.Error()) return nil, err } var result []*pb.Categories diff --git a/playground/backend/internal/code_processing/code_processing.go b/playground/backend/internal/code_processing/code_processing.go index 06bc83357012..b1fc191ceb35 100644 --- a/playground/backend/internal/code_processing/code_processing.go +++ b/playground/backend/internal/code_processing/code_processing.go @@ -111,8 +111,11 @@ func Process(ctx context.Context, cacheService cache.Cache, lc *fs_tool.LifeCycl err = runStep(pipelineLifeCycleCtx, cacheService, &lc.Paths, pipelineId, isUnitTest, sdkEnv, pipelineOptions) if err != nil { var pipelineCanceledError perrors.PipelineCanceledError + var runError perrors.RunError if errors.As(err, &pipelineCanceledError) { logger.Warnf("%s: pipeline execution has been canceled: %s", pipelineId, pipelineCanceledError.Error()) + } else if errors.As(err, &runError) { + logger.Warnf("%s: pipeline execution ended with error from child process: %s", runError.Error()) } else { logger.Errorf("%s: error during run step: %s", pipelineId, err.Error()) } @@ -190,7 +193,7 @@ func runStep(ctx context.Context, cacheService cache.Cache, paths *fs_tool.LifeC if processingErr != nil { return processingErr } - return fmt.Errorf("run error: %s", runError.String()) + return perrors.RunError{Log: runError} } // Run step is finished and code is executed err = processRunSuccess(pipelineId, cacheService, stopReadLogsChannel, finishReadLogsChannel) @@ -608,7 +611,7 @@ func processErrorWithSavingOutput(err error, errorOutput []byte, pipelineId uuid // sets corresponding status to the cache. func processRunError(errorChannel chan error, errorOutput []byte, pipelineId uuid.UUID, cacheService cache.Cache, stopReadLogsChannel, finishReadLogsChannel chan bool) error { err := <-errorChannel - logger.Errorf("%s: Run(): err: %s, output: %s\n", pipelineId, err.Error(), errorOutput) + logger.Warnf("%s: Run(): err: %s, output: %s\n", pipelineId, err.Error(), errorOutput) if err := utils.SetToCache(cacheService, pipelineId, cache.RunError, fmt.Sprintf("error: %s\noutput: %s", err.Error(), string(errorOutput))); err != nil { return err diff --git a/playground/backend/internal/components/cache_component.go b/playground/backend/internal/components/cache_component.go index 72d6c6213dce..fad449144904 100644 --- a/playground/backend/internal/components/cache_component.go +++ b/playground/backend/internal/components/cache_component.go @@ -43,7 +43,7 @@ func (cp *CacheComponent) GetSdkCatalogFromCacheOrDatastore(ctx context.Context, defer cancel() sdks, err := cp.cache.GetSdkCatalog(cctx) if err != nil { - logger.Errorf("error during getting the sdk catalog from the cache, err: %s", err.Error()) + logger.Warnf("error during getting the sdk catalog from the cache, err: %s", err.Error()) return cp.getSdks(ctx, cacheRequestTimeout) } else { return sdks, nil @@ -71,7 +71,7 @@ func (cp *CacheComponent) GetCatalogFromCacheOrDatastore(ctx context.Context, ca defer cancel() catalog, err := cp.cache.GetCatalog(cctx) if err != nil { - logger.Errorf("error during getting the catalog from the cache, err: %s", err.Error()) + logger.Warnf("error during getting the catalog from the cache, err: %s", err.Error()) return cp.getCatalog(ctx, cacheRequestTimeout) } else { return catalog, nil diff --git a/playground/backend/internal/db/datastore/datastore_db.go b/playground/backend/internal/db/datastore/datastore_db.go index c110a61487ae..7b92c915d2e0 100644 --- a/playground/backend/internal/db/datastore/datastore_db.go +++ b/playground/backend/internal/db/datastore/datastore_db.go @@ -583,7 +583,7 @@ func (d *Datastore) DeleteUnusedSnippets(ctx context.Context, retentionPeriod ti func rollback(tx *datastore.Transaction) { err := tx.Rollback() if err != nil { - logger.Errorf(errorMsgTemplateTxRollback, err.Error()) + logger.Warnf(errorMsgTemplateTxRollback, err.Error()) } } diff --git a/playground/backend/internal/emulators/kafka.go b/playground/backend/internal/emulators/kafka.go index 031373b47b04..6c1080b9227d 100644 --- a/playground/backend/internal/emulators/kafka.go +++ b/playground/backend/internal/emulators/kafka.go @@ -29,8 +29,8 @@ import ( "beam.apache.org/playground/backend/internal/constants" "beam.apache.org/playground/backend/internal/logger" - "github.com/confluentinc/confluent-kafka-go/kafka" - "github.com/linkedin/goavro" + "github.com/confluentinc/confluent-kafka-go/v2/kafka" + "github.com/linkedin/goavro/v2" ) const ( diff --git a/playground/backend/internal/errors/lifecycle_error.go b/playground/backend/internal/errors/lifecycle_error.go index a467bfd1a005..25de738a5432 100644 --- a/playground/backend/internal/errors/lifecycle_error.go +++ b/playground/backend/internal/errors/lifecycle_error.go @@ -15,6 +15,11 @@ package errors +import ( + "bytes" + "fmt" +) + type PipelineCanceledError struct { Reason string } @@ -23,6 +28,14 @@ func (e PipelineCanceledError) Error() string { return e.Reason } +type RunError struct { + Log bytes.Buffer +} + +func (e RunError) Error() string { + return fmt.Sprintf("run error: %s", e.Log.String()) +} + type CompilationError struct { Reason string } diff --git a/playground/backend/internal/fs_tool/fs.go b/playground/backend/internal/fs_tool/fs.go index 9c49fca53a0a..7247eb5ebd73 100644 --- a/playground/backend/internal/fs_tool/fs.go +++ b/playground/backend/internal/fs_tool/fs.go @@ -43,7 +43,7 @@ type LifeCyclePaths struct { AbsoluteExecutableFilePath string // /path/to/workingDir/pipelinesFolder/{pipelineId}/bin/{pipelineId}.{executableFileExtension} AbsoluteBaseFolderPath string // /path/to/workingDir/pipelinesFolder/{pipelineId} AbsoluteLogFilePath string // /path/to/workingDir/pipelinesFolder/{pipelineId}/logs.log - AbsoluteGraphFilePath string // /path/to/workingDir/pipelinesFolder/{pipelineId}/graph.dot + AbsoluteGraphFilePath string // /path/to/workingDir/pipelinesFolder/{pipelineId}/src/graph.dot ProjectDir string // /path/to/workingDir/ FindExecutableName func(context.Context, string) (string, error) FindTestExecutableName func(context.Context, string) (string, error) diff --git a/playground/backend/internal/fs_tool/fs_test.go b/playground/backend/internal/fs_tool/fs_test.go index db029635961f..3f0c9b012168 100644 --- a/playground/backend/internal/fs_tool/fs_test.go +++ b/playground/backend/internal/fs_tool/fs_test.go @@ -313,7 +313,7 @@ func TestNewLifeCycle(t *testing.T) { AbsoluteExecutableFilePath: filepath.Join(execFileFolder, fmt.Sprintf("%s%s", pipelineId.String(), javaCompiledFileExtension)), AbsoluteBaseFolderPath: baseFileFolder, AbsoluteLogFilePath: filepath.Join(baseFileFolder, logFileName), - AbsoluteGraphFilePath: filepath.Join(baseFileFolder, utils.GraphFileName), + AbsoluteGraphFilePath: filepath.Join(srcFileFolder, utils.GraphFileName), }, }, }, @@ -335,7 +335,7 @@ func TestNewLifeCycle(t *testing.T) { AbsoluteExecutableFilePath: filepath.Join(execFileFolder, fmt.Sprintf("%s%s", pipelineId.String(), goExecutableFileExtension)), AbsoluteBaseFolderPath: baseFileFolder, AbsoluteLogFilePath: filepath.Join(baseFileFolder, logFileName), - AbsoluteGraphFilePath: filepath.Join(baseFileFolder, utils.GraphFileName), + AbsoluteGraphFilePath: filepath.Join(srcFileFolder, utils.GraphFileName), }, }, }, diff --git a/playground/backend/internal/fs_tool/go_fs_test.go b/playground/backend/internal/fs_tool/go_fs_test.go index e5e513fd2531..c0d832bcccf0 100644 --- a/playground/backend/internal/fs_tool/go_fs_test.go +++ b/playground/backend/internal/fs_tool/go_fs_test.go @@ -58,7 +58,7 @@ func Test_newGoLifeCycle(t *testing.T) { AbsoluteExecutableFilePath: filepath.Join(binFileFolder, pipelineId.String()+goExecutableFileExtension), AbsoluteBaseFolderPath: baseFileFolder, AbsoluteLogFilePath: filepath.Join(baseFileFolder, logFileName), - AbsoluteGraphFilePath: filepath.Join(baseFileFolder, utils.GraphFileName), + AbsoluteGraphFilePath: filepath.Join(srcFileFolder, utils.GraphFileName), }, }, }, diff --git a/playground/backend/internal/fs_tool/lc_constructor.go b/playground/backend/internal/fs_tool/lc_constructor.go index a33f07b5633f..83179cdd4d2f 100644 --- a/playground/backend/internal/fs_tool/lc_constructor.go +++ b/playground/backend/internal/fs_tool/lc_constructor.go @@ -40,7 +40,7 @@ func newCompilingLifeCycle(pipelineId uuid.UUID, pipelinesFolder, sourceFileExte absExecFilePath, _ := filepath.Abs(filepath.Join(absExecFileFolderPath, execFileName)) absBaseFolderPath, _ := filepath.Abs(baseFileFolder) absLogFilePath, _ := filepath.Abs(filepath.Join(absBaseFolderPath, logFileName)) - absGraphFilePath, _ := filepath.Abs(filepath.Join(absBaseFolderPath, utils.GraphFileName)) + absGraphFilePath, _ := filepath.Abs(filepath.Join(absSrcFileFolderPath, utils.GraphFileName)) return &LifeCycle{ folderGlobs: []string{baseFileFolder, srcFileFolder, binFileFolder}, diff --git a/playground/backend/internal/utils/file_utils.go b/playground/backend/internal/utils/file_utils.go index 5e0d524363c6..61fef90dd9c4 100644 --- a/playground/backend/internal/utils/file_utils.go +++ b/playground/backend/internal/utils/file_utils.go @@ -124,14 +124,14 @@ func getExtBasedOnContent(content string) string { // getCorrectNameOrDefault returns the correct file name or default name. func getCorrectNameOrDefault(actualExt, correctExt, defaultFileName, name string) string { if actualExt == "" { - logger.Error("The name of the file does not have extension. Will be used default value") + logger.Infof("The name of the file does not have extension. Default value (%s) will be used", correctExt) if name == "" { return defaultFileName } return name + correctExt } if actualExt != correctExt { - logger.Error("The name of the file has wrong extension. Will be used correct extension according to sdk") + logger.Infof("The name of the file has wrong extension. Correct extension (%s) will be used according to sdk", correctExt) return name[0:len(name)-len(actualExt)] + correctExt } if filepath.Ext(name) == "" { diff --git a/playground/categories.yaml b/playground/categories.yaml index 32deba3a3941..066d93d4082f 100644 --- a/playground/categories.yaml +++ b/playground/categories.yaml @@ -38,3 +38,4 @@ categories: - Windowing - Debugging - Quickstart + - Emulated Data Source diff --git a/playground/doc/load_your_code/images/share-my-code.png b/playground/doc/load_your_code/images/share-my-code.png new file mode 100644 index 0000000000000000000000000000000000000000..f0cd54f4ff800f88103a99fc1c2fdceb946abc89 GIT binary patch literal 29370 zcmb@ubx@U2*EW7Y0qO2m1S#oG=>`GmPU-Fv>5%SLK)R&6yF}v9-Ee3)G~bOr?;p>6 z@60#9nIAKvd*8eF+G}5Ht!o>mq#%ikM1%wafl#HT#FRlG*f0rYeoP_mM z%W*NRqpt7C%kH!&l9-9}$a*XAoBf6hBX2BkxbJIRt?XdymZ0NNB%#JbwkfS)p(mm{ z#c`l2u}omf(;ahMUN225DfLi%>@rZ$*4*YDrR=E+eJh3WJtrJ%s1hUp)0;}7g~CCH*PTzRZuMrqj$QIdeP71#7aj>z24-?#DY4 zXU^33J4R^sYLoDIU_}->dR=5yuD%SD8mvkuqt3g~!ttw4KNc z(1pXBWEMdPAswIne}M&-m!_8&+Rf7*9zc9IjytTM8x`NB|{v%5F!b-zVu z;dlirb_U}&x0lm57t=T6oyK{yJ=Q0*{X*{ zgocLVe7r&Q@qp_&oE&c*Bja@vSS*cs_xkl~Wqwg3yxfVDH=yl0IlT`oUK%59dO?3% zG{V9-Z^{-R*>)XNR2m_}Lxq2_9UA(|2IjdtBcj)gc*t2Dm7Z?0YR7BtU z_yf#rGZbioA7VqMoy38e666|I_oKoAVths5uEd~ z+o(>2KaWx0teUVSgoZ3j@A~>SKFy4Vmp3ghk19jKJSw7ljiUX{!aJ(xf(aNBxtQt6 z=vkcl3O#*ImW1O`VLrARBZ9h=AD_F#VNPWv_@<_i!R?^;ZsbU$HXJDonCt7eF(C!` zVPVo#Z{Ieevt<+GRa@fWVm*&i1~GRcv|u!3vOsZ%dkQ53%z3()v+K8LT7y~m{;j?;7S=dw&89Y;gP+vNtG7E zW@cmeX;U>*Brp!!BNcNsrfd<(42_##Qq-G!kZV7x%0JI?fak23cEnEJ_=C&Ad}6L- zw8Q2u=5s~g2QqjApdOFo#j8ZRPd~K5<#0%09zk7BJEO(&s{cm&nqPq5BTrx7Y~+53 z6bHsl*gH>u1(wuOkc(j(m&~O>^LZyj5qf13>40`)hmk@(f;y3>sm&O3|4HskLgr1+ zW(rD{3I{AFtLQ>X`{#|U8gIYODAJc}UENq2yOn@*K{atv9xVPaQv8v>o=w)*6t1Tf zBSipZ8~5MV%h1{}F{zblCR!=o-$#sVwwl!<6}@`dBYAr{>ag3G^Wjuv$8zkTvYNO2 zS@J}D$h<@IHcfyUa2>|cf=O>E>MWLm1fA;w8+KKYNBOCg+lhDlsA1RXm2sjxE6MMsd&I|3Uz~mvFTrJbYjOXKn zSZgEOnWXYp%0mCE0h}*9f-KVc6t7=9q7tCMN5a35h{voR44kv>%Q1@mfra(yB``a1 z@Z?_4k+YE-_rSow%RiM`4DOy9pST@I_w1{I<}u^4Vn2u|vl6DJ(xH5Oo=NNzccy}} z@}$)GfRf<=M{f5h(2BUKr4}z*h)PIy#h1Wqci&8*=uhnx2Hn9fV&vgnfw7*omXmEh zUY`83Ax+;zsx)Nm=IEdG6OQ2?AtAvx_)@$Gq+E=={QR>^e3jJGJ)F3>cqv6`%C`cf z*b=4GY_SNr8Z`zm#E)9tOAll}G)wBHiYGB5YA=GspO+~1^?MFR(%gyZ7h3P%*cTL> zcBv?ywevWg&}*Zyvb`$WRn+l@rBTd;IlOlFGGHbGP8;{Z(|!EeheRGn?z9<5b5fJm zzm`fU-oAwcrH`srZmCSZ+km);>uIZAP=bnsRcWiXvSYKxw2dX$%&)BJZtsjah%FWh z@xarCp&`=&-TewI=F<|&-&T(|dI@vGmKNL`oeES;Zf}2i4|?;uLj3b_rg!OpX-gHM zSj#3cz~oo~ryb2U*=V881{4?+g!|c}U{cysLgG8QtKRv}id^OuE+`sxSN0%XTW`W~ zm+K@9mXYgxm=?}=?Bar5?Y+L-brfWl!3+id)fv5L8Iqvt)n(WAf$UN+ssk_Sh+ZwC zkR7oFq3im_I=Ab)U{A0*#T$;qOTPyNjS_9<ySRaNh z)VFw&8T7jTRCm_o{P~02UVpwX^yIp-TxlU2wz#~uQ17^XLC9Z*$3Ts3u}3&NA~7&R zHM-Zcx)(OF`60c|=Ce*Mmibsl=W0#7(KwaSj>3o;8^Jd!s$Oi|Mre3TU*kFcZ@X3O zk<9j-frRvDb(%Ld*9>hZzYT5ms^~h0ym|kA%%|BEq6McFeSX-nKyBQ4;Qr$WdX@7W zl96H-zn4(o!)*ByW~7%LEC^<6crxE9gx>Yltq4Z|T$#;?yr(D88ehF}oz}_ORi6oG zY*MPUh!N}{A#UXjoN}Ebqa2>%I`*F;^>!EsVy^fs7)~a;y3!Tl$;$01>#5M1DOIB% zP?cHKzz4{zHkms!Y9ED)A9iM? zh5@?CvdW+%te`iN^hLp;*%b-5l$j@;;Fh3*SmEP__A}D_kGl2avnx{QEr)lX-}{PM=l8HvtdvZN}m#QogU9 z)?Eh7_J`MqtPr#j?pJg>@Y9?n2&W%fhgucDAzTNns;t^Z_amYp(N2Nq&dV1f_$!Ju4$k-=M6>U>AmZEg-*>kqZel`x1<|i_zaI6g8(6mNbYYr zY+I?*~w?&VW`0@apKX)k~0h!Z46C*R}4PRj)h$Q$Xfg+)P*OONxS9cik-8J8lfP@<5 zPFYHN$)6*S!PF9=l8HKapt~yNflg`7I+l+W(nFIUo27XT5t()X_HvVGz>>ZJ=oc7P zZ*gMDqG-D_WagXgQj=cn&bP2IN^b6yxoY!j+cK-&^vd+ES7>P4Cu=FNW#^84QZKJv zuSi@WQ3K$XPbF%G*S|Y^Jr`CS)R`WyH_#&q>{lr!*FYfwnwz(ug=EwabGx&KQJM3aw?L@wJYy|G*bt>v(U5*l zxNu?M6A$lAI%M#>!~u55hBNQy<@KK;ewn-*0H~0{#2_Nt7fg06(^CHlcAC-D1!QS& zqB_LOJsl9ek#xRjn}s?|Y^UouFWq$cpTnNIFfdz`+VV!=F;d6HvE>aOiky4g1^6Hj zwM698%kzy`nCP=duVat_YbpybX}QYzjXS1BHJKMzS+C`JzTC|_W)Fj3=Bp6=z$M$B zwZP39Ro2N#d!yAhgya7H{sQ12eB|E<|Eu_TTgeaQ%Uo)gzC&cBq@@izI$(}YF{`id z?$``gL3K6@5;}|06i<{B-JUlEUk~Qzrq^Cu^z^1G)cZ*>?k?IY#H^3~ z1ITvj^CRY}z0k+x5L^!l1iocNMHD!8GY{P+(zxCUUEkaox|+moe~d!OmN{Ig!c9-c zM+<l(?w{Y%&PGLejCR{O?-t4df(Pqw`Y{8&T zkZW@QaQY>01wJG%c*S5=lTL;$xx=gGD%9W2;!tVY27~Ko zTcO#0kEv-KRz_7Cl^P5wqh@l{@prs;Z>?4x0y=XzpY6hdHU50Ld3Kt$o#xC9z>2Tb8`)D+q;qK865{yXfPZf2?;SNWb3b&B( zE;0a0yT`**gQ=PE$Cruc{SYUb&& zBhrOadiAIf^1b0!^hMcJR#O>W588i_R4szAr1!_ycRe}W?z{2)vrxk%M$IAr7Za-G zO0lF~uLtA=M8Rw0_C08B%O1oKK_Y#+ZbQ7k#wYC$et}Y?P{%o>dFqcG&odN{>@?`u zUh|(T6&-Pe`~~PZn1D@=UIG`PDK!4$SpzB45u%hUeP&H#PK`{FH+z3xGx9o!7|X|} zDSOF)=X#94bHKVnue=*8F>oK7Igd;?&0wkdrIQ$b`#?mxlu0 z1#3=XK#9_!JOl1Ap9UTlmX9zW%Nr6BaImnkKVbml=zUAIk5R3|I1dI4sql|dBO@cK z76YHY`^W>P7Qw&a|JN-3uSBes!9ks_H=9>El8BfLTy?mx3~}?)*iq;MiJ*66U?A0> zKa(&gm0Gkaed#$l!u!)j0D4k3lx`#8Ba=1g1>uU()?43LLLXyvffOvgT8{K*AKW-# z$~d3anqSXWSuqvS7VQWmrKUV~YBT8<+dyi_>CpFjINYBq=MiiYqIxV-wp$;G8kndGQl58)-o8b^Prc{ko@=m<;> z_Qeb5cTF#kvHPR?_0Fs2QbCV29OiwhJ9{!65l z@wAH8W4g)($l>f3k~?sr{#1Yv?ToT{jg60Fou7M59!wWWOC?f(TmvNy>K8uc1g$px zj*@#c@vQP%k{3B>hW)Ssf7Cs=GLq%hNq$?J)8L}r!0C+`Un|d4zf67|OoUw-a9R+ob* zhKnoRt)b+6hYe46Pfr|A7@Nh0Octi-f}PA49?l(7W`2Cp2|Bz2o2F}BTPVJV9#Eh7 zL8&G9+9Dhh_fgKKcT)y;Age5rtY3%U z{|OX~av&Lk#&y0mHP`YuA97RviPz=KIqHr&K8z;IJq0lIbmCDThndc{Ol?dD^5 z_|v(LbL_I$7<3w1W{+1x(8*s=iwGwt~rQ~FZ*52YzRuuzInY=y{#GFEF zN7gC05R-Ix6w>S}-xuWJNnYhQyH*r02LDN-LV}j(B|>b9#Rx>wX$kzvnZKEtkq3zqyG6 zZ9+SY-kwfg*%>=}AUr>F|B;KfbDJTXRJxfo1I561n}6UZ_q%@kbhq;Q_JVBai|=@) zVK*oA{`3@4E{!|D>&P?myJE|xpmk>ElCAj}4O_!npOT)3%gao@`mN3o&$F{x%=^|` z{h5dA!H30X2|nLpS{tO1V9Qxy8_8~eSui;m2rW3<+Nqu+ZHv~{TIsG~YI~6*+rRA1 zv4H?}B8}wlIjHa%$XvQRzaQXodfD(+R_)L6T7l*rR3cdL6brf}kV5XOvFhs$933Y9 zCp{z(88D|gBj}|RsxQ*Z#n_%+oOC0mxshAd8P)O_)os_r(x3NF$6k| z9S5%v9Y`G&q@yVF+jBJ)v_^#Hy_t~Av=hF9kc!L%a09kOG ztW+T81dOeEO^!g#5YsEM!ve!h&cNfyfsJUD7g}{q6Fya1Whg}4agqpv0ZXFQ9zmpr?_BhH<5t@}&fGLddsJlO7f0&xEdgil}$(un)Vs z7J!CzM0Ze*VfNq&$rw&N&mVL_wIFjP4G6h-Ves@gfP5shT8v9_fBkO0_Gpl;TitUpll%WliB{e($BY1%TV;~n;pIJ zTC6;mg>;S61xq6|a)G->fsW3HiADEG7oP2fdak(G@u+;$S;+I^UGChsJvOa!9W}L* zw|b%&?8U8|U;1d^K%!>HGqUkmcM5_I2VE2PlnauZVs!xIL~t^yGVw`z79?fZ%4tDuHolxWP?QrAowO*&UMW4PG66aKN;n zwP@kJ(kxaj8bR0)0^Ixt^?dFJqhW{NxI0q7S>LtmuOi7VuRKE3jnPQA2EH3RH`e+@ zeMr=-Ii6Y^ZI6UQ+5D*G%_H^0mhW`Auwo-QC(Le*?tNGzshGFJ=hbiFc z!guVF#qSYro<$b%X0kIyJ&QWe5@S4yVE9PjZt+}uce zQLykhGF?nlNPn3G3OlN;<2GRcF4OkPdTRgP2;X}Ma~hN!GEr;QZ1e<|;p>`n=xF+& zb63#aS-&zm>@aw%?sIfe%2ZHF>G%tNsSPKQ9^p^H@six5yJz{+qWQ>m7L(9Jl6kh@ z*NG>t45pvn-Ql=?%JsJL-rhd1(A|PMNVU69>38~PM#~|!USK^SyHK~lvwS=~El$SB z2nz_z0KQUV)>QYa8=7mYX-{AMwqWrHHG?XRhITh}H>DCCo*0MY2lD#md4F)fcZ@Ol z(^W}!2TZ)67jZym#|x<7*kfyK3zsj-)==VBZ58>Z`(wWBQ;y}dfne$xUhTouYS@Qd zM-ta@$JbX>FYcl{+PyUe@9uT!)Qbn4#@p03=l#rF#2WEPTxl#U_Imnhetn)m0u`&3 zId(oE7+gfyt?8FD#0!%4kJ@wt;2&S-r_BN$|M{W;s4eRf@mP_d`rG+Z@8Y)pfJh1D}+N3Hx_s8yX6`=;;D4^uV?{yXmeal~T$`Rs@^M(u8CMMW9`fy`0uZe;$} zLi&s1A3|#Pz2x+dj?-Em8U*~ChG|@OX*>7zE7Pe>mzGVIvrToTdp{ESr=YfvdJjxR zMHVPzfAAF*(P8P~P9`(@LwVh~^(%5eeirbAIy``u7jGrhDs*H;L|#7wP)Ig$D!&T} zD$&$W=}CA7jT2(+xJ|4Ov{bc)f7T|@!*2%{L0BpjPYKwK&qN{d@ccOf~EkqaQ{F@@6)KQm7 zpZpARdf<9~P_VFswLKi=desZwKkT$?l&L|D0TJ*P+#;5UBoXV6D%0hNhOUh5C;Ckm zsSxwJT8<`trx1Ly+M$L z`j*{Cz}*0NpZbQk2bbL3#=(O4N)xywBE@hjAG@z~sNVJIO+LUX2j zxo?!=OUcNXJw3h?NoU^#!?hdM^D(FDTz(*Js`+lW;x(>4emHloadB{b&kmJ^x^*=w z0M>W^Qa!83I?7S|lfomkUEkvXf`8*X)AA%Z-d?uWQ>BqbE|AdCfwV~AN;;fWZnUfz z@p-C}3>l9h*YjKPGepCS2pUR+O?9fn-s!y>{m~azt@IO6-vl%3p77{<5p$M5M7{_C zf$1B)8E`$y#6(Ed0)#{WQ`XXw&WDU3%{VJz6USPwPPXJdNBWqW=>m_>pXu%GE&Sz9 zkGin=)X7t--W~pgU6sD!%TDeBc|)L{Lsh{$^|AhX>v#Xd1z-a2u%^mg-zB?{-?r`I z%O6V1nPG1YCp*DeMF8FbQEn0^b||VD|D7HyD~vnja_8D|8~x&dEyK0G#$=$<_vY47 zi0d8fTUH9KGBssZ6>gVX6o1?o%tYTVJaQzXJlY<{F5kKxIYW~-=KO}p=3tler%ZxX zQH=(EOJ19-vwI3nO+L(~vYk@((VU&$soXgKQ7;#wkshqEba?~f3fAqvuBUO>mgDz( zsLjHcKsP??*~#1RQGe{S6Odf=X%hF>{qPf*tV;JTNiK_qwkwS1(fZQ_O>{v-w?NpT0P1l;N?mvR+#cfxWrB$TFMj z-aI<ZWH2@p0>EBCWyy7JMOVn?;r-aP`3ge!1zeG_f;AUav2x!WLZxS+;=yLl)S~O z0vtZ$WV|Fd>lphcB}J8Uj=^&|Ly517$VPtjwoevW5kn0Zh14q$avb6pi5Y09s2rKk zFv@IQA+r*>VI#;SyvQi;q6H=ubQUd!l9?pU%%~C2Nq+Q>j-Flme*OBw!|+0h?8pn< zuH_L^MJTgZ);OzalSn*AY=+|Y);&HhqwBkd&ushtLWmnX8{mV<47s7tG?JSfsEA^IkAaJrLrdANWr zy&>Vjl~$qGN(Yz*0z0+bsl1okN4pb2ZzG-z=Hi5QeI?CF&=9&qT1RY__)ad^0;Ckj zS0|;}kZp)b!d(;f4eGkJHR;qCqNgpl4(xO;u>Y%80fcIp0B zKx^|YH-iI|UWZ%t_UTfo2XNIK|F~0>nxwGuG@gQ(t3`LS}|knSE3LGiE5Z#+f5j5ds*YIXB>9C zhu8g6l`TYKnG}ksQqY>cgNX#h6?~v8oeOr}Ba@0k+spdDREsf$%_OJ+dK!$Ey*hg z-@vJHRjF?CVC&eE<;!otof2J^?#k*qg213%7jD;f8&U=2S9HrH7BZ(JE?QB1&JDE$c<0kWpdvE?? zF^Gzq`h1yBMWf!9O$OFbbX9|FjXZflNj+?LFuNFz)k^WX9cnk_dir%NRO{Bv`((6~6Y z4iB2IvFU_X@90(vyzZ#8S-XD#w;v4`sTABiK!t9MZ?gG0)>*Ph=Cj>avUluIc;_(2b0M$+#vJATr2lILn}|~ne{^7B_NiI1lz^mQA$<)TQOs)sHpz5 z`OvqtSbJa1sgv+J2L{B3%r<#QW(g^Sl|R6~-sE37-zo$EWPi4M%3$^g1@-m-95nm- zT1?M(k94L~Q&L%(l~WNN@Y%j^8i!MNoo0V%GT_m!KUDoXOh2n@W}fE+j@NgfQLOe| zGTR>29x;9)xxQt(u~r=tT^($;&}zj*@Aniz-gd{Mf6#Ii+_&hWt`3iW)DM`ADSU3H za689S`J{tkgEh_h(;m@Fe~LJ8=@NF99I{WqX_wy2k8DvSd}F%i=~>Q)vuUAAcd6_S zL?w^c>F7e&3@a-k$})gAH0{&PV{^7>qU;70$4jGW*lIIVin@~I-AaB zJKwH9PJJn`?*RGQ5F&X2|DxjCLkzI+?tWeL?4OnR$d7xaF4HKzdH3k`ydP~uis4U{ z+MAg?h@B5++Is3fl&TltaVjbTfv>q5kN&qzPf$R906&t&d7fToTJoiqZF?*BcQD5Y zi_K~d!ZTJ;DexUW`To=&e5oxZt>AK80$>e8fL<6F+$16qPmKz|pnkZ8H?S?ILkK8` zTwOkh=+UbWP{FOLe)8Acg;=e37d;F8>54R?J=UD(%h$NnD}1dRTaL%N=g*javsQbc3|?94*}$6OHJ~JNGq~iL;fSz`^JE0z+-j{r>O#}t07Q2l5+I`2PLnb6N5ByxZ5pKWx3yb6oX%_ zol^QRHH~w$wqZsKE{CMDZ8IO0g%Jrq!v5-OUrZ|tQ2#LFK>K)O_2S_cWn*%X&0>i+ zQgcQAyOxVO&CmC`^Aj6c3(pr^sYX>WOte5sg-hBvCplsfQP1zS7X(jZCQ&4VUJVs} z-wsX}$c3C{kGhf}dT3|8mN`+jk)gC@;=H*FWZW&1f>F7{s~J=LX!k^2n- z!GkT|#|TKeqYVKo8(Su*KZ>-uSkW7Bb-uWbT5Uzw+wQCU*;@xnX3!jL0MoF#b+WrL zX$&z^6<8gy-;70 z_&vFv$Bpi@*5j(CP8@)`HHJjzn?R5~GSiNY3XBrb;!jBYMB~8g&AE zC)U(O@Ep^>=s4inO+ydddG}Mmcg&02vRlQ3qf|d6zN&zmfV5lafD-^guwZ@gfI!1l z;~K!7{N*r==9(#xsb6c^i4>ZA>rt7!INse@`*p`vPbri^;8)%03?$h#ysgxKRy>^d z*;OAf!^IUMv}WLp!sjNAK}afEOZP#wNO?{mc)e)SJT!`Dod}+qXO0v@yWYASHi1Ow zWX@&@Pr;xUiO2T>`QYRiP6gn!^}3#O4aPky6=(RopcZSjmPTrur2HsK>~1rr+v=qL za&65^TDsMq4zdOO07B!hl1oTuWSi)W|5VL?u7Ez8*;;oH0m@ z)`zckPAnJR#bPR_97$BH{8f-BEn*}cEI{x2PZ;L^3SaQkbBiAixGq4AuF_nT|?MPL3P+9JWl}XvhY_SDfkJYHHXM zBXM}q(a{+IW|RmJJZT6L>+sPNdhVFEb*lN9@+bC>PA2x3d-lI2Hussy`Q4TNhKQ75 z3BSQrptGx&sL8+mOJ^0aS!${^pqwyaExLGajSAr(fAW8u(Z7(>f4(&Gjy$hGEdB7F z^E$vy;LW5%X*BsC8B+pCVvP(IwDxBNRByjdem{#DzINgKT92N9{t{i=UoE!LM&PFf zHuLBcY7|YO+}58@3<2lm3MOa-{ya5}K#Ww%|Ao<%Ah6IR3J6qv&5!n~WiEpsSbT=H zN(GLUxD$q*_+h%I8dG+jByJb=D>+;DiuudtslufO9nVr=f9RxEx}VLyWsFNr4YQbk z2`5H7RrxuM(|=?{4v0U+$|fZgvc_1o+3{p5{F$6&dH5x=MIAJBF^mMHDrD}|fI_sI zsuAzR4OSd^Gt1}6reDh#@?{B|nf-hY;7V1E#G8AuMd%=^mlU)-=Y;+@?e1T2P0H}M z!Tf8-=~;-YD`ZYmZsgUvbriWRiO=ld{zFHoNl!9w&30fU1+mQ z02z9~MBX>1*UwCp#yP^a5F0*dOj?}hvT&^l5Q+sGk8W<1-xzF<#eG~{R{`3{F&CtK76pUfu;&%HN ziUK#tug4X}3~o%xg&9Njhrp|3(@qia{26YBlET%Gx3|lYJQo zm^fU-{dlpm+azRg(ry2G(B&!CupGIAwBAB8Cay?})cwX-gB!u}Wg-9bK{)HTt*^G( zAp;Sy7m6^ zW>1W%lEWtcCxVMZ^+Lr)p|e+)O{m-B-}q|dP1&|L>~mA zI7eRH-3EtYMVb3R!26~5aMr_4Dq`4ar5hiL7fPK((IUVl&EpOa<3SRhw(Rt972I3c zIpR--R%#V}tVLRDhGJnmUCalHg^+IhzzJnTVjLIBR(B9o+P)O3*qh4|aN~$r;_pvJ zJ??6|ijkPiiq;$3cU6>dReD44j*c9i*4l&$u)|gQbC8)6VxS*O3FUv6GJ0Rqk7Of? zO5l%qZYXx2HLk9~pxW9C^rs(pkhXr>2Bb!rBvV?-IjD#31Du}Zba5vTGL-f9Ua$4Q zc5461CG>FoI5Vyb{{G2e=-sR4{NJKU-L~d)Y4ZHOe(Ihsws6AZQHUJQ@0?cP>uD&%vC*rr{RCeH_*EODYI zYs)1iAJ-blChlsig`h?f{f@ZqG0}qh_`6B)cV&|5l1AfI%y(2D%WY&IujEHYL;dLM z_)?qi?aY|8mgc0DtPC`Dw4Xlf>_-Xl~7^2vX?FG`x?z zDP67%(C!im<1;4@Q=295B6~*EqL-=PW4AI{dj+wgfHT766O{NxzuXVW5M~L~!(R1sU-Qwv%mgSj zS285&zR4`Wt5Jw6$VsxlG6M!Pg~gAD$@>I%$+j(vEBNxeqc9IZ!SFt9H*FEPl)Qx= z4y1HK&o+Lw6P^z;xK(;zwOZU)o8ngpo`Ob+!G>O9s!^*qi`RsQycnbXOac;s;1OJ$ zQALpn6`^lW8!-z%9IQQ57|s+Vx0eg*uI_~x44ju+^c$bGd*=egJS^WwqL$$fQlA>1 zGiiYE;W(NR$@j_I_atMi2xel!@B(v^omDg}Z;o4s3F*$ni1?jQ< z(lVHE$dVku4Y5{3mbGzlsUnL-ld4FiN;xhWye{zewTdm&w#R4-f&r3Qw|4VkRPKkA z?nVQ+CGs_%8t&I)Xp7){j^U@dA->7S{z?b^lZWe_$Gfw-rnWXzi8sr7WPlg8Vd&5q zw!-g9VBtz^B7fQiV2+MaQEzGZ8QeTsx<&V7y{6?zjC!Fz#-b=9GZf^=vb1Vl3vVM<#4y^aicecDd(wkNs$~}|m2{uz z8hvLKGs0;e4xIv3#~%6xuT)_{0s5IJ=3L`NlVMa;`MUugwcMGNUdZ13S7+#4{n=l$ z+rOf@eK5eic4cK)QmS;}IW(BDU#o7zE#ym;MfMbQ`m1d@8MfPcvqSCj3oIWZewz+ox)62^P%Y}VLfN@)c1cW1%)3V*?3d3Tok4Hzb-ya!`c+@&G2ykr76}7)4LG$9xUven5pnjEs&J?AFdtd`n_5Sf|T4 z-}iiTY{DU^ukTi2i%Im`8&^{&FW#{W2n4){oj7vQ#g@Qcp-T12fww!eGdU&0FB*kVFmS_uKZQEDI+Z(Y;luN7IantbZXG(Q@d zU?-c;G54`UNl4HKsEhG>eY;Yl5s#%hqR~UtEBKX_#Qx*szJz1nd@UuAskNTmwWVOa z+pAnldy11u%OV`9SXewa1(eBBlaF>ch3Z~rb) zkzFRZq5x4>ry`D{=ebH@F!@}dPDmPioOK=@xe!H4Q1c6YF+;UF_apb|mL>O-9hr!y zD#+Ul@W{{LM#*l0wQ1H#{gSd(U;%()!SyDgCo6R&>v=5xR)f*kHW4Bw_PiBFR@Rub zpIifv*H%!qSpYO@IT1NuTfAe{D1do);{}lbrEyt_bjuRHaTuQ|xuechxHjjJOGDvv z+H<&Bmi>J?rreB<;%7w%V>*0t7K0$uM_jx>rC&V@iE=*Q^) zU368rwC$oiZZafF>8Bi_+|T>kiu;?L>>|x-YP<+Iz+wlO)F!Nr71jDEz*C*v374`T zc(L^P0D@Gl(1HW#8~RVytH4Mbe?KV$soQVbH|9&!pknn3M+=zKwEJmJ;bDc7Ev|Bv zQ-7<0j6L#3TPFHU4&vAe$?GFoJ5Q#TM;zyNMVP8UWq`=r_+!4V z5m8OlWQy{6HH4=qi$h*wV_|IyPLa6nvwsXh!**c~2A*=c30r%e%lGbl^K}1EJ5+i1 zDurGW$@c#E5CfFioHPV^d@O{SzY%{1_V3GqC73Ev ziO}`Z*)bA~kJ%NZkC?XXt%yYL>`eTuRN>mTFo(lKdK~DGT4@hMfNH-0`MsuKB^_+BEw5ml*^9JmCnb$voIlq;?5uT=&Sz{y6y;Jiw=OSQE zmCI-`|6+-q|C{@TH@C+)NRApCzB^H9tDsFPAWByC7^dA8*~egb+xa z$PYjw=BXlmvgOt;T1j#6wtjW3?RoK49>>#aqz4*urdP;FO%bY#<(a_u=IqlUG`h~6 zSxa49UG*&=nng_`zIAj*QYcUfdIL9~{g1op?&bCG-IY0YJR;y-xWB(YxwxQu^F}o2 zHJn+M#>vS^hh?o^?fJsrVmd|Sn$?8B!wP^A%J@SksnoSxy=3w)k$C{ujGbsn=nyGf z`S%xh`Nz$|-RGwVSJACf{*SALub!9ofAdTreJCeY2cEs6g^0FR0)7ouRss}&CGWzH z8Pvl7n7Ci8K)*{klyU(}`{SlF?^1h&SvCBN*gyRM-;|LN6?hFht#Ao2O_dW&GquJ| zSYrX&Ds1c@LafQjNq`816asu}3=}V!mhtp#LK2lxmjX;n;Q1Te^D{Bzm*N4PU%JUjrO+oj~Aug@AzW8^7n0uFbm7PLw!w z;2)G9WfY~R#@+)-Az*R;CRH(?-2nejs_lRAZvW#a_-Oi`*3JZc)avdrU#P`+-O{hD ztjz7e{~p{whD%H=c{s>j{0X(stU9qc(-0`us4!ll!(^VWQw-2<(Ik3t=5K+8-t3Z* zlV8`ZzcL+4AZ!%8T0>CT^B!&$BaH-NIRM+A>8Poe2_e@=W@*eGT;}7{y7{R*xmy1H zbZ23Th;BA8cAb<)_Lf23OUtu?4unFb34QJR*X4G2Ljus1SYs^%1328s=NTFeV$a-r z5{1kF&mkJowc!(>{R<0yKr6^(T4QPCIlis)Z`(>Or;34!i&^G8FB9D0AhYofM`sPQ z-&aff&*^rMNt2?!eS5=0E1s* z&X?>u27%)^O=T; zqpg{Wg%Ou;yiLc78TWX)O|=LV`vxfELQr1frzIreg7-EakG+PfWq5KjGDsECnH`Ew zcn#UIz(SU1DK9kN)aRGDJB--tk+5X|J@mD+-L!ZJ-W$-hGwSxLydle%PfwQ-Z|uod zFaUOh=lvYdp~7?70ttQ@XA_j@E8-7;1H$8cX~Ow%F*tjh!Qga#W$9c}vhM^~Tz4S< zWynhw>w(Wd(E4KH;<~;(Dmoo%Fp$gp#^d*+0F?fcYv&<35Z-&8F<@Z75894eZjL_h z&lD9YmH=;wKbgEQv%BwQ>Gs%+y@Qzr!YNPb)y(}H*fidqcCzZH&wV(~eo@BFs&DXnyl+8i;K*?i|lHqB6Bz;H+9MTz_uI zEY)sDBqz7~@y3|oVQ5md0#oFYh|+ogPZBVh)iQ@%Ap8N}N%+mICMW^ z+{JIM-SycSU@km%kCZ>XZ*Iq&CH^YYf}ST#WE4H=b{f)=0b`6D|IZVdkLvL^RtQ09xghK%2`CG@B9<# zw^O#a$_xN!=8qT+vC-Q#72o?ceBZR{FLe;@KV=JybP2GbLYb>=q-10;!qvp-O$Bgj z<-2J4nj0GMFR!slu*5bWKjY>+_prVdu}D7p zm~eV#c9uZ+G68CSt4_{pGW({5eV?(fl_U23(){_>&dUBI-QU4817f*Prto$+{TT0F z$pK*O9Q!Z_BOH^C@YyMv{3+OwxkroDCcJ8@;Cr}T(a*Vr1LWr+V(#cpe2MO` zl^s>ZIT}I&l!k{kXmbi@A6$}Yth8HNiRHrF_uy{3V>_nhCM}eG9yGS3^ZmyY+%PJ4 zg>^N0T&opynSYq+fZ0hez``7LQ8#7hD;_3oDDW0XC3*My>3H*LVDgER5cVGTmi0pHJ z>rc3Q|NnOVe~*0a;xvS9uFhusMM1OU4R0oITj~ybEI!j@{yC^rZ9%9`V9k)U!Q;H{ zaF!3?caKfco}WdkTU+11nNAn*LK9HSgq{6ArM-1fTVM1qN-4!D6faub3KVxJ?k=TJ zpv8+ra4!_M;-z@;B7x#wytun-fZ!HLAl%dMZ|2RsJM-qv-1}d0l5@_Mwbx$q`K;aM z!%}O*>AMfVEZq&HSW5cac~9j9^eU-$V5SjS@B9nmssv7;u`7Un6GA1+{8bbf>1&9^ntBWjZ1h0$3pAT08Wkj&2-&dsalosWx<` zvj{1Ea7-$Lc|NbDib=y4RjPxG;v8OGeQOvhn!pcUbyCdN5=ZKX9(E0DmFYJfthhY{ z4vYm{`ECouQ{83zUfVsC!<;v}rHQ$ycJ3uanYotv@1p!PE+q~`uZ6E6kH*IER`D`V zmahbw3&PHSz+eKGHN{pRRRPkAF>^b9~2{48r1$tCOvTRo3JclT@g`B(0I z$;=x6aKu0c^#=}w+sas@witXqKx=a_>4>@9a7-t$I#Tx;$9A#;=P4p?Z)g{a0&wKc z?`%L=_|Ufzo&mzXSNIU#DwEc(4QUHo;B~cDTAO}t6?rk z9YA{D%}%66i8mddEMV4d^yE;$r5(S93T02X&lK`028wl^HTF+dd2pxa4;eT9^zmCj zGZH-QFN~UgLoxkf$mjM9YmG**>kffItF~SKY&fga>s0jn{=Q-Q<_gVfIDrpc^ceVR zI}}Sdd)lG?T5H!B-lrrt2m3Oy2 z830*nuNCRM+7>e|l?lCHwd8$a3Z}LODKyaC3fK!y7whAQm zU&OW~C<;+G4!N8xeA%|>#mJzj_V?N#1fw2@?yHM3VZ_+I-p@0%%Dc}*j!OdDnO0^5 zTGc2o#9%g=dnLJogyh6;AI``?r*X?QWX{h2>TUEkVKK07oMt*wfPB#bnc6Gwo3>pM zPPqehb}cU_=L)^H>ivsU`@xUbx*E^J8HbJs{q2G9YD09=sZl+Oc(zi<^mRvm+Wt&% zLvI{-7vGZ4?Se?#X4G%>6adH;yW-jaJUT5r?r>|bSiaJrV3pT>4}4nS%dqB$A0EazRfWkBk)!hnMzJg&r|B<;S;uf`T;+=^+J&B7Q2FdoWaC+Xq5FFb0`sIU9~YRaR3o zAI}NBt9lf$)3=^3rUnwoD1na;xN&B`5;8OAtXcp;S*%68;xHJqI=LSl$!$yl@G?0; z9k>Gt*=QSwsgx&z=5cz|I1XBu*Iw{FOIp1B2~W>6(%MX zQduAc`2D-wxw(9qQGH15J4ko4l8#PnmY84S2riDJ7{6kXj&_atd;b7xsH>OIM76d_ zpj6pfIE}^ZV>CeUjiQD-~fsLJmFl zVcMW9IyRAK!6wTv?E-5njogl4qoSX#({NzKy1VU&fQ18$=~D9uDJMm~9y^;3Be{KX z7=Y;o{`odP4+YXfA@EC4uJ=j0TT3ftsZl$sc6ycT16*BZC`AtFMN-nx-6a{V-S;*a zB~a_|w0a=llAe%2HV}U=ZTBmYm##>w zOb=h578E^h!d6xWl%n7zVvZY0E6f)0`!X}bZ`9}%ty8wsJjLYVB_s@O0&W$mTJK)( zMA0S#@3bNjaJUvQNMqUUm;ft75fd+f&bWELYFTD{Eqelb?d{_;QLW5sGyWm(-GR?ygfSNSWr+HZ-+dGQsQ#tt8TgnLB)r zk(HGo_)vi3(&5~uDS(3%KXh$z*}Jh_4{SPk{^(XzX3$PJP8x(BCL`Spk!|u3TM}`+ zJ|sDZ!Jg(xhl<|U*)e#wt`_;ZC%>Vmf38(vK;n74qM7b= zoV{E$YsKvc0MM2jPWBdFC~9gdv}6F=Ft9EM1uIqZ=_OW=ZaY=vTN_62j_0@ae(60A zmDZGgM9q@)$k`ev^~eD4^Mxr#s{XBMGs>pS$RGvs^1`n7#821!S?tYrzI|xdYNfCl z%TX+u)~;Fsk&EMIiFqYXmyGMyTokO*0`yo7>*C#f$h2L(;p;^RbQw%p-eIPhKK69~ z){aBe%L(xpzj!5X+$1+hlnm68(excHni$J7Lr{_{@%OF@q$#V?nBn$3BDW0olOa(< zDDzVP@f6#cc*r>-LATg}>qsn9|vERB&{bL+HDx6^&?R!GNg1tWu3+7_gYm{C9tU zh;QkyAu8ElywsnoSc;td-oLr7F>#v{5u0PVI#da$6tLhv6bFx@O{r5zp~ecL0)g3# zKManP;jlgWV@d`}Ha~x4pFMP_83k(oxEcYJZzDSjX5AL3ZPyY9e?J{f(BNaRlOnEUz#B-o)M!5JJ!B2RHXQN4{)XH+(z9;~nozUapFkrC9gF*;z z81z0cutU$gk|pAk1ArX}bA~HXRIUq{Y!gIt z6${HgCLh#%Y_!S@>+&uEzn-v!)`v$EfvB;ezjQ423LC{;p_R+yzjRN zGc3rosW(;i9Tw(UiP5M^mZVR7`MWA2|B{Fk*TXcGBAGG+fEW)v6DTinS#RP~FAeO{ z0B-Yd>vs6XG(IIc(o+i90~ywQbDx=M@WI2AD{K);1DU$y!+UrUQo7!&byEda7t zT%`l^@2dDGd1?T_FIncOg558k z0WYaEPU9a$EE+@}ckE%<&j<*0k_r?bU$Gzl8YUWrVYBH*+rM+(TYv)EC1V_bemJd? zCMD}m9=M~CVh1A#NsDwcz=(af3l+#*3j4!rtKn4ZVF`S%mAH0bKMT(d>aweMJ0EBL z$z{eQ!gj5(Wy!=W7!Pn#q^^8%;ADTM0mEwEF+cD*86`@kv4B;V|3E;bXKS_;_XjuS z6E9$u)-vU|-kWlL1x(J%Zk$=SBa)znmLfg&GM#$Vh#-mhK}++4Bw8(dntS@lwxx~! zxaBg0IbMsW zti;%Qc15)%LSRoMB;=P3Sg@FE+7Z~hhf-Jf>_t-< z{&*BqF(S1cV;)Ad+}z9^k0RUx2P6G>%OI+x*7eK>>QgQUz#lOY#oze5x&CB-ZCigY z@Lb?{`KI4tEKj=6| z=}?0EJi7Lm{AVT#?GG;PJPEwHfX`Q?HFbGS#~)ON<3xdnN6~WQl7_|B7ml~wbZavs zJFoaG-tlO%oT%2?f7h+^r$WJ}{tEnsW_zh?XuZW)Rv+sTHedx5nisk8e_n`ssY^Ch z=M$=Ery55QaWUJyt5>cqGH}{MF|%1ze0?yx&1uxRk}Xg!Btjd)Zrs3cKkwja`ub}M z=V$^)(AXu3D86xHI39F(XR!9*9IhqPW2f6DH|g*APQ&pHV8DV&xk`Gak~Bo!hpwiw1W+MJkT|(5JauAST!!A9-muRj1A3-`2jr)LyWCi4p{SH0*S; z&pF<@8MPhDj!6k^Bj~;spFDm@ym9W=OjC-ak~eJ|iT#X|ao$(h>2Cs^cVyxb39B+$ zR^14jsq|k0eD%a21&Om8l5#&Ff^@== zfYha^6m73(IL9UKM^U}6H0XGL@s!%s@h-gzKv^YcWep`UNr~4Wj=$b=&sHLGElFh} zS)@&iIo;gZ4zWLZED;bBzg=w+c%1V1N0aw-^yPJN0Xv*B6U!W?0g(?rVk|5yPXPBA z^)J?Pj>5b08W~69)AU{jaKVB2$_dN=SyX0=_Ge%cj;g9E1CY@`%B2vkude!-zKpnKlI;YP#*faRT%Vo| zh~ShlL)htPc$FQp zhn)0(fv6_tsO=V5I_rO5Fy|SyW&Y<;{~v*=UZT7-0^q;5<&K?YdueR2z^I?-l=)$= z30dj>yXD-BXV*)pnA&p~^kZTx1Bh##r}!L(XX2IM6WxDM)??l#GHZbCk)V0lGy6R} ze$Ki|EWsi_^)5>0x*-0-&_ehDOepQ#(Boo$%D}1nsh$A1NjzRbIL&VtwQD?8E}P&| zX?WU1SXwIrzF%c>?-yd;xZUW^F0F2-Q)+{A6@)};)nfPyqCSdj=SDw35f2}*@eZyU zD>z*Ays$N1?p|cf=Uk(8>fxmFFqvJy{ZzY!*!B+*6{2qn)JH9jl}n|{eQa^tMFrYI z0JP;xK}$jV3lB{bDS6_43Y(8YX=;w~C+vz7;Qm}&8wI-x5 z@FW9lbsKQa)-qeJTV$5BTu$`Tt5T~i3 zyfzIq?3SsyBmTSIr&0WJYf1@@q%?;edm=5-N&M({1IUfRurGcG!oe!B*IC@oS$Lg8-V_(@UiE1u7Hkh8V0g5M- zG-29#l`uar5=`HVn-kgB`e&U`QGG{*w|u_)m)F1{Em~Pw!f&A*hy0_4lFJ1bd|f3g zUNNB_`#y0LahS7oqB&#pd&vE4A2i)1^IRb6G(g3uPt=l_P5J8k0lEEGh<#wfgYlo~ z>|2eef3LXSewfc^otioqZkyIlxDSndDV{juKgW>D^DH=ai_Vhx_0fGz`HW^^8-9V! z*PP42DukO?#gFI4cuB0-=XFJ>45r6->0m}M9YDQjMeT>NG<_1l#)F0|m-Q?b^JGb? z<-ah&sxnKJkrmqxy!cj-&S=irHELhb#*(kKP=VHn*K_%HY!GZx*?YNR5CX4bZ1Q}D zx(1D5Ub@yK@^ya5$vYXvveQZa6BRnqZ+YE7ffQEy(-ep%RG|O})ooSQw%Zg=U>Rxn zI!ycQ(hKuBSX!$w-9@Sczi}9X>EBA(#Xb9Tqp)i%)YFOOdq{2nixt6?JZ1qlVJpU= zx{Bo1e+#PZky#Q-s#^*hj?d3WG;B-nqMa?(hvx|`zxdFK8W!%U5abO0q7a5$(Z&U-}lTEc;}j z+GwNnWHEfm{~f2hdboL2fmZq7EBv7br`0}Pf(_;VY*V71i~?ecsX-p%)e-^I)}S$V z8zXikh*>z?rd4RbZ&>AQAD^U#?fiy=Y?%U=hG%xoohx&Og(eS&I zUX|1zvFp)`fR0dbSsg;_SREB1u8eEe02ZBVt9!py_7h!&t@$ocfuirTsrh&3@ zIieu(`uO6^B!+LI{$M@*O&t@G%Y7_vTI5a}?c0aG!j;`0Fo>#yf!kj^yIW2}9)Hqh zP|07+tN(keRIjl+n=KG(4J$DW#xl8GVo^Tq?}ogVeN}v#)4MJ z&d*jCRP&@a26&@Bq4?Rdoi;e$SwxRt7ce8Oqx}m57CHoR+;>VNT z_dYnYH+HVa!p#{?p`C*QrY8}e-|p00w~DzL12-E>HSfQi!Y)4$o$8BeQN+oOKO`Dw z!afR-|88KQ-MxB`5TGHFVk|PIHJ@|pUT9&!2F(TJMc2MN{~(%P_{Bo$hY0>`eu1~+ zy|XYO17s#rQ47dGFg&X*N{(L0Omvpp9It`Cl;Pk*p4k8(u2%#rUH4m6V zV`d}B%bs{DvQ5u(FJd+<#`uTt3$v8fckr!;16xI~W>>eN@m&AI#!Ur0Gcn%x!E@@c z{VT7?lVfnJ@`1$H?;e>vjkaNsiBF|O7TMF3_TdHZTSG%0OnVlJCCaW%#|+SOeP}<; zA2hY!kZqN4qE(XWy=Sp&Je~U)FRpseQp*!h9(7XS)08Wjb=rcy@vuogMcJ^k*JV*C zWh^-Ed91XPurXVS|8i43>H&^1m02eZ+6V^uL~*w4P(d!ql(C#2|5)hQB|k3>T!}cSw&tfp8PUNvG9p zIYuhXnIY;Yf#$oUTg|E!XgY08IdLy80uwZ;^Ihgw($ubc`e*U_!Pmt@` z-{iM@z9ls;O?09%`z%*oWe$J9FYevk2Wy_U|5f-x0C`sSEHf)I|A!|3QRlyyR zk9c^O?m>>Y8X(qr*{Y&$6iQ0)QgvkmR&z_*d$=1TQX#oiTjCa{D$}~g*l-foY>2sM zKK|+O40}ly<3nSC3fq<#esA&Yr|IV8DXTmSF(*06>a6(Vd(>?)2Bpg7EMN;Q{MyJ+ zxfS!C1M`Z``kqRSE|n(@{N-*peIiE+G=A^Xdw?{Ju2s|qFDTr%<|di85FW^@z7X3Y zBA&N6TdC!-?_Q8Ik5K!wWrEVG5Cgx_C)Rc?tF!Skvk*oHX_y-xzplP7Ud^G)o&Ru8IWVUJo5J#%9NssgaEI zf9ta$;%DBzG|@5O|ILg4i8jDUzr zPs|@;?O*O3iT12VmC6A(dsFf^dafMi`ZH}6hl;6-tGo-%}vfZcpF{&w{Rmf-oyXtjbbPq9}qbrpSxKC4) zc7=rWa$dZiqp*6D297c*Viu`m>SYem`JxVq2Q0I?Dv1TbIMOgS2u>OX=lF+G@?uwp zNZJRsMnUGm znk8}{8c)|y9(CJ3x!d7{!FO2bJrX?S&>gU@;2v?4*FhY%HKgu916%!DHDVMo>H=x? z^L02z$5$HLro(QfPO$KsIDUL~ox#Uiu-%me>sq3^iUq{gjD?{|E@yXUB{HNu>ie&m z(RNI93D0_Fs28_X({0J{y-(kP=~7HdzKk|+bc%bR^=zv}rOC6=yX1+c0t@QC&>G)6 zt85PJ^gjk-XyeD_N)EHstMy8HenCtHyX94z8mjUnFT-_M&+2T>lslX_8W50OCh zJl&pA_Kqk2g4_)!H#>=~@yCNirK$8OaT^_exn6WJr-j2Ld#=_997Me!kS@IPuG!ur zK0Wp{KWFoq_u`(Fil8m>Xt{y5Un$;zB$1ohh9H)SCQO>&!ug7Ls1~GsW30y*HL?jp zAyxIZ@li)YEC))eB7 znc=ld*BBdr|5n?_x{>kuyJiV^9@iqaq5wWT|dG z&|)n7X3*@^FvJ*6;CFum2m)5k@pz*%#)T|M;(-NwJGAuuh-Glgi8LY(h6n@!XNRD&5iuL#dU6am7ZB!RLyc(Cj#YosINy!lhbd%l!O&V5&nBF1yS_7D##xuPhux4kdmt6^&cZ zlu$Zdj=0^VH9yC3UqN`Y6vM$}=2XJOm$kb}-_Jw>+gmQAmWhUSY5cx81HsE(Hv(*~+_nkyFDej-S3amk|@Y2yf z871fS7ss2S6TdJH3LayO}|f#SkH8AlM<<>_FCG930;c6b`}oCQvrme(!9 z5`}MQs^Jh8s=d-|7@*}720&MkMQ);-hS+2Sj?)Ung5`Y5t&e2}_O=4<7+!n6yfvRa zEE^odPtLfGoX~kqosw+EEgNX^bvr{0loieiDnupF{49j25(UJ4@E;~kSe*t4YF+9X zx|*kqspJF7z&2bdzzxBwP9&C>C++R_{FJ`G_M~ia27+H-2dzY%Y zu&Ci{)31K>a)gNxA+j$@(pfdPR=Cd()-hfSChd(5c#el9nrth$8QSX{@-vj`60Ia0 zxiRDV_{<2N=XpAEno*1{Zcmi9tKuV)EkV;3f%OvMtC?E4QtC$K6<%-HdHGy&rDE#V z0&48*3a@CsdgTgD@{(Z{H#q2`d+(MiO7ZW*UDd|gOYn_yMCtl>*IbH5qYr03^BUI;y#uEEQT=gWB8n|; z>8G$?7^+!d$c+MHxYYA40jTc$=N7!T?UoW99FV-Ij_?~elYeI}@ID6UTk0jWM#tsJ zlO+YC_TsVefS@c*z!ytri6XH9Z?w7zF4>cv3%5{?v(YB=_5ltk)F&Zjup`(eQ5n7+=wQQVUXwg1Mo18u1ogyBpLU&qf= zj_teLAjLHs8(d2U@nWy*uiqKqD=P)vAdwD`-=^mFhj3s7eK_UY=Z6x$m|+?%&jI){Se?JSc{ z5wU9SCC~Gfqh(X6fa1+`!sX9KJ3>R!IQ6le3OGgTS>Ek zeVZ@gGxDMbqv)@;Pw4oG@1CG~5dWxE#Ds;HZBfN%HP?CD6 z@s(b3%=RtiQAiF$cFJiA^>KQfCbkR=ef?s=9ibfdX<4raZIq?MMq+)wNTU;Nol`h`X$Ol;_nhq z`i{MIx|jFBZ3$&T&1&%U;S|0qf~n+N0tuZb@=B&}@W=0T&&`^s?6=93{QXcn#Fm9i zlsSy?`n=XRYHo3`$Bcq2E#G9|b!!{()~p@y@Jl?RN)DElZV@SiwGcVDGEom59G?JJ zVZp=q9s`CJlX~^sQF)(t<}N@6Ayn<-ZEh%zp8ynI(hrEQvyP`pt;4RL#5;+C89)6q z{ML7VUYSx7ZS-zBfebShyD!_6IDk&r0{!CtZ|XZX8~>6gx8B~H$Xy3<4YPg=q&1WERSRauU9W0HA4 zGXC0MZcdxrG6}Bhl0Cb>*PZGpi_t$tYPCwbZnWO21>^=B#8uCL<)=1WZ>e3|Ayd|8 zf2N9get_qa+B`xpFALLF&pKU5AKxu~~m`|z7-tK^!Qnu6=?>l?T6kM}NA#ovD2u|F0xL}38+0!2r) z6WZfGZHlj0uq03BKPx*$;`iXMOHNv7DI_K>sF3s+RR{|TwHJu|h$Y_}XY#mJO84W_ z^?lw~V!^Uv2F;8x_wCdwvl~eU4W>J#D9{Yg^ESY`6PAM?Up?>(853 z{iAo(B&3h~&t!4RFY#eS)6V!Y*7<3nl9Ez2;#PdkEU3wKJ6!Iy@##QhRJ-uwkzcBr12c>sAQN^a7~-=5If+^g6Y%+B|LQgL zPaEqts=r_V@d~xnY3=P7>eRtV{nPkvYxyAf8*j=t>HbJsvo*89&b&D7R(BuCt|PMv z=2XMTl1=f~bOf5^J7*20<^|_L5Ov}~g(K|hG!EG*jNDKD9i&d_;}+b+-ylR;nmASp zqR(3EQR~BJYAiqjkQ{GbrvwE3_^CwDYB=OizM-ja;(}KR@_1L(f1BDrO|9S~ERFRz zzSA!GPDb6l6ZvICu_@SlY8b(B>}YLysW0%dS^Qgx{=#Pixf3(utmGNz5sAf($mxBbpK_J z28V}nLc3mlA=siT&7BDWXzf5f1OV9x)U{^%{jagE*kP!Z1~EEpjT<=U2~1HaDn*3Z z8Z6o*|M17R>B*`b|KXDVcl@%rN)oHk+=|UQis3caTnDS4f%C!ITOm}$($V$ZrZ z11L-aoFAjCs+!!H1)!+6q@X8eb^w@rtdn(bZ;x5|=dCkSlovSm#2`>eNJv~l0^sBj zQUk4de9xYW4fMyL9Do?AhOiymP$Hb37jR^*D(}m$fKJSxIqla42-N)lG14@L%BI z;IWh7!FO7fjYM&9&^S8kDrQ0Un-7Vt7~bve8G4P++^N)=RKHOyB=EF+A)rg(>C<;R zeYf2sjA^`PY&W}pzh^5Rh)SX$6E2P-nJCrKQZGGop)!HD@{j!}>AWLXpTA&5L-=TL z(CTKF>xe|?o4M}=vl_pcdL_vJ`ZuH`la4vg@vnb_WkoS8fB*LYjules@4u0PTaR}A z=da*9;J*3i2Z>(b<^BC*j^t=U#6Pdcj6;U{=hY-}7{~s81#)Mc|1Vxx6p8%3HeSN# zJg~DlYkIyZiC9^8(Zjr{-N$L#Ixx92?T+><6SD$!I* z`wrbvgx1#9*M1#-f6jO1c8gP<%#D+!c&?$UvYz6us4DIm5#}q{Fa2ePxE{PbArS%J zou5BRN!A9rA{I0?;wd>WMMb%xzrPt=6vgO8YJ?J+s{Ffn|8wC!e`cT_GgSIhn$66_ z^zM;$ldySpOl+(W{7~%w_Cx)oD2aeIqlDE|HW}gmGizuxS|gb;mHm?6T(f&T6&K?= zJi^Z(Kd7&sDP>mnUrw}j67=v5Ystitd-p6A^pR977YK^~j4Gd+ zC6TU)SUwI|pCG*Yb*cvY#$n;u=RbrWihVx$9&xIstEw6$d)dp&Yjg4ZX?X1=|vD{MX2y85;5x#n^vpBAf(cS@bXgNwDc zPtISI3)~>cG$4*R-hKDs_Ai5NTb!r$JkhaaOirQ8eTh@m<|V%fl#hNyODNskv?|d| z&DifD6MymXQ@V2a-mIH7Qi_52KOAc~F~*P3X$c9aiPAF&7k&K{6EkGiaBOGXoq>0H z_s***@_l|0iNC+GvJ!J$(9*Zky2+I%wg9QNXi;TCsP*EetLrMKK!hqw0UCTQA zF3)%8H))xe;{Brol!AYrC7*cvmY9N-fbFO(`YRu%F#N#X&CTt$V#LW&MPYany``n4 z#-YREpD%^+=)IjCvu4%PEJG!g^JJ*O8{?HhmnS|os&Cj8Im zdo3PQQQ0vs_}N;}aq8a|o=Qzt$oA}Q&1ZJ_eb&{e(dDr!QrGw<|Gg9cehq5Z6aISm z@vdbi;aX&~4U&pO&TQp!fdY$=?Gx{?`sm`@Ke~x!yRx(CHI#7`eV5fUzb-FFWzROb zIfu@-Ue7DGQAQw|J*KKfG53?AyQ0Qp;j90wy`vy}qtS_0OI*Azqr4$H%4_=3Y{bd0 z!ria$$k-N@#%AI+7N7cm*;#*kdi*_t?_PmOw0&2I;@*ri4-e1G-tMl(bhG>0`Yz`| zN-uHSR(*B?2*FgoW?VPdW2!#iqO4d_OtdTzN?Y4~Jdg%+Q}JI;HyeFK7sD zmhgty(6zDtFV7{|N){hugRCeo-}|=MadT_VrmNN+4*r9S*C+7~`V#5(N$)3bsYDa0 z;F>CDnAceFguN{{sKysbW)!M{LQ~` zb%L28A(b8a=-%L&d2l=8S~DzrSfS{Ev8&@PqYpiiC*33QBTv z`llZkZ+&pVePhPH$&hj$`z5eVs^*CMCYvEkHY7MWwg|7?qSgj3k;Rug#aB9m8no|A zIun^p*VM1s_$);gZ#gWM z>d*y#W4qB=RDpiq87$R$Pt=;%FYC^oA0Haf7rE|aWvQvEs;a4dCQpv-Di%E}AP|Sj zY!9@S`}d)$)bS4PyA_Pnml>C6UY~2WZt=*e{{wa6aObUI&CN!ejp21AZ@BV(!5EQ`|-(EhH_Pkr4o}64`Tr$u!sx%K}erG2j^L>q_xK$dLvXZp)?nId$ zJ`p*$^6gwSB^6b~a^g9g77qp%79F8qt8bzWzKlFv|9X1-;nbZ}`XEQd5|gryJ|IC& zc8hoIO!$u~YCSK=%v7OzCz6Q1tfN!pxhp|L$u9Wa+0N)uafOk(dQ3Licay^FuqapI z4!-XSt*J0Vs0}ZOOpc|f~x*-z2|6taPuhoJ~)jSbqO`{QE=iaCf)L!vwjwiNtb)2gM}yzI&V2 zWwN*wtzNTu4CYO)Z_W3%!gC$dkYIEr~&7MWGfQ z=UjP$|3K!$ZMsv{uhX?t*Dw0_4tJ@h{vkmb8jivq6gjDuc>nqN87@^%gjubP^uo_# zmwvoCBi%0yDdQ4Q;&eaLj=?tE$qs^QMnu7iR2!4`WgIJeaW)O=bVKm3)fUfpLsc4) zL>gWE&p0pnm0o=wUMUQ3R#SR9j)Ki6pIDy$^6Bm6zB7TmOP@YPmvqC4$hm8fn3}2) z;^4qN;oeu2x3;#%BIPTBQ9cT;E z5*{78E4UObk~iLWLi1B~Od!19)Y$0o{qyItRssM6N`V{n*VX#GK0FJ9jz`9HK1Mal zq#`hfVXG$C%gxpGvE5VJcC8)XPB>WYfnR^vCd^G7IZZwq~2OY+gU~cFa^2X)u*nxO9nS9+mNt@}Y!dR7k_EGgMUR zLZ;;@u+-2#oSFsuiSwy?XfC33)f1fv5#f}fJm^X~8vE7J!gTe%yQQUP0~wJ9Ps5Kx zR?^sHMrLQN6`dHqtbX|tPoK}WJdh{tiFy-!l>Be@)PLez5=KhHS#7URq5^cyYzb+(mahm$jPgMp3Or>(IlaGVmE_& zW*VG-Z_N+l*+gI@?SnrvTr#(P{fU*5SpsLiH;&?MHVLWCW#OTfS6ROKr$=9uO+uh? z03fvr55tGmT}CdijqT)`)gH2fyeYCsEt#I zx!7!>-%#Gee!e<4B`GK&@dGZrnn4MwhJRmhbGrn(Lo`1x$1~m-o_hz?Ng5BjbiWySmW~VAeF`97cejpYTb& zrfs1Lr+f3Uk9Jn#vrY8|PLoGy`+5i5%_(s;%!%*wch%-(GD??;7)nurB6BC&>7FX* zcL_aa8~MAajGMb2Jo~fyAmaGzRo3ejwnt%~Qf0Vb|9C6yIjt@+Ub$RUV3lFHCWJ9= zY}4J>UJFk5CTWNkv8>fdKPVK{X&E@DqCMvmCXz{ zbS}zxFC^geay<2kny&-cx8U|%>(7NdKc&DM$?GvfH1xOLSU+~ z+IR;~K7`Y)E1w?ue;P=Yp5ydfuF%*clsud2OW(tzM=wm`PO;Nnx+qZ9xb4(me$WZyC zP!&IZMjbedoB36C0Rdpxy4H&@sN3JwB1QEXEHIcws1acZ8!5-3FwDnx6VS!3h2#Q`X{kJB{z} zyNUvhgh(5n!L?^!`TZfH;_@%l;?jUtTgmSx5^339;28OSzO2pzDUru;@7!-`E2=Y0 zK0-)j25|PU3SClXu%loGqLtaD^!L8M(%0{aCPABEJ6st5m1I5LCw~A>(d^L>RHjtY zsyyxOu(PvMP*glUi7dvHuFaB?a-5HBoDLIGQ6@;etS8#v-(N(ET+h(sTh01C!A2Xz z^oIT{{Y3%)dES zPZNg`G_%@WFFk#J`unsrKpJ(5O42+VMSyt4h8sohjxNzk7mnTDxOX)?(+ip-;S(A$ zkH6|c_7Fd&OeN-rSctv+jrR(T#$>3;gvIti)7KaV5sMc=a66Os6b0};LsihSmWWo3 z?HRb~<0CO_RG7$-sW+q}hH;OS!;2&r+OX_OsBar&z38P~w3mrzV;UeJy}_f^#dA;0 zwp^%s*Ij~zY|Zb>&(E*Dy}jGT4W}?&E7kqO=kx{n?tW&tgFfFXQ1T$#-h7=8Q)Hm= znBc7FP7;55~)InvLSP#NDFLsOgmRzsVq zKCZ153yVcF(g_I9xlz2lKHpkfUnqa;yb1SH^&!3n?z%BkWXYMBt%vfrlI+Z=CwU~K zrCR`^n=A+@^Mull?MyUY{U%SEFZ23stO#K8lmHRS8D;OPqAn*d{}+J)o*f<@o{&hAogg&h3(zJz zcKXtejJs0|?X~fsU>pC-ximXASH&<>i`nzd?j;?o?21py2L}L61>P?8(InF{ZL26` z{OAF~k}&1#pQJiS!$PGirn2W%an>IR-4-fMN1tEXa%-sBP}kD(B;`*~!ec#%vvDHm z86oDnjqVyqVJSgzahq3}lmR>6sF)-nq5cNkAoaiq+T7vq@A0|4Q>Lea1kDFISG>GL z{X+LPg-k3S+f@m*TO486SWpF7k{bC)%5B7fEy9@0tj_*8S^OEAy~r|wAe(sDr)5e* z0$B6eG-gRvA^NfN=g&JaHG53D2=7|QTfV@NrZJ-l6e?vf%u&UyJqeujWZm-G;nf&F zU|t9sFV@&+`pCJ=uSC$?{y>`bimVc%{a_eZ*uX4PV*gvm_xjpzCQ(VW?;;7Cm2#ue z<>nKtt&2b_?cFRmHl~%dP>oPwlIuC8|^M9i!0Snt2Q#zn2sAFO_Aq-=GDOaNVt=( zxR*Owg7Y^o1K4&Jmm(~>?*04s9&A^yUOfx#)(n24=BlKQ5u5F?iT1cI_1TGf3Anr7 zTx-qEh?pw4n<|Q?WwxSRVLLRlqxYraL)7pHvc#VsnV6a(YlwU9pfzjkOUEJ{Yw_|d zSfgxmq)5NC&^w@{mmv`8(}RK1O^7B&hv!f#XD#)pJj7q?c#gAZz%qfG%->n0#Rp{Bq50|123Q z3_XCFsbA9O!0;k8X~vk&+o3B|7!pPfpisO;Rb<_mZ`}eoGae-M$4T*TI(UVk1%0ym z;KrEd_Ycoci`3$^_f4)Q0L#wk1{zclaS|-cKKHdUT)kh7%C&SZGlW`69~rT~6hD!5 z16>$*zp#+2wJ`MCrQO%2IEu9u=<=tL{WVs2ArC=2^tHNcsg0NS&1jc?F3IAYJL#cv z2HN6-DRoI+F&-<0d!|SvbFol6d8tXIjbKXlWh6f9jTlU%|67z+&MU@PAW+P+?SUc& z1lhT{3G{4iY!{$>h__qM5+D?nH5cwmHH(w;DD?$ws+*Y5BA!4=Q5Tz&@b&e5JXd9= z>w|v9|O) zFI)KVZ%vd*g#?wvJ)w5hq#0BMS|LDwY9-g9kZ3dUWdjSQelS@?Fb?#8)YG0;m}J)GX8r-&5|cC2}ex>v#a|_fU^vn)KLEw>b<09Z=VuFhEmN6IfNXWgVr^BUH2|h!;~OX1Cp;bO+cj2i&%`Po1Z6#CV>JlF7e8L@Q0GwUvy+xHZ`ON%_&%#2r?W+rn`LMUW zB7>KUvyFTIberfnunjEbL}C z9H3-sp7*AN1Oy5|r6|}gsuPxjZd9f;HZn3|mPksd|7qTc=?-~Ms-ehL6Wct2X?i|M z?n#uxNxJfhwor~865nRwEu=_nw3X8S$7q1zSt)Td#e_y0Zv`3^!|E(f{ zOq6+(XBeiKuHKGJB49X6(aUwwD>vlc#p`pZ08R^je*Un7^@==In`YGZtXrXDbOHG~ zDN1908{hGF;<b8MO^7%fF&mGp$!Mi;%jdk62XMogI^Mdr2*K{p(Hj*kAM ztV$iR6w73V{A#E{f@;n*N;AXHA=lMa*cK)%qn2|SZ0uCM#VQ{W5z$=eJJ?l1$R>!_ z&`Cp&Z;+SVamF=69ieL#flHyN>u<2^8gsFSh8oj%_6;;;1K)tPF_q>&`U zSaKy@een-aL2BwB9V7-MWF$(@Pfre^N0Kb+6NzGI28!a6?Hwo-aC=l004|=DOyW*Y z29jV=o0mH+#KW^xlCD&2mpe{a5#N^d9*5)Z}Bz5xC84P7Xz0LI#(DNh2Y{ zw53*M(Na*e7b~~sXd~;cKDXbv_vkeow#nYR+YCItBO~5W3U<^Tfe>z}ywx3FFXX?R zFB@rRmiI4uU%Oac|qChbBI0+s0@A6qO1w`4BAbsuL!-#&Wov65R@D5V=%hF~Bl6GsA776Fo8Jz^oX8 zX#8=n5j7R!@dU&YYsDPuldx-5>FC8wS{4=|6V61JV8TdGRVL~vKadADzR;^{Y7!06 zNE52ckWZRA3eL4=G&TJK@z950MK`ti^IX~p)gvy-g)=Sq!hGz+*Kh1b$?7^@DVf$W zx}r_fmGY78(_s4Gvr4pL zyFXfv4}U*D*r)-r)af~H{?OQR>GoK;s+8ebQXo2R!?}`S2LY29FeRlTL9{Px432&J zm(>Kt6{@NyDB+W3oNtOinErIO#=Iu3^?qlxF;BQ(31fjic|fy5hdcW#1#!yf?JUuquFI*vjvmP-S7gPQiQENm}Wj>ZIGpUf929 zy7S`)YPPY=N1a4SyU>Za%LZ4#H-IlRRt4_>^pivQ9VR9w7o?=lUCyr@r(EIv6n|z7 zB$`@K=Mla1M==K+rUB}+Qg29yK@U;eOu`<>(+-f+NKXS=~v5{UnM zMG2k!8aP~?oSn<;O$e%KOOxH7CAo|iDAs4XrWiL5F|Th_1#xP6cvNR)(d|laysa1o z8r7%9l7(gX;I5UO6%*S6qly3b?Ojl`0|R64Pj-wCNhFrA&5DrIjseALeHqL87z9ti z8*5*C33fo3o2YkG+djg1-vWk@*uR+kx&_57(spuZOqZgVoU>=QJT0 z&N!Cx3Tr3*pOzBr8$Zb!R1@B0fp%V8F$#@{^|E^>yLA!cd%XmRTKiepo8}X+_xPlb zr||Mz$>PxEMa~2UdRVFP^*wPldo0x0SafG0{9k?tXvHx^95UYd`NnNyd&U znq?IfoXj|qYRyQ&$n|uA5>{I)wk+GhT>&ojP9?f{yoVEiGbW#^_OcrhnEU>7sv9VG6>+}8PWH1SpJY4b+ zb1(5~?gYgaW#2;&bb)mtWfSrP+#swiA9CNNDYi?s-e;)?FnRIf{F56WKEJ+KvJ-K7 ze5>^10Mpy=*?5d&AtoMm38|@NF5KfMOrKM$j1j(cTjJ#Uz+Eu6=(L@wcm2*vQRDSo^+E)B#tIX_+ zlt1%hre2sM=01n6kpBYLRyJfuu-UK1qPA52-K$sY*kbrGnrbqUs2k75P*gJV_r+ZR);(}-0K2{1-JKqIA(eiU_0tB((-_M zOZwy!JXTh+ZUQlWGi8wBGzpB7#Rw=ukc7MX$#O;ZT1oc}FOAx(j0r9|G3lIqI6e6d z1tPgckD+!HCs8p$_-}BAsNIqUx8H|;58RqFA6H85-e%Zx zW;IxH!uu?U@%?enKBS8N%Z>J&rw`o2xoSXP`&U%Yq`j!gX{^P0Pw9Z`$Wd)8j6#ZzkV zQj$35n?IBbbP!-H%pyQ|SS(O!yO+j>zZ(nfn8dd9RR(>y?ShQQgb1@qs9r~V^EW(6 z-^J7cAC|6WFy}%c9!Lu>EG}}fj~_u0EUvbBeS&`kO*ABzr%82wEe5Z%n-&9ZjE*0aX^5n1%=j3%Vf3vUIw& z@U*F&aDTm`@UD}NPZrdmdUQCB`gLHqcFAg@{8Y+g^yfdM5-FY)zrrw&$FkpN{4*Tu{7H9o^2$2BKFNdqo&~NWL1;T zlB%{j$+GyfeO2Q#YhciVqL-B>^<5VR55DspNh8i|Hf$fSPo>$2HjS`R1w606Cfg9NphhS}d z^l7v8neROM`C8Ss_ra3P#uwt|1EPFG&=0ZpoyPg8d#HxQYyf|RLIDIxVJP{e1q_D! z=zLzHt}!k}ME~B)OupE%;;kSv@azHn*3gNNWXZOVcSZ?uY%=saflEpFh_fa7=7kN* zIaeS`tE&v)tBs+)yvmdc2!cFQVel$T;6pq@{QEy4sOB6BizQ2$Cg7LOeyJE9V}^_s z)Tf)gmO?v{yXRNYWkJ~DGCArpg=f<#H<0>g%JQnv+~bMj1U^1K9$xT_bs5Ltr0>Fk z7s@Ob$suUg+)Y}C$Uw9<(zX(EF2zV5)d0dBFdwSIMIlmlOHv+>)m0U#cSRP%HCK(X zTmXrr`I{h(TWo|;fW>U<^#?&0DwY3PKAf-uB>q18TrlfasJXbf_!RE9=m!Ls<3jN_ z7`ydKt~gl3LofSEzv!wE63*P(+{{p|v(ZMrjV8wJ`~f)y%Op~i2kWxE`4cAJ@eJ** zWntF;v0hQE#=od>Q{}8cUVRSElt(mI_`b?ynkZ&>aG^7bGg#p#1&=VtqDJNm5J!$C z^u&c?)BQ>lX*Q;6wD4GU$)4jGls{$~NM(yxFPa!8(Ay>je@c*G+guC-9)Mb+X}LZ& za#Dk0Q!Z|b$ACtNpY)iLnl_`p9nVIzb2sAjcLY8$WlCC_rjxol0l#YK8Y!xhvMq97 z&Ud*FIJ2CrtivFL27olsw);RH?iK_&WIPR3*G+Y| zJe(;G87D`c8lHL=9?tX}R=yT@c@q4~wX`yxer(fO75VA5I^#BIv=d1I9=M7@KO7D; zu1s!pF8_`Eawod&jYZ9t7!FnaA-ea{rpc88td*0MEW=46Kw#98ps}CiKCpa2%x&E# zS3Fay^12D z&$0#U@{9A6;!=n;z)jYTVb#nD`}5NUz7M7QvuZSG-pA+TF1cL0204!1OuPfozkcxB zsFGnbik8)?gYT+Lwa6EEqoSe^Wej5*r?*~a@Tel+CesvyQx9FLcq{C1Pw~%67O$S+ z-`UFp+z?WftVj=I>Z@FZ;6`n&UwS2Bk8y4lJ>?XN8Gp?onP4=dY=Z2qEyLyCAE#12 zG7=KT45o1;U*9F?)EqdQ=8dRx&?OGlXu#0cTGX;4GV+TAD=B^XlC`YC%O;cBNy4Vm zsO9=E-&g$__t^GH+Nz^bGVL;4p0YAS5J8z1<(5IP;>YcZI1M+}%Dr@VnW3PdKu}sT zOXn4qsw`o}IQ47|EXK{sibaP*<%9S_9jXP}Q?!wv7zdsqzT&)!25(hkzDaN45N_=h z!&p^S)&AnB(qW3Gso>ll!Ywi#t7Sdx*K!NAhjsYhD{eG&Kxq?Si z=dn!->Gf#h!3nB=+6h_-Pfk&>3z{h44>Bq$EaRH$lJ$7^SS9wG@+gVI?={tRaQ`wY0-c8i6CYY?gX|C&p_bk)he#E02s<4+R7&vmF*l`V{Svv%L{Qa@DHGpYELJXF%O{XZQzo{DDY!WRI+y_bZ>wp|l)ucQa z)w50)l0 zs3M^Svy4rE`|rlK1?BK#f$nP&B>}J1Q00%%P#B#T#F!HWvvYLYFIlqmwi|=iO9M z5JEZtCYqV92*&u`1a2lt7sMq3LwbuD$G|0&y}ppztZ=9J*nR)E^2s*Ur{M#4S}mD8 zON^B?m5OM~bpfMOo1nCON76_0B11h%nxc^wd=I@5?JI1n$ZBoU%UL1}(Ha9{yel za*Ke4yd&7DU1eFru}X(ine7z_7+BWY#B#+JL=u}6hw%5jeEAY`SExo7#mA6e?lgX%8 zDrzO;>8|`~aq<*GkXQlRW9Pw*XNd#6c_}2>Mx#^@hz}rR3gxB$29IEgaY7dGZk})Y zzAL1VUWejKq7%ErQlliesk&c4X&U$j0lWPly;Po4)v=%MIaR$*8i?w|ZX#Gf_uAj& zGEVLzh?zzgga8G zoE{(%hnJSNv zdS3fKmQeY6L?j$e`AQ8?CM6$#c>9))21)V_gaJf_aeB3L6ibgi&(iAZMb}~GeROT@ z7W}yTK89d}Fk2Mw5VV=z-rh31NiA(H4qV4n8wZHLY;dwx7Ue&D2r=oH!d!&=9hC2V z28bZEU7t#2&%&P?2af>pf-~aCSKEAie3l(a_5<{G6FsKme}d6cu>{SN#uEyVPzQyC z6XHK#p0>9q<=m&=@^LN2%+U!YaA(L@5*klc9kz(rn8%oCzIg%;Gd6`f-C29R7h(boF4Yq1|ouXqO>yDe(Z9a17=OGeP+&7IO zHB)0&^>fo4ei*6 zu-_ajaA0fJMMemI9s}#e)G?$6!X$;<|2-%@rynUxcIJ$+p~JP-zk3w_aLdj4&Vb_GjBNvJ zmL$v3#8lOkKV(!?R3HOcAnj=ZQ5@-NdzN~pUt1z`=U=l<4V&sNb&#-n>EhY2o|$Y9 z^t5rX5W_&+MpN~uTVm$(>!ONGP?BwSzcIx8hZXp1{seAdKi?seOndR!&V-&*l7WVN z5?<2Yt8;~us7S`s&8E?_xMJlGO-Kowt?(^`>}2f4FlB_pklfVLJFF($f$5Mnra)um z7msD3&0sO(|8tB3F3Ar47?t z6n7DX=MWMDJwuhcxA|`;MA-o*P$Ig5NGNOK2TJ> z3KfF=ethhP1GhW6k)(Cv&(h$|8d%CXq^FSQMq48Ea87Tsqp%3paW`aCxjF+f`t3`+{ynr zd*W6n;s0+j`ETX<@9VTjDuwlE{{7K^MpjY{JUljlwUkZeiecGjPH=4TmE}V?uYT42 ze@{Lc-#j`xS~*J=-&LFf!7Op>M(}71M(VF&E4&jfUOT`?4i>3$x6uN>`{oM!#(xx; z{iFWJuOjR*JTLXD7muJ>I`iJWcfhfhctNwZf8u?`!s4#ipqW5VPfv^<_;dJ|d2Jlpn5_=m-a?8qEHCGu$`!rQg zM4{_%eYfAuYD=3tCw}J4nMNVgZa_s8l9H03&YFL~sT69Sg90dNnUw* z+g1l*y5gweH*a!&V z>-O~a0+OtI#$x38?S0pSt9@pdL7?$)c2+Bp2>S6cC53!8stO@1E1PldM@NqwwCfQd!HMNkSV8{P-gB z=;-!rcEe3-{{G}S&`1Q%oqNrw{~4#u&>JI|ls{;OHPFsqquYpuY}ag5!_BDZX#Uu- z=Mkq+?H0O1EibyHkddL9aJKXy9)=K{k~!mHbnDiwZ(l8Dkd4+a?nl28JmxwES>FLk|-YNU+a?Mdg$k1qJ87Nao=59RYQ}Llv+wDFhZg zEW|xfCjm63>lPw4>cNxcq;a%>9g|04kk7-9CuK&*iqyhx--auF&Q{6-J9@XakMi_< zJ>}-&JX7yzcCe6I;nxWLhvw9n@8xVt&YjH62Cxnh_tn=y!{~qYDsfOXmq!%yCL4}E zv^&x>8Y%3TE(i*0Uvznt4gbI>l<7FA(D&WKYt0hu(-RXD{WzVsHs5#I#)N@fcj-Zc zCU+*F9g?S_N$&>+Tw&frA#cIU5%>BuAO=t12@^IcQ1Yp$sO}lCc%GG#@?RS(;>~S; z`V>|z=K`b-;Ph9GB|=W&EI&V-u1no` zb9gV`ya7eIBjA?7Lpf;y0Zn++G}x)Ccn7|bA;uKx3jp|qw`XRoE~Piv!*o)=f`XLm z@JE%EX#*9NZV1A`+2Q9^0NiO35YX&3l*=WG5hEh00zzim72u||b;qppBx5R?kzTc0 za0irFzZ*d{ZbR8ZW((joz}qk5&P^uf2U@>Mi2H~+Ps-s18ke{J*5vu3Kp4P*qiSh| zv}J}lRFL48X$Y~B3a9(E#g)&Wt1Qu1LC!QBc3RXgRC+j+cj#$Od*Q-`K3;!NpjKM6 zYje?P97$cP?0p~}`>zsQ;0^PRb5tg8fqV5U#nJ)-Z@2Ek6qfF77!Fckt7PDt)9dc; zhNlW#Sy@RKr-b9WLd-j@3zJLDNA=Osy+8>_NlCAn4s61vbeEQvirRNtk;|-CKCE%v znri`1Gt+>j<|9ltZM>=l<#s?kxRybZOmx%%wYvaWDi}R6TYyrua5^RY6#O)R_ZmAy zkT&`N1L6MO!0p_mseX`Z8}81`1S5qas?KpVJFSvz4hV=n{%j{n9j)=&;tDf z^XQZ9q_A&bAOoS|?R_5&<7;FCJ=X03LOFHm>FN1{Rx|)8mhF{p@7KfWxiC9B3l-Ef z-MVKFTI?UOhQJqibJdX9psvG9gbVY1t|j^Ejx84;%3``BxY$n*J8~MF`bmZD?2&^> z#!q4Z{P4O-G3t4He*>dyb8}Pu&&^57--bFmuwKcrgv|`J5Tps&LG6ak11^V52J}$d zi!P!pP)ZuS%nOymf~Lbfod6Y>HA3(p;}>(yi}`um&grZ0)T1vPI4}ho9ojZ0UO?tR zxoZ@1UaCj8+JMr>XONAb8o0A&%(>-h5EB!V5YLXSLdnTlV$84m#>X?0rXW%};w)PD zC6Q2J_0uSi-(haB&s#sKpuGrv(dX zcXu~ui&-R!uz5GybsHj72fJU-EzY+s{V6L7L?5)>`u^Um5sr&O#s|_F*hz-9?r7rA z3Ilgu4G+_gw?Q@tE=D7vvvEvZTpEj19BDT4Pe@SEj|-a?RAg&Is^Q@$a796|nEd@G zfrc;WuJu=LXv2?4=c`Q5eUtTE_W}Z^>kn%UXTAZVEY5)L%o^c5e(@z^G_bQ;ot>Q!H`4vY22$+c_v2dhqeqXxC5RrH1gpN#&IW;?QI-J zKy~QEyIbZD{do6v9|UV&Gp5AiEb7N5*qXyWWk5#*RUl!Ae#^Gt{k$ryg&mAS=BhTA z-1KnM(i+^{^uqQrE2O18bgXBf5!>3@(vZ9Wt_Vp-*hjy%;9mlBs>R5M`T1=X9sG?q zJ}3!y1J;JSLd4J-9CN z3kVFA>$^k|BK!+eQc|!gg(dsv))o!?{*-09vNMWrUawg(!q{4Q<2<;2u#EIdN=i=M z*^mL-X5%3%#$a%66(jb;!Jk=(c=#uo5K$r^Egksk4nObot;xM_Aa5JEx|TyhR;;Xm zx2bM?`Tm8^Fj3P;6sJF=-N$gFf* zcGR|?1U|vw0+YBs%<(*y^T6OiC+r30>;e^V7W#(ZprrGFUB^v>R)^s`00WGwYVEsh z;H}5NOj?5jY4bZMUr<~`&ybR`N;<_PYqH(a=G<&T5LAku^9#sI1PaIHk%36 zKI!{3AxZ*JYMiMF?xM_uJLT(_xFm>lwon> zUc5jGSHTb`98ng3P%+B%?wQQ0WC65;*Pq3TTEItZ+1~Xx)%hg za++9vam&cu0=^#=Mm3?(vbRqJ z78Vw+X>~Ys0`MO=WXT0yO&}Sptilg2q;SIa4XNAPg9me1I(-B|h)ZYh zUrH(_=TfqxXL;^u2`J490|*KxWDfs zA1@>g6Z3x9m4PH5wrc%A1pi!t4~GE2!sh4a2Ziz6kS8=vcvv~m3=Ka=tyaSOXLu{oM)gOWhZCXVjq{KWiSqHOwL0jl1G8vmw@T+!gi(&y--&bm zA|Vt%f|1J6J>Nmna-67mfD-6@wc^7HliFL=#JTuPT@8zbO= zoM=vVS63JSVXyAosK4{4iS@`X>@rV zM4=$H0?iO^EH%G04AgXXD$FKGo?l;IH)B_eBhUQB{0qn64NSKhN%Bl@zo7Ex77_7; zqWgQ&Sj}FScJg(}4XL3?WMCHh^(nptF&GF7;C(>@&QcO9~~|bO``3Pys`NmbAI` zc&LtzO-)eIO557n5-z~>(46%tA?A751}UG^r}mtu$p#w~`ToDV9FAXz0K{JMc^+r^#~QjzKNY zWd&A5GdTVDiin%k!1BmLc_71Eiycn{DJ8;>_OWax+i{2u0(HiTDJl6N>B`N3bM>ab z|E~frc|_(Vl%=}Sia{;UTN^fbnx*1?mK{%(F*6>-eK%sc~4Uicy02Y{mh zJ%l;wQ=dHf4Z+VAC^R*7u1n1X3n+6j^9hY@nnCY=QVY8^@JQ>I7b7X%Vr2-Do(QxWc)aK!EWVv zxl(SFk6UfjD$2@Wzms(x0cpLfyDHvJY`O%nSieBQI!qp;?xVHxg#!ZMGKM#?cgzf+?OJv0vCw*vG19pOfg0cX(5d|Rt!W0DinlXE{btFdda1*m9 ziV7g1l-dU=Os2(XA%3t{J-&!D7TlO20cNO|M`wU`y#~#x6W>%4$*U$<^R7jMBr11x zcY?(qK5@y}9{3Vg)GxrtqFMNy2|z(s*WBFFVP=hf5Y9(z$hXSciTy~sr#|pW4-o4~ z`ud2>?@w$C4N}DT*-k9hn{IU##@YV^$F*OA+zDb9;GIDe%O$}kKcm*xmzO7ikO%I- zfi<~yt<-CXITk`?*onsMSR2D=NLjv;mnd`EUhdx@6X~WpOvPc12bnQTJdCIPm!HIE zJwU5aVEY{moPMsn0wD$a;*jo5`2&V=6O^3w`wK7;zaLzo^YZoUth+tNbWq#BzhJ)X z;DEX9V$N;(K2qq$$5%fC#YsKaNSC1iVW&}udVz)CIUJT)1nGk1JEcs80hwSUQqNieL@Pn2aP-2Tcf*r-d zr6ELEHmgtq9=tUh@eF zxdXG^sGkS40Pp}bhS%l#!I<3{gMbn4hyE2|F5&F;p*pmWL$tLDc z!?jnmyCu{x*8sy#P(@#slRH0#nfx_n?}{JPd`X*Qn8T>9s7Vkl zZ*GcSu_}G3sUK|Gvl+IIP51>o<-NYD(V>|OXHAVIcCAvxqSKVV_}nPeC2jRj(hE(2LD90Hp1vP z#iDf%#4Y%4 zXYMxL|5-jW`xTfGEJT}I1j|#1RKPU|-B~Mo*7~->@XLrqibgM9UIQl{e4YiNQsoK6 z*X|kIpNP8n3Pb?Ty+>&u|L_itU=QqWUu*uGY?+D8K)B>UeLe$9dsef}H*D?;k$&_C}x65WcFr_HG=)=LIF06v3nkDBgDZ zNB!8B7TK8n`mqaz3x2uzMJICHqM5-#H!J~t37>y81_%MWJNIFC9#NzIFRuPMEYq%S zAII;SY#Wo!X|io=vTL%<$u=gNQ%!bFlWlip+s60odEejXy`NuO{Zn1rTIX5^_G3SA z?gA)Wl1_^xDTmu7f`>JQ3Hf-TJ5oM13z)&-Hrsia@+Iv`d{l4XdL|j(Lbu}ia{!Q9 zBNXt>%rRn~hXAg`5|DpR$DOd7J9_}^1I@btwaM=M?6SDHXb(NWx^;LMP8Z(g2&Gar zdE&w=pxXjKNe-8zS!gf~9s*MUny<#j)bInAUws@1-E?(zi+1A&qHuvm8Tt%XQ*luB zrwGw;GlWeb7P-(q3(=ke+DoopoK2~Ks4zVna5A<4*yJTaGp+<4h!#?j1Zb#LRtN+z zzPPC9Ab|N$U%53?lTdxN|E385ItUc^7BW6VR9g4F4&ok%0Pa0}aA;_$)ujR;V5P;@ z&yDc_;saQk5~#MKrInU9#p%}q@`>E(!$4$BnhCVV&}%oI0CmBDz0o8DaGmr35aDoG zFXkdW831Muh<=jfK4#q!0*wFe)|Qc-U3E-;o%zHb^{^@t@Sw>_qoboh*>$N#QbSG6 zw^|cerbxgC{7#M*3sQmnx*C!Sh6O+wq8qwMa#6Iga#?TXH!_2Zpq%15-p2d?u5)1IB zK=+0W0MCY@f$@DbA-{kBcG&JOvjRA2&yRdK6O#hFDNaZYqce2q;_@=kX_xcD9b@=m zkM{C_y?%5_7v-OKwedP1pfJgdFh{8+WM!Qm9F%5fmjcu|P+mPeItmiQZGNdUZ+#n=I>?NVsr7DE7c64i-;fk6OR2cWzB$kGgu ze4uOwh(tpSN3(&fg1fu>&GCW);S5kY^5JzdSP@hJ*Mwk<1JuH=b@}-LKw?&H9OxPb z5T2q&6k=lHr5MAst&amP+5})cQ1EmFV8_;{pPUXrm0XaurP3=FTkR$W5sj&M@t}iPsFDC=g z<=kg5bd!@bG&H~<9n}Hq`j@Gph6rF)T>P(0R4dR6FESdq7KMF&1%<{eG`t& z0mfkD;Upx?prNS%-;X^x!>>{;NeNKl-xL)EL0mg4{b+&~S{bXO`2W)zOS8%CeE<)S;Npg3pI7YPjC=z)X3+4+M4L@aj~0CZ0PbOSZ0U@7nn%49l=Qaczm z_l`yJN7)VXC%ssU%dy?3oh?O=COhm3F5C6-i53U4*Q?#t436FQQ2T9hMx;_6nLo+D ztgso2<5vUFxUq4G2{TIRk{^1A4?k&eZS2*!zV217+{5%mDM)J8k7NT$3}WQiD2b=X zAoBXqO|OebqpYP>|49MBJpgjfeHBG4ur^HvV}#=r2#obqrT^dTmxdV-5(8Z#98EPm zaqWPH08P96esA8qqCGxfS?_Lo%O_pDZ`Y~k(_K}d^RR@Jl)YUaZu%D;K}D2V*M}CT zDHfI*hf9eVqU&p9PHfb01s(5~&4M#3-VSi^KvJ@TA0onJ1^GS`4}=1T9xOC86%4xpB2e=R}iQ1RE6ImmLn{$+{Ti_1uhn>Alat4Z%ahd@4A zT8r5QFezYQU?1Xa3OK1AoWP5V3t+fP1zqEZ$ymXO!`v;&QviS}@EcdHG0}7cz z7I&9?P7i}qav4oToCl4@3un4s_nw|vKSGcMumccxgo8!I&zJU(Tz9DX6;~Efw;p<> z6ukNN99BWwoDlcliPsaC=`#T{<&nxraW1ffg+bu0@_eHOV-ZH~7ONto@e9;(u4v-? zgFNrS_?9>f^yQ6&`n4`EURhmr6w)r|Pokdr=NK^~YwrX}>6AgbJ3`epp@5@eb$uNOymvzx@4K(B8rVkRjZk zKVh-azOb?~>GzwNrQ{os@x5LFfqh~Eqwe^iq@0Y5jDiBtZpy_arc?`R7^ydqHNAy^L46o8_zbKD(ke%X`i^PjK9-XSCu0Kfp*M}YS*jDj=C0a7vbKWqVO3jj$Mo(C)$$TAzW zNtA9NaaQ9HUiMwXcAfDhkEg{CH2g;QzNdeG1|R07b=44;4+Iu(818Ix0gIEx?}#=t zF@Dzupp<7_3B{%TT~MdMrtPNCY-p?7yTyIe9F?qzslI~jQyVgy6sh{e3r#gL>;aJR zW1}Ba6r=)}lAm8B2&I7JA&^2G-S5Ea(PRO9M?XX^B`|R_$&+sDm`uL~z-B-(U$sfb zG+1;7@D(4Aii?|UPja|?i;sCpw=1uw=j$1gkd~C~&Jqn+;`NE(XWc+FBO{|xIl*my z-A?ZopiCugry>Z@lQaYibvL(rfVL}Fbshk+3_XBfeGY5H0RnaS z3;?K&;F^lV0AuM6fV>g^34}B>pV&NqDdW3>PMJm@QQT2$5uZ6&01f zFH}JMMAH;i3V8#>QoAS9;Do+yxu5U%#xhq|Gw}fr$>rl{w>I3?)f|3e{{&_?(dxK6 z-4_W-;Trb$5>u?q0xTMa89>Ssv<9o$0E_`3mIibL!07@HE%o6Gwt%>j*$k}Q92ATU zM2J8>jnR6(TEBYS1sGmQnEMN;mfr`4<Sn9BXpL(!%>&#KfG{0&BAM?y}2MdRCSXB-8@YiSiZI7nz~q&hiX- zV&M8;p9dc{WG|e)X;hn5$cGCc^EdN9y!hnJE}VMK&sBUYrvu7*D;6+7H(mG2`a7A= zfpTB!4u;8&4aE?0hME(Cjnt^NG^lrxprBD@R8nXD^i3^TP@Uh#P=MwC4dFvFJE;(DEWc+^DX< z0m-BO@S$Ra9vt`&z$Ff3sd@lh0FY6-D)L#}m|sohoMqZfwp#+ zekNcRlAH#&iHI0Ygs13si&K1_;lAss1E1@QiR<0#Bll-f+qGdb5IP!>!_m#p!kyXY zztq}5DF@%F$BVV5iGjPUsI!i@@YZhBNH$AMCbMq(z_ILqOzQ!vE>AXQX{f0xZ73dmZPOOmk;d%?GX* zJp;wbmV?FF(O&@PdvWnQ&I$ER$lPZfA~QBNGCYFw6dQxU6-fdf+SNq0 zF!mgmfc)U(n;r2Y)D}7xW@?#^Ommz+dT*B>J2^co+7U~?0QHSdFPF|Al@cEx?^pYJ zO#%+mzf9B^=0sSi!F~`6z*avq%Ghg)DjEoix@+3Io0#YbyPL4hQoUV<9V|Ws!S8Py zpTDbgZ|FZqBm5BxNTCdAEt}dtWt; zrYQ!G@mub(VaV^>k}_+}vSvoP;C;p);B(qD;{&SgM{IapTL>Mfa(dsH%};)_bk*yB z?e*=S>{LP}`TI6s$?MLeWq30O1O5b*m29~JRr!gImytl``e41Q>#3jkt0hK+V66#G z{~&<>aO$>!3PgaY0EUXFEu>HP5{d%plaE=juQFma;M}CFmKE3IpF)vBb0RV5x`5A_ z=t;@SMudeaBWuASzyZnn?)|Mka_aN0dLxSaJqBd~s|7neF4qM8jc?Za@*Nxd=S>bB zGvgp=cJA|~M&r-X+a7t0U+jHV67fO1_CQh;D7b?<9 z8%fecS+lZ!B{%1McD{F3xWDP_x^G?YG+w_aZ2pJQKhme=pDVuo_R#KCU%~r~!?VNe zH{TNIbBq|FvU|$aZGod{p1mn0Rl{~wuf64WeMbWN znw`B4$N%PAyxx(D|8BK%;wHIkeAR7Ru&o2NyWoSL!H49&X|G&dyy7oZuLC7S-w(&1 z_K4E;v{u$u|LS(L^Eb??$xcjXB}ZG~>}>t*pTB#$TbrJ)1=(sZE$S?--iI2mtgMt; z8k-}}kd8Msva`Esq@Vnpmg#I4&KLw9)V5ckq>AHEhyVvegv0N7A)lr=eU$PX* zEn7p<$xVxsvtim=_9nNB#wqJtB)iReqr>PXdGAM#&bJ=F*FKidqK5yxcR?3_qqguYV(pl>=0wxhU1@Ikog`Z{ z7n^_a{y2nwP_#QYV?Gf|%94rAIwg}@y$1ZfwbSFVf2+mm-0o!2D7^RSshoK>*t9vT zXFFJMwY|aK&E@qjYc3g>8kCGllI=P$em6gSbkq=B>UsJUox%L4sO`9I#S5ve z2TUQb=Je#O$L+kzX2s_D9GF=<+Y-4Z_&ISx7=nWxpc(I7ZIE&VP{R9#YgF0d!~3@6 zo1o1a&+R=o5;pBgvxYDu@(d<79VO7pEO5%H5K)n|I5E^3?(x$l+95 zL(Y_0W5y>JS{ZV@8{&pd1ILbD1dP>8I5B%6ovGm@D#!NEhW`ozS`{J9o9!-_SD#c{8B`@ZQ;L!?S4BJi_ zV@I|f49Pc37mm?mPqO6e!vexeZoQt_OE^%lR!j;K51{ujB-r)SnpyjC5X9`Ye>`S} zeWmp9a6v?hMuxX5$q|$=zT{Zve>@AH*=N$pCg0MIIPXuk;_!PJKGvuPVXO~LS=hPl zzdumDAIQ9KuM50_?0om{{q9dW)_5PF1oQ$JG2l{45&X|zG+&Hk_L1K&kV|GhW==!v zA10t&;p7UUUx^lcUk1A2csumwI=pWy^v8C4i2`zh$RIuG30nnlR-Y$j7*2V!rqAz{ zfVQ2Jdx3h(QdgCJLF|!a;I_+fIjdFaF1p$&UG->^hT}B}&NM4Iq)iEz3%m7c)jG7$ zTf~&07O+g!rK(9Q=#`x-RpkZ6t|2oAS0e^1)n!;MvG%p3n2seQ2J*-QQDGKDdakW zzA%#h(bHb<3nlhEf|Bgll2%$zZF(V4!XZ6WJ|6AJI04buuT;&<`qVJ-<5u}%OHOla zj!s4s>7t}rYMUF5&d>vew}C{%#Ur)CUs1kZ3{jUm`X6b1C7BTshbz{iAcb@)m7gtf z)y%-@+bJIs>^%+zRcvZ2{`m@|Y@2HzvS*`=q?m~L1K5!Y@-M^5l==nznmb&p*Rk~( zHC^f+F~9*EsBS-c#2f#~a+%Ivh8ZNpf#t|d!>L^_y8yT4+@@=V85F003CBjF04DL)<(du*(Kvn(=(w%jW|qkn zAR(h+`F&y5_Js?tvXOgdr4g*}d-=67;Y{)qX3WdSTDZ9TcF|OJt;#}?foo7P+6g?phelx!ov{l~g9hqV! zbEm*Ypr|FTfVVPa0_l<|3(ab(AYL%VTv(6kOV5t^_XeUqj;_bCLvyf70?^^b#-)9%SC<*`t03J&r27H54^R?&tbZ=y0dTV)1N~l^6M|5#AcO%UDJ5Z( zef9a}lK9=BdZAA5-9T0#ph~^MC=Hh@Z&c2j!4gaGx+(eLKx=JIqySD>YAG$qV2qUo&*+KyxRvf_Rwi2 znbRyAwA^)Ok6nsdm=8l&s=^`;f$2=?W0ZSKT3b{8v5rqw{sfVsbdwL_KBrdtb#E=> z2IHNyL2*=I|GB~kKM%^prSDV|I3X;k2cavBl#L+U3Zbufh^3Vcy#-(e52{4M#^7EGUCjcb0sTSV&nxSV zZ+YW;gFb37Bnn6$C!;>vqVBUA-8r@dZsV#kc9R-{|9*V1)rC_GlEkqLHsm#$kB-I2 z0B?M zP1fYG-G=$iKLW4^=4FLm?Eww9S(0pdSQ%ckyrKc>&n^O-58C`rdr=Ko!h`6aAk*U} zF!u7)L~>&r{z>7|&JE3~Fx$>S=;-40e9b`$Tp^{v!+FZ;F>%JZLQ<(Q>}8tZ6WKqT z?6AYCJ@w?nl4;H4U+JX7lH1@-9!?rbwq_@W6Dx=p<;{*7P#F}Kt~A4d>yzZn9@>es zsB4MrOR)4Lo#f$phHpBzwLN+84$!3EbMWfW)8{0RB3D%NwsLZFF?BNaFgEsCIlk;O zl9aKwJFTp=VPLA}$+B%%gJu*$WGvx93x9eAYgen5=7`0xm<@5o#!dzJYp?t9<^KMd zkzKhW32V3jvE$g`Qr_y>hmzS6O7UP3G1mPmc6KN2@7@z_zIKr6z6oR}UwN6NX z%9__cs?x#-jPJq~FJhG(xIR0?Xs4RhQMgincT@ahc)x)KW2fyHe6Cel<>=rRG*LBk zHtN|PJ%N#Y+^SRGrpeydR6&R|pd)Wrq}+#4igM~LFQSHQ)Fa*zaMrgq>RniE6CSO~pa5Q1tR54qbMlzc-m^9@-hm+IMt7*+?@ zt*aTjKa2Uz@$&NLDsylg6%iohq6Xur2g^T|9?qlJUt;_HuINN2pz4h*)`_ZCi9oHa zI$dAtZ4mD{BvwXx2p!Uf2ANT9F&jXH17|Tlb_<)g5U!0j>=`46H(QeA({b4rY`6&G z9c#G*=#nK){C3P(a!@aZO(V#sA(jgG2%;CGhw$s~*M6^06Y`n7z)KT;%22KGJr66a zza1*9J#DO-W_I1~9WLneJSL{D3vOxKwcpQYoOk%`k;?169`gJ?;*p^v&fV7V`V- zbSd8VspGmtKKprN71P;Z^N!W~etxV7n9uO(TaBhSX>A<@o*QI|yf4sz|JZu4NGITd zPj#O4^iQDYc0;1TTLnjzUPrLkKkZ@y3OP?3SxpmR{5ia#pL)FaE587t$I40rbYPwg zc9r1+fXBwL4}Pd4gyie#4<25HgL=Mjk&BaFCZ1<|-Jjmutu=dX{*6XI&(_voSz2+? z>uCS&?RGt!yb=jtL7ds~^!9Vay~F!(9(unj%jbPK`dFr!Fulqf+_`Sb+6d3ENzuMg zwW6V@r~x=Hm$yJGVEHbO?eRYNg^A40=9ZfK&q~X2J34xSNnP*VbJy5*qWQ3@2ab>G z>W$-B9Y2ut+gj}}x1w)vb-h#de0G81_grnie>)!Ufv)$fIv)EE=~C?q+8dN-PHvwr zyka>vZXpxPtZNDt_W3aave&9Js$>Vvq5fBhEKW}rZv~?5UO|@}?~$ARU+WeKJx_X~ z+eDtn?d^;Y8j$ZfLQpL3*Cx-IN0ymWEsssZ9LqFg1`>#x{H&}5uw<5PYzJ9lvIuz! zxzJ*I3Vqg43UR3(GgD-XJF-8IkL-Sm{Rwl^|8$o;0?dWc{NcdJP`R~pl&sBZyQc`Qnw22W_3_5v&)lpxIY0sXIVulR(9= ziD%}!Y}SOClV~xKmw7Cj#Y6t0AxmOlRR31lFK_VZ-pVl_$-0%@m9<6&hN?%yg-uRi zB#SZjA^ve2=h9Lm8RS!>#wsD#Nw#n&r|x5rZPP-6mH#Y0Vl$I+dNd_%uS8cvOX#xV z++7MHRkvW_%Bfa$SEy$PSU?Cz4xiuc{9ng!)odAZIZVy1wZYQ1pytT&jf_CA-`4EN zG}!mn&sC?DugSY(yKVSwZFfVloF&}@(euaAW(8B$O*|>tychvMO>Hq9`qfe(xEu^> zniB+f2QT-tUrg71%hZUUQNPF}++y6f>hJ||koD#qr~8U!`ecKx`Q&k#A9|>3X-86| z7EQ*`eyv9}Rh+!(iqV%A_FrOsP#c1e@+FafIdeGIMRU=^O=MAGhyFmdix<>rs`fIA z{zYvUza-tpHHhO(2saTe7TwiO0wgj~TDc6PT(0EHOuAR0V2_-GE)G8pzA$<-!MKm6 zIYPC=4RrNoP^+jax0;P>qhJYn>G0{*pBChP3a`>51#(dx7&Ja2VkDOQo=?%`xQZPA z+_R_iN$2J@rmMpRY0y-JzR-8Bf&OPwppS3O8S+ma# zQ*4$l!2IA~!5?0<$K@@BXEhj|ClCHh2jiIFAXZbS@I1Qj@y{YqNw0?1l4a>qXDV);I95cdWJ^rmwM zLNh&n{`0esDCl%NFvy!1gL*P3?i&F9NWh(91pUedEx*cTXe~b|1*qpX4nJNz*{@Wp z(xPhzONk8rq96i0c;89!_eS`?PhCr49t@Gf#s(ZpWFR+z^r|^fmjYnyP)HbK0|xGX z-~DIntnmM_14MB3>*pG+f`ea>-bmTx3Ix%G&w@W>Mizn_1qMJz;*`c?E-lvExjM%s>YG#ObYYUu@P>D+Q-(dfw(IvwH$K%KZ;G{5r zaJd-7py|@6#7zg*8;e+3SvCk=CQJ#YcZ-+%_qB)A_X-L3m%w+=o98YbR!iU`gY>|| zpmh5{wk}!UJ_jBq1uO>TbJ$?EDjnanzIOYUU& zYw_EjA`*CC5Pv@)PCvu|w(viXX|Eqpr53H%#F6zwhOKhewuy>{h9PG`=I(cwCgueE zka@UXbq*7T$fhQ5e7QPeJUIlnd9rSokN58A!`!=Fdz;bN)1t)U$4a3+dm3Fvw;-=r z{fCxI{dY*KEr*yXzxVZ@;hg_ok1>_**3)>IM7E~T!JL_MF}HcjwmbW{vRJR$#gkac z=BoY+UbOVCH1E&;h0n=DMRkv6b*7jW_h;^}cMmUZ+r%&H+Zw){jg@3It!=2CE@XAJ zsw*phR+Kh26jP(XW2Ta*w;A-H^|W2wI%r4yWCPxq-mfo--?|?(fS>gz4rJxGyLE#1 z?RUc$;`ix?{rBZ=hjTR*=#Nbjf80HADC!whv6NlA3CdqzT@BJ{-Ho~9z1jcRB&gHx zU-x+yz$VVu*A^%L0{3|weaO(qf4}hBp3~k2sa;ZY9|Uo)`|S6gF08jd4NuI=XSH6< zy z$f!*)hQFzPY1)o%xQwRT_Ip7_R`z{7kI{deddTSFdfV5>^*eSO=z0sjWP0P7uP8S zZo*3ZG%N#x6~5V6h>k+#8;mo%hNQXUT)H9VLDueNi(9|lyZg(G-&g+Y`Nfv#-qmG7 z_v?PIlJib4@G1nZHQ#ri(z^3y%!%X?$yMN$E|vEa&5Zg8pw^g#k@IX#euu4oE4vMd z@S~qMHIPqTkGq#E)v@n=0{HKz?-!qU1s-{}?b(r96n;Q-=^DIcw zs!VwqyK!ZxGw#)(-OSh>9CIXN0_RN_l4ZuZ^$c9HUfYNF;041ZMMLV-VI-a|m@%X>o;JKJ zgNl9dX{gJPl0>oKyhl-D{NAw#-k1Ei-|*kpLTUV7vHSh5?V|h+?V{hunWEq4{XWCJ z{GIq#ozDGX{vJP!<_|9L%2Y$tuX1#Uo~E88NQ2G=Q<>B*G_z5RhfBI-t)(UGMWKFjxF;is`GWqe%C`*D6!|<>n&%!n?9dP(-tE<|&ON}e5ZEZ*} zRRe_n55m7*J5kWSR?vt`hEiH zqB;&UK4?O2Z}gfGa3s*k^^^ZqXeh@u4ltcTqoE(xc@*`)w;I`VYYy)dUnRzvW0%r_ zi)Em^>Eu_aj@G5h5sgAsXwOnL`>%M9wq2$%vPx2Ipnyo1@HKDD zaZk49b|!F0TxcIwj#(lXKiaHF`6~iBN3n4(YQtjCU*a@raXG^xoQ?SZoGKtyd^iZ6e5ik?&i!yqg$B((f-w`U|5%|aK{6-K zgGf2$;+gZJnPbFcz<9?-AcS*VV0Z)X^M`8V})r4Tbx^|;Xee0k&nui zcoXJMo;2SEzb@DR50t)KdWyb+8y2tz=^8 z3;6$YbHLeVM5|X?9(XqB*{!+Zw&``{Fj&dqwkz3vMSrxG9@!u6ldq0U(yG%dO=>9D zV=ph#q9{ovT~bvZp@8SA%-`1Gu;eV8wX!JXI0&7VQs5kPvb$t7AwA{*X;M`U8M?;9@B_*kQ8}`i~Il}lqwZ`{* zXHTswjhi*wl?*4L3%1X?Zzc%0e}q6alPMG7^me?pd&>hAU(o!g^2?oBV*hrEIx`)B zkT)-ug!#?MoAED1>%JEj{GPIGYy;Wk9N(?&rA!3RE9D8`ig|b~#->k+I9Y7{fz=XX zw07sj!?Jp^{nN46nCGbGIMo=9HxIfa?1HBmx3CvD0Nrq(FS_l7wOc@@iZoAw-4NHV zSvN5xiexkX`x!xp&f1l(1z;rYT_U-Hbu(up(W_BrBK$;H6B%AUhHIQd$&ta*Ey~rK zUyF7VgLR4vyWLc-pu>_|1DZT_d3nV>+ULr-^;`;|jQiDgwHoFQqx#Sf)Qb#rg>O-` z_(J#dFhwTDjU#oIVr)%3X?9F%WOMtPWqCz<)_lh%_0Hjkp8kaVUoS~E zhaSCzy78)w7kA2G^Vf5}JTc{19SXOPi zQ~}xTTMu~cXec7#9znYRHQ6(l?&FRy!Kp2Fgm;{mrs&P%#mjHjt9sVL4;2>tUlncx zRW0DRWX_jzoE@Wlno*r_sKgE8wfVQ+Ei>b#t0x=_rk>+}0-d>lm!&;r5tAr<{kO8& zvTH?)&oCd2nT@cWZ=;l!%$K^E_I~;Q`>zzb&&be$V30p}RsOv|E9i_ZV@zxAz_}L= zbLN}G^r6cf9v-!h6?=Jf>y)MXk$Bt6&|#k_3HCU7q*@JmohDX+VLj4Z;gs#1_E=#` z#ns(bw|lJ(vuNHf5A4!Ts@!dvmnJT4D=`H83GsTOuz1$mLcVa0h^k zR|GtLp+MZVisqKiH!kJUV9Xb*R2I)NEtt1xiVr4Jq3yl?#ukuGhMG0dEUMl{v#>=? z3ZJUr8BCJ?a0X!FK{$w)VNxT$wy)@Mv{>C|Xg4xC*RRbt|{r zFQtgzBsFBDIaX{kBZ*mK#LL<1jl$mQ6~ogZl7IZF%B-^Oigl|0v8PC)tVkahQ9x3# zBq-A1+eI_L6Sp$F;dld)b%NL%Tq>=)XkDstd$^%iy`X3=mvpi@qr^Ah9In>%+|k)S zrL1N+?qG04nW|8HTn2Q9i$T0~osMpc?H;a0X8WCV&lg(pzF@Xy*SzSzSBSBjJYu1b|0L^Yw_EBqR4 zsYu1!)b>tpr!hX-44jC^Vjen?&NqmJ;-pXhF@~QzMKSu6`@p$#=u&gbrR_;_n>pfk z`%>tJDIGeoZ@9_82)u-lMV;tVN8wEqsH3tA-Yt-}qfJx}co{X0ViRg~xYb5`>R5i_ z@YFI>4gXcD{DS8!`l-qS=CFC)ziYY2m*9Y?oOZ6<`1|I;Z#t~r;M&PBT z8H*4ldOdW#c z9Ux4ZuOhb_u8Mr_L}<}wpBOFb(_0)_;wS!kRz!QMS{jus;KztFe`z>i)gy^PVbV-R z(ZBqs0WPOv7^FD~@q#H2MK?A~)jerC`|IT^`3}=3DZ1MHq4%=oMy^KiVdlSF_%m~7ckcRm#uf2XN!=NI zyWENHv~{Uz_8iC|k)JIgeF&j294+q6;sH?LD$-Jh` zG5%1Ldo^2fqRA*mR^7FxL8JPR3`fShnhY0`LB#3*Pq=9udhvy;^Vp~yVBwC~; zCZ@YhV5+qR>nuW%KPt#u!(Zy{?p~7DU)uj;2-RuPQrZdgFb&bAh1I>N(rBUIQw}SR zgMV+++`;`lcNy)CF#~@vTc$g?2`eyg2_-OLMJnGVGk3XmRsQN?`@qP|0sOPr@9NbC zo+PQ_NDp(i(xLVG7Gn}W(vT+0+XKrUNlY>Oi^hrF=uqPpXSPVP-6$wk3y5DzK@b?V z0VW7);hbi;rjhE?jsh1c4~RK&;|AQDF~MrN_T(AMi0-a|*$g=IF7u}}xJ9aQ7R%Ydr+A)6DN-F=vcK&BI+LXo#chJP)PZVfF(Ogm z{ZTPVPz?ViYJ?@)7&jYr#C%dpd+=OAe2O9?>RNopxP^xMs8>@lFXC9xV>Kr?CtDL| zCXz;Y2(a!;>W0jvSgzUeD`^G)Sc)853M*^zXG(4M^r7r{ps55nJ0n~pe`i!3F8$Uw zfe>=vb?C_oq)GoBK>Sj-nv<^d>(W&ftX>aYDKpPUVdcyrBk(W$tDpS6`@&xNm-^?n zN%}#GplL!(fpL`zwp^+UI|{#Mg48hm+wWW&Y-tNJd-gB^F;ZNCHQkgB4+%=BotYu2 z*m$S&qRzR2rRuL$NFhy|E+?VhbX6T{3%>brfpy}nQWTSMk~QqXI;`N>SU0sAZ$V1V zOt^I6IJ>_jmU(%#A+P>2P5GgEWXcb&pN30XG#A88d1F-(qdgI6xt>(D*rcIHfy)_e z;GiA_Ol|1|`CEA$@SI>#(dOb}#aK0YGvd&4SLc75gxJ9hq4lLni?YPjg>rFbi9Tuy z7q6h%C(pN~vOfodT)*K~G@xHtR}`of)h>mGt`YW1f1qE(@dld=o5v*lZ~9pG@xm(v1WG zXT;1nh{S_Ilz(Rr!zH0GDOOJ-Eevoh<)9pI#BiLeLC2pVQz%o66C=yY;K%a9jY6Wz zFj;zQ?JH^2HC0d{U0Nu$bVGiW=EC4+(}BA}s|cv5Y_>Dt4n!H*tLuQvsYX=)@W&55 z?k-#0T@$+b4O3$=v}p0IB>?}&Rr8xdUFfb!YQFim@08WN*#;$)}@3`N9* ziZXp=m%~G-!91+?I^I~d>;x$HwMzIy3gw{Vh&VJ%ETag?v|`OaRV2bpJNsdlYBq_m z-v=RYXL}=*(mr9HMHveJVo4;!m1iiB>&2lW9{3;f@IS;c5c&bB+@=+)hUE^ubD?a? zzf8o1i)@57&Nr8`R%}>j5B|QCgc|PTvk-i-vmvP)nj&PM>-0$G+2f$s^}JG z(mF*+>SYfcjmbY1dtL3jG0*1dYLJjo` zeAplPK6HcsW?2yr)uF8vL*7?P$vma|IJd#G*y;!8Bya}M_J1BY=m~ribb+FkiUeOMu9yW z-F$hX&<<$`evDp~8t@jE@;t0c6_up8NX^hXnk3>8Me7D>LOeuMG}b$jUy@;1mspjN zrgiA3=4}2_^53~iznJ0Vz(f7mTV+8-izb;BI9gIb{V%7c&67r_ zzG{R%%|Vcxr0n3xcd(?F zI{|aL+CJ56TS6j)nBbgkz&I`1NS*6AeC58=B6gmvk4r z3iN3|{iarwZXfry%gVVpG;?djtk0@1J8BKz_nAK@1 z#cyz|gp*6sHi>*NZpU+^VUyGbqQc=@ii<|jX~bzRGRG(ENTo2ud@%wiwKGl-s+ZLW zs0-extH-%a(I!G{x1ZHaM2r{TF&0y&Xj;v}Q7#0#0F8k4K{H6ALegmV8>S%|sdF1s z0rn&!?so>b3QZf4e$ooQstne4{P0rfGC9Bd-I0o7GI$9fiRC?q7+ZHZYM+ci++*EO+f|sI?=d*A9_T z5SGgYZOtU1k{ywy(NEmZ{)ajJAC3>*qDD!)YvvFMYA>*tof!8YM3=zF?$aRtVHCq# z6<$bQ<>k6XNmFLyHmop0@(DDGUva1%!X|Pp&=Fi-AU2BQM14B`8Uq+hjI9t+TT2TD zmf+U!KqEg#oc0>^yRYki@qTqAM!8=r3yqyd9$)GP0bIIaLJ>G_Ud@+3@-|c8GX2^*`NAm<$y)U| zhrTVGEW^!4c?>yUs7ZYa-jZNA?}lG>+Ajxf{{*rg+j_O8rA97=3nB^kf0z+#V4o=6 zfFHi~%#v>c`R3vr5K7MxAR|8II^zsv`fQl@FAaCd}Z=Ow?zjJJx)Ra(Oyz z*)o*7_Q`h2LjH}aPt{ANEZBRM|K7X7IB{CLa4WoVI|Qv_|9eTg7@dsA<|zJee3mU1 zGDb}c=w2Jq;)rRTI(nW4L_t>DJ8M_yaTF<fk?5IC24mj02*rWG_2~?(8Io*h|z&Pq*@tV-tEn>&_rQf&{VrAiZLsg;hV? zs`1jhZI^&Km*v+lSE45aF&WeiPGjUv3{C1S_vYzjKY4T?h64WUQC!=mEYvIdeHMP> z%M3864l}gi5U7?Zb3~}=RvbBwMSD^w!k8y`bZD}dx02kEMeR;gGsnv`CoQ)BUZS3( zEz-hN`?_qT(Jo(|I_nr)s%{n5^K$RLJK4v6^SWv9i3pYs}C_3xU zh+8RMtoo;6NEqq1K&+i|=ZD*&QJ!Yy23pOHL_t;L$cQ7w_ey%N(z`_w#Pn4{lm%d- zVQ49eu9(xKBkXQ`e#&!N7|)BI%{KOk`7DK2LsWUXW1yAJkJV-!D*TpREzBzVbe^;T zIL{w6${DETj79alXvdY5CfJB#tYyw+{+28RUw>LYi#Wq}^r@Cadgw6n2S*$HKw`hGU_UGu(hN#{wgVCXHpGB+djI#{FyI5)l^=EwIj}5j2bA1 z34cJ&FM%P5Zq#atc|*K!)bhuyVCFRc{Q)IDj8UwXW;SrsSSOK^-{rs5n?A+qgTMyJ z%DQYtdH?rrX~TR@J6EmWKxFnC|00N0%6+kM-NnkyXR6T@{+Yngj~R0vwmHw|g4X>= z@~Mdm%T-L|nCLlWqGhkK`xOwFUn2+R)cQT1nl&x$aZ%@Pm+r%_t}m8|mVX z%P=0S*5gGnI=L2G!m5tOjvpEt^gA-*B8L#P-P*HzF~RrXL^b8ki?K}>FbnzPnR=rs zk(Tr*s~x$};YKT|nvx8JHt>)349XjR0jl&VBhC3jv#^1pkw=W+d;@B9RX#dDuH41= z4$6-NZctm?BOPo!vj){Fz8Nc~VU3b=2Z~sWBu;p4ZCWr!kECX`4F(q&w~vf>AjT46 zSGC@==$1n7-cKq1>7byyp(>DSiAB&_x@$S(cC|gV)zQ)ayOVouX^uM^7i?YtF z8-1zM4<>LEoT;Hd}u_-6icO331t9rCFkYIEI?YyyoA< z`SkV-i~#|rJ0jmi_{&AJPU#w?O4~5%aLynV`V`I?wJxzTF7ppv!%0g?T5?i6zc} zJH9&U+VS5Kl?Fct=43CGpINQ*;eNb&I?-M{CK9DL!RoEJ+ z&&`3}Q5s;2gDoaAEzqE2vPU=Wq#To1WO z`}K=*Ln(Z<@7K&pLq{T~D%D=}vu)eS=hrtH6Q6QtMH=W}E0;?S*doQKe3!T@lB&AY z*i7>VH7us1olTmO`4y8Uw&{UsR?l%l#3=^dE~9csE4rqxenTzZRlb*X?_InF!qG@+ z4yCN9$Jka0&H>c??qCvd`$mU}Rl%ZSjlge7ZKG0T)R#hs zYySWv1*49&GXqR}LN591rM?M6L^0(aay@EAI)POy`-zbO#B?LIkxvrs3(=aHac>2$ zLJ^KPE!7ugBHH?tEfc2Bz;p$4c-D7v8&ZS%_02>CJ!ePvOc@9Mw6}V zlBBhM?t3e9P-s}Pp}#uJ)dfkAymkD3$7DG!M%xH0zm!8b7f;$y3ed}mC)6lpyC&#Uo$rj~e zM$ARs`&x26gpC4RRiM@!2Sp^*2?{mO!*FFWo2AHkUoX8r?@hl+Fn8U1SY+&GKusFH zNVJ^RnX3e+*Qv-sp19@L85gE!Mq^laNc^WAzC3CFF@^a!Ar$FjjV(p$BJDoiggo#l zhruTMIv3GAp)`@LVUmM{xOwy97=Gwqoo@He zBROQo!a)~#lxvhBWMvkS!!J0=Wp3a8Si4#7J%PC?>uyW*Xr|5IC^R9rq=8nvw>d|y zGcD@ECXw}!LjNZDo9K~El(|L;{QMXm=D3HOxrv35=i&iI>LcXI9oJ97+-nY`MN}@x z{!#EUan>r4EqcwLS#~Pe(Mpw!la~0@%UZ!eZAzO<_qJr6!Mw_J;YWP47#D$tG(GP@ zURRtI1$&=0CKTOsCS1}bhIExy^jCgRGFjc=cWlEa1W+Oz8TOU9MDT@b+47ZoDM1Ee zoDAV;2c0P0HCb$ha3^u9k?bH7$wpRb%Ci1i0ZVcBc{PdVLOjN5w@u8u^viv6@60(c ziPAgF3L;UndFP{}KZET|*Npv;D4Tw|Cs{N?Vx6Zqn({7}vPVNvHK$S!E3vy1nvR-@EYxgb^qaTCbc_SCZW&rZW+kXMxoyC_|%`Z>av*2gkr3nzyJh$Zk(*T zI0}EBabEGWPLaMs1_mY)P5h`nL-cW}8lJ?FyM<`h(Yo5VGN7IkzVS-5IK@3np?5`M zj00sb!FT!X<9}x7H2n{vok($*QVr`Y2d>JbJorj{n=$KKpZIJbman)%fJ^0@w-M0S z%MxXk8O~$gz%d(Kx5P>%ufFOXiceo6wib28Tt8SZUysSNlaYSGfP^Hl&HUI>{jF}= zt0@ce0j&GlbdzBbSL|{QVvUq2NDo&uM#Dv@z7UXEYNF^xg+|J(YSrwU$=Ay#2hP7u zy#09vJ&gXRVfhI^QPr3^y1+0YLtUpNiMg~C{whbRxDzdwa{o2OI=w~>EcDhML zVNZsK&2YyH_{bttinXuQ+p8St5bKPV)69xBW3fQf5IMr$pw|LhiqLF$z;pGgCp}f~ z;!u%XoOfA$CM%VG=r0WN&7LGDG}$OZ{OcUSS!TxFZ`~zn{!!MwP0}CQq{F(AqHxgS zThtmX70x}pv>Lo(E}VV+wfV(s^j`Eg-+aggxbGcGnY>GqXX4;PvwPlNa7ugLYjgcS z@%^OzBjbuCuIMhm0O=`W*P+lbqwU-qlM@m51H-hV^k$>cMM)C6d#7R-HzUKKm7+)| zVYly{x%RfdN4AZmsLX$YK@pw6%9mST(z%D}L!`Rwc!eB^kD?~q^t->9+PCe^q+R1RXX$#s3*{J@PdOKip&|dekf!|1fvp)##6|U*vh?mDYHBHUE*7 z)H%aW(*Y(;c1F^<9P3|L;oV?;kEOG zDQm0!uXMNLEAkTNETzv3b}u;a_n7~26=l|1thJJm3{c>{jW!m})~2HxP-#?SDTq9N z&2$($QT&)8vo9rT+Kt3ue? ziMN-3F%D2--f|-+68{>VI=RpDR;^vm@Q8hM%Y(}|#`@P6+lV|yoq;XAs6;v3mad~H z1ZMbm5Ae+P?}E|wrS_Yd{lplk4>#18_l|=O#Tms)mfeo^gz;mgabqh1Hd$VLWQrFy z;#F2;NP4@MM zWqc@;8MoH+#1)Cx41N)vXH7e#54@jtl6+p^{`XTt`gMdfzv=m{O6#_6x=xZwh3@V3 zF!k+z4lSj!2VL~mqBfp0Nj$W1kDC)B3fPFNULG-28Qjenn9yR`!%}zVwb<2SrgA?G zQmOx-$7+c2r4c{2YZK1dl0EAnFsQO*c`y<4YDlEU5qDEa>U0Zlah&BJUu|4M&hI?; z&h7ZHZ|_a})~=6Kg3H`0rg7u@%4)}8sk~3aj_QPO~;3X_k! z-zf`BeGfX;f8S-zglhn>X!TT4U_kEhm$)e2h1sbTUqzs&&Ji!)$Eb0 z8R{*Z#?>!HE+6>kjJQXy|LE+#MWgr%rjl-N{hX>WH57idcLrx}3=L0DPs`0mPMm)) z>t9)DYN<_Avihkql>e~)_s`pkfkq~c?_9jB{Dg>}`80ieDbkpKrA51)a2soTj-s4B z`gW6;u%DaYpK2#p9OrOw;Pf``Sdi(tKP~5|;!{7eqPZU#tTZQtH+4ybY}qn|4q zo5_xiWE#R5&-i)}{-Dd3k5ox8p-&HEEc*TE=Iq=;cgZYeL}yYe(wlPJdj9Z-USX78 z;cQXu%`exL{tf`G!Yyz*vMAWM*jjOmW^tX$hn5k8*U%j!CuEwdW5ix>YyXdB!8P{C z{c&@j@=zY@@rUj9aDDMxmV0+p*(QwcqxT0+eNPsr4CB_&Vza3CYpV8dvM{9i{bop1 zc6#4-Sj;v#{uc6?x)v+qFzlb*_v6t+KDr?qE^EYJ=GD%jDVO8Ni&*S`tF|GN_Z zXRgG@|2{?$?y3LTtiLp&XB#)sTp1;}WqLhF%DN(of5J$T=FeUV^hp+%x-qlqSuq*B za`^Z>FnPX3`eiUwS)JN%3(5-<#odh8e&q7ybNlNHu54~Lt6vM4B`apbVsrC+gxuAm zb>9_+xjpm_H*b10ii}H*_xe7!e6?Dp1LIJN>AtAdzPk3nQ8mcJC|6;yn09*L%^KNS z>JD@`RYUDa%iMj$hOo~8deOsGU^HdUWRKT8T%%A`7;S{7OA^o{<+n`)+?4zpVe z^AXZZ2CwwShO=zz_1MEDN1m9lrSy51>DcEdn%veMb~LWg*=IH2B#I0Tny{~Hdo|T{ zQocyr6&SneFl*uVT0X8@lgr>?(wpZ4-|P8)4}0(u46X9s{p_ZnCMOd^sy(l76eUa8 zD?PJ~X;#ifYTK;ttiqtDUPe)5d2Nzui6wkKX<(T$hUtv5nIp~P6Ne==Ery5DsDgk? zkWn-`BX_=iG;^3o(E&4-7wO&Cn);uDOUrJu;iEl{P~Z~(M39jhYWPyc>%F2S#eaBs zg`7L|=cd^z&VMfd5EDASc&;dLydH;`Pk~l(wokq6@3O^;)8uz7=lnv@ z=b|?IrT1~g!Wo>q_5Tqw%Ix!fKmX3Q@srC>D_(FiWw~+H$;gy-ITR1KcFy*AhKq(G z%&%R#!=e67r`4JlhVQ~6nPA<3ftBFHwyv&){3w1nb9!``S-@%f{?X|KPwbD$RHuao zWL%tU^omg>UfZRn&F`Nk!&y_y`3BeS&ApquGby2#JcQ`d6O*1U;c)Wx+g@kpc6Lih zA{(0_X1#7I$>f)u2_|JizNY5dfP+29&oppy~DF%V2Unb|m; z*%;G^p41+E z*EIb7Hc@2!JHl=MorT_Ct6~kFOE2BIdS?04UZoVM8aH`5g2)mkOTE*=u1|1`Ea6?; zJG~~~r^RO%m6MbqR+9X`f4}TB z2a#U8RK>^oqE}+OH5(ey!*gvt+}&{_qv7Q3mA897*psqtZLbreVvqgIw4#U<9oM9I zGoFg4^%HyO2{ennh$wKMmJ}e83jaC)2T0HTNV^CyWYq(B61u3-RfgSb(9a*;^Q-eC z9fTw6U9sGf=WHpg_BbeQIN@k_AK1#vF%}Yv?4C-An&Pd%QC~r&z$`>d_P_EK#Ih0= zYa=gAIMvg+42u#!{qZY|KEb=>z%1I0J}Xj|z$xv6(L_PHXrzBYdL-_7xtXv7-^PTI zfQJl!<^kFN-Q~4YrQ)?79oGvnz&YB zYYpA_yKooi!#q5U3V-|lN<3VW4u0uCJac-kl{Oc=P!|ECBCQ-ubA2?Jd7+T6!9Wlw zs|k6?C;}!SF%IK}dJDs0<2o4L2ZPL0Q%OijoCx>W1Gj}+j!Q~PKrE0Z?pBI|c8NA( zLnC&z^p(IcdT}DRcSi78QrnxGj_~8)Q2Ot80T``ZwdKtiTE%W(^K3+1C(2)MySH}m z_~3D~7Hj^foj}dds(a(SO2Mc^Pc=%*ucPm$=l)afOi3(h{V}r00n~XTJtsC&=sr3K zxQBwb=Ko=lWcJHAuW~Ry1HpB46eU5W|9a!M)9eB3sLot7vZKaU)4z`UAqsQ&;yBlW zCF*D4@W0EN+dHh7K}EL^Va37#z8BEuvohbynp%+);%1^?l1@LwTvRcpI{_>-(pEwe9(D zZ4gU@SbIryx{!DaMC3sHy8IWzhxqm0HFz)lAD(0^0zLgNyevC;#CF+3u&f9^tH*{2 zzIZtaAp`8U<(@4B3K4gM;nR=V5y|EgdYFX#>zx!IKR+B~MZ6qwo^bh_JBau^6S-V5 zy;!m3eVck?x$5cm!qQT%UB(2KB)Sg@!a!(~LPJBJi3D7pE*3P#t0ush@Fm})f`F5P z7_d$`bUIwhzdoz7uI_NoeTc>PV$iE)bo+N1Bf5`KNc-2``rUf}AN6kUUeuz{g$QdQ z(1ArY$ab9l8e%g&&J#PyQz@|Ekm&ig@;P6TF#O`c^zu<$H~a-Y8W-`=-VH|Oq$b`H z&-=D7FShwJl^9VgN?&QKYgYP(Px8lhPTai{De2o^girW0_M#{>`mZ zDfHtI#H-~-H$6X`Z#uKB9-XasaEv<~PC(knXF)WrVxAL#rNs~;apZqPm*cT+Jczacd-Cinw z_hO0j!aSD(#wgUJ-iS-@T{gVabL$((Od%$ujnDb7E1JHAnLGqA>F3H{c522;alR%e zmVrJ8s#Wkj@@#l6;VYg6@=CoN-eQ(%*c`!dxEz8 zwtdTV`VAuR{&i}G$_3`@KT|zB>K21miV1>cSMK8*rR2+B;Yk$arI^4_Cgsu6P*{3I zg9_e97~jjpv>Qx&2A;=2F}}NJxf=25*jtp@zFYV1&YGTY=)Tj&qg$3hAki*_)}}y5 z_T_Ol?lt6x*Y~_%iHoW5@$rEXa28$<_!>&8qoecJlg)!Q@tFt|Q6f1!NfJ8-`o{*I zlMvBbw~_#r|86Jgticc+e>5)xXno zGf#{4{BrZ9ml3h<$t9;=>$O7?#>2$gQi|#g`$`7cB-`lwN-dFvdiXLH6%U^^ccJ)J z{??5um63!A?2y>C-3oga%QOjBejS&i+l?WIcG#eQRY9 zdC2#B);*j3wULb^gnBuQGAee4jerB|v}^+MSV+joGNd2}eef+#Y{L*QSdF5f;>Ol8 zOhtj=5%N3?hpp5b#6oC5ffFmm9`+ z@N@bX?41*mkoY-lm_TII4Qd0YzqdKvo?`!mYsz~iPN|}$mHfWvCyc*@IruH8bPS}3 zkM>GPPZzKqzA=Jy^bw}wA8LhFQ7E+ql^acAW}leB_jtFPwm{`&u?kwv87i_Ng>)GL~bG7wAV(B6nH#|iH_v}@P;o^Oog zq0tU8GW>>M!GN~cNovZBjERZ)&0Qr`>ZPb3DmOU@QEX3EWWOi{_RcMbi0&QYG2V-T zvCGWo8T`&Pq_lPP8(14`5y#$VN4p?`F~-u)_yaUq5Y~DR(OY~k5)@U6R%k#ta8TMw zJvjz$iRE~`Alv#=`m4d2*Y}gaPSE^rO3LFvN1yy4V#YYA323sMO_~Ob*WVzKC`yNG zPC-QJuV24zbcBY5b#--ZAeIdSv25rteifn6z_1OPoEQ6}swX5Jg3P$1x_Iut#&u1L zqNYGz0b~Nfh$Y=n5br>OyV8xq0zIW5Q(8l6jG9LXN4l~v0geyACpuPO`y zMY@yaUP3=i^SjK$sZ4x)BmvJh7{bECf9ab@x{<-Bm11i=0!>av)$kA~B%J9j2I=9g zn1IRQBkccv5>wGH0gEoI*kXEyTM)xL+B&+s(a_Ko!?qSbT*A=)eU6B`>Pz_*HzvM< z37VOiZD@h)M$lw^$TAr`X}uH>u7!E(icTOo@f$>1z(}psC*buuu&&hh*1aGJWBkG2 zcrggiTms&Zo-sy(fA%$;HVm7RN&g*8#2y(LfhFlv%W)?tP|e;N$qRom+}hd-M(_ic zr1TnKwO>daCNR~zTI%vw_9fLF>*&7jMgP;X@~c%OAgH0$^@7i~NGx415JVq~MsyzZ zr*aGiOtx`;ILqav4}mQJ@Z1X2YkO)1!)5(n3b^LJ{`&OkQ&1mz7<(g?0o;u;&5LWc z!Ko*~&tzKPQG#@bU?yT>pUDO~V*{W6{#ru$3p{g#Wv3@MGzi@F(73k`MkIE!c9TVV zvp4D1K{)I5aikNr8#lq6k*C7K9pqYhgo45-ybE_;-zvAz|RPe`gV=lPN zmBEP;;Njh{se|6gFmu#~I*Bm=Zr>rP&E1_BDO| zv-L6>y|y=0>#mJ$;NBov1+6x4gRd@>Zh_u2*+o8~xdCD+V__)wn)`b7Yk_*|-mB4+ z{3-!&sdJ1Llb6x`&vv`vT|b7rc%CSvq80?NH}~^D zKbQpRr45z(*ou}Dg#a?T4g}=p#>ZO%p~yAOLPD1xKpVIoZ&BUX(@Wp-$dg`-SVp&; zSgl!K{2(^T#L$6&WZd|xL)mGi&u2DQ!D2yBq`R|oJ&xgCD5y8i-X4f8r8^g&Q(!bSxRyxSb)0x*5HRP5=pn&;MB(V%GE!8ik2LUMA5W@)pf zLIUUypC^RiNdcrYCjrrrg8mFpMt~(*wm5=WBOM)}KSXzBhj8}9K9TSpNFcyn{yNE% z6c=v=N50>UCmD_SN|uPIs8RptLUx~D!*2Q2cxu!S28w^}sHoz`y^L)ClXVbRWl=$E zu^plJdng&m?eKnt5PA62)ff)OIO7Xh#9DZ(KMBCBSgPqBwb{KU7(!#24WmHI_#P*LQ2a1f}hWD zq(fUGmUYIe!_qiSCnoVFqv4UWKRe7+HkWh>+F$*2&c&*PlNTglA+LqE1mVm4{*Lpc ziV~Je{KboRw6dYSW?FbQSkEvdjbOqB`}L&UUTy{!p8xSZ=|sx0boUd~&D_X{JIJMS zgYYI{K^5Cx+qz-hkBr7hYA?JoNJc;$(f|=#kAO)g$wFSkQY)QG7S**YzVJo|G)s0Q zaz+ccd(jw6(RAt(5kJ&&o-vwf@ZJk!kbz6D^3cK}<7(x61QLV$Xs?5>VN-alf0i-b zK+-POT8D7hGWHQR;;yKLg~b7JQ6drkc7VgSh&Zt;OEZ)AHMtysB%|M5y1XVZ=(*!%GJ zrOv40Gf=RF&?{?kcDs1^(SLVK@^Rv@9SI$G?wGbb;X^~kAesWXTXFHHKas@5KCG?T z+TjL*IJ7_PRgemeB4!ISa4-cO<45SIoEopu`#{(^CflkndAi;?yI5ujD=2MXQu$VM?cSaJcz7PnU2c;|R zawGEQeA67)ql~)`X+)oRLpa!vPVDKCw=1P=8!0yyYD$`}w(0KfzQx2878?4oY2-Wj zy<+7zf2{nUMkt9QC?gw7#o{QP13HVPvGy}HED8w0^+r&d+S}Pti^U8K!&_|hQmw_s z!O_{At+CT=a50N`TMRLzl;gO3r<*n)dJ~(Huh5{diQ^{H`G_2C5tzhe?((RrSc-9( z__u+aVo>`o=7zL{83UA-%Q!w!{k<6(N)qW^3IE<-5#p-Pd911kH@eEu_eo8kyo!DN zYk(hIV1?&q>{SBTEb)%$`;^X2ugcCL`i->b%0yKfS3dX%suLR~n4zEuE4PV8`{W8~ z0EAk>L%4gqt$oaWkQ3C}1glo(@!B$)9>=IjKY^#JZQ%mJj0hwObqv$*{ddn-{*ugg z^NuH;Epx@2XY(Lf&o&$w7&tR?Q!aLj>UX7CSDjX&aU-8W%gIK`nu0HTq0u|H6I6SR<@rT-tR@Y*z|*8C(K>3pkk+y3E)qb1D! zN|&!~phB;zs!CN}Hoi9~w4EaX62WzqAdRbkdl^NX?Een^QQ{0Ao4+u#AyGP!p z3~e?ui(peyC3%VNQJ=G|L`GTBv;1j>D`Ni=AAZ7nMk7JlOGlN zpx#yOy-Lig6~8$1kL})RP-_o*!9@q&BaR>iW~DI>AW1P3Py}t`JBb`nm_LSD)0`)t zmCWQdJ{1?*j=sSjJZju-0o9e`OOVa2|LZ1$7L=~oytQN68s7y-wc4MiYMOy@WCf$e zW&DbKD?PMcb7P|EHF}nbXd+=7%LYRx+@`<#0bQrq$*n!T(PKRb2jrNiKm*`;KF%#& z4$2m@_G?rcxzg9imV%0bC|KjF=?j!6zLqkCgppiSlNzwj znRerke@96O4C5-g+ zxdE3Kg`MjQZ>^%rN$O%0{l;R+?_5*AdWR&%%Nm5Xy`6b(pu8{j%~n@eXI59m=<4ns z%H($*&XE9Qla>hTm5@;{g@T$V3A^5xGtoOSe@E%w;@9c9;=y!MVTFwfgD|`^nCJ)* z*-V=B2nu#q(oBn;?-7GU^Y}vX$J;n(KdXm8J&u~1I_4*H|F4AxSL9iUR138abpem{ zIf8-=;QkIeNN5_9n@oaTIs)sKX)lk^1QY5XpPxK(_~zmfYB3W0%eTFsjxkSxX(3k} za~82Jfitqb*L6%v+g zsz+>ew31;CM7m(LUXaOc3+lynwd1^+CKrMMlmrl!#%-PK=$?!>Y0ZR_pk3G0MR?; zEaB@>CjknyI;dKAWhj13JMRj{+xfzKS#4^nRn9$s~a(EG&#??b%Ie*Sozh z_9>maeTz(gwp9O4=1m1Fk&Q_cU**Qn;cR+>tPy~|{*Cq^4r&surKhJWq_9c|ya;zG z)vH391(Ga@G6X=6!+0^V!r}H}g?)Qlo0cv_Ah});twqT5Iydz1ua6QE5I_V*$0v0i z!QdUk2ro6P-vZ|t)S7bJm_m>dcSg!QC@9Dw`-dovUT+++OoTe(T*2ZrGw3()^k1qjqQRkqa;O!BS z_39e|Yd9{gYzoIbQVgl2@0lRF!T!@M_1u<$VeGHsSC&Db1q7YJ)Q&i;2Qost8g?|X zjXwTQ28JF8ihw%EloILzE8iC+&0qN7ZE`!GiG&w zO;WeK8e;kJ&RRk-ATwd2cqB(vk~N})*&5Gq@mXF)+F%fOZ@ue0*Fe|UaProUiWCWi z$9y(hu{yM~gna-H#yY;xF=DrSXtl-lJlkxkS zu~xcl!wqEO_xcjsB0*o9uLD-AL> zWO9#yvy_PE zOoaHuaCCmhnHmWB_PRQWNh3nABoDiXo`P|_`Ut^dnBco{g^9=}CLN6$b2UaC0MQ2@ zgY4I0=eeoSYu8EFfIBHMD7>RECLLoCn0j}08Iv&7$O~o~l33#?%Ao=f`*)HAxXe6K zO27l2t`mlPBImFK5SCWU!8{g)9G(SA&&|CWq7v<_6fueHEDrq~I?t)ptH>Bl^r$mgTinC8?qAzbwUGkL^{R4b9+9l! zik+#A&m>h8i5@Q}fwQ00_zIONHUmCTSATN6H)C_xByvVV<-Np>61bJAeFqK-@$6w>BbK_!)bjBgb5W`KHJN#bWYw zUc1Ci{Xm_hTTeYVXC#6xu~9phdy^b{4bFm)9UZ|tI<6D00ZA}heSvmEgUHrb7Ucwy z#4O{YzK4KTOj2r4+xOjD?Enzv)EY33bvlZ0m3~j2)G$WKa&lI%liK=(-R0rYxO)v$ zW8d0!l{WYY3|E+nbv!FXD3h0H73EUD#)sHPM#lWB6^oJ&%lM_RkH&bGfNNW70{5^TI&b;! zWbyv$=sPxpS}`91?Wv*1O#Hu^h%D-R>1PCxW2qC4zXT&?qRtfYt+NjRUGFIZqdtVp zpPn8t5F#QXu#jxOD5D|De!p=yu*KzTP+A%(yS}n#9k3wGli>B)8mC(6KvOT?SiZ?4 zohC5swp7dc*_ma?b$_9w7ctc?0(gO8uZu%7YJ2Vtgn%>9Wrs>ccW+8B#>aGS3pGsj zR4zq%`KKteiL`VG=Yc4t8KvrUy-QN8V8>sB9YT+V7w_42eOe6$X z&ELxM-z%lHu*i8(Xyw(^;#=BYdi&oTY4rMQ4iFNxQ@WjjV zMphQ}abGga)NRO8AqNDgh+4J|kZ*vy>g8cPgdglsFuKnqZT=m;7$ocw$cm}#AZ`87 za4%ldCa_NEduQ-l721y%+cIHZzLCq>#0hVw zgGyi5Y@tpW#cizN>#&)=vs2w@<1Tr?ghG*BW`tjBJAzbD3&I!*wk~~;hlL*kH}P>@ zT&&LKn+wJUuoQnv&S^y!CroEE+hdo^0b3L7yl`7J3g@k@$9sG1OQ$gulF zOWYvXCKdv={*6$L?VBZXrHyTQ3vYGLWi}82{U^Vin|80=PI8D1FhX$26S99uAD(2Q zQH1U`kD@FEL`D^oEIjZ=Bt%3ZHN4>F^ut_$aC(0a0}*dL9szsc`09#GmRNx3J}M3S zki&fi@QNKJFz8)>lIC%YTaytmAqW-4Mtsm1c=t*wye|{DQ9+k4S19`Bp8|7cemd*? zK|5wwk~x8;B$SfhDVkb{BwQ*Ba-zc`WbGdqVGNz6k&!?ZmORIPiBCS??8{$Q+b+B_ z(p&0|^nwhV&v}8p@#uxu=FB5NGDZ)-B4^)ow>C0*VbAU`{~jiM&49LP&rG}lWXGT$ z9XSK3W&0qA!9}Qz)#8IlcitOL5C7~4^5hqw73;anhgS|PzK&{x|L=LPBbgmZ$Qh6F zUo6_Z;SSL1(c0Sc;1sp-tDSWT7ym(nFWd7&OC_J=#@Hg`ZMo^8ttg@U5y6=y@z1j6D#dQ(7*#wLVP%Oms0ZvIatT`+sWG!O_ z3y7@m(HOa0K3af?dPhg^aB<6QXGtzQiTP$qBt!x*Z28pSt;!PtL{6(v!j0*ror9(MKZZ9ib9 z3?2{Pu6lh_1|pPdZOQVN0CfsK8e#8B$xsYtPMy+p_6;Z_>fgmZIo0Ct=@B^4EWz!>Z+ z$a{GdmQ^?|=voCvOk@u_y1G2qhCik@jp3tE%&sY5X+PEp7K9CnW)=RVAGv$&opL7M z@vqfMWdR@sA+^aX6+0_9;}18#B=Lcimr*eAEZ}O5v~b0+81{*fdWLie4BIR zCV)agdgboJiDX9B)lbhY+=b@@_W&gWYU@eP0Cbu1pHKL&+h!O9x@T*us(m^OHFPZpq9lxyJuUQ zF^3n1?R(pxrtsuoHx37TC-QCPwLb{x<^2RQU@8zS^d~A}_?D0z<#aBIlpY0s`{dAh zx?#8t-A2#uc&nP{e2y7)I}rb2nL@~;dLR_cZFxr$&2CI9Q{%0{?zC47!y*qlXA z%A7+ynMjMAY+)bzQQN+psIe1vwVbClzz8~zzEOs-p5Fxg${;|qFajhFwjtJ$ItYTm>|f|59-pC9obd0CnUoIf($bK?W>TK{lT#rF$vP>#LGcc9zBG1jn&lFuRj z6+Tah1z?rKWuZQv^+ri-Z+XKUb?tg5V@JoC*UZCL1f%wd*>t9;{a7hIubpIy1zfCV z2l#_)hRB&f&Q}Z=htPJDoe{2P7Rud4pKrjEH`{k;Jw=-$=@O9aUE<1QmY*-0D=4O*#nG=NBt0D8Tj^%XDtBySy0~*1bBA zsVj6y(Tymr)UUm#zZ;kel_SO*tD?JXg`$vg#iq{m_RtD@KQ*lcWcgMRImvNt<$-ET4zcX}->wFeHJ#5kMpZz%3Jt z`yvs3Bm-J(|nC_pt1QC7LHs^Jj|v1BIeW&8M+ zo;?mZGvFr(nG>n~Nk?Gr6C`is!30eGkFEUdGJ4YbdpdxpQ-3#o2F06sYGNlDYdbZ! zH;e)TQ>ns~8SKI=J$Q!9wX6wMC_L1Z;?G(*yNePGo>yRlAUUKFJJUK&A77}u0zLYK z0+Ellv<1#tbg@(lp}dEIB}a;-Kv=?^H8(eZ?GP|B=)1h?&9MA=agjElu3^8{?)&3z zmfKo|csSivApa~e4se5G?`0k2?P-?XCExU#1nVGL7tiU+MOM2!1%BRM*GjcYRo|PS zB5DuvI0QSq-Si9RHr7s#%Al+gE~3CFSbA!dIWyW#`j7{dx(XxE8sIUu8xduI@2NQY!xYd;RiV54mh z_LHcn=-w4_RD-ETFHX@aL`#b4*DnCErOL1zTC>G&8vrpDp=fLL;>$0&vbtUHT)qbz zp~X;|?Nj~{Cwd}(Y6E{5cm3A&>S{)raidPkx1}dt(d71%TSvK9Dtv*e)ppxoQ`hgO z?uH@~PwhLNtM=3-gO{|Bw&*u`?*c^I-~9aZ7eG(}5^X3JVBzA*jRS+CMvvKjV?$Pq zvgC-jt*vcr3%uya1L%~!D0Zj_f!;@z;fRh;? zuLk{6fGCTRU$MVU=O9SjdgY66TT8^{W=Wy1b_5P;4H#r&aMJ z(LMjO1`Z#sC8+dPmAO{{CkKXCq*G=Pia{J?HcJ)t9MRulAC5yExd+hb)!fh!uJarD z1p1j%ldbmn*K4tbt>M#!>Nhhj`naB?PwfDEGbjkaCHd1!A=2zJj^{KYkL5R^_b*i} zz<*P@5A@>qla@|DxdqC0EP4Epb-iH#cFdG#%rZKtqE+{_3M4}Yv= zv)q#q{|YiO(3wwRR?n3R$I-a0iqzX9S*QU3lTEAe23r!)Kox)<_`*FEEzo&AO?_5~ zeZ>6%C*X0;f5tMf+|tvZCl#wIJMCO)JmO#Qmiqo2a$HJ5t)y!`TnaS_6$QZMCtQq( z^QWZ>0q}i)lXa%vIZjn+zFWk5=K*+g*GMZ}pjn~j01PJ($mX+dFM}TvI}BxunI1rc zx3yx{HHmQaeNYT6&%BS_LqJAOyauka1-h$d)Tw|oXI9I(vTz4g&|NKOKJX8<+V(pA z8tknTXqcs+<%$NDqvsGvg>T=!{W{vUa6rVc_2iy?KrWV(TVzM-PzngHk7*%Enb^NngtHMKSUdd zfqPGt>jdF+U=cmMLJ|1pNtoNAOb(%D5K$^CvE z=cm8nK@vkjKzZWo^SXQA{XZ{=It=GrEtT0qlFWI8$=!q01_atL2}X%-g)A|Va!Stg z&FM$MyL*XJ;_(5BV;XunzDX={;TI^G&ojyBclUBGu$38Bou!!g9PpDZ^n(cv&QONG_~ z4>>KPChsb+>?5+3_JD;zAdI^5lkGVbotXnuSw45gQa|)kau2IaxR3RscaM9RXW-7# zz~m$;6UQ&QzFZpUgZPia{UJjq6hv1BGQDPM?7ZK>bAR~32hquTqXC?MU(zkyF=-6L z8r!emzU9pbAP4%NZr0Z_`X2tQx|bz6N)iN3dpWC2${DuK*2q8#Wqwb+g>n*%D>_UQ z!D_gNfsSX}kbuRfCj5KOeND%32?t!8J`FMKilYV$(%ZtYQm`BQdk$_JzlTbr1dtOz zGX!FvDOof%W}-YkJ=~m1)i=E{%)>!}nvst72VgqhuY!mGNCVMNX%)lYnIjSWpdF&t zW9Y8cHjB(f&LqEUpWMTbQ>2j}sncQA$?3DE7L_bClunnCPh%D$u3Ms`JS)C@|C)9` zUM%#}6wUxL_wn||q7vBofYyNam(_tKv$ zo&3ra2wj!nXr$|%=1stn5cBdCR2!P>~pRo1B|El-YtK(JQL3YFsc z_>}+4j~^wL@+j|t6*Bi-D+78JlF$3Q&pS&y<6oz*sMFQ|f_zV_7wB3CoMk7E$0&kK zOkMr`B~WMqr=3WcK<`9gJDewn+o5rBc08_k(5L(+y3A6CT9*Hz05>j4z?Kt;vXo8n{AHSnIAq$-}>pVI9%x==oIW4t7dU0=g6=po11{MTI4fM+vq`ad5-Za>pT1WX#gfxRxHl2{6> z_T%;ZG)rH=vq#&nk=hyl?f^=3P>ckQViE~T$|??)6c<~>v)D2$HX} zD=$?F`V+CfzqU1y&N;~MjS!cUky&S(i=(?gQlq}xMd_?nZgj76J=>l59UUw5i`yt> z$!T~)6C7~voSKzG&+o{kd^kUxg-XYaD-VPkbWF_ls_r;i-B8aM@peD;Mkx8OVmcSK zeQl^wR8Y`Z0r-))9t`C=Hq1L;XADn=JE1aF4=#nO(QcG!mD^(a=|3-wdD!3+2{E+V z#zjP=3qC3?D6ok%HDBg)lhP7*gmPnEn8df@>jAHMqFVsN!5-7*05<(}ub;Eu)4{<3 zypv-F@i(A}$w*0W)zS~YEwy__z~~TLz**-oOe=QugC` zI8SiuEXN)YcthbKR9)k}huv9+(3qc3BKCh6kxJy7P^7X>2X$9~w!0}nPOdW%etNl_ zSZE9ELk6Xs`2zsOp4~6zfQO22Y(i8{kD*ifwLWyH=gb4BRDvG`1%oDUS8yF;qb2mi zcuwSKaTZ`)IJ&9bSD|guc~p3%$-EN-7Z>-gNRua4jT3q|>=_rk$v4WBRgNBjlIDQ` z`jPe9h5yf%K26HK2Z&aIVtNbmO`w@26()2WXr&T!r*n}$H$i@hsJQs#JlSGMlkS98 zzMM*c0X0H8L+YBH0Mpt{y?#ywZmNnNcceD)5q=`xH0zyFsf({G9gf=K%mJ}_G;@Lugp{30RXgG}unPCm1Sk4Q_KTGygHIhN#J;b3ET9zsKoTCo-jISD5Zw&KL?=VRaj83zjcGWjb!pYq_a zYZb<`f5OoX3phPFfjfBwE|}+IE+o`lk80D>bb-~Z;lxmzD%NIm#NGPS-)9-1!9f0B zgvUDu)(7tw78W3ZY;j-3>F}ztwr_)0=f0+Ge}8}D_Z|stz(USwNHEO?ij#7h7(Jrb zDpY%=o+ta3nuf-tK!y5V$LJ{GwI?V0c0~%xIl#xAe`2#M)UC*>8T!xIeM=^h?q5xJ zNxr$cP4EbQXiKaGZwzy}8NaHisMylk z%~wnVU;GUoqOZ3%q}-6HEo8kHZ{Hg!1@AILgY~B~1J?Ea$-mkoRkof*LezmuPaz~S zP;wj>4XJcq6wS2QCF&{3V3s0L`CO(6-nZ+^mk0Vp_q)U&-f~U**w-G0T`fdIPbJ`z zQ~XvaOGmnlDlL*uU*8FK00>UBD|L>cWWLku3?~$Q% zb3TWvy!_7YZlLyLk)|9m6C)$E0wK5g0d>Lh&U@D!(sjjTW;)fQXX4P#wg){jQ}BNu zO)pP$IXOA?Q}dx&uW-J`E{O`04p4|IkWiK+!e!!|1~up$;1M_*-zGBRkaj{z^XZk@ z>LfiI$5!H*&6I5$dq2Akqf>j_I0i2#fnwiVT z&aPx%i{!W5gAZFY)1u3^@tZRA`jR(-A+3>cRL#R9bTHZN{u@dE=W{BLj0Daonnq;C zC$$%`r;J3F3mSlm1PZ`%+s8&lwX2RH7;v1pn3&EgfVzd$d=BY# zo^T3eMyLH9;m>Ly`W)+7E@ZBjv;V~MXA$ae|uGKR+dB$2uc6H_rLzHwC;X} zR<27rrfaw40|w`C|A&@b#3@la24v`AMw}8w@4W*3^?w~0<+<|j1EW~~K3Dp`&&ygb Z(Kat_V{m(%b*{kAeHj($a>)ll{}06}S&aYy literal 0 HcmV?d00001 diff --git a/playground/frontend/CONTRIBUTE.md b/playground/frontend/CONTRIBUTE.md index 310b7c5c476e..07bc63e1a22a 100644 --- a/playground/frontend/CONTRIBUTE.md +++ b/playground/frontend/CONTRIBUTE.md @@ -21,55 +21,52 @@ This guide consists of: -- [Project structure](#project-structure) +- [Project Structure](#project-structure) - [State Management](#state-management) -- [Configuration](#configuration) +- [Example Loading](#example-loading) - [Theming](#theming) -- [Adding a new page](#adding-a-new-page) +- [Adding a New Page](#adding-a-new-page) - [Accessibility](#accessibility) -- [Unit testing](#unit-testing) -- [Generated Files](#generated-files) - -## Project structure - -``` -frontend/ -├── web -├── lib -│ ├── api # generated dart client for the grpc api -│ ├── components # general UI components used across the app -│ ├── config # general configs e.g. theme -│ ├── constants # different consts file like colors,sizes -│ ├── modules # different parts of the app -│ │ └── actions # common actions for the pages like new example, reset -│ │ └── editor # editor text field and run code -│ │ └── examples # everything related to loading/showing examples -│ │ └── notifications # common notications system -│ │ └── output # component to show log/output/graph result of running code -│ │ └── sdk # sdk selector -│ │ └── shortcuts # shortcuts modal and definitions -│ ├── pages # playground pages -│ │ └── playground # main playground editor paage -│ │ └── embedded_playground # embedded version of the editor -├── test # folder with unit tests -├── pubspec.yaml # infromation about application and dependencies -├── build.gradle # gradle tasks for playground frontends -├── gradle.properties # default properties for project -``` + +## Project Structure + +The frontend consists of 3 projects: + +- `frontend` is the playground app itself. +- `frontend/playground_components` is the package with common code for Playground and Tour of Beam. +- `frontend/playground_components_dev` is common code for tests of Playground and Tour of Beam. ## State Management -Playground uses [provider](https://pub.dev/packages/provider) package for state management. We have -top level providers like `ThemeProvider`, common page level provider `PlaygroundPageProviders` which -contains decoupled playground page state and module providers like `OutputPlacementState`. +Playground uses the [app_state](https://pub.dev/packages/app_state) package for state management. +The standalone playground and the embedded playground are two screens within the same app, +chosen by the URL at runtime. + +The main state object is `PlaygroundController`, created in both of those screens. +It is hung in the widget tree with the [provider](https://pub.dev/packages/provider) package +for historical reasons, and we aim to remove that if we do further refactoring. +New code should pass it directly from widget to widget for compile-time safety. + +## Example Loading + +A URL is parsed into one of the subclasses of `PagePath`, most of which contain +an `ExamplesLoadingDescriptor` object, which in turn may contain multiple `ExampleLoadingDescriptor` +objects. + +This is passed to the `ExamplesLoader` object. It constructs an `ExampleLoader` object +for each example's descriptor, and that loader performs the actual loading. + +To add a new source for examples: -For quick start up, please take a look -to [this guide](https://docs.flutter.dev/development/data-and-backend/state-mgmt/simple) +1. Subclass `ExampleLoadingDescriptor` with state and a method to parse it from a map of query string parameters. +2. Add it to `ExamplesLoadingDescriptorFactory`. +3. Subclass `ExampleLoader` and load an example there. +4. Add it to the `ExampleLoaderFactory` in `ExamplesLoader`. ## Theming Playground app supports light and dark themes. Component themes are declared -in [theme.dart](./lib/config/theme.dart) file. +in [theme.dart](playground_components/lib/src/theme/theme.dart) file. To use specific color inside component you can use helper `ThemeColors` utility: @@ -77,18 +74,17 @@ To use specific color inside component you can use helper `ThemeColors` utility: [colors.dart](./lib/constants/colors.dart) contains color declarations. -## Adding a new page +## Adding a New Page -To add a new page do the following steps: +To add a new page, do the following steps: -- Add a page component to the `pages` folder -- Add a url to the [routes.dart](./lib/pages/routes.dart) class as a static property -- Add a case clause to the same class with your component +1. Read [the overview](https://pub.dev/packages/app_state) of the `app_state` package. +2. Create a new `PagePath` subclass that parses the new URL. +3. Create a new `ChangeNotifier with PageStateMixin` that holds the state of the page. +4. Create a new `StatelessWidget` as the main one for the page. +5. Create a new `StatefulMaterialPage` subclass that binds the three together. -``` -case Routes.page_url: - return Routes.renderRoute(const PageComponent()); -``` +See the example in [lib/pages/standalone_playground](lib/pages/standalone_playground). ## Accessibility @@ -96,21 +92,3 @@ Please, read the following guides about the accessibility: - [Flutter Doc](https://docs.flutter.dev/development/accessibility-and-localization/accessibility) - [Medium Article](https://medium.com/flutter-community/a-deep-dive-into-flutters-accessibility-widgets-eb0ef9455bc) - -## Unit testing - -Unit tests are on `tests` folder. It keeps the project structure from the `lib` folder -with `_test.dart` file postfix. - -We are using standard flutter library for unit testing -and [Mockito](https://pub.dev/packages/mockito) for generating mocks. To generate mocks for class -you need to add `@GenerateMocks([ExampleClient])` annotation to a test file and -run `$ flutter pub run build_runner build` command. - -Playground tests may be run using next commands: - -`$ flutter test` - -## Generated Files - -All generated files (generated api clients, mocks) should be published to the repository. diff --git a/playground/frontend/Dockerfile b/playground/frontend/Dockerfile index 848fc697f30e..02f24347f9b0 100644 --- a/playground/frontend/Dockerfile +++ b/playground/frontend/Dockerfile @@ -17,7 +17,7 @@ ############################################################################### FROM debian:11 as build -ARG FLUTTER_VERSION=3.10.2 +ARG FLUTTER_VERSION=3.10.4 ARG BUILD_COMMIT_HASH ARG BUILD_COMMIT_SECONDS_SINCE_EPOCH diff --git a/playground/frontend/README.md b/playground/frontend/README.md index 7fc4481b83e3..bce5bb328172 100644 --- a/playground/frontend/README.md +++ b/playground/frontend/README.md @@ -135,7 +135,7 @@ This includes: - Tests. - Linter. -### Code style +### Code Style Code can be automatically reformatted using: @@ -178,6 +178,18 @@ flutter test ./gradlew :playground:frontend:integrationTest -PdeviceId=web-server ``` +By default, tests do not expect specific code and output from most examples. +This is because we get the expected example files from GitHub itself at runtime. +Examples in the default GitHub branch may differ from the deployed ones, +and this will break the tests. + +To expect specific code and output, run tests like this using any repository owner/name +and commit reference to load the examples from: + +```bash +./gradlew :playground:frontend:integrationTest -PexamplesRepository=apache/beam -PexamplesRef=master +``` + ## Localization The project is in the process of migrating from diff --git a/playground/frontend/build.gradle b/playground/frontend/build.gradle index a21a0661761f..5e12022e3297 100644 --- a/playground/frontend/build.gradle +++ b/playground/frontend/build.gradle @@ -263,20 +263,33 @@ tasks.register("integrationTest_standalone_share_code") { void runIntegrationTest(String path, String url) { // Run with -PdeviceId=web-server for headless tests. + // Run with -PexamplesRepository=apache/beam -PexamplesRef=master to verify that deployed examples match the given branch or commit. String deviceId = project.hasProperty("deviceId") ? project.deviceId : "chrome" + String examplesRepository = project.hasProperty("examplesRepository") ? project.examplesRepository : null + String examplesRef = project.hasProperty("examplesRef") ? project.examplesRef : null + + List flutterArgs = [ + "drive", + "--driver=test_driver/integration_test.dart", + "--target=integration_test/${path}_test.dart", + "--web-launch-url='$url'", + "--device-id=$deviceId", + ] + + if (examplesRepository != null) { + flutterArgs.add("--dart-define=examples-repository=$examplesRepository") + } + if (examplesRef != null) { + flutterArgs.add("--dart-define=examples-ref=$examplesRef") + } exec { executable("flutter") - args( - "drive", - "--driver=test_driver/integration_test.dart", - "--target=integration_test/${path}_test.dart", - "--web-launch-url='$url'", - "--device-id=$deviceId", - ) + args(flutterArgs) } } + task copyDockerfileDependencies(type: Copy) { group = "build" description = "Copy files that required to build docker container" diff --git a/playground/frontend/integration_test/initial_urls_test.dart b/playground/frontend/integration_test/initial_urls_test.dart index bb8784dcc0ef..01d674dcad6f 100644 --- a/playground/frontend/integration_test/initial_urls_test.dart +++ b/playground/frontend/integration_test/initial_urls_test.dart @@ -49,7 +49,7 @@ void main() { await _testCatalogDefaultExampleLoader(wt); await _testContentExampleLoader(wt); await _testEmptyExampleLoader(wt); - await _testHttpExampleLoader(wt); + await _testHttpExampleLoaderIfDeployed(wt); await _testStandardExampleLoader(wt); await _testUserSharedExampleLoader(wt); @@ -76,7 +76,7 @@ final _croppedViewOptions = _mapToQueryString(_croppedViewOptionsMap); Future _testEmbeddedRoot(WidgetTester wt) async { await wt.navigateAndSettle(_embeddedPath); expectSdk(Sdk.java, wt); - expectVisibleText('', wt); + expectVisibleTextIfDeployed('', wt); expectLastAnalyticsEvent( const LoadedAnalyticsEvent( sdk: Sdk.java, @@ -90,7 +90,7 @@ Future _testStandaloneRoot(WidgetTester wt) async { await wt.navigateAndSettle(_standalonePath); expectSdk(Sdk.java, wt); - expectVisibleText(visibleText, wt); + expectVisibleTextIfDeployed(visibleText, wt); expectLastAnalyticsEvent( const LoadedAnalyticsEvent( sdk: Sdk.java, @@ -102,7 +102,7 @@ Future _testStandaloneRoot(WidgetTester wt) async { Future _testEmbeddedSdkOnly(WidgetTester wt) async { await wt.navigateAndSettle('$_embeddedPath?sdk=go'); expectSdk(Sdk.go, wt); - expectVisibleText('', wt); + expectVisibleTextIfDeployed('', wt); expectLastAnalyticsEvent( const LoadedAnalyticsEvent( sdk: Sdk.go, @@ -116,7 +116,7 @@ Future _testStandaloneSdkOnly(WidgetTester wt) async { await wt.navigateAndSettle('$_standalonePath?sdk=go'); expectSdk(Sdk.go, wt); - expectVisibleText(visibleText, wt); + expectVisibleTextIfDeployed(visibleText, wt); expectLastAnalyticsEvent( const LoadedAnalyticsEvent( sdk: Sdk.go, @@ -130,7 +130,7 @@ Future _testCatalogDefaultExampleLoader(WidgetTester wt) async { await wt.navigateAndSettle('$_standalonePath?sdk=go&default=true'); expectSdk(Sdk.go, wt); - expectVisibleText(visibleText, wt); + expectVisibleTextIfDeployed(visibleText, wt); expectLastAnalyticsEvent( const LoadedAnalyticsEvent( sdk: Sdk.go, @@ -150,7 +150,7 @@ Future _testContentExampleLoader(WidgetTester wt) async { '$path?sdk=go&files=${Uri.encodeComponent(files)}&$_fullViewOptions', ); expectSdk(Sdk.go, wt); - expectVisibleText(goExample.foldedVisibleText, wt); + expectVisibleTextIfDeployed(goExample.foldedVisibleText, wt); expectLastAnalyticsEvent( const LoadedAnalyticsEvent( sdk: Sdk.go, @@ -163,7 +163,7 @@ Future _testContentExampleLoader(WidgetTester wt) async { '$path?sdk=go&files=${Uri.encodeComponent(files)}&$_croppedViewOptions', ); expectSdk(Sdk.go, wt); - expectVisibleText(goExample.croppedFoldedVisibleText, wt); + expectVisibleTextIfDeployed(goExample.croppedFoldedVisibleText, wt); _expectReadOnly(wt); } } @@ -172,7 +172,7 @@ Future _testEmptyExampleLoader(WidgetTester wt) async { for (final path in _paths) { await wt.navigateAndSettle('$path?sdk=go&empty=true'); expectSdk(Sdk.go, wt); - expectVisibleText('', wt); + expectVisibleTextIfDeployed('', wt); expectLastAnalyticsEvent( const LoadedAnalyticsEvent( sdk: Sdk.go, @@ -182,13 +182,17 @@ Future _testEmptyExampleLoader(WidgetTester wt) async { } } -Future _testHttpExampleLoader(WidgetTester wt) async { +Future _testHttpExampleLoaderIfDeployed(WidgetTester wt) async { + if (!areExamplesDeployed) { + return; + } + for (final path in _paths) { await wt.navigateAndSettle( '$path?sdk=go&url=${goExample.rawUrl}&$_fullViewOptions', ); expectSdk(Sdk.go, wt); - expectVisibleText(goExample.foldedVisibleText, wt); + expectVisibleTextIfDeployed(goExample.foldedVisibleText, wt); expectLastAnalyticsEvent( LoadedAnalyticsEvent( sdk: Sdk.go, @@ -201,7 +205,7 @@ Future _testHttpExampleLoader(WidgetTester wt) async { '$path?sdk=go&url=${goExample.rawUrl}&$_croppedViewOptions', ); expectSdk(Sdk.go, wt); - expectVisibleText(goExample.croppedFoldedVisibleText, wt); + expectVisibleTextIfDeployed(goExample.croppedFoldedVisibleText, wt); expectLastAnalyticsEvent( LoadedAnalyticsEvent( sdk: Sdk.go, @@ -220,7 +224,7 @@ Future _testStandardExampleLoader(WidgetTester wt) async { '$path?sdk=go&path=${goWordCount.dbPath}', ); expectSdk(Sdk.go, wt); - expectVisibleText(visibleText, wt); + expectVisibleTextIfDeployed(visibleText, wt); expectLastAnalyticsEvent( LoadedAnalyticsEvent( sdk: Sdk.go, @@ -234,22 +238,14 @@ Future _testUserSharedExampleLoader(WidgetTester wt) async { final template = await goExample.getFullText(); final tail = '\n//${DateTime.now().millisecondsSinceEpoch}'; final content = '$template$tail'; - - final exampleCache = wt.findPlaygroundController().exampleCache; - final snippetId = await exampleCache.saveSnippet( - files: [SnippetFile(content: content, isMain: false, name: 'name')], - sdk: Sdk.go, - pipelineOptions: '--name=value', - ); - - print('Created user-shared example ID: $snippetId'); + final snippetId = await _getSnippetId(wt, content, Sdk.go); for (final path in _paths) { await wt.navigateAndSettle( '$path?sdk=go&shared=$snippetId&$_fullViewOptions', ); expectSdk(Sdk.go, wt); - expectVisibleText('${goExample.foldedVisibleText}$tail', wt); + expectVisibleTextIfDeployed('${goExample.foldedVisibleText}$tail', wt); expectLastAnalyticsEvent( LoadedAnalyticsEvent( sdk: Sdk.go, @@ -262,7 +258,7 @@ Future _testUserSharedExampleLoader(WidgetTester wt) async { '$path?sdk=go&shared=$snippetId&$_croppedViewOptions', ); expectSdk(Sdk.go, wt); - expectVisibleText(goExample.croppedFoldedVisibleText, wt); + expectVisibleTextIfDeployed(goExample.croppedFoldedVisibleText, wt); expectLastAnalyticsEvent( LoadedAnalyticsEvent( sdk: Sdk.go, @@ -273,19 +269,38 @@ Future _testUserSharedExampleLoader(WidgetTester wt) async { } } +Future _getSnippetId(WidgetTester wt, String content, Sdk sdk) async { + final exampleCache = wt.findPlaygroundController().exampleCache; + final snippetId = await exampleCache.saveSnippet( + files: [SnippetFile(content: content, isMain: false, name: 'name')], + sdk: sdk, + pipelineOptions: '--name=value', + ); + + print('Created user-shared example ID: $snippetId'); + + return snippetId; +} + Future _testMultipleExamples(WidgetTester wt) async { - final javaVisibleText = await javaAggregationMax.getVisibleText(); - final goVisibleText = goExample.foldedVisibleText; + final javaTemplate = await javaExample.getFullText(); + final goTemplate= await goExample.getFullText(); + final tail = '\n//${DateTime.now().millisecondsSinceEpoch}'; + final javaSnippetId = await _getSnippetId(wt, '$javaTemplate$tail', Sdk.java); + final goSnippetId = await _getSnippetId(wt, '$goTemplate$tail', Sdk.go); + + final javaVisibleText = '${javaExample.foldedVisibleText}$tail'; + final goVisibleText = '${goExample.foldedVisibleText}$tail'; final examplesList = [ { 'sdk': Sdk.java.id, - 'path': javaAggregationMax.dbPath, + 'shared': javaSnippetId, ..._fullViewOptionsMap, }, { 'sdk': Sdk.go.id, - 'url': goExample.rawUrl, + 'shared': goSnippetId, ..._fullViewOptionsMap, }, ]; @@ -294,11 +309,11 @@ Future _testMultipleExamples(WidgetTester wt) async { for (final path in _paths) { await wt.navigateAndSettle('$path?sdk=go&examples=$examples'); expectSdk(Sdk.go, wt); - expectVisibleText(goVisibleText, wt); + expectVisibleText(goVisibleText, wt, reason: 'go, $path'); expectLastAnalyticsEvent( LoadedAnalyticsEvent( sdk: Sdk.go, - snippet: goExample.rawUrl, + snippet: goSnippetId, ), ); await _expectEditableAndReadOnly(wt); @@ -308,7 +323,8 @@ Future _testMultipleExamples(WidgetTester wt) async { await wt.pumpAndSettle(); expectSdk(Sdk.java, wt); - expectVisibleText(javaVisibleText, wt); + expectVisibleText(javaVisibleText, wt, reason: 'java, $path'); + await _expectEditableAndReadOnly(wt); } } diff --git a/playground/frontend/integration_test/miscellaneous_ui/external_url_navigation.dart b/playground/frontend/integration_test/miscellaneous_ui/external_url_navigation.dart index fb656240c4fa..d5fe13712db6 100644 --- a/playground/frontend/integration_test/miscellaneous_ui/external_url_navigation.dart +++ b/playground/frontend/integration_test/miscellaneous_ui/external_url_navigation.dart @@ -90,6 +90,9 @@ Future _checkMenuItems(WidgetTester wt) async { } Future _checkExampleDescription(WidgetTester wt) async { + final url = wt.findPlaygroundController().selectedExample?.urlVcs; + expect(url, isNotNull); + await _tapAndExpectNavigationEvent( wt, [ @@ -99,7 +102,7 @@ Future _checkExampleDescription(WidgetTester wt) async { matching: find.byType(GithubButton), ), ], - javaMinimalWordCount.url, + url!, ); } diff --git a/playground/frontend/integration_test/miscellaneous_ui/feedback_test.dart b/playground/frontend/integration_test/miscellaneous_ui/feedback_test.dart index 02852b4a3bab..576b65f98340 100644 --- a/playground/frontend/integration_test/miscellaneous_ui/feedback_test.dart +++ b/playground/frontend/integration_test/miscellaneous_ui/feedback_test.dart @@ -25,20 +25,16 @@ import '../common/examples.dart'; Future checkFeedback(WidgetTester wt) async { for (final rating in FeedbackRating.values) { - for (final send in [true, false]) { - await _checkFeedback( - wt, - rating: rating, - send: send, - ); - } + await _checkFeedback( + wt, + rating: rating, + ); } } Future _checkFeedback( WidgetTester wt, { required FeedbackRating rating, - required bool send, }) async { await wt.tapAndSettle(find.feedbackThumb(rating)); @@ -47,29 +43,11 @@ Future _checkFeedback( rating: rating, snippetContext: defaultEventSnippetContext, ), - reason: 'Rating: $rating, Send: $send', + reason: 'Rating: $rating, Send: false', ); expect(find.feedbackDropdownContent(), findsOneWidget); - if (!send) { - await wt.tapAndSettle(find.dismissibleOverlay()); - } else { - final text = 'This is $rating text.'; - await wt.enterText(find.feedbackDropdownTextField(), text); - await wt.pumpAndSettle(); - - expect(find.text(text), findsOneWidget); - - await wt.tapAndSettle(find.feedbackDropdownSendButton()); - - expectLastAnalyticsEvent( - FeedbackFormSentAnalyticsEvent( - rating: rating, - text: text, - snippetContext: defaultEventSnippetContext, - ), - ); - } + await wt.tapAndSettle(find.dismissibleOverlay()); expect(find.feedbackDropdownContent(), findsNothing); } diff --git a/playground/frontend/integration_test/miscellaneous_ui/output_placement_test.dart b/playground/frontend/integration_test/miscellaneous_ui/output_placement_test.dart index a8ca1852e8eb..b13630c8e1a9 100644 --- a/playground/frontend/integration_test/miscellaneous_ui/output_placement_test.dart +++ b/playground/frontend/integration_test/miscellaneous_ui/output_placement_test.dart @@ -21,7 +21,6 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:playground/modules/output/models/output_placement.dart'; import 'package:playground_components_dev/playground_components_dev.dart'; -import '../common/common.dart'; import '../common/common_finders.dart'; Future checkOutputPlacement(WidgetTester wt) async { diff --git a/playground/frontend/integration_test/miscellaneous_ui/resize_output_test.dart b/playground/frontend/integration_test/miscellaneous_ui/resize_output_test.dart index 717ce6ac2c7a..353ee0593bc6 100644 --- a/playground/frontend/integration_test/miscellaneous_ui/resize_output_test.dart +++ b/playground/frontend/integration_test/miscellaneous_ui/resize_output_test.dart @@ -22,7 +22,6 @@ import 'package:playground/modules/output/models/output_placement.dart'; import 'package:playground_components/playground_components.dart'; import 'package:playground_components_dev/playground_components_dev.dart'; -import '../common/common.dart'; import '../common/common_finders.dart'; Future checkResizeOutput(WidgetTester wt) async { diff --git a/playground/frontend/integration_test/miscellaneous_ui/shortcuts_modal_test.dart b/playground/frontend/integration_test/miscellaneous_ui/shortcuts_modal_test.dart index 78addbc0de75..93c748f422c1 100644 --- a/playground/frontend/integration_test/miscellaneous_ui/shortcuts_modal_test.dart +++ b/playground/frontend/integration_test/miscellaneous_ui/shortcuts_modal_test.dart @@ -17,7 +17,6 @@ */ import 'package:flutter/services.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:playground/pages/standalone_playground/widgets/more_actions.dart'; import 'package:playground/services/analytics/events/shortcuts_clicked.dart'; diff --git a/playground/frontend/integration_test/standalone_change_example_sdk_run_test.dart b/playground/frontend/integration_test/standalone_change_example_sdk_run_test.dart index 00f10d3b8643..c7fc945aea9b 100644 --- a/playground/frontend/integration_test/standalone_change_example_sdk_run_test.dart +++ b/playground/frontend/integration_test/standalone_change_example_sdk_run_test.dart @@ -35,12 +35,17 @@ void main() { await wt.tapAndSettle(find.exampleSelector()); await wt.tapAndSettle(find.exampleItemInDropdown(javaAggregationMax.name)); - expect( - wt.findOneCodeController().lastTextSpan!.toPlainText().isAsIfCutFrom( - await javaAggregationMax.getVisibleText(), - ), - true, - ); + if (areExamplesDeployed) { + final visibleText = await javaAggregationMax.getVisibleText(); + final lastSpanText = + wt.findOneCodeController().lastTextSpan!.toPlainText(); + + expect( + lastSpanText.isAsIfCutFrom(visibleText), + true, + reason: '$lastSpanText is not as if cut from $visibleText', + ); + } expectLastAnalyticsEvent( SnippetSelectedAnalyticsEvent( @@ -65,18 +70,25 @@ public class MyClass { await wt.tapAndSettle(find.runOrCancelButton()); - expectOutputEquals('$_outputPrefix$text', wt); + expectOutputEqualsIfDeployed('$_outputPrefix$text', wt); } Future switchToPython(WidgetTester wt) async { await wt.changeSdk(Sdk.python); - expect( - wt.findOneCodeController().lastTextSpan!.toPlainText().isAsIfCutFrom( - await pythonWordCountWithMetrics.getVisibleText(), - ), - true, - ); + if (areExamplesDeployed) { + final visibleText = await pythonWordCountWithMetrics.getVisibleText(); + final lastSpanText = wt + .findOneCodeController() + .lastTextSpan! + .toPlainText(); + + expect( + lastSpanText.isAsIfCutFrom(visibleText), + true, + reason: '$lastSpanText is not as if cut from $visibleText', + ); + } expectLastAnalyticsEvent(const SdkSelectedAnalyticsEvent(sdk: Sdk.python)); } @@ -108,7 +120,7 @@ public class MyClass { await wt.tapAndSettle(find.runOrCancelButton()); - expectOutputEquals('$_outputPrefix$text', wt); + expectOutputEqualsIfDeployed('$_outputPrefix$text', wt); } testWidgets('Change example, change SDK, run', (WidgetTester wt) async { diff --git a/playground/frontend/integration_test/standalone_default_examples_test.dart b/playground/frontend/integration_test/standalone_default_examples_test.dart index ebde29f4f038..e81bc4901d5d 100644 --- a/playground/frontend/integration_test/standalone_default_examples_test.dart +++ b/playground/frontend/integration_test/standalone_default_examples_test.dart @@ -53,7 +53,7 @@ Future _expectExample(ExampleDescriptor example, WidgetTester wt) async { final visibleText = await example.getVisibleText(); expectSdk(example.sdk, wt); - expectVisibleText(visibleText, wt); + expectVisibleTextIfDeployed(visibleText, wt); if (example.hasGraphTab) { expect(find.graphTab(), findsOneWidget); diff --git a/playground/frontend/integration_test/standalone_editing_test.dart b/playground/frontend/integration_test/standalone_editing_test.dart index 0dc3323ca4da..7f4a128069de 100644 --- a/playground/frontend/integration_test/standalone_editing_test.dart +++ b/playground/frontend/integration_test/standalone_editing_test.dart @@ -38,23 +38,6 @@ void main() { }); } -Future _checkAutocomplete(WidgetTester wt) async { - // Several newlines are required here because suggestion - // popup works incorrectly. Remove when fixed - await wt.enterCodeFieldText('\n\n\n\n\nsdk'); - - final playgroundController = wt.findPlaygroundController(); - await wt.runShortcut(playgroundController.showSuggestionsShortcut); - await wt.pumpAndSettle(); - - expect(find.text('sdkHttpMetadata'), findsOneWidget); - expect(find.text('sdkHttpMetadataWithoutHeaders'), findsOneWidget); - expect(find.text('sdkHttpResponse'), findsOneWidget); - expect(find.text('sdkHttpResponseWithoutHeaders'), findsOneWidget); - - await wt.tapAndSettle(find.resetButton()); -} - Future _checkResetUnmodifiedCode(WidgetTester wt) async { final playgroundController = wt.findPlaygroundController(); @@ -97,6 +80,23 @@ Future _checkResetModifiedCode(WidgetTester wt) async { ); } +Future _checkAutocomplete(WidgetTester wt) async { + // Several newlines are required here because suggestion + // popup works incorrectly. Remove when fixed + await wt.enterCodeFieldText('\n\n\n\n\nsdk'); + + final playgroundController = wt.findPlaygroundController(); + await wt.runShortcut(playgroundController.showSuggestionsShortcut); + await wt.pumpAndSettle(); + + expect(find.text('sdkHttpMetadata'), findsOneWidget); + expect(find.text('sdkHttpMetadataWithoutHeaders'), findsOneWidget); + expect(find.text('sdkHttpResponse'), findsOneWidget); + expect(find.text('sdkHttpResponseWithoutHeaders'), findsOneWidget); + + await wt.tapAndSettle(find.resetButton()); +} + Future _checkCodeHighlightedMultipleColors(WidgetTester wt) async { final codeController = wt.findOneCodeController(); final colors = {}; diff --git a/playground/frontend/lib/constants/links.dart b/playground/frontend/lib/constants/links.dart index b9aa3d3d1700..5307c4dd18f3 100644 --- a/playground/frontend/lib/constants/links.dart +++ b/playground/frontend/lib/constants/links.dart @@ -16,4 +16,5 @@ * limitations under the License. */ -const kAddExampleLink = 'https://beam.apache.org/get-started/try-beam-playground/#how-to-add-new-examples'; +const playgroundFeedbackGoogleFormsUrl = + 'https://docs.google.com/forms/d/e/1FAIpQLSd5_5XeOwwW2yjEVHUXmiBad8Lxk-4OtNcgG45pbyAZzd4EbA/viewform?usp=pp_url'; diff --git a/playground/frontend/lib/locator.dart b/playground/frontend/lib/locator.dart index 21496607b6e7..6aef592e9f7b 100644 --- a/playground/frontend/lib/locator.dart +++ b/playground/frontend/lib/locator.dart @@ -62,7 +62,6 @@ void _initializeRouter() { GetIt.instance.registerSingleton( PlaygroundRouteInformationParser(), ); - print('Initialized PageStackRouteInformationParser'); } void _initializeServices() { diff --git a/playground/frontend/lib/modules/actions/components/new_example.dart b/playground/frontend/lib/modules/actions/components/new_example.dart index 30e44f24c736..6f1b1c9bf1e5 100644 --- a/playground/frontend/lib/modules/actions/components/new_example.dart +++ b/playground/frontend/lib/modules/actions/components/new_example.dart @@ -42,7 +42,7 @@ class NewExampleButton extends StatelessWidget { PlaygroundComponents.analyticsService.sendUnawaited( const NewExampleAnalyticsEvent(), ); - unawaited(launchUrl(Uri.parse('/'))); + unawaited(launchUrl(Uri.parse(BeamLinks.newExample))); }, ), ); diff --git a/playground/frontend/lib/modules/editor/components/share_dropdown/share_tabs/share_tabs.dart b/playground/frontend/lib/modules/editor/components/share_dropdown/share_tabs/share_tabs.dart index 33e423422086..18ad44b4f58b 100644 --- a/playground/frontend/lib/modules/editor/components/share_dropdown/share_tabs/share_tabs.dart +++ b/playground/frontend/lib/modules/editor/components/share_dropdown/share_tabs/share_tabs.dart @@ -48,9 +48,8 @@ class ShareTabs extends StatelessWidget { builder: (context, playgroundController, _) { final controller = playgroundController.requireSnippetEditingController(); - final descriptor = controller.descriptor; - if (descriptor == null || controller.isChanged) { + if (controller.shouldSaveBeforeSharing()) { return SnippetSaveAndShareTabs( eventSnippetContext: eventSnippetContext, onError: onError, @@ -61,7 +60,7 @@ class ShareTabs extends StatelessWidget { } return ExampleShareTabs( - descriptor: descriptor, + descriptor: controller.descriptor!, eventSnippetContext: eventSnippetContext, sdk: controller.sdk, tabController: tabController, diff --git a/playground/frontend/lib/modules/examples/examples_dropdown_content.dart b/playground/frontend/lib/modules/examples/examples_dropdown_content.dart index df0743001c55..0ed1304d460f 100644 --- a/playground/frontend/lib/modules/examples/examples_dropdown_content.dart +++ b/playground/frontend/lib/modules/examples/examples_dropdown_content.dart @@ -21,7 +21,6 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:playground_components/playground_components.dart'; import 'package:url_launcher/url_launcher.dart'; -import '../../constants/links.dart'; import '../../constants/sizes.dart'; import 'components/example_list/example_list.dart'; import 'components/filter/filter.dart'; @@ -88,7 +87,7 @@ class _ExamplesDropdownContentState extends State { ), ), ), - onPressed: () => launchUrl(Uri.parse(kAddExampleLink)), + onPressed: () => launchUrl(Uri.parse(BeamLinks.newExample)), ), ), ], diff --git a/playground/frontend/lib/modules/examples/models/example_loading_descriptors/examples_loading_descriptor_factory.dart b/playground/frontend/lib/modules/examples/models/example_loading_descriptors/examples_loading_descriptor_factory.dart index 41a2443f9d12..ce567e170a60 100644 --- a/playground/frontend/lib/modules/examples/models/example_loading_descriptors/examples_loading_descriptor_factory.dart +++ b/playground/frontend/lib/modules/examples/models/example_loading_descriptors/examples_loading_descriptor_factory.dart @@ -61,7 +61,7 @@ class ExamplesLoadingDescriptorFactory { return null; } - // The order does not matter. + // The order does not matter because parsing must not be ambiguous. return CatalogDefaultExampleLoadingDescriptor.tryParse(map) ?? ContentExampleLoadingDescriptor.tryParse(map) ?? EmptyExampleLoadingDescriptor.tryParse(map) ?? diff --git a/playground/frontend/lib/modules/examples/models/example_loading_descriptors/no_url_example_loading_descriptor.dart b/playground/frontend/lib/modules/examples/models/example_loading_descriptors/no_url_example_loading_descriptor.dart index e315201f76ae..b187352f89e6 100644 --- a/playground/frontend/lib/modules/examples/models/example_loading_descriptors/no_url_example_loading_descriptor.dart +++ b/playground/frontend/lib/modules/examples/models/example_loading_descriptors/no_url_example_loading_descriptor.dart @@ -31,4 +31,7 @@ class NoUrlExampleLoadingDescriptor extends ExampleLoadingDescriptor { @override Map toJson() => {}; + + @override + bool get isSerializableToUrl => true; } diff --git a/playground/frontend/lib/modules/messages/parsers/messages_parser.dart b/playground/frontend/lib/modules/messages/parsers/messages_parser.dart index 2d8b71bca635..b2e98bf42d11 100644 --- a/playground/frontend/lib/modules/messages/parsers/messages_parser.dart +++ b/playground/frontend/lib/modules/messages/parsers/messages_parser.dart @@ -32,8 +32,7 @@ class MessagesParser { } AbstractMessage? _tryParseMap(Map map) { - return SetContentMessage.tryParse(map) ?? - SetSdkMessage.tryParse(map); + return SetContentMessage.tryParse(map) ?? SetSdkMessage.tryParse(map); } AbstractMessage? _tryParseIfJson(Object? json) { @@ -46,6 +45,7 @@ class MessagesParser { } } on FormatException catch (ex) { // TODO: Log + print('_tryParseIfJson FormatException: $ex'); } } diff --git a/playground/frontend/lib/modules/shortcuts/constants/global_shortcuts.dart b/playground/frontend/lib/modules/shortcuts/constants/global_shortcuts.dart index 4c762e1c6c31..30ba033fac61 100644 --- a/playground/frontend/lib/modules/shortcuts/constants/global_shortcuts.dart +++ b/playground/frontend/lib/modules/shortcuts/constants/global_shortcuts.dart @@ -51,7 +51,7 @@ final kNewExampleShortcut = BeamShortcut( ], actionIntent: const NewExampleIntent(), createAction: (_) => CallbackAction( - onInvoke: (_) => launchUrl(Uri.parse('/')), + onInvoke: (_) => launchUrl(Uri.parse(BeamLinks.newExample)), ), ); diff --git a/playground/frontend/lib/pages/embedded_playground/widgets/embedded_editor.dart b/playground/frontend/lib/pages/embedded_playground/widgets/embedded_editor.dart index b117adac24ba..c94e824db45f 100644 --- a/playground/frontend/lib/pages/embedded_playground/widgets/embedded_editor.dart +++ b/playground/frontend/lib/pages/embedded_playground/widgets/embedded_editor.dart @@ -35,6 +35,7 @@ class EmbeddedEditor extends StatelessWidget { } return SnippetEditor( + autofocus: false, controller: snippetController, isEditable: isEditable, ); diff --git a/playground/frontend/lib/pages/standalone_playground/widgets/editor_textarea_wrapper.dart b/playground/frontend/lib/pages/standalone_playground/widgets/editor_textarea_wrapper.dart index 086a61ed64c7..81e50e9719fa 100644 --- a/playground/frontend/lib/pages/standalone_playground/widgets/editor_textarea_wrapper.dart +++ b/playground/frontend/lib/pages/standalone_playground/widgets/editor_textarea_wrapper.dart @@ -51,6 +51,7 @@ class CodeTextAreaWrapper extends StatelessWidget { final example = snippetController.example; return SnippetEditor( + autofocus: true, controller: snippetController, isEditable: true, actionsWidget: Row( diff --git a/playground/frontend/lib/pages/standalone_playground/widgets/playground_page_footer.dart b/playground/frontend/lib/pages/standalone_playground/widgets/playground_page_footer.dart index 8af1ab6eca31..22bbb71aaf6d 100644 --- a/playground/frontend/lib/pages/standalone_playground/widgets/playground_page_footer.dart +++ b/playground/frontend/lib/pages/standalone_playground/widgets/playground_page_footer.dart @@ -23,6 +23,7 @@ import 'package:playground_components/playground_components.dart'; import 'package:provider/provider.dart'; import '../../../constants/sizes.dart'; +import '../../../constants/links.dart'; class PlaygroundPageFooter extends StatelessWidget { const PlaygroundPageFooter({Key? key}) : super(key: key); @@ -46,6 +47,7 @@ class PlaygroundPageFooter extends StatelessWidget { children: [ FeedbackWidget( controller: GetIt.instance.get(), + feedbackFormUrl: playgroundFeedbackGoogleFormsUrl, title: 'ui.feedbackTitle'.tr(), ), ReportIssueButton(playgroundController: playgroundController), diff --git a/playground/frontend/lib/playground_app.dart b/playground/frontend/lib/playground_app.dart index c335c31d9cde..001cd4c07f0e 100644 --- a/playground/frontend/lib/playground_app.dart +++ b/playground/frontend/lib/playground_app.dart @@ -16,7 +16,6 @@ * limitations under the License. */ -import 'package:app_state/app_state.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; @@ -29,8 +28,8 @@ import 'l10n/l10n.dart'; class PlaygroundApp extends StatelessWidget { final BackButtonDispatcher backButtonDispatcher; - final PageStackRouteInformationParser routeInformationParser; - final PageStackRouterDelegate routerDelegate; + final RouteInformationParser routeInformationParser; + final RouterDelegate routerDelegate; const PlaygroundApp({ required this.backButtonDispatcher, diff --git a/playground/frontend/lib/router/page_factory.dart b/playground/frontend/lib/router/page_factory.dart index 3bf14ca2df37..89a1fd0916d1 100644 --- a/playground/frontend/lib/router/page_factory.dart +++ b/playground/frontend/lib/router/page_factory.dart @@ -24,9 +24,9 @@ import '../pages/embedded_playground/page.dart'; /// Creates pages from their normalized state. class PageFactory { static AbstractPage? createPage( - String factoryKey, - Map state, - ) { + String factoryKey, + Map state, + ) { switch (factoryKey) { case EmbeddedPlaygroundPage.classFactoryKey: return EmbeddedPlaygroundPage.fromStateMap(state); diff --git a/playground/frontend/playground_components/lib/src/constants/backend_urls.dart b/playground/frontend/playground_components/lib/src/constants/backend_urls.dart index 20c2d6348d95..af9390ddc6d6 100644 --- a/playground/frontend/playground_components/lib/src/constants/backend_urls.dart +++ b/playground/frontend/playground_components/lib/src/constants/backend_urls.dart @@ -23,11 +23,19 @@ const defaultBackendUrlTemplate = 'https://{node}.play.beam.apache.org'; /// The URLs for local backend development. const backendUrlOverrides = { + // Uncomment the following lines to use staging backend: // 'router': 'https://router.play-dev.beam.apache.org', // 'go': 'https://go.play-dev.beam.apache.org', // 'java': 'https://java.play-dev.beam.apache.org', // 'python': 'https://python.play-dev.beam.apache.org', // 'scio': 'https://scio.play-dev.beam.apache.org', + + // Uncomment the following lines to use local backend: + // 'router': 'http://localhost:8081', + // 'go': 'http://localhost:8084', + // 'java': 'http://localhost:8086', + // 'python': 'http://localhost:8088', + // 'scio': 'http://localhost:8090', }; /// The URL templates that will not be probed diff --git a/playground/frontend/playground_components/lib/src/constants/colors.dart b/playground/frontend/playground_components/lib/src/constants/colors.dart index 6db92295c16a..e548b31e4e4a 100644 --- a/playground/frontend/playground_components/lib/src/constants/colors.dart +++ b/playground/frontend/playground_components/lib/src/constants/colors.dart @@ -60,9 +60,9 @@ class BeamLightThemeColors { static const primary = Color(0xffE74D1A); static const icon = BeamColors.grey3; - static const code1 = Color(0xffDA2833); + static const code1 = primary; static const code2 = Color(0xff5929B4); - static const codeComment = Color(0xff4C6B60); + static const codeComment = Color(0xff1B5E20); static const codeBackground = Color(0xffFEF6F3); } @@ -79,8 +79,8 @@ class BeamDarkThemeColors { static const primary = Color(0xffF26628); static const icon = Color(0xff606772); - static const code1 = Color(0xffDA2833); - static const code2 = Color(0xff5929B4); - static const codeComment = Color(0xff4C6B60); + static const code1 = Color(0xffFFEB3B); + static const code2 = primary; + static const codeComment = Color(0xff689F38); static const codeBackground = Color(0xff231B1B); } diff --git a/playground/frontend/playground_components/lib/src/constants/links.dart b/playground/frontend/playground_components/lib/src/constants/links.dart index aba7413e2959..c5addcfcc266 100644 --- a/playground/frontend/playground_components/lib/src/constants/links.dart +++ b/playground/frontend/playground_components/lib/src/constants/links.dart @@ -24,6 +24,8 @@ class BeamLinks { // GitHub static const github = 'https://github.com/apache/beam'; + static const newExample = + 'https://github.com/apache/beam/blob/master/playground/load_your_code.md'; static const reportIssue = 'https://github.com/apache/beam/issues'; // Projects diff --git a/playground/frontend/playground_components/lib/src/controllers/code_runner.dart b/playground/frontend/playground_components/lib/src/controllers/code_runner.dart index 68b357b36326..0a55b4236b6f 100644 --- a/playground/frontend/playground_components/lib/src/controllers/code_runner.dart +++ b/playground/frontend/playground_components/lib/src/controllers/code_runner.dart @@ -16,6 +16,8 @@ * limitations under the License. */ +// ignore_for_file: prefer_interpolation_to_compose_strings + import 'dart:async'; import 'package:clock/clock.dart'; @@ -58,7 +60,6 @@ class CodeRunner extends ChangeNotifier { }) : _snippetEditingControllerGetter = snippetEditingControllerGetter; RunCodeResult? _result; - StreamSubscription? _runSubscription; DateTime? _runStartDate; DateTime? _runStopDate; @@ -155,7 +156,6 @@ class CodeRunner extends ChangeNotifier { final log = parsedPipelineOptions.isEmpty ? kProcessingStartedText - // ignore: prefer_interpolation_to_compose_strings : kProcessingStartedOptionsText + parsedPipelineOptions.entries .map((e) => '--${e.key} ${e.value}') @@ -209,7 +209,10 @@ class CodeRunner extends ChangeNotifier { _setResult( RunCodeResult( errorMessage: ex.message ?? kUnknownErrorText, - output: ex.message ?? kUnknownErrorText, + log: _result!.log, + output: (_result!.output ?? '') + + '\n' + + (ex.message ?? kUnknownErrorText), sdk: request.sdk, status: RunCodeStatus.unknownError, ), @@ -219,7 +222,8 @@ class CodeRunner extends ChangeNotifier { _setResult( RunCodeResult( errorMessage: kUnknownErrorText, - output: kUnknownErrorText, + log: _result!.log, + output: (_result!.output ?? '') + '\n' + kUnknownErrorText, sdk: request.sdk, status: RunCodeStatus.unknownError, ), @@ -270,6 +274,8 @@ class CodeRunner extends ChangeNotifier { _setResult( RunCodeResult( + graph: _result!.graph, + log: _result!.log, output: _result!.output, sdk: _result!.sdk, status: _result!.status, @@ -311,7 +317,6 @@ class CodeRunner extends ChangeNotifier { _setResult( RunCodeResult( graph: _result?.graph, - // ignore: prefer_interpolation_to_compose_strings log: (_result?.log ?? '') + '\n' + 'widgets.output.messages.pipelineCancelled'.tr(), @@ -344,7 +349,6 @@ class CodeRunner extends ChangeNotifier { _setResult( RunCodeResult( graph: selectedExample.graph, - // ignore: prefer_interpolation_to_compose_strings log: kCachedResultsLog + logs, output: selectedExample.outputs, sdk: selectedExample.sdk, @@ -399,7 +403,7 @@ class CodeRunner extends ChangeNotifier { return RunCodeResult( graph: prevGraph, log: prevLog, - output: compileOutput.output, + output: prevOutput + compileOutput.output, pipelineUuid: pipelineUuid, sdk: prevResult.sdk, status: status, @@ -410,7 +414,7 @@ class CodeRunner extends ChangeNotifier { errorMessage: kTimeoutErrorText, graph: prevGraph, log: prevLog, - output: kTimeoutErrorText, + output: prevOutput + kTimeoutErrorText, pipelineUuid: pipelineUuid, sdk: prevResult.sdk, status: status, @@ -421,7 +425,7 @@ class CodeRunner extends ChangeNotifier { return RunCodeResult( graph: prevGraph, log: prevLog, - output: output.output, + output: prevOutput + output.output, pipelineUuid: pipelineUuid, sdk: prevResult.sdk, status: status, @@ -432,7 +436,7 @@ class CodeRunner extends ChangeNotifier { return RunCodeResult( graph: prevGraph, log: prevLog, - output: output.output, + output: prevOutput + output.output, sdk: prevResult.sdk, status: status, ); @@ -443,7 +447,7 @@ class CodeRunner extends ChangeNotifier { return RunCodeResult( graph: prevGraph, log: prevLog, - output: output.output, + output: prevOutput + output.output, sdk: prevResult.sdk, status: status, ); @@ -453,7 +457,7 @@ class CodeRunner extends ChangeNotifier { errorMessage: kUnknownErrorText, graph: prevGraph, log: prevLog, - output: kUnknownErrorText, + output: prevOutput + kUnknownErrorText, pipelineUuid: pipelineUuid, sdk: prevResult.sdk, status: status, @@ -508,6 +512,7 @@ class CodeRunner extends ChangeNotifier { return RunCodeResult( graph: prevGraph, log: prevLog, + output: prevOutput, pipelineUuid: pipelineUuid, sdk: prevResult.sdk, status: status, diff --git a/playground/frontend/playground_components/lib/src/controllers/example_loaders/example_loader_factory.dart b/playground/frontend/playground_components/lib/src/controllers/example_loaders/example_loader_factory.dart index 9a16d7d4b990..edf0a961fb39 100644 --- a/playground/frontend/playground_components/lib/src/controllers/example_loaders/example_loader_factory.dart +++ b/playground/frontend/playground_components/lib/src/controllers/example_loaders/example_loader_factory.dart @@ -50,4 +50,3 @@ class ExampleLoaderFactory { ); } } - diff --git a/playground/frontend/playground_components/lib/src/controllers/example_loaders/examples_loader.dart b/playground/frontend/playground_components/lib/src/controllers/example_loaders/examples_loader.dart index e463a8172331..ca82333459a7 100644 --- a/playground/frontend/playground_components/lib/src/controllers/example_loaders/examples_loader.dart +++ b/playground/frontend/playground_components/lib/src/controllers/example_loaders/examples_loader.dart @@ -20,7 +20,6 @@ import 'package:collection/collection.dart'; import 'package:get_it/get_it.dart'; import '../../exceptions/example_loading_exception.dart'; -import '../../exceptions/examples_loading_exception.dart'; import '../../models/example.dart'; import '../../models/example_loading_descriptors/empty_example_loading_descriptor.dart'; import '../../models/example_loading_descriptors/example_loading_descriptor.dart'; @@ -43,6 +42,8 @@ class ExamplesLoader { PlaygroundController? _playgroundController; ExamplesLoadingDescriptor? _descriptor; + static final failedToLoadExamples = []; + ExamplesLoader() { defaultFactory.add(CatalogDefaultExampleLoader.new); defaultFactory.add(ContentExampleLoader.new); @@ -74,9 +75,9 @@ class ExamplesLoader { try { final loadFutures = loaders.map(_loadOne); await Future.wait(loadFutures); - } on Exception catch (ex) { - _emptyMissing(loaders); - throw ExamplesLoadingException(ex); + // ignore: avoid_catches_without_on_clauses + } catch (_) { + await _emptyMissing(loaders); } final sdk = descriptor.initialSdk; @@ -100,8 +101,8 @@ class ExamplesLoader { return loader; } - void _emptyMissing(Iterable loaders) { - loaders.forEach(_emptyIfMissing); + Future _emptyMissing(Iterable loaders) async { + await Future.wait(loaders.map(_emptyIfMissing)); } Future _emptyIfMissing(ExampleLoader loader) async { @@ -147,7 +148,10 @@ class ExamplesLoader { Example example; try { example = await loader.future; - } on Exception { + // ignore: avoid_catches_without_on_clauses + } catch (ex) { + example = Example.empty(loader.sdk ?? Sdk.java); + _handleLoadException(loader, ex as Exception); throw ExampleLoadingException(token: loader.descriptor.token); } _playgroundController!.setExample( @@ -157,6 +161,19 @@ class ExamplesLoader { ); } + void _handleLoadException(ExampleLoader loader, Exception ex) { + if (loader.descriptor.token != null) { + failedToLoadExamples.add(loader.descriptor.token!); + } + GetIt.instance.get().addException(ex); + final example = Example.empty(loader.sdk ?? Sdk.java); + _playgroundController!.setExample( + example, + descriptor: loader.descriptor, + setCurrentSdk: _shouldSetCurrentSdk(example.sdk), + ); + } + bool _shouldSetCurrentSdk(Sdk sdk) { final descriptor = _descriptor; diff --git a/playground/frontend/playground_components/lib/src/controllers/example_loaders/standard_example_loader.dart b/playground/frontend/playground_components/lib/src/controllers/example_loaders/standard_example_loader.dart index 0d1dd0df060b..20c88d635583 100644 --- a/playground/frontend/playground_components/lib/src/controllers/example_loaders/standard_example_loader.dart +++ b/playground/frontend/playground_components/lib/src/controllers/example_loaders/standard_example_loader.dart @@ -34,53 +34,50 @@ class StandardExampleLoader extends ExampleLoader { final StandardExampleLoadingDescriptor descriptor; final ExampleCache exampleCache; - final _completer = Completer(); @override Sdk? get sdk => descriptor.sdk; @override - Future get future => _completer.future; + late Future future = _load(); StandardExampleLoader({ required this.descriptor, required this.exampleCache, - }) { - unawaited(_load()); - } + }); - Future _load() async { + Future _load() async { try { - final example = await exampleCache.getPrecompiledObject( + final exampleWithoutOptions = await exampleCache.getPrecompiledObject( descriptor.path, descriptor.sdk, ); - _completer.complete(example); + return exampleWithoutOptions.copyWith( + viewOptions: descriptor.viewOptions, + ); } on Exception catch (ex, trace) { - await _tryLoadSharedExample( + return _tryLoadSharedExample( previousExceptions: [ex], previousStackTraces: [trace], ); } } - Future _tryLoadSharedExample({ + Future _tryLoadSharedExample({ required List previousExceptions, required List previousStackTraces, }) async { try { - final example = await exampleCache.loadSharedExample( + return await exampleCache.loadSharedExample( descriptor.path, viewOptions: descriptor.viewOptions, ); - _completer.complete(example); } on Exception catch (ex, trace) { - _completer.completeError( - MultipleExceptions( - exceptions: [...previousExceptions, ex], - stackTraces: [...previousStackTraces, trace], - ), + throw MultipleExceptions( + 'Cannot load example: ${descriptor.path}', + exceptions: [...previousExceptions, ex], + stackTraces: [...previousStackTraces, trace], ); } } diff --git a/playground/frontend/playground_components/lib/src/controllers/snippet_editing_controller.dart b/playground/frontend/playground_components/lib/src/controllers/snippet_editing_controller.dart index 445b92a062f6..090ab1018f15 100644 --- a/playground/frontend/playground_components/lib/src/controllers/snippet_editing_controller.dart +++ b/playground/frontend/playground_components/lib/src/controllers/snippet_editing_controller.dart @@ -46,6 +46,7 @@ class SnippetEditingController extends ChangeNotifier { final _fileControllersByName = {}; Map _defaultEventParams = const {}; + void setDefaultEventParams(Map eventParams) { _defaultEventParams = eventParams; for (final fileController in _fileControllers) { @@ -224,6 +225,20 @@ class SnippetEditingController extends ChangeNotifier { SnippetFileEditingController? get activeFileController => _activeFileController; + SnippetFileEditingController requireFileControllerByName(String name) { + final result = getFileControllerByName(name); + + if (result != null) { + return result; + } + + throw Exception( + 'Required SnippetFileEditingController for $name, ' + 'only have ${_fileControllers.map((c) => c.getFile().name)}, ' + '${example?.path} ${example?.name}', + ); + } + SnippetFileEditingController? getFileControllerByName(String name) { return _fileControllersByName[name]; } @@ -250,4 +265,16 @@ class SnippetEditingController extends ChangeNotifier { snippet: descriptor.token, ); } + + bool shouldSaveBeforeSharing() { + if (!(descriptor?.isSerializableToUrl ?? false)) { + return true; + } + + if (isChanged) { + return true; + } + + return false; + } } diff --git a/playground/frontend/playground_components/lib/src/exceptions/detailed_exception.dart b/playground/frontend/playground_components/lib/src/exceptions/detailed_exception.dart new file mode 100644 index 000000000000..d535b7a8faf5 --- /dev/null +++ b/playground/frontend/playground_components/lib/src/exceptions/detailed_exception.dart @@ -0,0 +1,22 @@ +/* + * 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. + */ + +/// An [Exception] with more [details] than should be shown in an error popup. +abstract class DetailedException implements Exception { + String get details; +} diff --git a/playground/frontend/playground_components/lib/src/exceptions/multiple_exceptions.dart b/playground/frontend/playground_components/lib/src/exceptions/multiple_exceptions.dart index e3fffb8c31ff..3fd83f8c9fab 100644 --- a/playground/frontend/playground_components/lib/src/exceptions/multiple_exceptions.dart +++ b/playground/frontend/playground_components/lib/src/exceptions/multiple_exceptions.dart @@ -16,17 +16,23 @@ * limitations under the License. */ -class MultipleExceptions implements Exception { +import 'detailed_exception.dart'; + +class MultipleExceptions implements DetailedException { + final String message; final List exceptions; final List stackTraces; - MultipleExceptions({ + MultipleExceptions(this.message, { required this.exceptions, required this.stackTraces, }); @override - String toString() { + String toString() => message; + + @override + String get details { final buffer = StringBuffer('Exceptions (${exceptions.length}): '); for (var i = 0; i < exceptions.length; i++) { buffer diff --git a/playground/frontend/playground_components/lib/src/models/example.dart b/playground/frontend/playground_components/lib/src/models/example.dart index 85858e875717..044cc4e2e0c0 100644 --- a/playground/frontend/playground_components/lib/src/models/example.dart +++ b/playground/frontend/playground_components/lib/src/models/example.dart @@ -41,6 +41,7 @@ class Example extends ExampleBase { required super.sdk, required super.type, required super.path, + super.alwaysRun, super.complexity, super.contextLine, super.datasets, @@ -69,6 +70,7 @@ class Example extends ExampleBase { required this.outputs, this.graph, }) : super( + alwaysRun: example.alwaysRun, complexity: example.complexity, contextLine: example.contextLine, datasets: example.datasets, @@ -93,4 +95,30 @@ class Example extends ExampleBase { sdk: sdk, type: ExampleType.example, ); + + Example copyWith({ + ExampleViewOptions? viewOptions, + }) { + return Example( + alwaysRun: alwaysRun, + complexity: complexity, + contextLine: contextLine, + datasets: datasets, + description: description, + files: files, + graph: graph, + isMultiFile: isMultiFile, + logs: logs, + name: name, + outputs: outputs, + path: path, + pipelineOptions: pipelineOptions, + sdk: sdk, + tags: tags, + type: type, + urlNotebook: urlNotebook, + urlVcs: urlVcs, + viewOptions: viewOptions ?? this.viewOptions, + ); + } } diff --git a/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/catalog_default_example_loading_descriptor.dart b/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/catalog_default_example_loading_descriptor.dart index 4eb63ba3eb67..383373e9676d 100644 --- a/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/catalog_default_example_loading_descriptor.dart +++ b/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/catalog_default_example_loading_descriptor.dart @@ -63,4 +63,7 @@ class CatalogDefaultExampleLoadingDescriptor extends ExampleLoadingDescriptor { viewOptions: ExampleViewOptions.fromShortMap(map), ); } + + @override + bool get isSerializableToUrl => true; } diff --git a/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/content_example_loading_descriptor.dart b/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/content_example_loading_descriptor.dart index a4415935c088..3ffab8577b23 100644 --- a/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/content_example_loading_descriptor.dart +++ b/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/content_example_loading_descriptor.dart @@ -116,4 +116,7 @@ class ContentExampleLoadingDescriptor extends ExampleLoadingDescriptor { 'sdk': sdk.id, ...viewOptions.toShortMap(), }; + + @override + bool get isSerializableToUrl => false; } diff --git a/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/empty_example_loading_descriptor.dart b/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/empty_example_loading_descriptor.dart index f17d991bc425..f92bd1762932 100644 --- a/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/empty_example_loading_descriptor.dart +++ b/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/empty_example_loading_descriptor.dart @@ -53,4 +53,7 @@ class EmptyExampleLoadingDescriptor extends ExampleLoadingDescriptor { sdk: Sdk.parseOrCreate(map['sdk']), ); } + + @override + bool get isSerializableToUrl => true; } diff --git a/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/example_loading_descriptor.dart b/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/example_loading_descriptor.dart index 5fbbf54375db..eb48aee667a9 100644 --- a/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/example_loading_descriptor.dart +++ b/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/example_loading_descriptor.dart @@ -40,4 +40,9 @@ abstract class ExampleLoadingDescriptor with EquatableMixin { ExampleLoadingDescriptor copyWithoutViewOptions(); Map toJson(); + + /// Whether this descriptor can be serialized to a URL. + /// + /// If false, the code must be saved at the backend before sharing. + bool get isSerializableToUrl; } diff --git a/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/hive_example_loading_descriptor.dart b/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/hive_example_loading_descriptor.dart index f69a9e505914..9b729a527d39 100644 --- a/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/hive_example_loading_descriptor.dart +++ b/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/hive_example_loading_descriptor.dart @@ -75,4 +75,7 @@ class HiveExampleLoadingDescriptor extends ExampleLoadingDescriptor { viewOptions: ExampleViewOptions.fromShortMap(map), ); } + + @override + bool get isSerializableToUrl => false; } diff --git a/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/http_example_loading_descriptor.dart b/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/http_example_loading_descriptor.dart index dfc45c7162c6..323a7475c71e 100644 --- a/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/http_example_loading_descriptor.dart +++ b/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/http_example_loading_descriptor.dart @@ -79,4 +79,7 @@ class HttpExampleLoadingDescriptor extends ExampleLoadingDescriptor { viewOptions: ExampleViewOptions.fromShortMap(map), ); } + + @override + bool get isSerializableToUrl => true; } diff --git a/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/standard_example_loading_descriptor.dart b/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/standard_example_loading_descriptor.dart index 72d7a539dd41..aaca54e3f41c 100644 --- a/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/standard_example_loading_descriptor.dart +++ b/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/standard_example_loading_descriptor.dart @@ -72,4 +72,7 @@ class StandardExampleLoadingDescriptor extends ExampleLoadingDescriptor { viewOptions: ExampleViewOptions.fromShortMap(map), ); } + + @override + bool get isSerializableToUrl => true; } diff --git a/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/user_shared_example_loading_descriptor.dart b/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/user_shared_example_loading_descriptor.dart index 29984d3caa09..4f757e8ec874 100644 --- a/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/user_shared_example_loading_descriptor.dart +++ b/playground/frontend/playground_components/lib/src/models/example_loading_descriptors/user_shared_example_loading_descriptor.dart @@ -73,4 +73,7 @@ class UserSharedExampleLoadingDescriptor extends ExampleLoadingDescriptor { viewOptions: ExampleViewOptions.fromShortMap(map), ); } + + @override + bool get isSerializableToUrl => true; } diff --git a/playground/frontend/playground_components/lib/src/repositories/backend_urls.dart b/playground/frontend/playground_components/lib/src/repositories/backend_urls.dart index 7654a8afcd6a..cfd2860e8942 100644 --- a/playground/frontend/playground_components/lib/src/repositories/backend_urls.dart +++ b/playground/frontend/playground_components/lib/src/repositories/backend_urls.dart @@ -95,11 +95,11 @@ List _getBackendUrlOptions(String node) { } final currentHost = Uri.base.host; - final nodeUriFromCurrentHost = Uri.base.replace( + final nodeUriFromCurrentHost = Uri( + scheme: Uri.base.scheme, host: '$node.$currentHost', - path: '', - queryParameters: {}, - ).removeFragment(); + port: Uri.base.port, + ); return { nodeUriFromCurrentHost.toString(), diff --git a/playground/frontend/playground_components/lib/src/services/toast_notifier.dart b/playground/frontend/playground_components/lib/src/services/toast_notifier.dart index e4e872d90f18..6497482a24c1 100644 --- a/playground/frontend/playground_components/lib/src/services/toast_notifier.dart +++ b/playground/frontend/playground_components/lib/src/services/toast_notifier.dart @@ -21,6 +21,7 @@ import 'dart:async'; import 'package:easy_localization/easy_localization.dart'; import 'package:rxdart/rxdart.dart'; +import '../exceptions/detailed_exception.dart'; import '../models/toast.dart'; import '../models/toast_type.dart'; @@ -48,6 +49,18 @@ class ToastNotifier { type: ToastType.error, ), ); + + _logExceptionToConsole(exception); + } + + void _logExceptionToConsole(Exception exception) { + final buffer = StringBuffer('$exception\n'); + + if (exception is DetailedException) { + buffer.writeln(exception.details); + } + + print(buffer); // ignore: avoid_print } Future dispose() async { diff --git a/playground/frontend/playground_components/lib/src/theme/theme.dart b/playground/frontend/playground_components/lib/src/theme/theme.dart index 25db8d562dde..dd18fa4e3c0a 100644 --- a/playground/frontend/playground_components/lib/src/theme/theme.dart +++ b/playground/frontend/playground_components/lib/src/theme/theme.dart @@ -22,6 +22,7 @@ import 'package:flutter_markdown_selectionarea/flutter_markdown.dart'; import 'package:google_fonts/google_fonts.dart'; import '../../playground_components.dart'; +import 'transitions.dart'; const codeFontSize = 14.0; @@ -171,6 +172,7 @@ final kLightTheme = ThemeData( BeamLightThemeColors.text, BeamLightThemeColors.primary, ), + pageTransitionsTheme: NoTransitionsTheme(), primaryColor: BeamLightThemeColors.primary, scaffoldBackgroundColor: BeamLightThemeColors.secondaryBackground, selectedRowColor: BeamLightThemeColors.selectedUnitColor, @@ -248,6 +250,7 @@ final kDarkTheme = ThemeData( BeamDarkThemeColors.text, BeamDarkThemeColors.primary, ), + pageTransitionsTheme: NoTransitionsTheme(), primaryColor: BeamDarkThemeColors.primary, scaffoldBackgroundColor: BeamDarkThemeColors.secondaryBackground, selectedRowColor: BeamDarkThemeColors.selectedUnitColor, @@ -442,32 +445,40 @@ RoundedRectangleBorder _getButtonBorder(double radius) { MarkdownStyleSheet _getMarkdownStyle(Brightness brightness) { final Color primaryColor; final Color codeblockBackgroundColor; - final Color textColor; if (brightness == Brightness.light) { primaryColor = BeamLightThemeColors.primary; codeblockBackgroundColor = BeamLightThemeColors.codeBackground; - textColor = BeamLightThemeColors.text; } else { primaryColor = BeamDarkThemeColors.primary; codeblockBackgroundColor = BeamDarkThemeColors.codeBackground; - textColor = BeamDarkThemeColors.text; } - final textTheme = _getTextTheme(textColor); return MarkdownStyleSheet( - p: textTheme.bodyMedium, - pPadding: EdgeInsets.only(top: BeamSizes.size2), - h1: textTheme.headlineMedium, - h3: textTheme.headlineSmall, - h3Padding: EdgeInsets.only(top: BeamSizes.size4), + p: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w400, + ), + pPadding: const EdgeInsets.only(top: BeamSizes.size2), + h1: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.w600, + ), + h2: const TextStyle( + fontSize: 17, + fontWeight: FontWeight.w600, + ), + h3: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + ), + h3Padding: const EdgeInsets.only(top: BeamSizes.size4), blockquoteDecoration: BoxDecoration( color: codeblockBackgroundColor, borderRadius: BorderRadius.circular(BeamSizes.size6), ), code: GoogleFonts.sourceCodePro( - color: textColor, backgroundColor: BeamColors.transparent, - fontSize: BeamSizes.size12, + fontSize: 14, ), codeblockDecoration: BoxDecoration( color: codeblockBackgroundColor, diff --git a/learning/tour-of-beam/frontend/lib/pages/tour/widgets/content_tree_title.dart b/playground/frontend/playground_components/lib/src/theme/transitions.dart similarity index 58% rename from learning/tour-of-beam/frontend/lib/pages/tour/widgets/content_tree_title.dart rename to playground/frontend/playground_components/lib/src/theme/transitions.dart index d92ff7605d81..8388ba37775e 100644 --- a/learning/tour-of-beam/frontend/lib/pages/tour/widgets/content_tree_title.dart +++ b/playground/frontend/playground_components/lib/src/theme/transitions.dart @@ -16,26 +16,20 @@ * limitations under the License. */ -import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:playground_components/playground_components.dart'; - -class ContentTreeTitleWidget extends StatelessWidget { - const ContentTreeTitleWidget(); +/// Disables page transitions. +/// +/// See https://medium.com/flutter/improving-perceived-performance-with-image-placeholders-precaching-and-disabled-navigation-6b3601087a2b +class NoTransitionsTheme extends PageTransitionsTheme { @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.symmetric(vertical: BeamSizes.size12), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - 'pages.tour.summaryTitle', - style: Theme.of(context).textTheme.headlineLarge, - ).tr(), - ], - ), - ); + Widget buildTransitions( + PageRoute route, + BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + return child; } } diff --git a/playground/frontend/playground_components/lib/src/widgets/copyright.dart b/playground/frontend/playground_components/lib/src/widgets/copyright.dart index 86b0346f285e..e0f3a92e8b29 100644 --- a/playground/frontend/playground_components/lib/src/widgets/copyright.dart +++ b/playground/frontend/playground_components/lib/src/widgets/copyright.dart @@ -17,7 +17,7 @@ */ import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/widgets.dart'; +import 'package:flutter/material.dart'; class CopyrightWidget extends StatelessWidget { const CopyrightWidget(); diff --git a/playground/frontend/playground_components/lib/src/widgets/feedback.dart b/playground/frontend/playground_components/lib/src/widgets/feedback.dart index b4d83c2ad7d7..62fd515dfad1 100644 --- a/playground/frontend/playground_components/lib/src/widgets/feedback.dart +++ b/playground/frontend/playground_components/lib/src/widgets/feedback.dart @@ -22,16 +22,19 @@ import 'package:flutter_svg/flutter_svg.dart'; import '../../playground_components.dart'; import '../assets/assets.gen.dart'; +import 'iframe/iframe.dart'; class FeedbackWidget extends StatelessWidget { static const positiveRatingButtonKey = Key('positive'); static const negativeRatingButtonKey = Key('negative'); final FeedbackController controller; + final String feedbackFormUrl; final String title; const FeedbackWidget({ required this.controller, + required this.feedbackFormUrl, required this.title, }); @@ -57,6 +60,7 @@ class FeedbackWidget extends StatelessWidget { child: FeedbackDropdown( close: closeNotifier.notifyPublic, controller: controller, + feedbackFormUrl: feedbackFormUrl, rating: rating, title: 'widgets.feedback.title'.tr(), subtitle: 'widgets.feedback.hint'.tr(), @@ -142,33 +146,22 @@ class FeedbackDropdown extends StatelessWidget { static const sendButtonKey = Key('sendFeedbackButtonKey'); static const textFieldKey = Key('feedbackTextFieldKey'); - final FeedbackController controller; final VoidCallback close; + final FeedbackController controller; + final String feedbackFormUrl; final FeedbackRating rating; final String title; final String subtitle; const FeedbackDropdown({ + required this.close, required this.controller, + required this.feedbackFormUrl, required this.title, required this.rating, - required this.close, required this.subtitle, }); - void _sendFeedback() { - PlaygroundComponents.analyticsService.sendUnawaited( - FeedbackFormSentAnalyticsEvent( - rating: rating, - text: controller.textController.text, - snippetContext: controller.eventSnippetContext, - additionalParams: controller.additionalParams, - ), - ); - controller.textController.clear(); - close(); - } - @override Widget build(BuildContext context) { return AnimatedBuilder( @@ -178,42 +171,26 @@ class FeedbackDropdown extends StatelessWidget { borderRadius: BorderRadius.circular(8), ), padding: const EdgeInsets.all(16), - width: 400, + width: 500, + height: MediaQuery.of(context).size.height - 100, child: Column( - crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ Text( title, style: Theme.of(context).textTheme.headlineLarge, ), - const SizedBox(height: BeamSizes.size8), + const SizedBox(height: BeamSizes.size6), Text( subtitle, + textAlign: TextAlign.center, ), - const SizedBox(height: BeamSizes.size8), - TextField( - key: textFieldKey, - controller: controller.textController, - decoration: const InputDecoration( - border: OutlineInputBorder(), + const SizedBox(height: BeamSizes.size16), + Expanded( + child: IFrameWidget( + url: feedbackFormUrl, + viewType: 'feedbackGoogleForms', ), - keyboardType: TextInputType.multiline, - maxLines: 5, - minLines: 3, - ), - const SizedBox(height: BeamSizes.size8), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - ElevatedButton( - key: sendButtonKey, - onPressed: controller.textController.text.isEmpty - ? null - : _sendFeedback, - child: const Text('widgets.feedback.send').tr(), - ), - ], ), ], ), diff --git a/playground/frontend/playground_components/lib/src/widgets/iframe/iframe.dart b/playground/frontend/playground_components/lib/src/widgets/iframe/iframe.dart new file mode 100644 index 000000000000..7cf807b5d393 --- /dev/null +++ b/playground/frontend/playground_components/lib/src/widgets/iframe/iframe.dart @@ -0,0 +1,19 @@ +/* + * 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. + */ + +export 'iframe_non_web.dart' if (dart.library.html) 'iframe_web.dart'; diff --git a/playground/frontend/playground_components/lib/src/widgets/iframe/iframe_non_web.dart b/playground/frontend/playground_components/lib/src/widgets/iframe/iframe_non_web.dart new file mode 100644 index 000000000000..de8a60df74c0 --- /dev/null +++ b/playground/frontend/playground_components/lib/src/widgets/iframe/iframe_non_web.dart @@ -0,0 +1,41 @@ +/* + * 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. + */ + +// ignore: avoid_web_libraries_in_flutter + +import 'package:flutter/widgets.dart'; + +class IFrameWidget extends StatefulWidget { + final String url; + final String viewType; + + const IFrameWidget({ + required this.url, + required this.viewType, + }); + + @override + State createState() => _IFrameWidgetState(); +} + +class _IFrameWidgetState extends State { + @override + Widget build(BuildContext context) { + return ErrorWidget('This only works in web.'); + } +} diff --git a/playground/frontend/playground_components/lib/src/widgets/iframe/iframe_web.dart b/playground/frontend/playground_components/lib/src/widgets/iframe/iframe_web.dart new file mode 100644 index 000000000000..ef26b8fd84c4 --- /dev/null +++ b/playground/frontend/playground_components/lib/src/widgets/iframe/iframe_web.dart @@ -0,0 +1,61 @@ +/* + * 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. + */ + +// ignore: avoid_web_libraries_in_flutter +import 'dart:html' as html; +import 'dart:ui' as ui; + +import 'package:flutter/material.dart'; + +class IFrameWidget extends StatefulWidget { + final String url; + final String viewType; + + const IFrameWidget({ + required this.url, + required this.viewType, + }); + + @override + State createState() => _IFrameWidgetState(); +} + +class _IFrameWidgetState extends State { + final _iFrameElement = html.IFrameElement(); + + @override + void initState() { + // ignore: unsafe_html + _iFrameElement.src = widget.url; + _iFrameElement.style.border = 'none'; + // ignore: undefined_prefixed_name, avoid_dynamic_calls + ui.platformViewRegistry.registerViewFactory( + widget.viewType, + (int viewId) => _iFrameElement, + ); + + super.initState(); + } + + @override + Widget build(BuildContext context) { + return HtmlElementView( + viewType: widget.viewType, + ); + } +} diff --git a/playground/frontend/playground_components/lib/src/widgets/output/result_tab_content.dart b/playground/frontend/playground_components/lib/src/widgets/output/result_tab_content.dart index 215493e4c7d1..dbcd5d1ddb79 100644 --- a/playground/frontend/playground_components/lib/src/widgets/output/result_tab_content.dart +++ b/playground/frontend/playground_components/lib/src/widgets/output/result_tab_content.dart @@ -26,6 +26,12 @@ import '../../enums/unread_entry.dart'; import '../../theme/theme.dart'; import '../unread/clearer.dart'; +// TODO(alexeyinkin): Show the full text when fixed: https://github.com/flutter/flutter/issues/128575 +const _maxFirstCharacters = 1000; +const _maxLastCharacters = 10000; +const _cutTemplate = 'Showing the first $_maxFirstCharacters ' + 'and the last $_maxLastCharacters characters:\n'; + class ResultTabContent extends StatefulWidget { const ResultTabContent({ required this.playgroundController, @@ -68,6 +74,20 @@ class _ResultTabContentState extends State { } String _getText() { + final fullText = _getFullText(); + + if (fullText.length <= _maxFirstCharacters + _maxLastCharacters) { + return fullText; + } + + // ignore: prefer_interpolation_to_compose_strings + return _cutTemplate + + fullText.substring(0, _maxFirstCharacters) + + '\n\n...\n\n' + + fullText.substring(fullText.length - _maxLastCharacters); + } + + String _getFullText() { final filter = widget.playgroundController.resultFilterController.value; switch (filter) { diff --git a/playground/frontend/playground_components/lib/src/widgets/snippet_editor.dart b/playground/frontend/playground_components/lib/src/widgets/snippet_editor.dart index 8a23ed7094d0..c0b8487213e1 100644 --- a/playground/frontend/playground_components/lib/src/widgets/snippet_editor.dart +++ b/playground/frontend/playground_components/lib/src/widgets/snippet_editor.dart @@ -26,11 +26,13 @@ import 'tabbed_snippet_editor.dart'; class SnippetEditor extends StatelessWidget { const SnippetEditor({ + required this.autofocus, required this.controller, required this.isEditable, this.actionsWidget, }); + final bool autofocus; final SnippetEditingController controller; final bool isEditable; @@ -56,6 +58,7 @@ class SnippetEditor extends StatelessWidget { children: [ Positioned.fill( child: SnippetFileEditor( + autofocus: autofocus, controller: controller.fileControllers.first, eventSnippetContext: controller.eventSnippetContext, isEditable: isEditable, @@ -72,6 +75,7 @@ class SnippetEditor extends StatelessWidget { default: return TabbedSnippetEditor( + autofocus: autofocus, controller: controller, eventSnippetContext: controller.eventSnippetContext, isEditable: isEditable, diff --git a/playground/frontend/playground_components/lib/src/widgets/snippet_file_editor.dart b/playground/frontend/playground_components/lib/src/widgets/snippet_file_editor.dart index 7e48d803f3b7..473bb82f76e2 100644 --- a/playground/frontend/playground_components/lib/src/widgets/snippet_file_editor.dart +++ b/playground/frontend/playground_components/lib/src/widgets/snippet_file_editor.dart @@ -30,6 +30,7 @@ import '../theme/theme.dart'; class SnippetFileEditor extends StatefulWidget { SnippetFileEditor({ + required this.autofocus, required this.controller, required this.eventSnippetContext, required this.isEditable, @@ -38,6 +39,7 @@ class SnippetFileEditor extends StatefulWidget { key: ValueKey(controller.savedFile), ); + final bool autofocus; final SnippetFileEditingController controller; final EventSnippetContext eventSnippetContext; final bool isEditable; @@ -69,7 +71,7 @@ class _SnippetFileEditorState extends State { void didChangeDependencies() { super.didChangeDependencies(); - if (!_didAutoFocus) { + if (widget.autofocus && !_didAutoFocus) { _didAutoFocus = true; SchedulerBinding.instance.addPostFrameCallback((_) { if (mounted) { diff --git a/playground/frontend/playground_components/lib/src/widgets/tabbed_snippet_editor.dart b/playground/frontend/playground_components/lib/src/widgets/tabbed_snippet_editor.dart index 1f895c376d12..4b78b3277e9d 100644 --- a/playground/frontend/playground_components/lib/src/widgets/tabbed_snippet_editor.dart +++ b/playground/frontend/playground_components/lib/src/widgets/tabbed_snippet_editor.dart @@ -28,12 +28,14 @@ import 'tabs/tab_bar.dart'; class TabbedSnippetEditor extends StatelessWidget { const TabbedSnippetEditor({ + required this.autofocus, required this.controller, required this.eventSnippetContext, required this.isEditable, this.trailing, }); + final bool autofocus; final SnippetEditingController controller; final EventSnippetContext eventSnippetContext; final bool isEditable; @@ -45,6 +47,7 @@ class TabbedSnippetEditor extends StatelessWidget { final keys = files.map((f) => f.name).toList(growable: false); final initialKey = files.firstWhereOrNull((f) => f.isMain)?.name; + // TODO(nausharipov): fork keyed_collection_widgets and put prints. return DefaultKeyedTabController.fromKeys( animationDuration: Duration.zero, initialKey: initialKey, @@ -71,7 +74,8 @@ class TabbedSnippetEditor extends StatelessWidget { children: { for (final key in keys) key: SnippetFileEditor( - controller: controller.getFileControllerByName(key)!, + autofocus: autofocus, + controller: controller.requireFileControllerByName(key), eventSnippetContext: eventSnippetContext, isEditable: isEditable, ), diff --git a/playground/frontend/playground_components/pubspec.yaml b/playground/frontend/playground_components/pubspec.yaml index fb8dbdcd3f79..e0394dab9f7f 100644 --- a/playground/frontend/playground_components/pubspec.yaml +++ b/playground/frontend/playground_components/pubspec.yaml @@ -22,7 +22,7 @@ publish_to: none environment: sdk: '>=3.0.2 <4.0.0' - flutter: '>=3.10.2' + flutter: '>=3.10.4' dependencies: aligned_dialog: ^0.0.6 @@ -36,7 +36,7 @@ dependencies: enum_map: ^0.2.1 equatable: ^2.0.5 flutter: { sdk: flutter } - flutter_code_editor: ^0.2.23 + flutter_code_editor: ^0.3.0 # TODO(nausharipov): return flutter_markdown when it is fixed, https://github.com/apache/beam/issues/26498 # The exact version is used because this non-official package can be poorly maintained. diff --git a/playground/frontend/playground_components/test/src/controllers/example_loaders/common.dart b/playground/frontend/playground_components/test/src/controllers/example_loaders/common.dart index 42c0eec3010c..714bea3c3c93 100644 --- a/playground/frontend/playground_components/test/src/controllers/example_loaders/common.dart +++ b/playground/frontend/playground_components/test/src/controllers/example_loaders/common.dart @@ -21,7 +21,9 @@ import 'package:playground_components/src/controllers/example_loaders/example_lo import 'package:playground_components/src/controllers/example_loaders/example_loader_factory.dart'; class TestExampleLoadingDescriptor extends ExampleLoadingDescriptor { + @override final Sdk? sdk; + final bool succeed; const TestExampleLoadingDescriptor( @@ -37,6 +39,9 @@ class TestExampleLoadingDescriptor extends ExampleLoadingDescriptor { @override Map toJson() => throw UnimplementedError(); + + @override + bool get isSerializableToUrl => true; } class TestExampleLoader extends ExampleLoader { diff --git a/playground/frontend/playground_components/test/src/controllers/example_loaders/example_loader_factory_test.dart b/playground/frontend/playground_components/test/src/controllers/example_loaders/example_loader_factory_test.dart index a0d046b1aa94..4d698333cec7 100644 --- a/playground/frontend/playground_components/test/src/controllers/example_loaders/example_loader_factory_test.dart +++ b/playground/frontend/playground_components/test/src/controllers/example_loaders/example_loader_factory_test.dart @@ -60,4 +60,7 @@ class _UnregisteredDescriptor extends ExampleLoadingDescriptor { @override Map toJson() => throw UnimplementedError(); + + @override + bool get isSerializableToUrl => true; } diff --git a/playground/frontend/playground_components/test/src/controllers/example_loaders/examples_loader_test.dart b/playground/frontend/playground_components/test/src/controllers/example_loaders/examples_loader_test.dart index f9b7479d6d50..d3dbd1c09c06 100644 --- a/playground/frontend/playground_components/test/src/controllers/example_loaders/examples_loader_test.dart +++ b/playground/frontend/playground_components/test/src/controllers/example_loaders/examples_loader_test.dart @@ -33,6 +33,8 @@ void main() async { final setEmptyIfNotExistsTrue = []; final setEmptyIfNotExistsFalse = []; + await PlaygroundComponents.ensureInitialized(); + setUp(() { setExampleTrue.clear(); setExampleFalse.clear(); @@ -121,7 +123,6 @@ void main() async { group('Error.', () { test('Load empty example instead', () async { - Exception? thrown; const descriptor = ExamplesLoadingDescriptor( descriptors: [ TestExampleLoadingDescriptor(Sdk.go, succeed: false), @@ -130,13 +131,8 @@ void main() async { initialSdk: Sdk.python, ); - try { - await examplesLoader.loadIfNew(descriptor); - } on ExamplesLoadingException catch (ex) { - thrown = ex; - } + await examplesLoader.loadIfNew(descriptor); - expect(thrown, isA()); expect(setEmptyIfNotExistsTrue, [Sdk.python]); expect(setEmptyIfNotExistsFalse, [Sdk.go]); }); diff --git a/playground/frontend/playground_components_dev/analysis_options.yaml b/playground/frontend/playground_components_dev/analysis_options.yaml index fe2e0e8eb952..06a391310797 100644 --- a/playground/frontend/playground_components_dev/analysis_options.yaml +++ b/playground/frontend/playground_components_dev/analysis_options.yaml @@ -16,3 +16,7 @@ # under the License. include: package:total_lints/app.yaml + +linter: + rules: + do_not_use_environment: false diff --git a/playground/frontend/playground_components_dev/lib/playground_components_dev.dart b/playground/frontend/playground_components_dev/lib/playground_components_dev.dart index d02b9448230f..704d512ea4f7 100644 --- a/playground/frontend/playground_components_dev/lib/playground_components_dev.dart +++ b/playground/frontend/playground_components_dev/lib/playground_components_dev.dart @@ -27,6 +27,7 @@ export 'src/examples/go/minimal_word_count.dart'; export 'src/examples/go/word_count.dart'; export 'src/examples/java/aggregation_max.dart'; +export 'src/examples/java/example.dart'; export 'src/examples/java/minimal_word_count.dart'; export 'src/examples/python/aggregation_mean.dart'; diff --git a/playground/frontend/playground_components_dev/lib/src/examples/example_descriptor.dart b/playground/frontend/playground_components_dev/lib/src/examples/example_descriptor.dart index f420990a11b9..6c938919e214 100644 --- a/playground/frontend/playground_components_dev/lib/src/examples/example_descriptor.dart +++ b/playground/frontend/playground_components_dev/lib/src/examples/example_descriptor.dart @@ -25,14 +25,16 @@ import '../code.dart'; const _noGraphSdks = [Sdk.go, Sdk.scio]; +const areExamplesDeployed = ExampleDescriptor._repository != '' && + ExampleDescriptor._ref != ''; + /// Describes an example for the purpose of integration tests. class ExampleDescriptor { static const _schemaAndHost = 'https://github.com'; static const _rawSchemaAndHost = 'https://raw.githubusercontent.com'; - static const _defaultOwner = 'apache'; - static const _defaultRepository = 'beam'; - static const _defaultRef = 'master'; + static const _repository = String.fromEnvironment('example-repository'); + static const _ref = String.fromEnvironment('example-ref'); const ExampleDescriptor( this.name, { @@ -42,11 +44,11 @@ class ExampleDescriptor { this.contextLine1Based, this.croppedFoldedVisibleText, this.foldedVisibleText, + this.fullText, this.outputContains, this.outputTail, - this.owner = _defaultOwner, - this.repository = _defaultRepository, - this.ref = _defaultRef, + this.repository = _repository, + this.ref = _ref, }); /// 1-based line index to set cursor to. @@ -61,10 +63,8 @@ class ExampleDescriptor { /// File path relative to the repository root, starting with `/`. final String path; - /// The owner of the GitHub repository where this example code is stored. - final String owner; - - /// The name of the GitHub repository where this example code is stored. + /// The owner and repository where this example code is stored, + /// like 'apache/beam'. final String repository; /// The branch name or commit hash of the GitHub repository @@ -74,6 +74,9 @@ class ExampleDescriptor { /// The SDK of this example. final Sdk sdk; + /// Full text to override the one we would get from HTTPS. + final String? fullText; + /// Visible text when using `visibleSectionNames` and `foldOutsideSections()`. final String? croppedFoldedVisibleText; @@ -96,13 +99,13 @@ class ExampleDescriptor { /// /// Example: /// https://github.com/apache/beam/blob/master/examples/java/src/main/java/org/apache/beam/examples/MinimalWordCount.java - String get url => '$_schemaAndHost/$owner/$repository/blob/$ref$path'; + String get url => '$_schemaAndHost/$repository/blob/$ref$path'; /// The URL to view the file raw content on GitHub. /// /// Example: /// https://raw.githubusercontent.com/apache/beam/master/examples/java/src/main/java/org/apache/beam/examples/MinimalWordCount.java - String get rawUrl => '$_rawSchemaAndHost/$owner/$repository/$ref$path'; + String get rawUrl => '$_rawSchemaAndHost/$repository/$ref$path'; /// The visible text in the code editor after required foldings. Future getVisibleText() async { @@ -113,8 +116,8 @@ class ExampleDescriptor { /// The full code of the example. Future getFullText() async { - final response = await http.get(Uri.parse(rawUrl)); - return cutTagComments(response.body); + final text = fullText ?? (await http.get(Uri.parse(rawUrl))).body; + return cutTagComments(text); } /// Cuts the comments containing meta tags from the file in the repository diff --git a/playground/frontend/playground_components_dev/lib/src/examples/go/example.dart b/playground/frontend/playground_components_dev/lib/src/examples/go/example.dart index 3a910870a01a..249dfbda621f 100644 --- a/playground/frontend/playground_components_dev/lib/src/examples/go/example.dart +++ b/playground/frontend/playground_components_dev/lib/src/examples/go/example.dart @@ -29,6 +29,51 @@ const goExample = ExampleDescriptor( '/playground/frontend/playground_components_dev/lib/src/examples/go/content/example.go', sdk: Sdk.go, + fullText: ''' +/* + * 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 ( + "fmt" + "github.com/apache/beam/sdks/v2/go/pkg/beam" +) + +func OutsideOfSections() { +} + +// [START show] +func Folded() { +} + +func Unfolded1() { + fmt.Print("editable")// [START unfold1] + fmt.Print("readonly")// [START readonly1] [END unfold1] [END readonly1] +} + +func Unfolded2() { + fmt.Print("editable")// [START unfold2] + fmt.Print("readonly")// [START readonly2] [END unfold2] [END readonly2] +} +// [END show] +''', + croppedFoldedVisibleText: ''' func Folded() { diff --git a/plugins/beam-code-completion-plugin/src/main/java/BeamJavaSDKPattern.java b/playground/frontend/playground_components_dev/lib/src/examples/java/content/example.java similarity index 64% rename from plugins/beam-code-completion-plugin/src/main/java/BeamJavaSDKPattern.java rename to playground/frontend/playground_components_dev/lib/src/examples/java/content/example.java index e60f76237d01..9e796ebb3947 100644 --- a/plugins/beam-code-completion-plugin/src/main/java/BeamJavaSDKPattern.java +++ b/playground/frontend/playground_components_dev/lib/src/examples/java/content/example.java @@ -16,19 +16,25 @@ * limitations under the License. */ -import com.intellij.patterns.PatternCondition; -import com.intellij.psi.PsiElement; -import com.intellij.util.ProcessingContext; -import org.jetbrains.annotations.NotNull; +package main; +import a; +import b; -public class BeamJavaSDKPattern extends PatternCondition { - BeamJavaSDKPattern() { - super("javaSDKPattern()"); - } +void OutsideOfSections() { +} + +// [START show] +void Folded() { +} + +void Unfolded1() { + System.out.println("editable")// [START unfold1] + System.out.println("readonly")// [START readonly1] [END unfold1] [END readonly1] +} - @Override - public boolean accepts(@NotNull PsiElement psiElement, ProcessingContext context) { - return false; - } +void Unfolded2() { + System.out.println("editable")// [START unfold2] + System.out.println("readonly")// [START readonly2] [END unfold2] [END readonly2] } +// [END show] diff --git a/playground/frontend/playground_components_dev/lib/src/examples/java/example.dart b/playground/frontend/playground_components_dev/lib/src/examples/java/example.dart new file mode 100644 index 000000000000..2e44a6639b38 --- /dev/null +++ b/playground/frontend/playground_components_dev/lib/src/examples/java/example.dart @@ -0,0 +1,111 @@ +/* + * 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. + */ + +import 'package:playground_components/playground_components.dart'; + +import '../example_descriptor.dart'; + +/// To test code folding, read-only, and visible sections. Not runnable. +const javaExample = ExampleDescriptor( + // + '', + dbPath: '', + path: + '/playground/frontend/playground_components_dev/lib/src/examples/java/content/example.java', + sdk: Sdk.java, + + fullText: ''' +/* + * 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 a; +import b; + +void OutsideOfSections() { +} + +// [START show] +void Folded() { +} + +void Unfolded1() { + System.out.println("editable")// [START unfold1] + System.out.println("readonly")// [START readonly1] [END unfold1] [END readonly1] +} + +void Unfolded2() { + System.out.println("editable")// [START unfold2] + System.out.println("readonly")// [START readonly2] [END unfold2] [END readonly2] +} +// [END show] +''', + + croppedFoldedVisibleText: ''' + +void Folded() { + +void Unfolded1() { + System.out.println("editable") + System.out.println("readonly") +} + +void Unfolded2() { + System.out.println("editable") + System.out.println("readonly") +} + +''', + foldedVisibleText: ''' +/* + +package main; + +void OutsideOfSections() { + + +void Folded() { + +void Unfolded1() { + System.out.println("editable") + System.out.println("readonly") +} + +void Unfolded2() { + System.out.println("editable") + System.out.println("readonly") +} + +''', +); diff --git a/playground/frontend/playground_components_dev/lib/src/examples/scio/minimal_word_count.dart b/playground/frontend/playground_components_dev/lib/src/examples/scio/minimal_word_count.dart index dbb679a6d6f9..f1be208d7196 100644 --- a/playground/frontend/playground_components_dev/lib/src/examples/scio/minimal_word_count.dart +++ b/playground/frontend/playground_components_dev/lib/src/examples/scio/minimal_word_count.dart @@ -29,8 +29,7 @@ const scioMinimalWordCount = ExampleDescriptor( '/scio-examples/src/main/scala/com/spotify/scio/examples/MinimalWordCount.scala', sdk: Sdk.scio, - owner: 'spotify', - repository: 'scio', + repository: 'spotify/scio', ref: spotifyScioRef, outputContains: ['Finalizing 5 file results'], diff --git a/playground/frontend/playground_components_dev/lib/src/expect.dart b/playground/frontend/playground_components_dev/lib/src/expect.dart index 4df3a7bab929..54b1ac979193 100644 --- a/playground/frontend/playground_components_dev/lib/src/expect.dart +++ b/playground/frontend/playground_components_dev/lib/src/expect.dart @@ -44,30 +44,42 @@ void expectContextLine( ); } -void expectOutput(ExampleDescriptor example, WidgetTester wt) { +void expectOutputIfDeployed(ExampleDescriptor example, WidgetTester wt) { if (example.outputTail != null) { - expectOutputEndsWith(example.outputTail, wt); + expectOutputEndsWithIfDeployed(example.outputTail, wt); } else if (example.outputContains != null) { for (final str in example.outputContains!) { - expectOutputContains(str, wt); + expectOutputContainsIfDeployed(str, wt); } } else { throw AssertionError('No pattern to check example output: ${example.path}'); } } -void expectOutputEquals(String text, WidgetTester wt) { +void expectOutputEqualsIfDeployed(String text, WidgetTester wt) { + if (!areExamplesDeployed) { + return; + } + final actualText = wt.findOutputText(); expect(actualText, text); } -void expectOutputContains(String? text, WidgetTester wt) { +void expectOutputContainsIfDeployed(String? text, WidgetTester wt) { + if (!areExamplesDeployed) { + return; + } + final actualText = wt.findOutputText(); expect(text, isNotNull); expect(actualText, contains(text)); } -void expectOutputEndsWith(String? text, WidgetTester wt) { +void expectOutputEndsWithIfDeployed(String? text, WidgetTester wt) { + if (!areExamplesDeployed) { + return; + } + final actualText = wt.findOutputText(); expect(text, isNotNull); expect(actualText, endsWith(text!)); @@ -91,10 +103,18 @@ void expectSimilar(double a, double b) { expect(a, onePerCentTolerance(b)); } -void expectVisibleText(String? visibleText, WidgetTester wt) { +void expectVisibleTextIfDeployed(String? visibleText, WidgetTester wt) { + if (!areExamplesDeployed) { + return; + } + + expectVisibleText(visibleText, wt); +} + +void expectVisibleText(String? visibleText, WidgetTester wt, {String? reason}) { final controller = wt.findOneCodeController(); expect(visibleText, isNotNull); - expect(controller.text, visibleText); + expect(controller.text, visibleText, reason: reason); } void expectLastAnalyticsEvent( diff --git a/playground/frontend/playground_components_dev/lib/src/widget_tester.dart b/playground/frontend/playground_components_dev/lib/src/widget_tester.dart index 507f3bdaaae1..94678fdebae4 100644 --- a/playground/frontend/playground_components_dev/lib/src/widget_tester.dart +++ b/playground/frontend/playground_components_dev/lib/src/widget_tester.dart @@ -144,7 +144,7 @@ extension WidgetTesterExtension on WidgetTester { await pumpAndSettle(); // Let the UI catch up. expectOutputStartsWith(kCachedResultsLog, this); - expectOutput(example, this); + expectOutputIfDeployed(example, this); } Future modifyRunExpectReal(ExampleDescriptor example) async { @@ -159,7 +159,7 @@ extension WidgetTesterExtension on WidgetTester { final actualText = findOutputText(); expect(actualText, isNot(startsWith(kCachedResultsLog))); - expectOutput(example, this); + expectOutputIfDeployed(example, this); // Animation stops just before the analytics event is fired, wait a bit. await Future.delayed(const Duration(seconds: 1)); diff --git a/playground/frontend/playground_components_dev/pubspec.yaml b/playground/frontend/playground_components_dev/pubspec.yaml index f7f32551ddf3..ae9424b96064 100644 --- a/playground/frontend/playground_components_dev/pubspec.yaml +++ b/playground/frontend/playground_components_dev/pubspec.yaml @@ -22,12 +22,12 @@ publish_to: none environment: sdk: '>=3.0.2 <4.0.0' - flutter: '>=3.10.2' + flutter: '>=3.10.4' dependencies: app_state: ^0.9.3 flutter: { sdk: flutter } - flutter_code_editor: ^0.2.23 + flutter_code_editor: ^0.3.0 flutter_test: { sdk: flutter } get_it: ^7.2.0 highlight: ^0.7.0 diff --git a/playground/frontend/pubspec.lock b/playground/frontend/pubspec.lock index e294bdddc743..425e33e4de7d 100644 --- a/playground/frontend/pubspec.lock +++ b/playground/frontend/pubspec.lock @@ -37,10 +37,10 @@ packages: dependency: "direct main" description: name: app_state - sha256: "8f363b17492dccf720cc70e896a367726171bee8dad047acd8f69f2cc2cf7e9c" + sha256: a0db005a03cb28bfc00e788b9389d22540ac259a860675f02fe9c43ab7c76553 url: "https://pub.dev" source: hosted - version: "0.9.3" + version: "0.9.4" archive: dependency: transitive description: @@ -394,10 +394,10 @@ packages: dependency: "direct dev" description: name: flutter_code_editor - sha256: "5cd0337a24155dcac85d4f5b0cc8fa022ab19785a968a86726cdc62e363ee428" + sha256: d4f94719d3f4dc3f40b0b80c980e3b550069c413542b6c0521bff8267f57eefb url: "https://pub.dev" source: hosted - version: "0.2.23" + version: "0.3.0" flutter_driver: dependency: transitive description: flutter @@ -415,10 +415,10 @@ packages: dependency: transitive description: name: flutter_issue_108697_workaround - sha256: "71401a9196e1e8ed7a6463b8ab8ea6bf8d8cc719783c4be309553d64d8c353ec" + sha256: "4f0ec26fd21b15954fda4acc94922abd2b2c067b5af4629438e270f8b2a2da08" url: "https://pub.dev" source: hosted - version: "0.1.2" + version: "0.1.3" flutter_lints: dependency: "direct dev" description: @@ -1377,4 +1377,4 @@ packages: version: "3.1.2" sdks: dart: ">=3.0.2 <4.0.0" - flutter: ">=3.10.2" + flutter: ">=3.10.4" diff --git a/playground/frontend/pubspec.yaml b/playground/frontend/pubspec.yaml index 02dd49404b96..066ab4aa6ad7 100644 --- a/playground/frontend/pubspec.yaml +++ b/playground/frontend/pubspec.yaml @@ -22,12 +22,12 @@ version: 1.0.0+1 environment: sdk: '>=3.0.2 <4.0.0' - flutter: '>=3.10.2' + flutter: '>=3.10.4' dependencies: akvelon_flutter_issue_106664_workaround: ^0.1.2 aligned_dialog: ^0.0.6 - app_state: ^0.9.3 + app_state: ^0.9.4 collection: ^1.15.0 easy_localization: ^3.0.1 easy_localization_ext: ^0.1.1 @@ -52,7 +52,7 @@ dependencies: dev_dependencies: build_runner: ^2.1.4 fake_async: ^1.3.0 - flutter_code_editor: ^0.2.23 + flutter_code_editor: ^0.3.0 flutter_lints: ^2.0.1 flutter_test: { sdk: flutter } integration_test: { sdk: flutter } diff --git a/playground/frontend/web/index.html b/playground/frontend/web/index.html index cb7ab5052531..bed71f2f21e0 100644 --- a/playground/frontend/web/index.html +++ b/playground/frontend/web/index.html @@ -61,8 +61,7 @@ textarea ~ grammarly-extension { display: none; } - - + + +# How to Add an Example/Snippet/Learning Content into Apache Beam Playground + +Adding a new example, code snippet, or Tour of Beam learning unit into the Playground is a three-step process: + +1. Prepare a code snippet. +2. Add the code snippet to Apache Beam and/or Playground. +3. Create a link to view the code snippet in Playground or to embed in a website page. + + +Playground sources and output presentation formats: + +![Workflow](doc/load_your_code/images/workflow.png) + +This guide will walk through all steps. + + +# Table of Contents + +- [Step 1. Prepare a code snippet](#step-1-prepare-a-code-snippet) + * [Code snippet data sources and dependencies](#code-snippet-data-sources-and-dependencies) + * [Emphasizing parts of code](#emphasizing-parts-of-code) + * [Named Sections](#named-sections) +- [Step 2. Add the code snippet to the Apache Beam repo and/or Playground](#step-2-add-the-code-snippet-to-the-apache-beam-repo-andor-playground) + * [Source 1. How to add an example to Playground Examples Catalog](#source-1-how-to-add-an-example-to-playground-examples-catalog) + + [1. Add the file with example to a directory](#1-add-the-file-with-example-to-a-directory) + + [2. Add metadata to describe example](#2-add-metadata-to-describe-the-example) + - [Kafka emulator](#kafka-emulator) + + [3. Submit a PR](#3-submit-a-pr) + + [4. Save the snippet ID](#4-save-the-snippet-id) + * [Source 2. How to add an unlisted example to Playground](#source-2-how-to-add-an-unlisted-example-to-playground) + * [Source 3. How to add a Tour of Beam unit](#source-3-how-to-add-a-tour-of-beam-unit) + * [Source 4. How to add a snippet with the app alone](#source-4-how-to-add-a-snippet-with-the-app-alone) + * [Source 5. How to load code from GitHub or other HTTPS URL](#source-5-how-to-load-code-from-github-or-other-https-url) +- [Step 3. Create a link or embed the snippet](#step-3-create-a-link-or-embed-the-snippet) + * [Link to a snippet](#link-to-a-snippet) + + [Link to an example from the Playground Examples Catalog](#link-to-an-example-from-the-playground-examples-catalog) + + [Link to an unlisted example](#link-to-an-unlisted-example) + + [Link to a snippet from a Tour of Beam unit](#link-to-a-snippet-from-a-tour-of-beam-unit) + + [Link to a user-shared snippet](#link-to-a-user-shared-snippet) + + [Link to a GitHub or HTTPS URL snippet](#link-to-a-github-or-other-https-url-snippet) + + [Link to an empty editor](#link-to-an-empty-editor) + * [Link to multiple snippets](#link-to-multiple-snippets) + * [Embedding a snippet into HTML](#embedding-a-snippet-into-html) + + [Embedding a snippet from Playground Examples Catalog](#embedding-a-snippet-from-playground-examples-catalog) + + [Embedding a user-shared snippet](#embedding-a-user-shared-snippet) + + [Embedding a snippet from other sources](#embedding-a-snippet-from-other-sources) + * [Embedding a snippet into the Apache Beam website](#embedding-a-snippet-into-the-apache-beam-website) +- [Snippet view options](#snippet-view-options) + * [Read-only sections](#read-only-sections) + * [Folding everything except named sections](#folding-everything-except-named-sections) + * [Hiding everything except a named section](#hiding-everything-except-a-named-section) + + +## Step 1. Prepare a code snippet + +Playground runs example code snippets using Apache Beam Direct Runner +and requires that a code snippet is a complete runnable code. + +### Code snippet data sources and dependencies + +Code snippets can use data sources to demonstrate transforms and concepts. Playground restricts code access to Internet for security reasons. Following are the recommend ways for code snippet's data sources and dependecies: + +| Source/Dependency | Notes | +|----------|-----------------------------------------------------------| +| File | Store code snippet's data file in a GCS bucket in `apache-beam-testing` project. | +| BigQuery | Create a BigQuery dataset/table in `apache-beam-testing` project. | +| Python package | Python packages accessible by Playground are located in a [Beam Python SDK container](https://github.com/apache/beam/tree/master/sdks/python/container) and in [Playground Python container](https://github.com/apache/beam/tree/master/playground/backend/containers/python). Add required packages to [Playground Python container](https://github.com/apache/beam/tree/master/playground/backend/containers/python). Please submit pull request with changes to the container or contact [dev@beam.apache.org](mailto:dev@beam.apache.org) | +| GitHub repo | If your example clones or dependes on files in a GitHub repo, copy required files to a GCS bucket in `apache-beam-testing` project and use the GCS files. | + + +### Emphasizing parts of code + +Playground provides multiple features to help focus users on certain parts of the code. + +Playground automatically applies the following to all snippets: +- Folds a comment if a snippet starts with one. +- Folds imports. + +### Named Sections + +Playground supports *Named Sections* to tag code blocks and provide the following view options: +- Fold all blocks except tagged code blocks. + This can be useful to help user focus on specific code blocks and features presented in a snippet. +- Hide all code except tagged code blocks. + This can be useful to create runnable snippets illustrating specific concepts or transforms, + and hide all non-essential code blocks. + Such snippet can be embedded on a website to make examples in documentation and tutorials runnable. +- Make certain code parts read-only. + This feature can be useful to create learning units where user modifications are desired + only in certain parts of the code. + +Please see [Snippet View Options](#snippet-view-options) section for details how different view options can be used. + +If you do not need any of those view options, skip to the [next step](#step-2-add-the-code-snippet-to-the-apache-beam-repo-andor-playground). + +*Named Sections* are defined with the following syntax: + +``` +// [START section_name] +void method() { +... +} +// [END section_name] +``` + +Create a named section for each part of your code that you want the above features for. +To learn more details about the syntax please see +the [README of the editor](https://pub.dev/packages/flutter_code_editor) that Playground uses. + +## Step 2. Add the code snippet to the Apache Beam repo and/or Playground + +There are several types of code snippets in the Playground: + +1. Example — a code snippet displayed in the Playground Examples Catalog. + See [how to add a new example here](#source-1-how-to-add-an-example-to-playground-examples-catalog). +2. Unlisted Example — the same as an example, but is not listed in the example dropdown + and can only be accessed by direct linking. These are typically embedded on a website. + See [how to add a new unlisted example here](#source-2-how-to-add-an-unlisted-example-to-playground). +3. [Tour of Beam](https://github.com/apache/beam/tree/master/learning/tour-of-beam) learning unit. + See [how to add a new Tour of Beam unit here](#source-3-how-to-add-a-tour-of-beam-unit). +4. User-shared code snippets do not require a PR and should be used for code + not displayed on Beam resources. + See [how to add a snippet with the app alone here](#source-4-how-to-add-a-snippet-with-the-app-alone). +5. GitHub or other HTTPS URL sources. + See [how to load a snippet from external GitHub or other HTTPS URL here](#source-5-how-to-load-code-from-github-or-other-https-url). + +See the [workflow above](#how-to-add-an-examplesnippetlearning-content-into-apache-beam-playground) how artifacts map to these sources. + +### Source 1. How to add an example to Playground Examples Catalog + +Playground Examples Catalog helps users discover example snippets +and is the recommended way to add examples. Playground automatically scans, +verifies and deploys example snippets from the directories listed below. + +> **Note:** SCIO examples are stored in a separate repository. To add support for a new SCIO example, please refer to [this section of `TASKS.md`](TASKS.md#obtaining-scio-examples). + +#### 1. Add the file with example to a directory + +Playground Java, Python, and Go examples are automatically picked from these +predefined directories by the `playground_examples_ci.yml` GitHub workflow +after a PR is merged to Beam repo: +- `/examples` +- `/learning/katas` +- `/sdks`. + +Adding Scala example snippets automatically is not supported, +and Scala example snippets can be added to the catalog manually. + +#### 2. Add metadata to describe the example + +Playground relies on metadata comments block to identify and place an example into the database, +which is required for an example to show in the Examples Catalog. +See [this](https://github.com/apache/beam/blob/3e080ff212d8ed7208c8486b515bb73c5d294475/examples/java/src/main/java/org/apache/beam/examples/MinimalWordCount.java#L20-L36) for an example. +Playground automatically removes metadata comments block before storing the example in database, +so the metadata is not visible to end users. The block is in the format of a YAML map: + +```yaml +beam-playground: + # Name of the Beam example that will be displayed in the Playground Examples Catalog. Required. + name: "" + # Description of the Beam example that will be displayed in the Playground Examples Catalog. Required. + description: "" + # Contains information about pipeline options of the Beam example/test/kata. Optional. + pipeline_options: "--name1 value1 --name2 value2" + # The line number to scroll to when the snippet is loaded. + # Note that lines of the metadata block are cut so line numbers after it are shifted. + # Optional, defaults to 1 (the first line). + context_line: 1 + # Categories this example is included into. See below for the supported values. + # Optional, defaults to no categories making the example unlisted. + categories: + - "Combiners" + - "Core Transforms" + # Tags by which this snippet can be found in the Example Catalog. Optional. + tags: + - "numbers" + - "count" + # Helps user to identify example's complexity. Values: BASIC|MEDIUM|ADVANCED. Required. + complexity: BASIC + # Specifies the example to be loaded as default when its SDK selected in the Playground. + # See section "Default examples" below. Optional, defaults to false. + default_example: true + # If the snippet has a Colab notebook, can link the URL of the Colab notebook that is based on this snippet. + url_notebook: "https://colab.research.google.com/github/apache/beam/blob/master/examples/notebooks/documentation/transforms/python/elementwise/filter-py.ipynb" + # Specifies if the given example consists of multiple files or not. Optional, defaults to false. + multifile: true + # Specifies example caching by Playground. Optional, defaults to false (the output is cached). + always_run: true + # Datasets which will be used by emulators. Optional. + # Please see section "Kafka emulator" for more information. + datasets: + # Dataset name + CountWords: + # Dataset location. Only "local" is supported. Required. + location: local + # Dataset format. Supported values are "avro" and "json". Required. + format: avro + # List of emulators to start during pipeline execution. Currently only `kafka` type is supported. Optional. + emulators: + - type: kafka + topic: + # Dataset id. Will be used as a topic name. + id: dataset + # Name of dataset specified in "datasets" section. + source_dataset: "CountWords" +``` + +For metadata reference, see the fields in the `Tag` class [here](infrastructure/models.py). + +##### Categories + +The list of supported categories for an example is +[here](https://github.com/apache/beam/blob/master/playground/categories.yaml). +To add a new category, submit a PR that adds a category to the [categories.yaml](https://github.com/apache/beam/blob/master/playground/categories.yaml). +When it is merged, the new category can be used in an example. + +##### Default examples + +Each SDK must have a single default example. +If there is none, the user will see an error in the app and a blank editor. +If there are more than one, it is not defined which one will be selected. + +##### Kafka emulator + +Examples which require Kafka server emulator need to include the `emulators` tag +and provide `dataset` in the example's tag. You can refer to an example +[here](/examples/java/src/main/java/org/apache/beam/examples/KafkaWordCountJson.java). + +1. Add your dataset in either JSON or Avro format into the `playground/backend/datasets` path. + +2. Add the following elements to the example's metadata tag: + ```YAML + emulators: + - type: kafka + topic: + id: dataset + source_dataset: + datasets: + : + location: local + format: json # or 'avro' + ``` + replace `` with the name of your dataset file without the file name extension. + +3. Use the exact string `"kafka_server:9092"` as the server name in your code snippet. + This string will be replaced by the actual host name and port automatically + before the compilation step by Playground. + +>**Kafka emulator limitations:** +> - Playground Kafka emulator currently supports only Beam Java SDK. +> - The exact string `"kafka_server:9092"` should be present in the code snippet; + any other variation like `"kafa_server" + ":9092"` will not work. + +#### 3. Submit a PR + +Create and submit a PR with the code snippet into [the Apache Beam repository](https://github.com/apache/beam) +following the [Contribution guide](https://beam.apache.org/contribute/). +Verify that all pre-commit tests are passing. + +Playground CI will verify and deploy the example to Playground Example Catalog when the PR is merged. + +#### 4. Save the snippet ID + +The snippet will be assigned an ID. +You can find it in the address bar of the browser when you select it in the dropdown. + +For example, in this URL: + +``` +https://play.beam.apache.org/?path=SDK_JAVA_MinimalWordCount&sdk=java +``` + +the ID is: `SDK_JAVA_MinimalWordCount`. + +You will need the snippet ID to embed the Playground with the snippet into a website page. + +### Source 2. How to add an unlisted example to Playground + +Not all examples must be visible in the example dropdown. +Some examples are best in the context of Apache Beam documentation. +To embed them into the documentation, use unlisted examples. +They work and are checked and cached the same way as the examples displayed in the Playground catalog. + +Proceed the same way as with [Source 1. Playground Examples Catalog](#source-1-how-to-add-an-example-to-playground-examples-catalog) except: +1. Use the directory `/learning/beamdoc` +2. Do not use the following attributes: + - `categories` + - `default_example` + - `tags` + +The ID of the snippet is a function of the SDK and the `name` attribute from its metadata: + +| SDK | ID | +|--------|-----------------| +| Go | SDK_GO_name | +| Java | SDK_JAVA_name | +| Python | SDK_PYTHON_name | + +### Source 3. How to add a Tour of Beam unit + +"Tour of Beam" is a separate project that combines learning materials with runnable snippets +and allows students to track their learning progress. +It uses the Playground engine, and so its content is added in a similar way. + +A Tour of Beam unit consists of learning materials and an optional runnable snippet. +See [the learning content README](../learning/tour-of-beam/learning-content/README.md) on how to add units and link snippets to them. + +#### Adding a snippet + +Tour of Beam snippets are checked and cached the same way as Playground examples. + +Proceed the same way as with [Source 1. Playground Examples Catalog](#source-1-how-to-add-an-example-to-playground-examples-catalog) except: + +1. Use the directory `/learning/tour-of-beam/learning-content`. + It is recommended to follow the directory hierarchy as described in + [the learning content README](../learning/tour-of-beam/learning-content/README.md). +2. Do not use the following attributes: + - `categories` + - `default_example` + - `tags` + +The ID of the snippet is a function of the SDK and the `name` attribute from its metadata: + +| SDK | ID | +|--------|-----------------------------| +| Go | TB_EXAMPLES_SDK_GO_name | +| Java | TB_EXAMPLES_SDK_JAVA_name | +| Python | TB_EXAMPLES_SDK_PYTHON_name | + +For instance, for the Go the example `CSV` it is `TB_EXAMPLES_SDK_GO_CSV`. + +### Source 4. How to add a snippet with the app alone + +A code snippet can be saved to the Playground using **"Share my code"** button in the Playground: + +![Sharing code with the app alone](doc/load_your_code/images/share-my-code.png) + +This is easy and fast. It does not require any interaction with the Beam team. + +>**Share my code** considerations: +> - A user-shared snippet is immutable. + If you edit the code and re-share, a new snippet and a new link will be generated. +> - Playground automatically applies a 3-month retention policy to shared snippets that are not used. + To request a deletion of a snippet, please send an email to + [dev@beam.apache.org](mailto:dev@beam.apache.org?subject=[Playground]%20Delete%20a%20snippet) + with subject: *[Playground] Delete a snippet*. +> - Playground does not cache output or graph for user-shared snippets. +> - Playground does not verify user-shared snippets. + +### Source 5. How to load code from GitHub or another HTTPS URL + +Playground can load a snippet stored on an HTTPS server using the provided URL, +including GitHub direct links to raw file content. + +This is as easy and fast as using *Share my code* button, but also allows you to modify a snippet +after it is published without changing a link. + +>Loading snippet from HTTPS URL considerations: +> - Playground does not cache output or graph for HTTPS URL snippets. +> - Playground does not verify HTTPS URL snippets. + +#### Cross-Origin Resource Sharing + +For Playground to be able to load the snippet over HTTPS, the HTTPS server needs to allow +the access by sending the following header: + +``` +Access-Control-Allow-Origin: * +``` + +at least when requested with `*.beam.apache.org` as +[`referer`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer). + +This is related to Cross-Origin Resource Sharing (CORS), to read more about CORS please see +[CORS (Cross-Origin Resource Sharing)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS). + +Many prefer to host code snippets in their GitHub repositories. +GitHub is known to allow cross-origin access on direct links to raw file content. +An example of loading a GitHub snippet: + +``` +https://play.beam.apache.org/?sdk=go&url=https://raw.githubusercontent.com/apache/beam-starter-go/main/main.go +``` + +## Step 3. Create a link or embed the snippet + +The snippet can now be shown in the Playground. +Choose any of the following ways. + +### Link to a snippet + +#### Link to an example from the Playground Examples Catalog + +1. Open your snippet in the dropdown menu. +2. Without changing it, click "Share my code". +3. Copy the link. + +The link contains the `path` to your snippet in the database. It is in the following format: +``` +https://play.beam.apache.org/?path=SDK_JAVA_MinimalWordCount&sdk=java +``` + +A special case is the default snippet for an SDK. It can be loaded by the following link: + +``` +https://play.beam.apache.org/?sdk=python&default=true +``` + +This way if another snippet is ever made default, the links you shared will lead +to the new snippet. + +#### Link to an unlisted example + +Link to an unlisted example can be constructed by providing your snippet ID and SDK in the following URL: +``` +https://play.beam.apache.org/?path=&sdk= +``` + +The ID of the snippet is a function of the SDK and the `name` attribute from its metadata: + +| SDK | ID | +|--------|-----------------| +| Go | SDK_GO_name | +| Java | SDK_JAVA_name | +| Python | SDK_PYTHON_name | + +#### Link to a snippet from a Tour of Beam unit + +Link to a snippet can be constructed by providing your snippet ID and SDK in the following URL: +``` +https://play.beam.apache.org/?path=&sdk= +``` + +The ID of the snippet is a function of the SDK and the `name` attribute from its metadata: + +| SDK | ID | +|--------|-----------------------------| +| Go | TB_EXAMPLES_SDK_GO_name | +| Java | TB_EXAMPLES_SDK_JAVA_name | +| Python | TB_EXAMPLES_SDK_PYTHON_name | + +For instance, for the Go the example `CSV` it is `TB_EXAMPLES_SDK_GO_CSV`, and the link is +``` +https://play.beam.apache.org/?path=TB_EXAMPLES_SDK_GO_CSV&sdk=go +``` + +#### Link to a user-shared snippet + +You get the link when you click "Share my code" button. It is in the following format: + +``` +https://play.beam.apache.org/?sdk=java&shared=SNIPPET_ID +``` + +#### Link to a GitHub or other HTTPS URL snippet + +Add the URL to the `url` parameter, for example: + +``` +https://play.beam.apache.org/?sdk=go&url=https://raw.githubusercontent.com/apache/beam-starter-go/main/main.go +``` + +#### Link to an empty editor + +You can link to an empty editor to make your users start their snippets from scratch: + +``` +https://play.beam.apache.org/?sdk=go&empty=true +``` + +### Link to multiple snippets + +The above URLs load snippets that you want. But what happens if the user switches SDK? Normally this will be shown: +- The catalog default example for the new SDK. +- The empty editor for the new SDK if the Playground is embedded. + +This can be changed by linking to multiple examples, up to one per SDK. + +For this purpose, make a JSON array with any combination of parameters that +are allowed for loading single examples, for instance: + +```json +[ + { + "sdk": "java", + "path": "SDK_JAVA_AggregationMax" + }, + { + "sdk": "go", + "url": "https://raw.githubusercontent.com/apache/beam-starter-go/main/main.go" + } +] +``` + +Then pass it in`examples` query parameter like this: + +`https://play.beam.apache.org/?sdk=go&examples=[{"sdk":"java","path":"SDK_JAVA_AggregationMax"},{"sdk":"go","url":"https://raw.githubusercontent.com/apache/beam-starter-go/main/main.go"}]` + +This starts with the Go example loaded from the URL. +If SDK is then switched to Java, the `AggregationMax` catalog example is loaded for it. +If SDK is switched to any other one, the default example for that SDK is loaded, because no override was provided. + + +### Embedding a snippet into HTML + +Embedded Playground is a simplified interface of the Playground web app designed to be embedded +into an ` +

+ +{{< case_study_feedback "HSBC" >}} + + +
diff --git a/website/www/site/content/en/case-studies/projectShield.md b/website/www/site/content/en/case-studies/projectShield.md new file mode 100644 index 000000000000..eadac63d8d8a --- /dev/null +++ b/website/www/site/content/en/case-studies/projectShield.md @@ -0,0 +1,231 @@ +--- +title: "Efficient Streaming Analytics: Making the Web a Safer Place with Project Shield" +name: "Project Shield" +icon: "/images/logos/powered-by/project_shield.png" +category: "study" +cardTitle: "Efficient Streaming Analytics: Making the Web a Safer Place with Project Shield" +cardDescription: "Project Shield defends the websites of over 3K vulnerable organizations in >150 countries against DDoS attacks with the mission of protecting freedom of speech. The Apache Beam streaming pipelines process about 3 TB of log data daily at >10,000 queries per second. The pipelines produce real-time user-facing analytics, tailored traffic rate limits, and defense recommendations. Apache Beam enabled the delivery of critical metrics at scale with a ~2x efficiency gain. This data supported Project Shield’s goal of eliminating the DDoS attack as a weapon for silencing the voices of journalists and others who speak the truth. Ultimately, Project Shield’s goal is to make the web a safer place." +authorName: "Marc Howard" +coauthorName: "Chad Hansen" +authorPosition: "Founding Engineer @ Project Shield" +coauthorPosition: "Founding Engineer @ Project Shield" +authorImg: /images/case-study/projectShield/marc_howard.jpg +coauthorImg: /images/case-study/projectShield/chad_hansen.png +publishDate: 2023-06-08T00:12:00+00:00 +--- + +
+
+ +
+
+

+ “Apache Beam supports our mission to make the web a safer and better place by providing near-real-time visibility into traffic data for our customers, providing ongoing analysis and adjustments to our defenses, and neutralizing the impact of traffic spikes during DDoS attacks on the performance and efficiency of our platform.” +

+
+
+ +
+
+
+ Marc Howard +
+
+ Founding Engineer @ Project Shield +
+
+
+
+
+
+ +# Efficient Streaming Analytics: Making the Web a Safer Place with Project Shield + +## Background + +[Project Shield](https://projectshield.withgoogle.com/landing), offered by [Google Cloud](https://cloud.google.com/) and [Jigsaw](https://jigsaw.google.com/) (a subsidiary of Google), is a service that counters [distributed-denial-of-service](https://en.wikipedia.org/wiki/Distributed-denial-of-service) (DDoS) attacks. Project Shield is available free of charge to eligible websites that have media, elections, and human rights related content. [Founded in 2013](https://www.forbes.com/sites/andygreenberg/2013/10/21/googles-project-shield-will-offer-free-cyberattack-protection-to-hundreds-of-at-risk-sites/), Project Shield’s mission is to protect freedom of speech and to make sure that, when people have access to democracy-related information, the information isn’t compromised, censored, or silenced in a politically-motivated way. + +In the first half of 2022, Project Shield defended websites of vulnerable users - such as human rights, news, and civil society organizations or governments under exigent circumstances - [against more than 25,000 attacks](https://cloud.google.com/blog/products/identity-security/ddos-attack-trends-during-us-midterm-elections). Notably, Project Shield helped ensure [unhindered access to election-related information during the U.S. 2022 midterm election season](https://cloud.google.com/blog/products/identity-security/ddos-attack-trends-during-us-midterm-elections). It also [enables Ukrainian critical infrastructure and media websites to defend against non-stop attacks](https://cio.economictimes.indiatimes.com/news/internet/google-expands-project-shield-to-protect-govts-from-hacking/90072091) and to continue providing crucial services and information during the invasion of Ukraine. + +Marc Howard and Chad Hansen, the co-founding engineers, explain how Project Shield uses Apache Beam to deliver some of their core value. The streaming Apache Beam pipelines process about 3 TB of log data daily at significantly over 10,000 queries per second. These pipelines enable multiple product needs. For example, Apache Beam produces real-time analytics and critical metrics for [over 3000 customer websites in 150 countries](https://www.washingtonpost.com/opinions/2022/06/21/russia-ukraine-cyberwar-intelligence-agencies-tech-companies/). These metrics power long-term attack analytics at scale, fine-tuning Project Shield’s defenses and supporting them in the effort of making the web a safe and free space. + +## Journey To Beam + +The Project Shield platform is built using Google Cloud technologies and provides multi-layered defenses. To absorb part of the traffic and keep websites online even if their servers are down, it uses [Cloud CDN](https://cloud.google.com/cdn) for [caching](https://en.wikipedia.org/wiki/Cache_(computing)). To protect websites from DDoS and other malicious attacks, it leverages [Cloud Armor](https://cloud.google.com/armor) features, such as adaptive protection, rate limiting, and bot management. + +Project Shield acts as a [reverse proxy](https://en.wikipedia.org/wiki/Reverse_proxy): it receives traffic requests on a website’s behalf, absorbs traffic through caching, filters harmful traffic, bans attackers, and then sends safe traffic to a website’s origin server. This configuration allows websites to stay up and running when someone tries to take them down with a DDoS attack. The challenge is that, with a large portion of traffic blocked, the logs on customers’ origin servers no longer have accurate analytics about website traffic. Instead, customers rely on Project Shield to provide all of the traffic analytics. + +
+ + Project Shield Mechanism + + Project Shield Mechanism +
+ +Originally, Project Shield stored traffic logs in [BigQuery](https://cloud.google.com/bigquery). It used one large query to produce analytics and charts with different traffic metrics, such as the amount of traffic, QPS, the share of cached traffic, and the attack data. However, querying all of the logs, especially with dramatic spikes in traffic, was slow and expensive. + +
+

+ Often people want to know traffic metrics during critical times: if their website is under attack: they want to see what's happening right now. We need the data points to appear on the UI fast. +

+
+
+ +
+
+
+ Marc Howard +
+
+ Founding Engineer @ Project Shield +
+
+
+
+ +Project Shield’s team then added [Firestore](https://firebase.google.com/docs/firestore) as an intermediate step, running a [cron](https://en.wikipedia.org/wiki/Cron) every minute to query logs from BigQuery and write the interim reports to Firestore, then using these reports to build charts. This step improved performance slightly, but the gain was not sufficient to meet critical business timelines, and it didn’t provide adequate visibility into historical traffic for customers. + +Unlike BigQuery, Firestore was designed for medium-sized workloads. Therefore, it wasn’t possible to fetch many models at the same time to provide customers with cumulative statistics for extended time frames. Querying the logs every minute was inefficient from a cost perspective. In addition, some of the logs were coming to BigQuery with a delay, and it was necessary to run the cron again in 24 hours to double-check for the late-coming logs. + +
+

+ Querying over all of our traffic logs every minute is very expensive, especially when you consider that we are a DDoS defense service - the number of logs that we see can often spike dramatically. +

+
+
+ +
+
+
+ Marc Howard +
+
+ Founding Engineer @ Project Shield +
+
+
+
+ +Project Shield’s team looked for a data processing framework that would minimize end-to-end latency, meet their scaling needs for better customer visibility, and ensure cost efficiency. + +They selected Apache Beam for its [strong processing guarantees](/documentation/runtime/model/), streaming capabilities, and out-of-the-box [I/Os](/documentation/io/connectors/) for BigQuery and Pub/Sub. By pairing Apache Beam with the [Dataflow runner](/documentation/runners/dataflow/), they also benefited from built-in autoscaling. In addition, the [Apache Beam Python SDK](/documentation/sdks/python/) lets you use Python across the board and simplifies reading data model types that have to be the same on the backend that consumes them and on the pipeline that writes them. + +## Use Cases + +Project Shield became one of the early adopters of Apache Beam and migrated their workflows to streaming Apache Beam pipelines in 2020. Currently, Apache Beam powers multiple product needs with multiple streaming pipelines. + +The unified streaming pipeline that produces user-facing analytics reads the logs from Pub/Sub while they arrive from Cloud Logging, windows logs per minute every minute, splits by the hostname of the request, generates reports, and writes the reports to BigQuery. The pipeline aggregates log data, removes [Personally Identifiable Information](https://en.wikipedia.org/wiki/Personal_data) (PII) without using a [DLP](https://en.wikipedia.org/wiki/Data_loss_prevention_software), and allows for storing the data in BigQuery for a longer period while meeting the regulatory requirements. [CombineFn](/documentation/transforms/python/aggregation/combineperkey/#example-5-combining-with-a-combinefn) allows Project Shield’s team to create a custom accumulator that takes the key into account when keying log data off the hostname and minute, [combining the log data per key](/documentation/programming-guide/#combine). If logs come in late, Apache Beam creates a new report and aggregates several reports per hostname per minute. + +
+

+ The fact that we can just key data, use CombinePerKey, and the accumulator works like magic was a big win for us +

+
+
+ +
+
+
+ Marc Howard +
+
+ Founding Engineer @ Project Shield +
+
+
+
+ +The Apache Beam log processing pipeline provides Project Shield with the ability to query only the relevant reports, thus enabling Project Shield to load the data to the customer dashboard within just 2 minutes. The pipeline also provides enhanced visibility for Project Shield’s customers, because the queried reports are much smaller in size and easier to store than the traffic logs. + +
+

+ The end-to-end pipeline latency was very meaningful to us, and the Apache Beam streaming allowed for displaying all the traffic metrics on charts within 2 minutes, but also to look back on days, weeks, or months of data and show graphs on a scalable timeframe to customers. +

+
+
+ +
+
+
+ Chad Hansen +
+
+ Founding Engineer @ Project Shield +
+
+
+
+ +Project Shield extended the streaming Apache Beam log processing pipeline to generate a different type of report based on the logs and requests during attacks. The Apache Beam pipeline analyzes attacks and generates critical defense recommendations. These recommendations are then used by the internal long-term attack analysis system to fine-tune Project Shield’s defenses. + +Apache Beam also powers Project Shield’s traffic rate-limiting decisions by analyzing patterns in the traffic logs. The streaming Apache Beam pipeline gathers information about the legitimate usage of a website, excludes abusive traffic from that analysis, and crafts traffic rate limits that divide the two groups safely. Those limits are then enforced in the form of Cloud Armor rules and policies and used to restrict abusive traffic or to ban it entirely. + +
+ + Apache Beam Streaming Log Analytics + + Apache Beam Streaming Log Analytics +
+ +The combination of Apache Beam and Cloud Dataflow greatly simplifies Project Shield’s operational management of streaming pipelines. Apache Beam provides easy-to-use streaming primitives, while Dataflow enables [out-of-the-box pipeline lifecycle management](https://cloud.google.com/dataflow/docs/pipeline-lifecycle) and compliments Pub/Sub’s delivery model with [message deduplication and exactly-once, in-order processing](https://www.cloudskillsboost.google/focuses/18457?parent=catalog). The Apache Beam [Pub/Sub I/O](https://beam.apache.org/releases/pydoc/current/apache_beam.io.gcp.pubsub.html) provides the ability to key log data off Pub/Sub event timestamps. This feature enables Project Shield to improve the overall data accuracy by windowing log data after all the relevant logs come in. [Various options for managing the pipeline lifecycle](https://cloud.google.com/dataflow/docs/guides/pipeline-workflows#update-streaming-pipelines-prod) allow Project Shield to employ simple and reliable deployment processes. The Apache Beam Dataflow runner’s [autoscaling and managed service capabilities](https://cloud.google.com/dataflow/docs/horizontal-autoscaling) help handle dramatic spikes in resource consumption during DDoS attacks and provide instant visibility for customers. + +
+

+ When attacks come in, we are ready to handle high volumes of traffic and deliver on-time metrics during critical windows with Apache Beam. +

+
+
+ +
+
+
+ Chad Hansen +
+
+ Founding Engineer @ Project Shield +
+
+
+
+ +## Results + +The adoption of Apache Beam enabled Project Shield to embrace streaming, scale its pipelines, maximize efficiency, and minimize latency. The streaming Apache Beam pipelines process about 3 TB of log data daily at significantly over 10,000 queries per second to produce user-facing analytics, tailored traffic rate limits, and defense recommendations for over 3K customers all over the world. The streaming processing and powerful transforms of Apache Beam ensure delivery of critical metrics within just 2 minutes, enabling customer visibility into historical traffic, and resulting in a 91% compute efficiency gain, compared to the original solution. + +
+

+ The Apache Beam model and the autoscaling capabilities of its Dataflow runner help prevent the spikes in traffic during DDoS attacks from having a meaningful impact on our platform from an efficiency and financial perspective. +

+
+
+ +
+
+
+ Marc Howard +
+
+ Founding Engineer @ Project Shield +
+
+
+
+ +The Apache Beam data processing framework supports Project Shield’s goal to eliminate the DDoS attack as a weapon for silencing the voices of journalists and others who speak the truth, making the web a safer place. + +{{< case_study_feedback "Project Shield" >}} + +
+
diff --git a/website/www/site/content/en/contribute/get-started-contributing.md b/website/www/site/content/en/contribute/get-started-contributing.md index 1e20e876258f..7d4b9193ff05 100644 --- a/website/www/site/content/en/contribute/get-started-contributing.md +++ b/website/www/site/content/en/contribute/get-started-contributing.md @@ -157,7 +157,7 @@ To install these in a Debian-based distribution: 4. Once Go is installed, install goavro: ``` $ export GOPATH=`pwd`/sdks/go/examples/.gogradle/project_gopath - $ go get github.com/linkedin/goavro + $ go get github.com/linkedin/goavro/v2 ``` **Important**: gLinux users should configure their machines for sudoless Docker. diff --git a/website/www/site/content/en/contribute/release-guide.md b/website/www/site/content/en/contribute/release-guide.md index 48ac902fe835..3b0a0cb2c9a4 100644 --- a/website/www/site/content/en/contribute/release-guide.md +++ b/website/www/site/content/en/contribute/release-guide.md @@ -94,7 +94,7 @@ Please have these credentials ready at hand, you will likely need to enter them * Apache ID and Password; * GitHub ID and Password. * DockerHub ID and Password. (You should be a member of maintainer team; email at dev@ if you are not.) - +* Account to access to apache-beam-testing Google Cloud Platform project. The account must have permissions to start Cloud Build triggers. Required for Playground environment update. (E-mail to pabloem@google.com to request access) ### One-time setup instructions @@ -167,7 +167,7 @@ Configure access to the [Apache Nexus repository](https://repository.apache.org/ -#### Submit your GPG public key into MIT PGP Public Key Server +#### Submit your GPG public key into Ubuntu OpenPGP Key Server In order to make yourself have right permission to stage java artifacts in Apache Nexus staging repository, please submit your GPG public key into the [Ubuntu OpenPGP Key Server](https://keyserver.ubuntu.com/). @@ -200,7 +200,7 @@ You also need to be a maintainer (or an owner) of the [apache-beam](https://pypi Ask on the mailing list for assistance. #### Login to DockerHub -If you are a member of the [`beammaintainers` DockerHub team](https://hub.docker.com/orgs/apache/teams/beammaintainers), run following command manually. +If you are a member of the [`beam` DockerHub team](https://hub.docker.com/orgs/apache/teams/beam), run following command manually. It will ask you to input your DockerHub ID and password if authorization info cannot be found from ~/.docker/config.json file. ``` @@ -215,7 +215,7 @@ For example, } ``` -If you are not already a member of the `beammaintainers` team, please email `dev@` for help with any DockerHub related tasks. We are not able +If you are not already a member of the `beam` team, please email `dev@` for help with any DockerHub related tasks. We are not able to add more members to the DockerHub team because [the ASF has a limited number of seats available](https://infra.apache.org/docker-hub-policy.html). ### Create a new milestone in GitHub @@ -318,7 +318,7 @@ There are 2 ways to perform this verification, either running automation script( ``` cd beam/release/src/main/scripts && ./verify_release_build.sh ``` - 1. Trigger `beam_Release_Gradle_Build` and all Jenkins PostCommit jobs from the PR created by the previous step. + 1. Trigger all Jenkins PostCommit jobs from the PR created by the previous step. You can run [mass_comment.py](https://github.com/apache/beam/blob/master/release/src/main/scripts/mass_comment.py) to do that. Or manually add one trigger phrase per PR comment. See [jenkins_jobs.txt](https://github.com/apache/beam/blob/master/release/src/main/scripts/jenkins_jobs.txt) @@ -328,9 +328,6 @@ There are 2 ways to perform this verification, either running automation script( 1. Installs ```hub``` with your agreement and setup local git repo; 1. Create a test PR against release branch; -The [`beam_Release_Gradle_Build`](https://ci-beam.apache.org/job/beam_Release_Gradle_Build/) Jenkins job runs `./gradlew build -PisRelease`. -This only verifies that everything builds with unit tests passing. - #### Verify the build succeeds * Tasks you need to do manually to __verify the build succeed__: @@ -522,6 +519,7 @@ You don't need to wait for the action to complete to start running the script. * **The script will:** 1. Clone the repo at the selected RC tag. 1. Run gradle publish to push java artifacts into Maven staging repo. + 1. Stage SDK docker images to [docker hub Apache organization](https://hub.docker.com/search?q=apache%2Fbeam&type=image). #### Tasks you need to do manually @@ -548,10 +546,12 @@ You don't need to wait for the action to complete to start running the script. * **The script will:** 1. Clone the repo at the selected RC tag. 1. Stage source release into dist.apache.org dev [repo](https://dist.apache.org/repos/dist/dev/beam/). +Skip this step if you already did it with the build_release_candidate GitHub Actions workflow. 1. Stage, sign and hash python source distribution and wheels into dist.apache.org dev repo python dir 1. Stage SDK docker images to [docker hub Apache organization](https://hub.docker.com/search?q=apache%2Fbeam&type=image). -Note: if you are not a member of the [`beammaintainers` DockerHub team](https://hub.docker.com/orgs/apache/teams/beammaintainers) you will need -help with this step. Please email `dev@` and ask a member of the `beammaintainers` DockerHub team for help. +Skip this step if you already did it with the build_release_candidate GitHub Actions workflow. +Note: if you are not a member of the [`beam` DockerHub team](https://hub.docker.com/orgs/apache/teams/beam) you will need +help with this step. Please email `dev@` and ask a member of the `beam` DockerHub team for help. 1. Create a PR to update beam-site, changes includes: * Copy python doc into beam-site * Copy java doc into beam-site @@ -1148,8 +1148,8 @@ All wheels should be published, in addition to the zip of the release source. ### Deploy docker images to DockerHub -Note: if you are not a member of the [beammaintainers DockerHub team](https://hub.docker.com/orgs/apache/teams/beammaintainers), -you will need help with this step. Please email dev@ and ask a member of the beammaintainers DockerHub team for help. +Note: if you are not a member of the [beam DockerHub team](https://hub.docker.com/orgs/apache/teams/beam), +you will need help with this step. Please email dev@ and ask a member of the beam DockerHub team for help. * **Script:** [publish_docker_images.sh](https://github.com/apache/beam/blob/master/release/src/main/scripts/publish_docker_images.sh) * **Usage** @@ -1178,6 +1178,13 @@ Create and push a new signed tag for the released version by copying the tag for gpg --output ~/doc.sig --sign ~/.bashrc VERSION_TAG="v${RELEASE_VERSION}" +RC_TAG="${VERSION_TAG}-RC${RC_NUM}" + +# Ensure local tags are in sync. If there's a mismatch, it will tell you. +git fetch --all --tags + +# If the tag exists, a commit number is produced, otherwise there's an error. +git rev-list $RC_TAG -n 1 # Tag for Go SDK git tag -s "sdks/$VERSION_TAG" "$RC_TAG" @@ -1263,6 +1270,45 @@ Also, update [the Wikipedia article on Apache Beam](https://en.wikipedia.org/wik ********** +## 13. Update Beam Playground + +After new Beam Release is published, Beam Playgorund can be updated following the steps below: + +1. Open the [Cloud Build triggers in apache-beam-testing](https://console.cloud.google.com/cloud-build/triggers?project=apache-beam-testing) GCP project. +1. Find the trigger "Deploy-Update-Playground-environment-stg": + 1. Click on the trigger name to open its settings + 1. Change the value for _SDK_TAG variable (Advanced -> Substitution Variables) to the actual version of Beam SDK (e.g. 2.47.0) + 1. Click the Save button. The settings window should close without any errors + 1. Click the RUN button next to the trigger name + 1. Set the value for the _CONTAINER_TAG variable in format DD-MM-vXX (DD - day, MM - month, XX - version, e.g., 20-12-v01) + 1. Click the Run Trigger button + 1. Open the [Trigger History](https://console.cloud.google.com/cloud-build/builds?project=apache-beam-testing) and wait for the job completion. Ensure that the job completed successfully (Status field shows a green tick) +1. Find the trigger "Playground-CD-stable-manual-stg": + 1. Click the RUN button next to the trigger name + 1. Click the Run Trigger button (with default varaible vaues) + 1. Open the [Trigger History](https://console.cloud.google.com/cloud-build/builds?project=apache-beam-testing) and wait for the job completion. Ensure that the job completed successfully (Status field shows a green tick) + 1. Click the RUN button next to the trigger name + 1. Change values for the variables: + * _ORIGIN = PG_BEAMDOC + * _SUBDIRS = ./learning/beamdoc + 1. Click the Run Trigger button + 1. Open the [Trigger History](https://console.cloud.google.com/cloud-build/builds?project=apache-beam-testing) and wait for the job completion. Ensure that the job completed successfully (Status field shows a green tick) +1. Test updated [staging Playground](https://play-dev.beam.apache.org/) in a browser + 1. Open the menu (represented by '...' in the right top corner) and click on Versions. Validate that commit is the same for all listed containers, and the hash belongs to a [recent master branch commit](https://github.com/apache/beam/commits/master) + 1. For each of the supported SDKs (Java, Python, Go, SCIO): + * Switch to the SDK + * Make any changes to the loaded default example + * Click the Run button + * Wait for successful completion + * Click "Share My Code" to ensure that the link is generated +1. Repeat the same steps for "Deploy-Update-Playground-environment-prod" trigger as for "Deploy-Update-Playground-environment-stg" trigger +1. Repeat the same steps for "Playground-CD-stable-manual-prod" trigger as for "Playground-CD-stable-manual-stg" trigger +1. Test updated [prod Playground](https://play.beam.apache.org/) in a browser. The process is similar to the staging environment. +1. Find the trigger "Playground-CI-stable" + 1. Click on the trigger name to open its settings + 1. Set the value for the _BEAM_VERSION variable (Advanced -> Substitution Variables) to the actual version of Beam SDK (e.g., 2.47.0) + 1. Click the Save button. Click the Save button. The settings window should close without any errors + ## Improve the process It is important that we improve the release processes over time. diff --git a/website/www/site/content/en/documentation/io/built-in/google-bigquery.md b/website/www/site/content/en/documentation/io/built-in/google-bigquery.md index 61ff8c74e6dc..24314dc11800 100644 --- a/website/www/site/content/en/documentation/io/built-in/google-bigquery.md +++ b/website/www/site/content/en/documentation/io/built-in/google-bigquery.md @@ -363,7 +363,7 @@ GitHub](https://github.com/apache/beam/blob/master/examples/java/src/main/java/o {{< /highlight >}} {{< highlight py >}} -# The SDK for Python does not support the BigQuery Storage API. +{{< code_sample "sdks/python/apache_beam/examples/snippets/snippets.py" model_bigqueryio_read_table_with_storage_api >}} {{< /highlight >}} The following code snippet reads with a query string. @@ -779,6 +779,17 @@ Starting with version 2.36.0 of the Beam SDK for Java, you can use the [BigQuery Storage Write API](https://cloud.google.com/bigquery/docs/write-api) from the BigQueryIO connector. +Also after version 2.47.0 of Beam SDK for Python, SDK supports BigQuery Storage Write API. + +{{< paragraph class="language-py" >}} +BigQuery Storage Write API for Python SDK currently has some limitations on supported data types. As this method makes use of cross-language transforms, we are limited to the types supported at the cross-language boundary. For example, `apache_beam.utils.timestamp.Timestamp` is needed to write a `TIMESTAMP` BigQuery type. Also, some types (e.g. `DATETIME`) are not supported yet. For more details, please refer to the [full type mapping](https://github.com/apache/beam/blob/0b430748cdd2e25edc553747ce018195e9cce888/sdks/python/apache_beam/io/gcp/bigquery_tools.py#L112-L123). +{{< /paragraph >}} + +{{< paragraph class="language-py" >}} +**Note:** If you want to run WriteToBigQuery with Storage Write API from the source code, you need to run `./gradlew :sdks:java:io:google-cloud-platform:expansion-service:build` to build the expansion-service jar. If you are running from a released Beam SDK, the jar will already be included. + +{{< /paragraph >}} + #### Exactly-once semantics To write to BigQuery using the Storage Write API, set `withMethod` to @@ -795,7 +806,7 @@ BigQueryIO.writeTableRows() ); {{< /highlight >}} {{< highlight py >}} -# The SDK for Python does not support the BigQuery Storage API. +{{< code_sample "sdks/python/apache_beam/examples/snippets/snippets.py" model_bigqueryio_write_with_storage_write_api >}} {{< /highlight >}} If you want to change the behavior of BigQueryIO so that all the BigQuery sinks @@ -820,7 +831,7 @@ TableSchema schema = new TableSchema().setFields( .setMode("REQUIRED"))); {{< /highlight >}} {{< highlight py >}} -# The SDK for Python does not support the BigQuery Storage API. +{{< code_sample "sdks/python/apache_beam/examples/snippets/snippets.py" model_bigqueryio_write_schema >}} {{< /highlight >}} For streaming pipelines, you need to set two additional parameters: the number @@ -834,7 +845,7 @@ BigQueryIO.writeTableRows() ); {{< /highlight >}} {{< highlight py >}} -# The SDK for Python does not support the BigQuery Storage API. +{{< code_sample "sdks/python/apache_beam/examples/snippets/snippets.py" model_bigqueryio_storage_write_api_with_frequency >}} {{< /highlight >}} The number of streams defines the parallelism of the BigQueryIO Write transform @@ -859,9 +870,14 @@ the BigQuery service, so you should use only as many streams as needed for your use case. Triggering frequency in single-digit seconds is a good choice for most pipelines. -Currently, `STORAGE_WRITE_API` doesn’t support -[`withAutoSharding`](https://beam.apache.org/releases/javadoc/current/org/apache/beam/sdk/io/gcp/bigquery/BigQueryIO.Write.html#withAutoSharding--). -The method will be supported in a future release. +{{< paragraph class="language-java" wrap="span">}} +Similar to streaming inserts, `STORAGE_WRITE_API` supports dynamically determining +the number of parallel streams to write to BigQuery (starting 2.42.0). You can +explicitly enable this using [`withAutoSharding`](https://beam.apache.org/releases/javadoc/current/org/apache/beam/sdk/io/gcp/bigquery/BigQueryIO.Write.html#withAutoSharding--). + +***Note:*** `STORAGE_WRITE_API` will default to dynamic sharding when +`numStorageWriteApiStreams` is set to 0 or is unspecified. +{{< /paragraph >}} When using `STORAGE_WRITE_API`, the PCollection returned by [`WriteResult.getFailedInserts`](https://beam.apache.org/releases/javadoc/current/org/apache/beam/sdk/io/gcp/bigquery/WriteResult.html#getFailedInserts--) diff --git a/website/www/site/content/en/documentation/io/connectors.md b/website/www/site/content/en/documentation/io/connectors.md index 83c53f165b51..a1f458377afd 100644 --- a/website/www/site/content/en/documentation/io/connectors.md +++ b/website/www/site/content/en/documentation/io/connectors.md @@ -554,7 +554,10 @@ This table provides a consolidated, at-a-glance overview of the available built-
✔ - native + native (sink) +
+ ✔ + via X-language
Not available Not available
- + - - - - - - - + + + - - + + + - - + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - +
Beam Version Flink Version Artifact IdSupported Beam Versions
≥ 2.38.01.14.x *beam-runners-flink-1.14
1.13.x *beam-runners-flink-1.131.16.xbeam-runners-flink-1.16≥ 2.47.0
1.12.x *beam-runners-flink-1.121.15.xbeam-runners-flink-1.15≥ 2.40.0
1.11.x *beam-runners-flink-1.111.14.xbeam-runners-flink-1.14≥ 2.38.0
2.31.0 - 2.37.01.13.x *1.13.x beam-runners-flink-1.13≥ 2.31.0
1.12.x *beam-runners-flink-1.12
1.11.x *beam-runners-flink-1.11
2.30.01.12.x *beam-runners-flink-1.12
1.11.x *beam-runners-flink-1.11
1.10.xbeam-runners-flink-1.10
2.27.0 - 2.29.01.12.x *1.12.x beam-runners-flink-1.12≥ 2.27.0
1.11.x *beam-runners-flink-1.11
1.10.xbeam-runners-flink-1.10
1.9.xbeam-runners-flink-1.9
1.8.xbeam-runners-flink-1.8
2.25.0 - 2.26.01.11.x *1.11.x beam-runners-flink-1.112.25.0 - 2.38.0
1.10.x beam-runners-flink-1.102.21.0 - 2.30.0
1.9.x beam-runners-flink-1.92.17.0 - 2.29.0
1.8.x beam-runners-flink-1.8
2.21.0 - 2.24.01.10.xbeam-runners-flink-1.10
1.9.xbeam-runners-flink-1.9
1.8.xbeam-runners-flink-1.8
2.17.0 - 2.20.01.9.xbeam-runners-flink-1.9
1.8.xbeam-runners-flink-1.8
1.7.xbeam-runners-flink-1.7
2.13.0 - 2.16.01.8.xbeam-runners-flink-1.82.13.0 - 2.29.0
1.7.x beam-runners-flink-1.72.10.0 - 2.20.0
1.6.x beam-runners-flink-1.62.10.0 - 2.16.0
1.5.x beam-runners-flink_2.112.6.0 - 2.16.0
2.10.0 - 2.16.01.7.xbeam-runners-flink-1.7
1.6.xbeam-runners-flink-1.6
1.5.x1.4.x with Scala 2.11 beam-runners-flink_2.112.3.0 - 2.5.0
2.9.01.5.xbeam-runners-flink_2.11
2.8.0
2.7.0
2.6.0
2.5.01.4.x with Scala 2.11beam-runners-flink_2.11
2.4.0
2.3.0
2.2.01.3.x with Scala 2.10beam-runners-flink_2.10
2.1.x1.3.x with Scala 2.10beam-runners-flink_2.102.1.x - 2.2.0
2.0.0 1.2.x with Scala 2.10 beam-runners-flink_2.102.0.0
-* This version does not have a published docker image for the Flink Job Service. - For retrieving the right Flink version, see the [Flink downloads page](https://flink.apache.org/downloads.html). For more information, the [Flink Documentation](https://ci.apache.org/projects/flink/flink-docs-stable/) can be helpful. diff --git a/website/www/site/content/en/documentation/runners/spark.md b/website/www/site/content/en/documentation/runners/spark.md index 3b166c077e0c..0b3075061e44 100644 --- a/website/www/site/content/en/documentation/runners/spark.md +++ b/website/www/site/content/en/documentation/runners/spark.md @@ -215,7 +215,7 @@ options = PipelineOptions([ "--job_endpoint=localhost:8099", "--environment_type=LOOPBACK" ]) -with beam.Pipeline(options) as p: +with beam.Pipeline(options=options) as p: ... {{< /highlight >}} diff --git a/website/www/site/content/en/documentation/runtime/environments.md b/website/www/site/content/en/documentation/runtime/environments.md index 78c7dc32a49d..554d471da98e 100644 --- a/website/www/site/content/en/documentation/runtime/environments.md +++ b/website/www/site/content/en/documentation/runtime/environments.md @@ -115,10 +115,10 @@ This method requires building image artifacts from Beam source. For additional i ./gradlew :sdks:java:container:java17:docker ./gradlew :sdks:go:container:docker ./gradlew :sdks:python:container:py36:docker - ./gradlew :sdks:python:container:py37:docker ./gradlew :sdks:python:container:py38:docker ./gradlew :sdks:python:container:py39:docker ./gradlew :sdks:python:container:py310:docker + ./gradlew :sdks:python:container:py311:docker # Shortcut for building all Python SDKs ./gradlew :sdks:python:container buildAll diff --git a/website/www/site/content/en/documentation/transforms/java/aggregation/approximatequantiles.md b/website/www/site/content/en/documentation/transforms/java/aggregation/approximatequantiles.md index 3f543a8dea09..fdcb741c5343 100644 --- a/website/www/site/content/en/documentation/transforms/java/aggregation/approximatequantiles.md +++ b/website/www/site/content/en/documentation/transforms/java/aggregation/approximatequantiles.md @@ -30,11 +30,16 @@ globally or per-key. Using an approximation algorithm, it returns the minimum value, *n-2* intermediate values, and the maximum value. ## Examples + **Example**: to compute the quartiles of a `PCollection` of integers, we would use `ApproximateQuantiles.globally(5)`. This will produce a list containing 5 values: the minimum value, Quartile 1 value, Quartile 2 value, Quartile 3 value, and the maximum value. +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_ApproximateQuantiles" show="main_section" >}} +{{< /playground >}} + ## Related transforms * [ApproximateUnique](/documentation/transforms/java/aggregation/approximateunique) estimates the number of distinct elements or distinct values in key-value pairs diff --git a/website/www/site/content/en/documentation/transforms/java/aggregation/cogroupbykey.md b/website/www/site/content/en/documentation/transforms/java/aggregation/cogroupbykey.md index 90c0984f3df2..d95b58fb13fe 100644 --- a/website/www/site/content/en/documentation/transforms/java/aggregation/cogroupbykey.md +++ b/website/www/site/content/en/documentation/transforms/java/aggregation/cogroupbykey.md @@ -35,7 +35,8 @@ that key in each input collection. See more information in the [Beam Programming Guide](/documentation/programming-guide/#cogroupbykey). ## Examples -**Example**: Say you have two different files with user data; one file has + +**Example 1**: Say you have two different files with user data; one file has names and email addresses and the other file has names and phone numbers. You can join those two data sets, using the username as a common key and the @@ -66,6 +67,12 @@ result.apply(ParDo.of(new DoFn, /* some result */>() { })); {{< /highlight >}} +**Example 2:** + +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_GroupByKey" show="main_section" >}} +{{< /playground >}} + ## Related transforms * [GroupByKey](/documentation/transforms/java/aggregation/groupbykey) takes one input collection. diff --git a/website/www/site/content/en/documentation/transforms/java/aggregation/combine.md b/website/www/site/content/en/documentation/transforms/java/aggregation/combine.md index f40c694692bc..c9a28d6c454b 100644 --- a/website/www/site/content/en/documentation/transforms/java/aggregation/combine.md +++ b/website/www/site/content/en/documentation/transforms/java/aggregation/combine.md @@ -42,7 +42,9 @@ commumative operation. But, it allows the use of partial sums to be precomputed. See more information in the [Beam Programming Guide](/documentation/programming-guide/#combine). ## Examples + **Example 1**: Global combine + Use the global combine to combine all of the elements in a given `PCollection` into a single value, represented in your pipeline as a new `PCollection` containing one element. The following example code shows how to apply the Beam-provided @@ -57,6 +59,7 @@ PCollection sum = pc.apply( {{< /highlight >}} **Example 2**: Keyed combine + Use a keyed combine to combine all of the values associated with each key into a single output value for each key. As with the global combine, the function passed to a keyed combine must be associative and commutative. @@ -75,6 +78,12 @@ PCollection> avgAccuracyPerPlayer = new MeanInts()))); {{< /highlight >}} +**Example 3**: + +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_Combine" show="main_section" >}} +{{< /playground >}} + ## Related transforms * [CombineWithContext](/documentation/transforms/java/aggregation/combinewithcontext) * [GroupByKey](/documentation/transforms/java/aggregation/groupbykey) diff --git a/website/www/site/content/en/documentation/transforms/java/aggregation/count.md b/website/www/site/content/en/documentation/transforms/java/aggregation/count.md index 0b84ead8391a..7865fc9a19ef 100644 --- a/website/www/site/content/en/documentation/transforms/java/aggregation/count.md +++ b/website/www/site/content/en/documentation/transforms/java/aggregation/count.md @@ -39,7 +39,18 @@ transform has three varieties: appeared in the original collection. ## Examples -See [BEAM-7703](https://issues.apache.org/jira/browse/BEAM-7703) for updates. + +**Example 1**: Count.globally + +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_Count" show="main_section" >}} +{{< /playground >}} + +**Example 2**: Count.perKey + +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_CountPerKey" show="main_section" >}} +{{< /playground >}} ## Related transforms * [ApproximateUnique](/documentation/transforms/java/aggregation/approximateunique) diff --git a/website/www/site/content/en/documentation/transforms/java/aggregation/distinct.md b/website/www/site/content/en/documentation/transforms/java/aggregation/distinct.md index 7c5cbd2e9316..b8956f29d26c 100644 --- a/website/www/site/content/en/documentation/transforms/java/aggregation/distinct.md +++ b/website/www/site/content/en/documentation/transforms/java/aggregation/distinct.md @@ -33,7 +33,7 @@ values for each key. ## Examples -**Example 1** Find the distinct element from a `PCollection` of `String`. +**Example 1**: Find the distinct element from a `PCollection` of `String`. {{< highlight java >}} @@ -50,6 +50,12 @@ PCollection distinctWords = input.apply(Distinct.create()); {{< /highlight >}} +**Example 2**: Find the distinct element from a `PCollection` of `Integer`. + +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_Distinct" show="main_section" >}} +{{< /playground >}} + ## Related transforms * [Count](/documentation/transforms/java/aggregation/count) counts the number of elements within each aggregation. diff --git a/website/www/site/content/en/documentation/transforms/java/aggregation/groupbykey.md b/website/www/site/content/en/documentation/transforms/java/aggregation/groupbykey.md index c9986f72e99f..48c605c850ef 100644 --- a/website/www/site/content/en/documentation/transforms/java/aggregation/groupbykey.md +++ b/website/www/site/content/en/documentation/transforms/java/aggregation/groupbykey.md @@ -36,10 +36,10 @@ windowing or triggering is necessary when processing unbounded collections. See more information in the [Beam Programming Guide](/documentation/programming-guide/#groupbykey). ## Examples -**Example 1**: (a, 1), (b, 2), (a, 3) will result into (a, [1, 3]), (b, [2]). -**Example 2**: Given a collection of customer orders keyed by postal code, -you could use `GroupByKey` to get the collection of all orders in each postal code. +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="PG_BEAMDOC_SDK_JAVA_GroupByKey" show="main_section" >}} +{{< /playground >}} ## Related transforms * [CoGroupByKey](/documentation/transforms/java/aggregation/cogroupbykey) diff --git a/website/www/site/content/en/documentation/transforms/java/aggregation/groupintobatches.md b/website/www/site/content/en/documentation/transforms/java/aggregation/groupintobatches.md index 6d1963fd0760..26bfa6c0d229 100644 --- a/website/www/site/content/en/documentation/transforms/java/aggregation/groupintobatches.md +++ b/website/www/site/content/en/documentation/transforms/java/aggregation/groupintobatches.md @@ -34,7 +34,10 @@ to the output collection. Batches contain elements from the same window, so windows are preserved. Batches might contain elements from more than one bundle. ## Examples -See [BEAM-7703](https://issues.apache.org/jira/browse/BEAM-7703) for updates. + +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_GroupIntoBatches" show="main_section" >}} +{{< /playground >}} ## Related transforms * [GroupByKey](/documentation/transforms/java/aggregation/groupbykey) takes one input collection. diff --git a/website/www/site/content/en/documentation/transforms/java/aggregation/latest.md b/website/www/site/content/en/documentation/transforms/java/aggregation/latest.md index 454d39bf14e4..bda9200774df 100644 --- a/website/www/site/content/en/documentation/transforms/java/aggregation/latest.md +++ b/website/www/site/content/en/documentation/transforms/java/aggregation/latest.md @@ -35,7 +35,9 @@ A transform and `Combine.CombineFn` for computing the latest element in a collec For elements with the same timestamp, the output element is arbitrarily selected. ## Examples -**Example**: compute the latest value for each session + +**Example 1**: Compute the latest value for each session + {{< highlight java >}} PCollection input = ...; PCollection sessioned = input @@ -43,6 +45,12 @@ For elements with the same timestamp, the output element is arbitrarily selected PCollection latestValues = sessioned.apply(Latest.globally()); {{< /highlight >}} +**Example 2**: + +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_Latest" show="main_section" >}} +{{< /playground >}} + ## Related transforms * [Reify](/documentation/transforms/java/elementwise/reify) converts between explicit and implicit form of various Beam values diff --git a/website/www/site/content/en/documentation/transforms/java/aggregation/max.md b/website/www/site/content/en/documentation/transforms/java/aggregation/max.md index edc07d2edb55..18f0b42453ec 100644 --- a/website/www/site/content/en/documentation/transforms/java/aggregation/max.md +++ b/website/www/site/content/en/documentation/transforms/java/aggregation/max.md @@ -29,6 +29,7 @@ Provides a variety of different transforms for computing the maximum values in a collection, either globally or for each key. ## Examples + **Example 1**: get the maximum of a `PCollection` of `Doubles`. {{< highlight java >}} @@ -45,6 +46,18 @@ PCollection> maxPerKey = input .apply(Max.integersPerKey()); {{< /highlight >}} +**Example 3**: + +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_Max" show="main_section" >}} +{{< /playground >}} + +**Example 4**: + +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_MaxPerKey" show="main_section" >}} +{{< /playground >}} + ## Related transforms * [Min](/documentation/transforms/java/aggregation/min) for computing minimum values in a collection diff --git a/website/www/site/content/en/documentation/transforms/java/aggregation/mean.md b/website/www/site/content/en/documentation/transforms/java/aggregation/mean.md index 88f90d585d22..2509c9b46a7d 100644 --- a/website/www/site/content/en/documentation/transforms/java/aggregation/mean.md +++ b/website/www/site/content/en/documentation/transforms/java/aggregation/mean.md @@ -34,18 +34,15 @@ or the mean of the values associated with each key in a collection of key-value ## Examples **Example 1**: get the mean of a `PCollection` of `Longs`. -{{< highlight java >}} -PCollection input = ...; -PCollection mean = input.apply(Mean.globally()); -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_Mean" show="main_section" >}} +{{< /playground >}} **Example 2**: calculate the mean of the `Integers` associated with each unique key (which is of type `String`). -{{< highlight java >}} -PCollection> input = ...; -PCollection> meanPerKey = - input.apply(Mean.perKey()); -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_MeanPerKey" show="main_section" >}} +{{< /playground >}} ## Related transforms * [Max](/documentation/transforms/java/aggregation/max) diff --git a/website/www/site/content/en/documentation/transforms/java/aggregation/min.md b/website/www/site/content/en/documentation/transforms/java/aggregation/min.md index e5ecf67cd5d0..0942534e9d74 100644 --- a/website/www/site/content/en/documentation/transforms/java/aggregation/min.md +++ b/website/www/site/content/en/documentation/transforms/java/aggregation/min.md @@ -29,7 +29,19 @@ Provides a variety of different transforms for computing the minimum values in a collection, either globally or for each key. ## Examples -See [BEAM-7703](https://issues.apache.org/jira/browse/BEAM-7703) for updates. + +**Example 1**: get the minimum of a `PCollection` of `Doubles`. + +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_Min" show="main_section" >}} +{{< /playground >}} + +**Example 2**: calculate the minimum of the `Integers` associated +with each unique key (which is of type `String`). + +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_MinPerKey" show="main_section" >}} +{{< /playground >}} ## Related transforms * [Max](/documentation/transforms/java/aggregation/max) diff --git a/website/www/site/content/en/documentation/transforms/java/aggregation/sample.md b/website/www/site/content/en/documentation/transforms/java/aggregation/sample.md index e3328af66f06..a3499e595db0 100644 --- a/website/www/site/content/en/documentation/transforms/java/aggregation/sample.md +++ b/website/www/site/content/en/documentation/transforms/java/aggregation/sample.md @@ -29,7 +29,10 @@ Transforms for taking samples of the elements in a collection, or samples of the values associated with each key in a collection of key-value pairs. ## Examples -See [BEAM-7703](https://issues.apache.org/jira/browse/BEAM-7703) for updates. + +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_Sample" show="main_section" >}} +{{< /playground >}} ## Related transforms * [Top](/documentation/transforms/java/aggregation/top) diff --git a/website/www/site/content/en/documentation/transforms/java/aggregation/sum.md b/website/www/site/content/en/documentation/transforms/java/aggregation/sum.md index 2c49cbe4c039..944abc46d4b3 100644 --- a/website/www/site/content/en/documentation/transforms/java/aggregation/sum.md +++ b/website/www/site/content/en/documentation/transforms/java/aggregation/sum.md @@ -31,18 +31,15 @@ values associated with each key in a collection of key-value pairs. ## Examples **Example 1**: get the sum of a `PCollection` of `Doubles`. -{{< highlight java >}} -PCollection input = ...; -PCollection sum = input.apply(Sum.doublesGlobally()); -{{< /highlight >}} - -Example 2: calculate the sum of the `Integers` associated with each unique key (which is of type `String`). - -{{< highlight java >}} -PCollection> input = ...; -PCollection> sumPerKey = input - .apply(Sum.integersPerKey()); -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_Sum" show="main_section" >}} +{{< /playground >}} + +**Example 2**: calculate the sum of the `Integers` associated with each unique key (which is of type `String`). + +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_SumPerKey" show="main_section" >}} +{{< /playground >}} ## Related transforms * [Count](/documentation/transforms/java/aggregation/count) diff --git a/website/www/site/content/en/documentation/transforms/java/aggregation/top.md b/website/www/site/content/en/documentation/transforms/java/aggregation/top.md index 018154437681..044e57b8f5c8 100644 --- a/website/www/site/content/en/documentation/transforms/java/aggregation/top.md +++ b/website/www/site/content/en/documentation/transforms/java/aggregation/top.md @@ -30,7 +30,10 @@ a collection, or the largest (or smallest) set of values associated with each key in a collection of key-value pairs. ## Examples -See [BEAM-7703](https://issues.apache.org/jira/browse/BEAM-7703) for updates. + +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_Top" show="main_section" >}} +{{< /playground >}} ## Related transforms * [Sample](/documentation/transforms/java/aggregation/sample) diff --git a/website/www/site/content/en/documentation/transforms/java/elementwise/filter.md b/website/www/site/content/en/documentation/transforms/java/elementwise/filter.md index 8bdce38b05ac..bd8ffd821755 100644 --- a/website/www/site/content/en/documentation/transforms/java/elementwise/filter.md +++ b/website/www/site/content/en/documentation/transforms/java/elementwise/filter.md @@ -30,6 +30,7 @@ May also be used to filter based on an inequality with a given value based on the natural ordering of the element. ## Examples + **Example 1**: Filtering with a predicate {{< highlight java >}} @@ -53,6 +54,12 @@ PCollection smallNumbers = numbers.apply(Filter.lessThanEq(3)); {{< /highlight >}} Other variants include `Filter.greaterThanEq`, `Filter.lessThan` and `Filter.equal`. +**Example 3**: Filtering with lambda + +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_Filter" >}} +{{< /playground >}} + ## Related transforms * [FlatMapElements](/documentation/transforms/java/elementwise/flatmapelements) behaves the same as `Map`, but for each input it might produce zero or more outputs. diff --git a/website/www/site/content/en/documentation/transforms/java/elementwise/flatmapelements.md b/website/www/site/content/en/documentation/transforms/java/elementwise/flatmapelements.md index bfbc3e1f88b0..da64b2a5af5a 100644 --- a/website/www/site/content/en/documentation/transforms/java/elementwise/flatmapelements.md +++ b/website/www/site/content/en/documentation/transforms/java/elementwise/flatmapelements.md @@ -29,7 +29,10 @@ Applies a simple 1-to-many mapping function over each element in the collection. The many elements are flattened into the resulting collection. ## Examples -See [BEAM-7702](https://issues.apache.org/jira/browse/BEAM-7702) for updates. + +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_FlatMapElements" show="main_section" >}} +{{< /playground >}} ## Related transforms * [Filter](/documentation/transforms/java/elementwise/filter) is useful if the function is just diff --git a/website/www/site/content/en/documentation/transforms/java/elementwise/keys.md b/website/www/site/content/en/documentation/transforms/java/elementwise/keys.md index c62efd30abb7..b506478a6dc2 100644 --- a/website/www/site/content/en/documentation/transforms/java/elementwise/keys.md +++ b/website/www/site/content/en/documentation/transforms/java/elementwise/keys.md @@ -28,12 +28,10 @@ limitations under the License. Takes a collection of key-value pairs, and returns the key of each element. ## Examples -**Example** -{{< highlight java >}} -PCollection> keyValuePairs = /* ... */; -PCollection keys = keyValuePairs.apply(Keys.create()); -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_Keys" show="main_section" >}} +{{< /playground >}} ## Related transforms * [KvSwap](/documentation/transforms/java/elementwise/kvswap) swaps key-value pair values. diff --git a/website/www/site/content/en/documentation/transforms/java/elementwise/kvswap.md b/website/www/site/content/en/documentation/transforms/java/elementwise/kvswap.md index b0f8b5eb4b57..000fb30fbf24 100644 --- a/website/www/site/content/en/documentation/transforms/java/elementwise/kvswap.md +++ b/website/www/site/content/en/documentation/transforms/java/elementwise/kvswap.md @@ -28,12 +28,10 @@ limitations under the License. Takes a collection of key-value pairs and returns a collection of key-value pairs which has each key and value swapped. ## Examples -**Example**: -{{< highlight java >}} -PCollection> strIntPairs = /* ... */; -PCollection> intStrPairs = strIntPairs.apply(KvSwap.create()); -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_KvSwap" show="main_section" >}} +{{< /playground >}} ## Related transforms * [Keys](/documentation/transforms/java/elementwise/keys) for extracting the key of each component. diff --git a/website/www/site/content/en/documentation/transforms/java/elementwise/mapelements.md b/website/www/site/content/en/documentation/transforms/java/elementwise/mapelements.md index 5b900baf9690..a0e2aadc1fbf 100644 --- a/website/www/site/content/en/documentation/transforms/java/elementwise/mapelements.md +++ b/website/www/site/content/en/documentation/transforms/java/elementwise/mapelements.md @@ -28,18 +28,12 @@ limitations under the License. Applies a simple 1-to-1 mapping function over each element in the collection. ## Examples + **Example 1**: providing the mapping function using a `SimpleFunction` -{{< highlight java >}} -PCollection lines = Create.of("Hello World", "Beam is fun"); -PCollection lineLengths = lines.apply(MapElements.via( - new SimpleFunction() { - @Override - public Integer apply(String line) { - return line.length(); - } - }); -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_MapElements" show="main_section" >}} +{{< /playground >}} **Example 2**: providing the mapping function using a `SerializableFunction`, which allows the use of Java 8 lambdas. Due to type erasure, you need diff --git a/website/www/site/content/en/documentation/transforms/java/elementwise/pardo.md b/website/www/site/content/en/documentation/transforms/java/elementwise/pardo.md index 05b1990ffdef..d955fffe9848 100644 --- a/website/www/site/content/en/documentation/transforms/java/elementwise/pardo.md +++ b/website/www/site/content/en/documentation/transforms/java/elementwise/pardo.md @@ -33,6 +33,7 @@ an output PCollection. See more information in the [Beam Programming Guide](/documentation/programming-guide/#pardo). ## Examples + **Example 1**: Passing side inputs {{< highlight java >}} @@ -142,6 +143,11 @@ See more information in the [Beam Programming Guide](/documentation/programming- }})); {{< /highlight >}} +**Example 4**: Apply a simple custom function + +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_FilterParDo" >}} +{{< /playground >}} ## Related transforms * [MapElements](/documentation/transforms/java/elementwise/mapelements) diff --git a/website/www/site/content/en/documentation/transforms/java/elementwise/partition.md b/website/www/site/content/en/documentation/transforms/java/elementwise/partition.md index 66c27019b5fd..713910752d72 100644 --- a/website/www/site/content/en/documentation/transforms/java/elementwise/partition.md +++ b/website/www/site/content/en/documentation/transforms/java/elementwise/partition.md @@ -32,24 +32,12 @@ The number of partitions must be determined at graph construction time. You cann See more information in the [Beam Programming Guide](/documentation/programming-guide/#partition). ## Examples + **Example**: dividing a `PCollection` into percentile groups -{{< highlight java >}} -// Provide an int value with the desired number of result partitions, and a PartitionFn that represents the -// partitioning function. In this example, we define the PartitionFn in-line. Returns a PCollectionList -// containing each of the resulting partitions as individual PCollection objects. -PCollection students = ...; -// Split students up into 10 partitions, by percentile: -PCollectionList studentsByPercentile = - students.apply(Partition.of(10, new PartitionFn() { - public int partitionFor(Student student, int numPartitions) { - return student.getPercentile() // 0..99 - * numPartitions / 100; - }})); - -// You can extract each partition from the PCollectionList using the get method, as follows: -PCollection fortiethPercentile = studentsByPercentile.get(4); -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_PartitionPercentile" show="main_section" >}} +{{< /playground >}} ## Related transforms * [Filter](/documentation/transforms/java/elementwise/filter) is useful if the function is just diff --git a/website/www/site/content/en/documentation/transforms/java/elementwise/regex.md b/website/www/site/content/en/documentation/transforms/java/elementwise/regex.md index 60545f26e597..8fb2e84040e8 100644 --- a/website/www/site/content/en/documentation/transforms/java/elementwise/regex.md +++ b/website/www/site/content/en/documentation/transforms/java/elementwise/regex.md @@ -28,7 +28,10 @@ limitations under the License. Provides a variety of functionality based on regular expressions. ## Examples -See [BEAM-7702](https://issues.apache.org/jira/browse/BEAM-7702) for updates. + +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_Regex" show="main_section" >}} +{{< /playground >}} ## Related transforms * [MapElements](/documentation/transforms/java/elementwise/mapelements) diff --git a/website/www/site/content/en/documentation/transforms/java/elementwise/tostring.md b/website/www/site/content/en/documentation/transforms/java/elementwise/tostring.md index fd5329ff1c81..dccfb1883c99 100644 --- a/website/www/site/content/en/documentation/transforms/java/elementwise/tostring.md +++ b/website/www/site/content/en/documentation/transforms/java/elementwise/tostring.md @@ -29,7 +29,10 @@ A variety of utility transforms for invoking the `toString()` method on every element in the input collection. ## Examples -See [BEAM-7702](https://issues.apache.org/jira/browse/BEAM-7702) for updates. + +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_ToString" show="main_section" >}} +{{< /playground >}} ## Related transforms * [MapElements](/documentation/transforms/java/elementwise/mapelements) diff --git a/website/www/site/content/en/documentation/transforms/java/elementwise/values.md b/website/www/site/content/en/documentation/transforms/java/elementwise/values.md index 5e6f1cb0975f..137519cf320d 100644 --- a/website/www/site/content/en/documentation/transforms/java/elementwise/values.md +++ b/website/www/site/content/en/documentation/transforms/java/elementwise/values.md @@ -29,12 +29,10 @@ The `Values` transform takes a collection of key-value pairs, and returns the value of each element. ## Examples -**Example** -{{< highlight java >}} -PCollection> keyValuePairs = /* ... */; -PCollection values = keyValuePairs.apply(Values.create()); -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_Values" show="main_section" >}} +{{< /playground >}} ## Related transforms * [Keys](/documentation/transforms/java/elementwise/keys) for extracting the key of each component. diff --git a/website/www/site/content/en/documentation/transforms/java/elementwise/withkeys.md b/website/www/site/content/en/documentation/transforms/java/elementwise/withkeys.md index 977fbdee1ebf..2cf758676a85 100644 --- a/website/www/site/content/en/documentation/transforms/java/elementwise/withkeys.md +++ b/website/www/site/content/en/documentation/transforms/java/elementwise/withkeys.md @@ -35,17 +35,10 @@ There are two versions of `WithKeys`, depending on how the key should be determi * `WithKeys.of(K key)` associates each value with the specified key. ## Examples -**Example** -{{< highlight java >}} -PCollection words = Create.of("Hello", "World", "Beam", "is", "fun"); -PCollection> lengthAndWord = - words.apply(WithKeys.of(new SerializableFunction() { - @Override - public Integer apply(String s) { - return s.length(); - } - }); -{{< /highlight >}} + +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="PG_BEAMDOC_SDK_JAVA_WithKeys" show="main_section" >}} +{{< /playground >}} ## Related transforms * [Keys](/documentation/transforms/java/elementwise/keys) for extracting the key of each component. diff --git a/website/www/site/content/en/documentation/transforms/java/elementwise/withtimestamps.md b/website/www/site/content/en/documentation/transforms/java/elementwise/withtimestamps.md index b2595d8bc36a..31875eaca01b 100644 --- a/website/www/site/content/en/documentation/transforms/java/elementwise/withtimestamps.md +++ b/website/www/site/content/en/documentation/transforms/java/elementwise/withtimestamps.md @@ -28,7 +28,10 @@ limitations under the License. Assigns timestamps to all the elements of a collection. ## Examples -See [BEAM-7702](https://issues.apache.org/jira/browse/BEAM-7702) for updates. + +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_Latest" show="main_section" >}} +{{< /playground >}} ## Related transforms * [Reify](/documentation/transforms/java/elementwise/reify) diff --git a/website/www/site/content/en/documentation/transforms/java/other/create.md b/website/www/site/content/en/documentation/transforms/java/other/create.md index 13bdd0789b36..2a7a6c16391a 100644 --- a/website/www/site/content/en/documentation/transforms/java/other/create.md +++ b/website/www/site/content/en/documentation/transforms/java/other/create.md @@ -32,7 +32,9 @@ For example, a single element to execute a one-time `ParDo` or a list of filenam ## Examples -See [BEAM-7704](https://issues.apache.org/jira/browse/BEAM-7704) for updates. +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_Create" show="main_section" >}} +{{< /playground >}} ## Related transforms N/A diff --git a/website/www/site/content/en/documentation/transforms/java/other/flatten.md b/website/www/site/content/en/documentation/transforms/java/other/flatten.md index ffb2d0573d54..663146415c05 100644 --- a/website/www/site/content/en/documentation/transforms/java/other/flatten.md +++ b/website/www/site/content/en/documentation/transforms/java/other/flatten.md @@ -48,16 +48,10 @@ See more information in the [Beam Programming Guide](/documentation/programming- ## Examples **Example**: Apply a `Flatten` transform to merge multiple `PCollection` objects -{{< highlight java >}} -// Flatten takes a PCollectionList of PCollection objects of a given type. -// Returns a single PCollection that contains all of the elements in the PCollection objects in that list. -PCollection pc1 = Create.of("Hello"); -PCollection pc2 = Create.of("World", "Beam"); -PCollection pc3 = Create.of("Is", "Fun"); -PCollectionList collections = PCollectionList.of(pc1).and(pc2).and(pc3); +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="PG_BEAMDOC_SDK_JAVA_Flatten" show="main_section" >}} +{{< /playground >}} -PCollection merged = collections.apply(Flatten.pCollections()); -{{< /highlight >}} The resulting collection now has all the elements: "Hello", "World", "Beam", "Is", and "Fun". diff --git a/website/www/site/content/en/documentation/transforms/java/other/view.md b/website/www/site/content/en/documentation/transforms/java/other/view.md index a4a31efb8f56..8ee9296f18c2 100644 --- a/website/www/site/content/en/documentation/transforms/java/other/view.md +++ b/website/www/site/content/en/documentation/transforms/java/other/view.md @@ -28,7 +28,10 @@ limitations under the License. Operations for turning a collection into view that may be used as a side-input to a `ParDo`. ## Examples -See [BEAM-7704](https://issues.apache.org/jira/browse/BEAM-7704) for updates. + +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_View" show="main_section" >}} +{{< /playground >}} ## Related transforms * [ParDo](/documentation/transforms/java/elementwise/pardo) diff --git a/website/www/site/content/en/documentation/transforms/java/other/window.md b/website/www/site/content/en/documentation/transforms/java/other/window.md index 439f484697f8..1a818baaea9a 100644 --- a/website/www/site/content/en/documentation/transforms/java/other/window.md +++ b/website/www/site/content/en/documentation/transforms/java/other/window.md @@ -29,7 +29,10 @@ Logically divides up or groups the elements of a collection into finite windows according to a function. ## Examples -See [BEAM-7704](https://issues.apache.org/jira/browse/BEAM-7704) for updates. + +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_Window" show="main_section" >}} +{{< /playground >}} ## Related transforms * [Reify](/documentation/transforms/java/elementwise/reify) diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/combineglobally.md b/website/www/site/content/en/documentation/transforms/python/aggregation/combineglobally.md index 1b27e1844bb8..d2f8b27fb107 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/combineglobally.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/combineglobally.md @@ -36,33 +36,17 @@ Then, we apply `CombineGlobally` in multiple ways to combine all the elements in We define a function `get_common_items` which takes an `iterable` of sets as an input, and calculates the intersection (common items) of those sets. -{{< highlight language="py" py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally.py" combineglobally_function >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally_test.py" common_items >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_CombineGloballyFunction" show="combineglobally_function" >}} +{{< /playground >}} ### Example 2: Combining with a lambda function We can also use lambda functions to simplify **Example 1**. -{{< highlight language="py" py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally.py" combineglobally_lambda >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally_test.py" common_items >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_CombineGloballyLambda" show="combineglobally_lambda" >}} +{{< /playground >}} ### Example 3: Combining with multiple arguments @@ -71,17 +55,9 @@ They are passed as additional positional arguments or keyword arguments to the f In this example, the lambda function takes `sets` and `exclude` as arguments. -{{< highlight language="py" py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally.py" combineglobally_multiple_arguments >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally_test.py" common_items_with_exceptions >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_CombineGloballyMultipleArguments" show="combineglobally_multiple_arguments" >}} +{{< /playground >}} ### Example 4: Combining with a `CombineFn` @@ -101,17 +77,9 @@ The more general way to combine elements, and the most flexible, is with a class * [`CombineFn.extract_output()`](https://beam.apache.org/releases/pydoc/current/apache_beam.transforms.core.html#apache_beam.transforms.core.CombineFn.extract_output): It allows to do additional calculations before extracting a result. -{{< highlight language="py" py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally.py" combineglobally_combinefn >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally_test.py" percentages >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_CombineGloballyCombineFn" show="combineglobally_combinefn" >}} +{{< /playground >}} ## Related transforms diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/combineperkey.md b/website/www/site/content/en/documentation/transforms/python/aggregation/combineperkey.md index b79c183286ef..65084c187f94 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/combineperkey.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/combineperkey.md @@ -38,49 +38,25 @@ We use the function [`sum`](https://docs.python.org/3/library/functions.html#sum) which takes an `iterable` of numbers and adds them together. -{{< highlight language="py" py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" combineperkey_simple >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey_test.py" total >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_CombinePerKeySimple" show="combineperkey_simple" >}} +{{< /playground >}} ### Example 2: Combining with a function We define a function `saturated_sum` which takes an `iterable` of numbers and adds them together, up to a predefined maximum number. -{{< highlight language="py" py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" combineperkey_function >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey_test.py" saturated_total >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_CombinePerKeyFunction" show="combineperkey_function" >}} +{{< /playground >}} ### Example 3: Combining with a lambda function We can also use lambda functions to simplify **Example 2**. -{{< highlight language="py" py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" combineperkey_lambda >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey_test.py" saturated_total >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_CombinePerKeyLambda" show="combineperkey_lambda" >}} +{{< /playground >}} ### Example 4: Combining with multiple arguments @@ -89,17 +65,9 @@ They are passed as additional positional arguments or keyword arguments to the f In this example, the lambda function takes `values` and `max_value` as arguments. -{{< highlight language="py" py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" combineperkey_multiple_arguments >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey_test.py" saturated_total >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_CombinePerKeyMultipleArguments" show="combineperkey_multiple_arguments" >}} +{{< /playground >}} ### Example 5: Combining with a `CombineFn` @@ -119,17 +87,9 @@ The more general way to combine elements, and the most flexible, is with a class * [`CombineFn.extract_output()`](https://beam.apache.org/releases/pydoc/current/apache_beam.transforms.core.html#apache_beam.transforms.core.CombineFn.extract_output): It allows to do additional calculations before extracting a result. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" combineperkey_combinefn >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey_test.py" average >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_CombinePerKeyCombineFn" show="combineperkey_combinefn" >}} +{{< /playground >}} ## Related transforms diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/combinevalues.md b/website/www/site/content/en/documentation/transforms/python/aggregation/combinevalues.md index 64c1e7f7ccb0..2fb6446d331a 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/combinevalues.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/combinevalues.md @@ -39,17 +39,9 @@ We use the function [`sum`](https://docs.python.org/3/library/functions.html#sum) which takes an `iterable` of numbers and adds them together. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" combinevalues_simple >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues_test.py" total >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_CombineValuesSimple" show="combinevalues_simple" >}} +{{< /playground >}} ### Example 2: Combining with a function @@ -58,33 +50,17 @@ We want the sum to be bounded up to a maximum value, so we use We define a function `saturated_sum` which takes an `iterable` of numbers and adds them together, up to a predefined maximum number. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" combinevalues_function >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues_test.py" saturated_total >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_CombineValuesFunction" show="combinevalues_function" >}} +{{< /playground >}} ### Example 3: Combining with a lambda function We can also use lambda functions to simplify **Example 2**. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" combinevalues_lambda >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues_test.py" saturated_total >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_CombineValuesLambda" show="combinevalues_lambda" >}} +{{< /playground >}} ### Example 4: Combining with multiple arguments @@ -93,17 +69,9 @@ They are passed as additional positional arguments or keyword arguments to the f In this example, the lambda function takes `values` and `max_value` as arguments. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" combinevalues_multiple_arguments >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues_test.py" saturated_total >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_CombineValuesMultipleArguments" show="combinevalues_multiple_arguments" >}} +{{< /playground >}} ### Example 5: Combining with a `CombineFn` @@ -123,17 +91,9 @@ The more general way to combine elements, and the most flexible, is with a class * [`CombineFn.extract_output()`](https://beam.apache.org/releases/pydoc/current/apache_beam.transforms.core.html#apache_beam.transforms.core.CombineFn.extract_output): It allows to do additional calculations before extracting a result. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" combinevalues_combinefn >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues_test.py" percentages_per_season >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_CombineValuesCombineFn" show="combinevalues_combinefn" >}} +{{< /playground >}} ## Related transforms diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/count.md b/website/www/site/content/en/documentation/transforms/python/aggregation/count.md index 5aa6e1b8252f..a444cd4b3dd9 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/count.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/count.md @@ -32,49 +32,25 @@ Then, we apply `Count` to get the total number of elements in different ways. We use `Count.Globally()` to count *all* elements in a `PCollection`, even if there are duplicate elements. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/count.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/count.py" count_globally >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/count_test.py" total_elements >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_CountGlobally" show="count_globally" >}} +{{< /playground >}} ### Example 2: Counting elements for each key We use `Count.PerKey()` to count the elements for each unique key in a `PCollection` of key-values. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/count.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/count.py" count_per_key >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/count_test.py" total_elements_per_key >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_CountPerKey" show="count_per_key" >}} +{{< /playground >}} ### Example 3: Counting all unique elements We use `Count.PerElement()` to count the only the unique elements in a `PCollection`. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/count.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/count.py" count_per_element >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/count_test.py" total_unique_elements >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_CountPerElement" show="count_per_element" >}} +{{< /playground >}} ## Related transforms diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/distinct.md b/website/www/site/content/en/documentation/transforms/python/aggregation/distinct.md index 08db6bd987c5..24abe6bdd247 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/distinct.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/distinct.md @@ -29,17 +29,9 @@ In the following example, we create a pipeline with two `PCollection`s of produc We use `Distinct` to get rid of duplicate elements, which outputs a `PCollection` of all the unique elements. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/distinct.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/distinct.py" distinct >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/distinct_test.py" unique_elements >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_Distinct" show="distinc" >}} +{{< /playground >}} ## Related transforms diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/groupby.md b/website/www/site/content/en/documentation/transforms/python/aggregation/groupby.md index df281bdabe0a..95e0dd650d1a 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/groupby.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/groupby.md @@ -32,70 +32,31 @@ In the following example, we create a pipeline with a `PCollection` of fruits. We use `GroupBy` to group all fruits by the first letter of their name. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" groupby_expr >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" groupby_expr_result >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_GroupByExpr" show="groupby_expr" >}} +{{< /playground >}} We can group by a composite key consisting of multiple properties if desired. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" groupby_two_exprs >}} -{{< /highlight >}} - The resulting key is a named tuple with the two requested attributes, and the values are grouped accordingly. -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" groupby_two_exprs_result >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_GroupByTwoExprs" show="groupby_two_exprs" >}} +{{< /playground >}} In the case that the property one wishes to group by is an attribute, a string -may be passed to `GroupBy` in the place of a callable expression. For example, -suppose I have the following data - -{{< highlight py >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" groupby_table >}} -{{< /highlight >}} - -We can then do - -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" groupby_attr >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} +may be passed to `GroupBy` in the place of a callable expression. -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" groupby_attr_result >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_GroupByAttr" show="groupby_attr" >}} +{{< /playground >}} It is possible to mix and match attributes and expressions, for example -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" groupby_attr_expr >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" groupby_attr_expr_result >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_GroupByAttrExpr" show="groupby_attr_expr" >}} +{{< /playground >}} ## Aggregation @@ -108,47 +69,23 @@ by, and finally a field name in which to store the result. For example, suppose one wanted to compute the amount of each fruit to buy. One could write -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" simple_aggregate >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" simple_aggregate_result >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_GroupBySimpleAggregate" show="simple_aggregate" >}} +{{< /playground >}} Similar to the parameters in `GroupBy`, one can also aggregate multiple fields and by expressions. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" expr_aggregate >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" expr_aggregate_result >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_GroupByExprAggregate" show="expr_aggregate" >}} +{{< /playground >}} One can, of course, aggregate the same field multiple times as well. This example also illustrates a global grouping, as the grouping key is empty. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" global_aggregate >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" global_aggregate_result >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_GroupByGlobalAggregate" show="global_aggregate" >}} +{{< /playground >}} ## Related transforms diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/groupbykey.md b/website/www/site/content/en/documentation/transforms/python/aggregation/groupbykey.md index 06ff183f833b..5ba04bc2fe1a 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/groupbykey.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/groupbykey.md @@ -28,7 +28,7 @@ See more information in the [Beam Programming Guide](/documentation/programming- ## Examples -In the following example, we create a pipeline with a `PCollection` of produce keyed by season. +**Example 1**: In the following example, we create a pipeline with a `PCollection` of produce keyed by season. We use `GroupByKey` to group all the produce for each season. @@ -44,6 +44,12 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupbykey_test.py" produce_counts >}} {{< /highlight >}} +**Example 2**: + +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_GroupByKey" show="groupbykey" >}} +{{< /playground >}} + ## Related transforms * [GroupBy](/documentation/transforms/python/aggregation/groupby) for grouping by arbitrary properties of the elements. diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/groupintobatches.md b/website/www/site/content/en/documentation/transforms/python/aggregation/groupintobatches.md index a7c9cd9b2348..d187c2a1f250 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/groupintobatches.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/groupintobatches.md @@ -29,17 +29,9 @@ In the following example, we create a pipeline with a `PCollection` of produce b We use `GroupIntoBatches` to get fixed-sized batches for every key, which outputs a list of elements for every key. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupintobatches.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupintobatches.py" groupintobatches >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupintobatches_test.py" batches_with_keys >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_GroupIntoBatches" show="groupintobatches" >}} +{{< /playground >}} ## Related transforms diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/latest.md b/website/www/site/content/en/documentation/transforms/python/aggregation/latest.md index 613858c44752..eb2e0a05498c 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/latest.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/latest.md @@ -33,33 +33,17 @@ We use `Latest` to get the element with the latest timestamp from the `PCollecti We use `Latest.Globally()` to get the element with the latest timestamp in the entire `PCollection`. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/latest.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/latest.py" latest_globally >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/latest_test.py" latest_element >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_LatestGlobally" show="latest_globally" >}} +{{< /playground >}} ### Example 2: Latest elements for each key We use `Latest.PerKey()` to get the elements with the latest timestamp for each key in a `PCollection` of key-values. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/latest.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/latest.py" latest_per_key >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/latest_test.py" latest_elements_per_key >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_LatestPerKey" show="latest_per_key" >}} +{{< /playground >}} ## Related transforms diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/max.md b/website/www/site/content/en/documentation/transforms/python/aggregation/max.md index 37210888226c..3ee9452cd834 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/max.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/max.md @@ -32,33 +32,17 @@ Then, we get the element with the maximum value in different ways. We use `Combine.Globally()` to get the maximum element from the *entire* `PCollection`. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/max.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/max.py" max_globally >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/max_test.py" max_element >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_MaxGlobally" show="max_globally" >}} +{{< /playground >}} ### Example 2: Maximum elements for each key We use `Combine.PerKey()` to get the maximum element for each unique key in a `PCollection` of key-values. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/max.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/max.py" max_per_key >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/max_test.py" elements_with_max_value_per_key >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_MaxPerKey" show="max_per_key" >}} +{{< /playground >}} ## Related transforms diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/mean.md b/website/www/site/content/en/documentation/transforms/python/aggregation/mean.md index 76a2d0082ed1..346d2da8d670 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/mean.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/mean.md @@ -34,33 +34,17 @@ Then, we get the element with the average value in different ways. We use `Mean.Globally()` to get the average of the elements from the *entire* `PCollection`. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/mean.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/mean.py" mean_globally >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/mean_test.py" mean_element >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_MeanGlobally" show="mean_globally" >}} +{{< /playground >}} ### Example 2: Mean of elements for each key We use `Mean.PerKey()` to get the average of the elements for each unique key in a `PCollection` of key-values. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/mean.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/mean.py" mean_per_key >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/mean_test.py" elements_with_mean_value_per_key >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_MeanPerKey" show="mean_per_ke" >}} +{{< /playground >}} ## Related transforms diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/min.md b/website/www/site/content/en/documentation/transforms/python/aggregation/min.md index 62f9d15d4904..ad472bec8c7c 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/min.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/min.md @@ -32,33 +32,17 @@ Then, we get the element with the minimum value in different ways. We use `Combine.Globally()` to get the minimum element from the *entire* `PCollection`. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/min.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/min.py" min_globally >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/min_test.py" min_element >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_MinGlobally" show="min_globally" >}} +{{< /playground >}} ### Example 2: Minimum elements for each key We use `Combine.PerKey()` to get the minimum element for each unique key in a `PCollection` of key-values. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/min.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/min.py" min_per_key >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/min_test.py" elements_with_min_value_per_key >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_MinPerKey" show="min_per_key" >}} +{{< /playground >}} ## Related transforms diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/sample.md b/website/www/site/content/en/documentation/transforms/python/aggregation/sample.md index bd822ea89d4e..ac1cece481ef 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/sample.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/sample.md @@ -34,33 +34,17 @@ Then, we get a random sample of elements in different ways. We use `Sample.FixedSizeGlobally()` to get a fixed-size random sample of elements from the *entire* `PCollection`. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/sample.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/sample.py" sample_fixed_size_globally >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/sample_test.py" sample >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_SampleFixedSizeGlobally" show="sample_fixed_size_globally" >}} +{{< /playground >}} ### Example 2: Sample elements for each key We use `Sample.FixedSizePerKey()` to get fixed-size random samples for each unique key in a `PCollection` of key-values. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/sample.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/sample.py" sample_fixed_size_per_key >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/sample_test.py" samples_per_key >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_SampleFixedSizePerKey" show="sample_fixed_size_per_key" >}} +{{< /playground >}} ## Related transforms diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/sum.md b/website/www/site/content/en/documentation/transforms/python/aggregation/sum.md index 9ceda5cbb084..44f8cadfa964 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/sum.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/sum.md @@ -32,33 +32,17 @@ Then, we get the sum of all the element values in different ways. We use `Combine.Globally()` to get sum of all the element values from the *entire* `PCollection`. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/sum.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/sum.py" sum_globally >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/sum_test.py" total >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_SumGlobally" show="sum_globally" >}} +{{< /playground >}} ### Example 2: Sum of the elements for each key We use `Combine.PerKey()` to get the sum of all the element values for each unique key in a `PCollection` of key-values. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/sum.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/sum.py" sum_per_key >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/sum_test.py" totals_per_key >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_SumPerKey" show="sum_per_ke" >}} +{{< /playground >}} ## Related transforms diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/top.md b/website/www/site/content/en/documentation/transforms/python/aggregation/top.md index 8c93499d049b..06a6107706af 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/top.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/top.md @@ -34,65 +34,33 @@ Then, we get the largest or smallest elements in different ways. We use `Top.Largest()` to get the largest elements from the *entire* `PCollection`. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py" top_largest >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/top_test.py" largest_elements >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_TopLargest" show="top_largest" >}} +{{< /playground >}} ### Example 2: Largest elements for each key We use `Top.LargestPerKey()` to get the largest elements for each unique key in a `PCollection` of key-values. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py" top_largest_per_key >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/top_test.py" largest_elements_per_key >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_TopLargestPerKey" show="top_largest_per_key" >}} +{{< /playground >}} ### Example 3: Smallest elements from a PCollection We use `Top.Smallest()` to get the smallest elements from the *entire* `PCollection`. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py" top_smallest >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/top_test.py" smallest_elements >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_TopSmallest" show="top_smallest" >}} +{{< /playground >}} ### Example 4: Smallest elements for each key We use `Top.SmallestPerKey()` to get the smallest elements for each unique key in a `PCollection` of key-values. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py" top_smallest_per_key >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/top_test.py" smallest_elements_per_key >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_TopSmallestPerKey" show="top_smallest_per_key" >}} +{{< /playground >}} ### Example 5: Custom elements from a PCollection @@ -101,17 +69,9 @@ We use `Top.Of()` to get elements with customized rules from the *entire* `PColl You can change how the elements are compared with `key`. By default you get the largest elements, but you can get the smallest by setting `reverse=True`. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py" top_of >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/top_test.py" shortest_elements >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_TopOf" show="top_of" >}} +{{< /playground >}} ### Example 6: Custom elements for each key @@ -120,17 +80,9 @@ We use `Top.PerKey()` to get elements with customized rules for each unique key You can change how the elements are compared with `key`. By default you get the largest elements, but you can get the smallest by setting `reverse=True`. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py" top_per_key >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/top_test.py" shortest_elements_per_key >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_TopPerKey" show="top_per_key" >}} +{{< /playground >}} ## Related transforms diff --git a/website/www/site/content/en/documentation/transforms/python/elementwise/filter.md b/website/www/site/content/en/documentation/transforms/python/elementwise/filter.md index 3b1b46e35239..c2c2d56f9743 100644 --- a/website/www/site/content/en/documentation/transforms/python/elementwise/filter.md +++ b/website/www/site/content/en/documentation/transforms/python/elementwise/filter.md @@ -36,34 +36,17 @@ Then, we apply `Filter` in multiple ways to filter out produce by their duration We define a function `is_perennial` which returns `True` if the element's duration equals `'perennial'`, and `False` otherwise. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py" notebook="examples/notebooks/documentation/transforms/python/elementwise/filter" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py" filter_function >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter_test.py" perennials >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_FilterFunction" show="filter_function" >}} +{{< /playground >}} ### Example 2: Filtering with a lambda function We can also use lambda functions to simplify **Example 1**. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/filter" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py" filter_lambda >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter_test.py" perennials >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_FilterLambda" show="filter_lambda" >}} +{{< /playground >}} ### Example 3: Filtering with multiple arguments @@ -72,18 +55,9 @@ They are passed as additional positional arguments or keyword arguments to the f In this example, `has_duration` takes `plant` and `duration` as arguments. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/filter" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py" filter_multiple_arguments >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter_test.py" perennials >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_FilterMultipleArguments" show="filter_multiple_arguments" >}} +{{< /playground >}} ### Example 4: Filtering with side inputs as singletons @@ -93,18 +67,9 @@ passing the `PCollection` as a *singleton* accesses that value. In this example, we pass a `PCollection` the value `'perennial'` as a singleton. We then use that value to filter out perennials. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/filter" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py" filter_side_inputs_singleton >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter_test.py" perennials >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_FilterSideInputsSingleton" show="filter_side_inputs_singleton" >}} +{{< /playground >}} ### Example 5: Filtering with side inputs as iterators @@ -112,18 +77,9 @@ If the `PCollection` has multiple values, pass the `PCollection` as an *iterator This accesses elements lazily as they are needed, so it is possible to iterate over large `PCollection`s that won't fit into memory. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/filter" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py" filter_side_inputs_iter >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter_test.py" valid_plants >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_FilterSideInputsIter" show="filter_side_inputs_iter" >}} +{{< /playground >}} > **Note**: You can pass the `PCollection` as a *list* with `beam.pvalue.AsList(pcollection)`, > but this requires that all the elements fit into memory. @@ -135,18 +91,9 @@ Each element must be a `(key, value)` pair. Note that all the elements of the `PCollection` must fit into memory for this. If the `PCollection` won't fit into memory, use `beam.pvalue.AsIter(pcollection)` instead. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/filter" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py" filter_side_inputs_dict >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter_test.py" perennials >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_FilterSideInputsDict" show="filter_side_inputs_dict" >}} +{{< /playground >}} ## Related transforms diff --git a/website/www/site/content/en/documentation/transforms/python/elementwise/flatmap.md b/website/www/site/content/en/documentation/transforms/python/elementwise/flatmap.md index 15648b986e2f..0a4f5e7fae07 100644 --- a/website/www/site/content/en/documentation/transforms/python/elementwise/flatmap.md +++ b/website/www/site/content/en/documentation/transforms/python/elementwise/flatmap.md @@ -37,35 +37,17 @@ where each of the output `iterable`'s elements is an element of the resulting `P We use the function `str.split` which takes a single `str` element and outputs a `list` of `str`s. This pipeline splits the input element using whitespaces, creating a list of zero or more elements. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/flatmap" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" flatmap_simple >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap_test.py" plants >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_FlatMapSimple" show="flatmap_simple" >}} +{{< /playground >}} ### Example 2: FlatMap with a function We define a function `split_words` which splits an input `str` element using the delimiter `','` and outputs a `list` of `str`s. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/flatmap" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" flatmap_function >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap_test.py" plants >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_FlatMapFunction" show="flatmap_function" >}} +{{< /playground >}} ### Example 3: FlatMap with a lambda function @@ -73,18 +55,9 @@ For this example, we want to flatten a `PCollection` of lists of `str`s into a ` Each input element is already an `iterable`, where each element is what we want in the resulting `PCollection`. We use a lambda function that returns the same input element it received. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/flatmap" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" flatmap_lambda >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap_test.py" plants >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_FlatMapLambda" show="flatmap_lambda" >}} +{{< /playground >}} ### Example 4: FlatMap with a generator @@ -92,36 +65,18 @@ For this example, we want to flatten a `PCollection` of lists of `str`s into a ` We use a generator to iterate over the input list and yield each of the elements. Each yielded result in the generator is an element in the resulting `PCollection`. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/flatmap" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" flatmap_generator >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap_test.py" plants >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_FlatMapGenerator" show="flatmap_generator" >}} +{{< /playground >}} ### Example 5: FlatMapTuple for key-value pairs If your `PCollection` consists of `(key, value)` pairs, you can use `FlatMapTuple` to unpack them into different function arguments. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/flatmap" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" flatmap_tuple >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap_test.py" plants >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_FlatMapTuple" show="flatmap_tuple" >}} +{{< /playground >}} ### Example 6: FlatMap with multiple arguments @@ -130,18 +85,9 @@ They are passed as additional positional arguments or keyword arguments to the f In this example, `split_words` takes `text` and `delimiter` as arguments. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/flatmap" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" flatmap_multiple_arguments >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap_test.py" plants >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_FlatMapMultipleArguments" show="flatmap_multiple_arguments" >}} +{{< /playground >}} ### Example 7: FlatMap with side inputs as singletons @@ -151,18 +97,9 @@ passing the `PCollection` as a *singleton* accesses that value. In this example, we pass a `PCollection` the value `','` as a singleton. We then use that value as the delimiter for the `str.split` method. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/flatmap" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" flatmap_side_inputs_singleton >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap_test.py" plants >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_FlatMapSideInputSingleton" show="flatmap_side_inputs_singleton" >}} +{{< /playground >}} ### Example 8: FlatMap with side inputs as iterators @@ -170,18 +107,9 @@ If the `PCollection` has multiple values, pass the `PCollection` as an *iterator This accesses elements lazily as they are needed, so it is possible to iterate over large `PCollection`s that won't fit into memory. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/flatmap" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" flatmap_side_inputs_iter >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap_test.py" valid_plants >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_FlatMapSideInputsIter" show="flatmap_side_inputs_iter" >}} +{{< /playground >}} > **Note**: You can pass the `PCollection` as a *list* with `beam.pvalue.AsList(pcollection)`, > but this requires that all the elements fit into memory. @@ -193,18 +121,9 @@ Each element must be a `(key, value)` pair. Note that all the elements of the `PCollection` must fit into memory for this. If the `PCollection` won't fit into memory, use `beam.pvalue.AsIter(pcollection)` instead. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/flatmap" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" flatmap_side_inputs_dict >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap_test.py" valid_plants >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_FlatMapSideInputsDict" show="flatmap_side_inputs_dict" >}} +{{< /playground >}} ## Related transforms diff --git a/website/www/site/content/en/documentation/transforms/python/elementwise/keys.md b/website/www/site/content/en/documentation/transforms/python/elementwise/keys.md index d30717d3e814..91d888dcb00f 100644 --- a/website/www/site/content/en/documentation/transforms/python/elementwise/keys.md +++ b/website/www/site/content/en/documentation/transforms/python/elementwise/keys.md @@ -28,18 +28,9 @@ Takes a collection of key-value pairs and returns the key of each element. In the following example, we create a pipeline with a `PCollection` of key-value pairs. Then, we apply `Keys` to extract the keys and discard the values. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/keys.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/keys" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/keys.py" keys >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/keys_test.py" icons >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_Keys" show="keys" >}} +{{< /playground >}} ## Related transforms diff --git a/website/www/site/content/en/documentation/transforms/python/elementwise/kvswap.md b/website/www/site/content/en/documentation/transforms/python/elementwise/kvswap.md index 3c3a25518c82..62f374846925 100644 --- a/website/www/site/content/en/documentation/transforms/python/elementwise/kvswap.md +++ b/website/www/site/content/en/documentation/transforms/python/elementwise/kvswap.md @@ -29,18 +29,9 @@ which has each key and value swapped. In the following example, we create a pipeline with a `PCollection` of key-value pairs. Then, we apply `KvSwap` to swap the keys and values. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/kvswap.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/kvswap" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/kvswap.py" kvswap >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/kvswap_test.py" plants >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_KvSwap" show="kvswap" >}} +{{< /playground >}} ## Related transforms diff --git a/website/www/site/content/en/documentation/transforms/python/elementwise/map.md b/website/www/site/content/en/documentation/transforms/python/elementwise/map.md index d31bbabea2e2..68948ba49fbd 100644 --- a/website/www/site/content/en/documentation/transforms/python/elementwise/map.md +++ b/website/www/site/content/en/documentation/transforms/python/elementwise/map.md @@ -35,52 +35,25 @@ Then, we apply `Map` in multiple ways to transform every element in the `PCollec We use the function `str.strip` which takes a single `str` element and outputs a `str`. It strips the input element's whitespaces, including newlines and tabs. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/map" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" map_simple >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map_test.py" plants >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_MapSimple" show="map_simple" >}} +{{< /playground >}} ### Example 2: Map with a function We define a function `strip_header_and_newline` which strips any `'#'`, `' '`, and `'\n'` characters from each element. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/map" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" map_function >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map_test.py" plants >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_MapFunction" show="map_function" >}} +{{< /playground >}} ### Example 3: Map with a lambda function We can also use lambda functions to simplify **Example 2**. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/map" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" map_lambda >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map_test.py" plants >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_MapLambda" show="map_lambda" >}} +{{< /playground >}} ### Example 4: Map with multiple arguments @@ -89,36 +62,18 @@ They are passed as additional positional arguments or keyword arguments to the f In this example, `strip` takes `text` and `chars` as arguments. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/map" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" map_multiple_arguments >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map_test.py" plants >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_MapMultipleArguments" show="map_multiple_arguments" >}} +{{< /playground >}} ### Example 5: MapTuple for key-value pairs If your `PCollection` consists of `(key, value)` pairs, you can use `MapTuple` to unpack them into different function arguments. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/map" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" map_tuple >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map_test.py" plants >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_MapTuple" show="map_tuple" >}} +{{< /playground >}} ### Example 6: Map with side inputs as singletons @@ -128,18 +83,9 @@ passing the `PCollection` as a *singleton* accesses that value. In this example, we pass a `PCollection` the value `'# \n'` as a singleton. We then use that value as the characters for the `str.strip` method. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/map" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" map_side_inputs_singleton >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map_test.py" plants >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_MapSideInputsSingleton" show="map_side_inputs_singleton" >}} +{{< /playground >}} ### Example 7: Map with side inputs as iterators @@ -147,18 +93,9 @@ If the `PCollection` has multiple values, pass the `PCollection` as an *iterator This accesses elements lazily as they are needed, so it is possible to iterate over large `PCollection`s that won't fit into memory. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/map" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" map_side_inputs_iter >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map_test.py" plants >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_MapSideInputsIter" show="map_side_inputs_iter" >}} +{{< /playground >}} > **Note**: You can pass the `PCollection` as a *list* with `beam.pvalue.AsList(pcollection)`, > but this requires that all the elements fit into memory. @@ -170,18 +107,9 @@ Each element must be a `(key, value)` pair. Note that all the elements of the `PCollection` must fit into memory for this. If the `PCollection` won't fit into memory, use `beam.pvalue.AsIter(pcollection)` instead. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/map" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" map_side_inputs_dict >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map_test.py" plant_details >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_MapSideInputsDict" show="map_side_inputs_dict" >}} +{{< /playground >}} ## Related transforms diff --git a/website/www/site/content/en/documentation/transforms/python/elementwise/pardo.md b/website/www/site/content/en/documentation/transforms/python/elementwise/pardo.md index 9c54a83dd24e..9cb31207e88d 100644 --- a/website/www/site/content/en/documentation/transforms/python/elementwise/pardo.md +++ b/website/www/site/content/en/documentation/transforms/python/elementwise/pardo.md @@ -41,18 +41,9 @@ which stores the `delimiter` as an object field. The `process` method is called once per element, and it can yield zero or more output elements. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/pardo.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/pardo" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/pardo.py" pardo_dofn >}} -{{}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/pardo_test.py" plants >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_ParDoDoFn" show="pardo_dofn" >}} +{{< /playground >}} ### Example 2: ParDo with timestamp and window information @@ -67,18 +58,9 @@ In this example, we add new parameters to the `process` method to bind parameter [`apache_beam.transforms.window.*Window`](https://beam.apache.org/releases/pydoc/current/apache_beam.transforms.window.html) object. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/pardo.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/pardo" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/pardo.py" pardo_dofn_params >}} -{{}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/pardo_test.py" dofn_params >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_ParDoDoFnParams" show="pardo_dofn_params" >}} +{{< /playground >}} ### Example 3: ParDo with DoFn methods @@ -126,18 +108,9 @@ starts and finishes with `start_bundle` and `finish_bundle`. Note that `teardown` is called as a *best effort* and is *not guaranteed*. For example, if the worker crashes, `teardown` might not be called. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/pardo.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/pardo" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/pardo.py" pardo_dofn_methods >}} -{{}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/pardo_test.py" results >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_ParDoDoFnMethods" show="pardo_dofn_methods" >}} +{{< /playground >}} > *Known issues:* > diff --git a/website/www/site/content/en/documentation/transforms/python/elementwise/partition.md b/website/www/site/content/en/documentation/transforms/python/elementwise/partition.md index fbfe8a99ac52..9a7b27cf383f 100644 --- a/website/www/site/content/en/documentation/transforms/python/elementwise/partition.md +++ b/website/www/site/content/en/documentation/transforms/python/elementwise/partition.md @@ -46,35 +46,17 @@ and it must return an integer in the range `0` to `num_partitions-1`. In the following example, we have a known list of durations. We partition the `PCollection` into one `PCollection` for every duration type. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/partition.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/partition" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/partition.py" partition_function >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/partition_test.py" partitions >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_PartitionFunction" show="partition_function" >}} +{{< /playground >}} ### Example 2: Partition with a lambda function We can also use lambda functions to simplify **Example 1**. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/partition.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/partition" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/partition.py" partition_lambda >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/partition_test.py" partitions >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_PartitionLambda" show="partition_lambda" >}} +{{< /playground >}} ### Example 3: Partition with multiple arguments @@ -108,18 +90,9 @@ identify the partition index to which that bucket corresponds. This `split_dataset` function is generic enough to support any number of partitions by any ratio. You might want to adapt the bucket assignment to use a more appropriate or randomized hash for your dataset. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/partition.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/partition" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/partition.py" partition_multiple_arguments >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/partition_test.py" train_test >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_PartitionMultipleArguments" show="partition_multiple_arguments" >}} +{{< /playground >}} ## Related transforms diff --git a/website/www/site/content/en/documentation/transforms/python/elementwise/regex.md b/website/www/site/content/en/documentation/transforms/python/elementwise/regex.md index 6947fd18252a..339492d9180a 100644 --- a/website/www/site/content/en/documentation/transforms/python/elementwise/regex.md +++ b/website/www/site/content/en/documentation/transforms/python/elementwise/regex.md @@ -61,18 +61,9 @@ To match until the end of the string, add `'$'` at the end of the regular expres To start matching at any point instead of the beginning of the string, use [`Regex.find(regex)`](#example-4-regex-find). -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/regex" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" regex_matches >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex_test.py" plants_matches >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_RegexMatches" show="regex_matches" >}} +{{< /playground >}} ### Example 2: Regex match with all groups @@ -87,18 +78,9 @@ To match until the end of the string, add `'$'` at the end of the regular expres To start matching at any point instead of the beginning of the string, use [`Regex.find_all(regex, group=Regex.ALL, outputEmpty=False)`](#example-5-regex-find-all). -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/regex" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" regex_all_matches >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex_test.py" plants_all_matches >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_RegexAllMatches" show="regex_all_matches" >}} +{{< /playground >}} ### Example 3: Regex match into key-value pairs @@ -114,18 +96,9 @@ To match until the end of the string, add `'$'` at the end of the regular expres To start matching at any point instead of the beginning of the string, use [`Regex.find_kv(regex, keyGroup)`](#example-6-regex-find-as-key-value-pairs). -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/regex" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" regex_matches_kv >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex_test.py" plants_matches_kv >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_RegexMatchesKV" show="regex_matches_kv" >}} +{{< /playground >}} ### Example 4: Regex find @@ -141,18 +114,9 @@ To match until the end of the string, add `'$'` at the end of the regular expres If you need to match from the start only, consider using [`Regex.matches(regex)`](#example-1-regex-match). -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/regex" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" regex_find >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex_test.py" plants_matches >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_RegexFind" show="regex_find" >}} +{{< /playground >}} ### Example 5: Regex find all @@ -168,18 +132,9 @@ To match until the end of the string, add `'$'` at the end of the regular expres If you need to match all groups from the start only, consider using [`Regex.all_matches(regex)`](#example-2-regex-match-with-all-groups). -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/regex" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" regex_find_all >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex_test.py" plants_find_all >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_RegexFindAll" show="regex_find_all" >}} +{{< /playground >}} ### Example 6: Regex find as key-value pairs @@ -196,18 +151,9 @@ To match until the end of the string, add `'$'` at the end of the regular expres If you need to match as key-value pairs from the start only, consider using [`Regex.matches_kv(regex)`](#example-3-regex-match-into-key-value-pairs). -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/regex" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" regex_find_kv >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex_test.py" plants_find_kv >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_RegexFindKV" show="regex_find_kv" >}} +{{< /playground >}} ### Example 7: Regex replace all @@ -216,18 +162,9 @@ You can also use [backreferences](https://docs.python.org/3/library/re.html?highlight=backreference#re.sub) on the `replacement`. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/regex" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" regex_replace_all >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex_test.py" plants_replace_all >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_RegexReplaceAll" show="regex_replace_all" >}} +{{< /playground >}} ### Example 8: Regex replace first @@ -236,36 +173,18 @@ You can also use [backreferences](https://docs.python.org/3/library/re.html?highlight=backreference#re.sub) on the `replacement`. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/regex" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" regex_replace_first >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex_test.py" plants_replace_first >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_RegexReplaceFirst" show="regex_replace_first" >}} +{{< /playground >}} ### Example 9: Regex split `Regex.split` returns the list of strings that were delimited by the specified regular expression. The argument `outputEmpty` is set to `False` by default, but can be set to `True` to keep empty items in the output list. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/regex" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" regex_split >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex_test.py" plants_split >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_RegexSplit" show="regex_split" >}} +{{< /playground >}} ## Related transforms diff --git a/website/www/site/content/en/documentation/transforms/python/elementwise/runinference-sklearn.md b/website/www/site/content/en/documentation/transforms/python/elementwise/runinference-sklearn.md index 5e3fad1cf419..af0ce9bd9314 100644 --- a/website/www/site/content/en/documentation/transforms/python/elementwise/runinference-sklearn.md +++ b/website/www/site/content/en/documentation/transforms/python/elementwise/runinference-sklearn.md @@ -33,9 +33,9 @@ The following examples demonstrate how to to create pipelines that use the Beam In this example, we create a pipeline that uses an SKlearn RunInference transform on unkeyed data. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/runinference.py" +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/runinference_sklearn_unkeyed_model_handler.py" class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/runinference.py" sklearn_unkeyed_model_handler >}} +{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/runinference_sklearn_unkeyed_model_handler.py" sklearn_unkeyed_model_handler >}} {{}} {{< paragraph class="notebook-skip" >}} @@ -50,9 +50,9 @@ Output: In this example, we create a pipeline that uses an SKlearn RunInference transform on keyed data. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/runinference.py" +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/runinference_sklearn_keyed_model_handler.py" class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/runinference.py" sklearn_keyed_model_handler >}} +{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/runinference_sklearn_keyed_model_handler.py" sklearn_keyed_model_handler >}} {{}} {{< paragraph class="notebook-skip" >}} diff --git a/website/www/site/content/en/documentation/transforms/python/elementwise/runinference.md b/website/www/site/content/en/documentation/transforms/python/elementwise/runinference.md index 39db1aa68d3e..369b74714424 100644 --- a/website/www/site/content/en/documentation/transforms/python/elementwise/runinference.md +++ b/website/www/site/content/en/documentation/transforms/python/elementwise/runinference.md @@ -29,11 +29,9 @@ limitations under the License. -Uses models to do local and remote inference. A `RunInference` transform performs inference on a `PCollection` of examples using a machine learning (ML) model. The transform outputs a `PCollection` that contains the input examples and output predictions. +Uses models to do local and remote inference. A `RunInference` transform performs inference on a `PCollection` of examples using a machine learning (ML) model. The transform outputs a `PCollection` that contains the input examples and output predictions. Avaliable in Apache Beam 2.40.0 and later versions. -You must have Apache Beam 2.40.0 or later installed to run these pipelines. - -See more [RunInference API pipeline examples](https://github.com/apache/beam/tree/master/sdks/python/apache_beam/examples/inference). +For more information, read about Beam RunInference APIs on [Machine Learning with Python](https://beam.apache.org/documentation/sdks/python-machine-learning) page and explore [RunInference API pipeline examples](https://github.com/apache/beam/tree/master/sdks/python/apache_beam/examples/inference). ## Examples diff --git a/website/www/site/content/en/documentation/transforms/python/elementwise/tostring.md b/website/www/site/content/en/documentation/transforms/python/elementwise/tostring.md index 4b3d79acada0..0e25516a31ec 100644 --- a/website/www/site/content/en/documentation/transforms/python/elementwise/tostring.md +++ b/website/www/site/content/en/documentation/transforms/python/elementwise/tostring.md @@ -35,36 +35,18 @@ expect their input elements to be strings. The following example converts a `(key, value)` pair into a string delimited by `','`. You can specify a different delimiter using the `delimiter` argument. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/tostring.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/tostring" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/tostring.py" tostring_kvs >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/tostring_test.py" plants >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_ToStringKvs" show="tostring_kvs" >}} +{{< /playground >}} ### Example 2: Elements to string The following example converts a dictionary into a string. The string output will be equivalent to `str(element)`. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/tostring.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/tostring" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/tostring.py" tostring_element >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/tostring_test.py" plant_lists >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_ToStringElement" show="tostring_element" >}} +{{< /playground >}} ### Example 3: Iterables to string @@ -73,18 +55,9 @@ into a string delimited by `','`. You can specify a different delimiter using the `delimiter` argument. The string output will be equivalent to `iterable.join(delimiter)`. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/tostring.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/tostring" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/tostring.py" tostring_iterables >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/tostring_test.py" plants_csv >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_ToStringIterables" show="tostring_iterables" >}} +{{< /playground >}} ## Related transforms diff --git a/website/www/site/content/en/documentation/transforms/python/elementwise/values.md b/website/www/site/content/en/documentation/transforms/python/elementwise/values.md index 63e324c10eb4..8c62f002bb01 100644 --- a/website/www/site/content/en/documentation/transforms/python/elementwise/values.md +++ b/website/www/site/content/en/documentation/transforms/python/elementwise/values.md @@ -28,18 +28,9 @@ Takes a collection of key-value pairs, and returns the value of each element. In the following example, we create a pipeline with a `PCollection` of key-value pairs. Then, we apply `Values` to extract the values and discard the keys. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/values.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/values" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/values.py" values >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/values_test.py" plants >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_Values" show="values" >}} +{{< /playground >}} ## Related transforms diff --git a/website/www/site/content/en/documentation/transforms/python/elementwise/withtimestamps.md b/website/www/site/content/en/documentation/transforms/python/elementwise/withtimestamps.md index 51c9c64abc23..c8e0782efcac 100644 --- a/website/www/site/content/en/documentation/transforms/python/elementwise/withtimestamps.md +++ b/website/www/site/content/en/documentation/transforms/python/elementwise/withtimestamps.md @@ -33,18 +33,9 @@ The elements themselves often already contain a timestamp field. [Unix timestamp](https://en.wikipedia.org/wiki/Unix_time) in the form of seconds. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/withtimestamps.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/withtimestamps" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/withtimestamps.py" withtimestamps_event_time >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/withtimestamps_test.py" plant_timestamps >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_WithTimestampsEventTime" show="withtimestamps_event_time" >}} +{{< /playground >}} To convert from a [`time.struct_time`](https://docs.python.org/3/library/time.html#time.struct_time) @@ -72,18 +63,9 @@ If each element has a chronological number, these numbers can be used as a [logical clock](https://en.wikipedia.org/wiki/Logical_clock). These numbers have to be converted to a *"seconds"* equivalent, which can be especially important depending on your windowing and late data rules. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/withtimestamps.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/withtimestamps" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/withtimestamps.py" withtimestamps_logical_clock >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/withtimestamps_test.py" plant_events >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_WithTimestampsLogicalClock" show="withtimestamps_logical_clock" >}} +{{< /playground >}} ### Example 3: Timestamp by processing time @@ -93,18 +75,9 @@ Workers might have time deltas, so using this method is not a reliable way to do By using processing time, there is no way of knowing if data is arriving late because the timestamp is attached when the element *enters* into the pipeline. -{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/withtimestamps.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/withtimestamps" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/withtimestamps.py" withtimestamps_processing_time >}} -{{< /highlight >}} - -{{< paragraph class="notebook-skip" >}} -Output: -{{< /paragraph >}} - -{{< highlight class="notebook-skip" >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/withtimestamps_test.py" plant_processing_times >}} -{{< /highlight >}} +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_WithTimestampsProcessingTime" show="withtimestamps_processing_time" >}} +{{< /playground >}} ## Related transforms diff --git a/website/www/site/content/en/documentation/transforms/python/other/create.md b/website/www/site/content/en/documentation/transforms/python/other/create.md index 0ad28d022dc4..5b17c06d96e0 100644 --- a/website/www/site/content/en/documentation/transforms/python/other/create.md +++ b/website/www/site/content/en/documentation/transforms/python/other/create.md @@ -32,6 +32,9 @@ in parallel. For example, a single element to execute a one-time `ParDo` or a list of filenames to be read. ## Examples -See [Issue 19498](https://github.com/apache/beam/issues/19498) for updates. + +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_Create" show="create" >}} +{{< /playground >}} ## Related transforms diff --git a/website/www/site/content/en/documentation/transforms/python/other/flatten.md b/website/www/site/content/en/documentation/transforms/python/other/flatten.md index d76b5b817ec9..d5c6f354c8b1 100644 --- a/website/www/site/content/en/documentation/transforms/python/other/flatten.md +++ b/website/www/site/content/en/documentation/transforms/python/other/flatten.md @@ -35,7 +35,10 @@ that store the same data type. See more information in the [Beam Programming Guide](/documentation/programming-guide/#flatten). ## Examples -See [Issue 19498](https://github.com/apache/beam/issues/19498) for updates. + +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_Flatten" show="flatten" >}} +{{< /playground >}} ## Related transforms * [FlatMap](/documentation/transforms/python/elementwise/flatmap) applies a simple 1-to-many mapping diff --git a/website/www/site/content/en/documentation/transforms/python/other/windowinto.md b/website/www/site/content/en/documentation/transforms/python/other/windowinto.md index 121d5e4551ae..46a116c0a8ea 100644 --- a/website/www/site/content/en/documentation/transforms/python/other/windowinto.md +++ b/website/www/site/content/en/documentation/transforms/python/other/windowinto.md @@ -30,7 +30,10 @@ Logically divides up or groups the elements of a collection into finite windows according to a function. ## Examples -See [Issue 19498](https://github.com/apache/beam/issues/19498) for updates. + +{{< playground height="700px" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_Window" show="window" >}} +{{< /playground >}} ## Related transforms * [GroupByKey](/documentation/transforms/python/aggregation/groupbykey) diff --git a/website/www/site/content/en/get-started/_index.md b/website/www/site/content/en/get-started/_index.md index 21d6886672a7..c436129b066a 100644 --- a/website/www/site/content/en/get-started/_index.md +++ b/website/www/site/content/en/get-started/_index.md @@ -23,18 +23,24 @@ limitations under the License. Learn to use Beam to create data processing pipelines that run on supported processing back-ends: +## [Tour of Beam](https://tour.beam.apache.org) + +Learn Beam with an interactive tour with learning topics covering core Beam concepts +from simple ones to more advanced ones. +You can try examples, do exercises, and solve challenges along the learning journey. + ## [Beam Overview](/get-started/beam-overview) Learn about the Beam model, the currently available Beam SDKs and Runners, and Beam's native I/O connectors. -## Quickstarts for Java, Python, Go, and Typescript +## Quickstarts for Java, Python, Go, and TypeScript Learn how to set up a Beam project and run a simple example Beam pipeline on your local machine. * [Java quickstart](/get-started/quickstart-java) * [Python quickstart](/get-started/quickstart-py) * [Go quickstart](/get-started/quickstart-go) -* [Typescript quickstart](/get-started/quickstart/typescript) +* [TypeScript quickstart](/get-started/quickstart/typescript) ## Example Walkthroughs diff --git a/website/www/site/content/en/get-started/an-interactive-overview-of-beam.md b/website/www/site/content/en/get-started/an-interactive-overview-of-beam.md new file mode 100644 index 000000000000..af56d31a61d6 --- /dev/null +++ b/website/www/site/content/en/get-started/an-interactive-overview-of-beam.md @@ -0,0 +1,96 @@ +--- +title: "An Interactive Overview of Beam" +--- + + + +# An Interactive Overview of Beam + +Here you can find a collection of the interactive notebooks available for Apache Beam, which are hosted in +[Colab](https://colab.research.google.com). +The notebooks allow you to interactively play with the code and see how your changes affect the pipeline. +You don't need to install anything or modify your computer in any way to use these notebooks. + +You can also [try an Apache Beam pipeline](/get-started/try-apache-beam) using the Java, Python, and Go SDKs. + +## Get started + +### Learn the basics + +In this notebook we go through the basics of what is Apache Beam and how to get started. +We learn what is a data pipeline, a PCollection, a PTransform, as well as some basic transforms like `Map`, `FlatMap`, `Filter`, `Combine`, and `GroupByKey`. + +{{< button-colab url="https://colab.research.google.com/github/apache/beam/blob/master/examples/notebooks/interactive-overview/getting-started.ipynb" >}} + +### Reading and writing data + +In this notebook we go through some examples on how to read and write data to and from different data formats. +We introduce the built-in `ReadFromText` and `WriteToText` transforms. +We also see how we can read from CSV files, read from a SQLite database, write fixed-sized batches of elements, and write windows of elements. + +{{< button-colab url="https://colab.research.google.com/github/apache/beam/blob/master/examples/notebooks/interactive-overview/reading-and-writing-data.ipynb" >}} + +### Windowing + +In this notebook we go through how to aggregate data based on time intervals, or in streaming pipelines. +We introduce the `GlobalWindow`, `FixedWindows`, `SlidingWindows`, and `Sessions`. + +{{< button-colab url="https://colab.research.google.com/github/apache/beam/blob/master/examples/notebooks/interactive-overview/windowing.ipynb" >}} + +### DataFrames + +Beam DataFrames provide a pandas-like [DataFrame](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html) +API to declare Beam pipelines. +To learn more about Beam DataFrames, take a look at the +[Beam DataFrames overview](/documentation/dsls/dataframes/overview) page. + +{{< button-colab url="https://colab.research.google.com/github/apache/beam/blob/master/examples/notebooks/interactive-overview/dataframes.ipynb" >}} + +## Transforms + +Check the [Python transform catalog](/documentation/transforms/python/overview/) +for a complete list of the available transforms. + +### Element-wise transforms + +#### Map + +Applies a simple one-to-one mapping function over each element in the collection. + +{{< button-colab url="https://colab.research.google.com/github/apache/beam/blob/master/examples/notebooks/documentation/transforms/python/elementwise/map-py.ipynb" >}} + +#### FlatMap + +Applies a simple one-to-many mapping function over each element in the collection. The many elements are flattened into the resulting collection. + +{{< button-colab url="https://colab.research.google.com/github/apache/beam/blob/master/examples/notebooks/documentation/transforms/python/elementwise/flatmap-py.ipynb" >}} + +#### Filter + +Given a predicate, filter out all elements that don’t satisfy that predicate. + +{{< button-colab url="https://colab.research.google.com/github/apache/beam/blob/master/examples/notebooks/documentation/transforms/python/elementwise/filter-py.ipynb" >}} + +#### Partition + +Separates elements in a collection into multiple output collections. + +{{< button-colab url="https://colab.research.google.com/github/apache/beam/blob/master/examples/notebooks/documentation/transforms/python/elementwise/partition-py.ipynb" >}} + +#### ParDo + +A transform for generic parallel processing. It's recommended to use `Map`, `FlatMap`, `Filter` or other more specific transforms when possible. + +{{< button-colab url="https://colab.research.google.com/github/apache/beam/blob/master/examples/notebooks/documentation/transforms/python/elementwise/pardo-py.ipynb" >}} diff --git a/website/www/site/content/en/get-started/beam-overview.md b/website/www/site/content/en/get-started/beam-overview.md index 517a294b9118..c4f3eba48a1a 100644 --- a/website/www/site/content/en/get-started/beam-overview.md +++ b/website/www/site/content/en/get-started/beam-overview.md @@ -66,7 +66,7 @@ Get started using Beam for your data processing tasks. > If you already know [Apache Spark](https://spark.apache.org/), > check our [Getting started from Apache Spark](/get-started/from-spark) page. -1. Take the [Tour of Beam](/get-started/tour-of-beam) as an online interactive learning experience. +1. Take the [Tour of Beam](https://tour.beam.apache.org/) as an online interactive learning experience. 1. Follow the Quickstart for the [Java SDK](/get-started/quickstart-java), the [Python SDK](/get-started/quickstart-py), or the [Go SDK](/get-started/quickstart-go). diff --git a/website/www/site/content/en/get-started/downloads.md b/website/www/site/content/en/get-started/downloads.md index 35acb147f110..a0762fd2ea93 100644 --- a/website/www/site/content/en/get-started/downloads.md +++ b/website/www/site/content/en/get-started/downloads.md @@ -96,10 +96,18 @@ versions denoted `0.x.y`. ## Releases +### 2.49.0 (2023-07-17) +Official [source code download](https://downloads.apache.org/beam/2.49.0/apache-beam-2.49.0-source-release.zip). +[SHA-512](https://downloads.apache.org/beam/2.49.0/apache-beam-2.49.0-source-release.zip.sha512). +[signature](https://downloads.apache.org/beam/2.49.0/apache-beam-2.49.0-source-release.zip.asc). + +[Release notes](https://github.com/apache/beam/releases/tag/v2.49.0) +[Blog post](/blog/beam-2.49.0). + ### 2.48.0 (2023-05-31) -Official [source code download](https://downloads.apache.org/beam/2.48.0/apache-beam-2.48.0-source-release.zip). -[SHA-512](https://downloads.apache.org/beam/2.48.0/apache-beam-2.48.0-source-release.zip.sha512). -[signature](https://downloads.apache.org/beam/2.48.0/apache-beam-2.48.0-source-release.zip.asc). +Official [source code download](https://archive.apache.org/dist/beam/2.48.0/apache-beam-2.48.0-source-release.zip). +[SHA-512](https://archive.apache.org/dist/beam/2.48.0/apache-beam-2.48.0-source-release.zip.sha512). +[signature](https://archive.apache.org/dist/beam/2.48.0/apache-beam-2.48.0-source-release.zip.asc). [Release notes](https://github.com/apache/beam/releases/tag/v2.48.0) [Blog post](/blog/beam-2.48.0). diff --git a/website/www/site/content/en/get-started/quickstart-go.md b/website/www/site/content/en/get-started/quickstart-go.md index c2504205aa6c..bf9a711ed656 100644 --- a/website/www/site/content/en/get-started/quickstart-go.md +++ b/website/www/site/content/en/get-started/quickstart-go.md @@ -25,21 +25,13 @@ If you're interested in contributing to the Apache Beam Go codebase, see the [Co ## Set up your environment -The Beam SDK for Go requires `go` version 1.19 or newer. It can be downloaded [here](https://golang.org/). Check that you have version 1.19 by running: +The Beam SDK for Go requires `go` version 1.19 or newer. It can be downloaded [here](https://golang.org/). Check that you have at least version 1.19 by running: {{< highlight >}} $ go version {{< /highlight >}} -## Get the SDK and the examples - -The easiest way to obtain the Apache Beam Go SDK is via `go get`: - -{{< highlight >}} -$ go get -u github.com/apache/beam/sdks/v2/go/pkg/beam -{{< /highlight >}} - -For development of the Go SDK itself, see [BUILD.md](https://github.com/apache/beam/blob/master/sdks/go/BUILD.md) for details. +If you are unfamiliar with Go, see the [Get Started With Go Tutorial](https://go.dev/doc/tutorial/getting-started). ## Run wordcount @@ -51,22 +43,18 @@ required arguments described in the examples. For example, to run `wordcount`, run: {{< runner direct >}} -$ go install github.com/apache/beam/sdks/v2/go/examples/wordcount -$ wordcount --input --output counts +$ go run github.com/apache/beam/sdks/v2/go/examples/wordcount@latest --input "gs://apache-beam-samples/shakespeare/kinglear.txt" --output counts +$ less counts {{< /runner >}} {{< runner dataflow >}} -$ go install github.com/apache/beam/sdks/v2/go/examples/wordcount -# As part of the initial setup, for non linux users - install package unix before run -$ go get -u golang.org/x/sys/unix -$ wordcount --input gs://dataflow-samples/shakespeare/kinglear.txt \ +$ go run github.com/apache/beam/sdks/v2/go/examples/wordcount@latest --input gs://dataflow-samples/shakespeare/kinglear.txt \ --output gs:///counts \ --runner dataflow \ --project your-gcp-project \ --region your-gcp-region \ --temp_location gs:///tmp/ \ - --staging_location gs:///binaries/ \ - --worker_harness_container_image=apache/beam_go_sdk:latest + --staging_location gs:///binaries/ {{< /runner >}} {{< runner spark >}} @@ -75,8 +63,7 @@ $ wordcount --input gs://dataflow-samples/shakespeare/kinglear.txt \ $ ./gradlew :runners:spark:3:job-server:runShadow -PsparkMasterUrl=spark://localhost:7077 # In a separate terminal, run: -$ go install github.com/apache/beam/sdks/v2/go/examples/wordcount -$ wordcount --input \ +$ go run github.com/apache/beam/sdks/v2/go/examples/wordcount@latest --input \ --output counts \ --runner spark \ --endpoint localhost:8099 @@ -87,6 +74,7 @@ $ wordcount --input \ * Learn more about the [Beam SDK for Go](/documentation/sdks/go/) and look through the [godoc](https://pkg.go.dev/github.com/apache/beam/sdks/v2/go/pkg/beam). * Walk through these WordCount examples in the [WordCount Example Walkthrough](/get-started/wordcount-example). +* Clone the [Beam Go starter project](https://github.com/apache/beam-starter-go). * Take a self-paced tour through our [Learning Resources](/documentation/resources/learning-resources). * Dive in to some of our favorite [Videos and Podcasts](/get-started/resources/videos-and-podcasts). * Join the Beam [users@](/community/contact-us) mailing list. diff --git a/website/www/site/content/en/get-started/quickstart-py.md b/website/www/site/content/en/get-started/quickstart-py.md index bd6fd3eaa0db..9376606b916e 100644 --- a/website/www/site/content/en/get-started/quickstart-py.md +++ b/website/www/site/content/en/get-started/quickstart-py.md @@ -23,7 +23,7 @@ If you're interested in contributing to the Apache Beam Python codebase, see the {{< toc >}} -The Python SDK supports Python 3.7, 3.8, 3.9 and 3.10. Beam 2.38.0 was the last release with support for Python 3.6. +The Python SDK supports Python 3.8, 3.9, 3.10 and 3.11. Beam 2.48.0 was the last release with support for Python 3.7. ## Set up your environment @@ -142,6 +142,7 @@ sequentially in the format `counts-0000-of-0001`. * Learn more about the [Beam SDK for Python](/documentation/sdks/python/) and look through the [Python SDK API reference](https://beam.apache.org/releases/pydoc). +* Get [An Interactive Overview of Beam](/get-started/an-interactive-overview-of-beam) * Walk through these WordCount examples in the [WordCount Example Walkthrough](/get-started/wordcount-example). * Take a self-paced tour through our [Learning Resources](/documentation/resources/learning-resources). * Dive in to some of our favorite [Videos and Podcasts](/get-started/resources/videos-and-podcasts). diff --git a/website/www/site/content/en/get-started/resources/learning-resources.md b/website/www/site/content/en/get-started/resources/learning-resources.md index e435a07b2874..abd4566f4d3c 100644 --- a/website/www/site/content/en/get-started/resources/learning-resources.md +++ b/website/www/site/content/en/get-started/resources/learning-resources.md @@ -80,6 +80,16 @@ If you have additional material that you would like to see here, please let us k * **[Timely and Stateful Processing](/blog/2017/08/28/timely-processing.html)** - An example on how to do batched RPC calls. The call requests are stored in a mutable state as they are received. Once there are either enough requests or a certain time has passed, the batch of requests is triggered to be sent. * **[Running External Libraries](https://cloud.google.com/blog/products/gcp/running-external-libraries-with-cloud-dataflow-for-grid-computing-workloads)** - Call an external library written in a language that does not have a native SDK in Apache Beam such as C++. +## Videos {#videos} + +* **[Getting Started with Apache Beam](https://www.youtube.com/playlist?list=PLIivdWyY5sqIEiHGunZXg_yoS7unlHNJt)** - Five part video series for understanding basic to advanced concepts. +* See more [Videos and Podcasts](/get-started/resources/videos-and-podcasts/) + +## Courses {#courses} + +* **[Beam College](https://beamcollege.dev/)** -- Free live and recorded lessons for learning Beam and data processing. +* **[Serverless Data Processing](https://www.coursera.org/specializations/serverless-data-processing-with-dataflow)** - Course specialized for Dataflow runner. + ## Books {#books} ### Building Big Data Pipelines with Apache Beam @@ -90,6 +100,14 @@ If you have additional material that you would like to see here, please let us k **[Streaming Systems: The What, Where, When, and How of Large-Scale Data Processing](https://learning.oreilly.com/library/view/streaming-systems/9781491983867/)** by Tyler Akidau, Slava Chernyak, Reuven Lax. (August 2018). Expanded from Tyler Akidau’s popular blog posts "Streaming 101" and "Streaming 102", this book takes you from an introductory level to a nuanced understanding of the what, where, when, and how of processing real-time data streams. + +## Certifications {#certifications} + +### Getting Started with Apache Beam Quest + +**[Get Started with Apache Beam](https://www.cloudskillsboost.google/quests/310)** This quest includes four labs that teach you how to write and test Apache Beam pipelines. Three of the labs use Java and one uses Python. Each lab takes about 1.5 hours to complete. When you complete the quest, you're granted a badge that you can use to show your Beam expertise. + + ## Interactive Labs {#interactive-labs} ### Java diff --git a/website/www/site/content/en/get-started/tour-of-beam.md b/website/www/site/content/en/get-started/tour-of-beam.md index 80dcb7eb21de..0deca6be0b91 100644 --- a/website/www/site/content/en/get-started/tour-of-beam.md +++ b/website/www/site/content/en/get-started/tour-of-beam.md @@ -1,5 +1,5 @@ --- -title: "Tour of Beam" +title: "The Tour of Beam" --- -# Tour of Beam +# The Tour of Beam -Here you can find a collection of the interactive notebooks available for Apache Beam, which are hosted in -[Colab](https://colab.research.google.com). -The notebooks allow you to interactively play with the code and see how your changes affect the pipeline. -You don't need to install anything or modify your computer in any way to use these notebooks. - -You can also [try an Apache Beam pipeline](/get-started/try-apache-beam) using the Java, Python, and Go SDKs. - -## Get started - -### Learn the basics - -In this notebook we go through the basics of what is Apache Beam and how to get started. -We learn what is a data pipeline, a PCollection, a PTransform, as well as some basic transforms like `Map`, `FlatMap`, `Filter`, `Combine`, and `GroupByKey`. - -{{< button-colab url="https://colab.research.google.com/github/apache/beam/blob/master/examples/notebooks/tour-of-beam/getting-started.ipynb" >}} - -### Reading and writing data - -In this notebook we go through some examples on how to read and write data to and from different data formats. -We introduce the built-in `ReadFromText` and `WriteToText` transforms. -We also see how we can read from CSV files, read from a SQLite database, write fixed-sized batches of elements, and write windows of elements. - -{{< button-colab url="https://colab.research.google.com/github/apache/beam/blob/master/examples/notebooks/tour-of-beam/reading-and-writing-data.ipynb" >}} - -### Windowing - -In this notebook we go through how to aggregate data based on time intervals, or in streaming pipelines. -We introduce the `GlobalWindow`, `FixedWindows`, `SlidingWindows`, and `Sessions`. - -{{< button-colab url="https://colab.research.google.com/github/apache/beam/blob/master/examples/notebooks/tour-of-beam/windowing.ipynb" >}} - -### DataFrames - -Beam DataFrames provide a pandas-like [DataFrame](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html) -API to declare Beam pipelines. -To learn more about Beam DataFrames, take a look at the -[Beam DataFrames overview](/documentation/dsls/dataframes/overview) page. - -{{< button-colab url="https://colab.research.google.com/github/apache/beam/blob/master/examples/notebooks/tour-of-beam/dataframes.ipynb" >}} - -## Transforms - -Check the [Python transform catalog](/documentation/transforms/python/overview/) -for a complete list of the available transforms. - -### Element-wise transforms - -#### Map - -Applies a simple one-to-one mapping function over each element in the collection. - -{{< button-colab url="https://colab.research.google.com/github/apache/beam/blob/master/examples/notebooks/documentation/transforms/python/elementwise/map-py.ipynb" >}} - -#### FlatMap - -Applies a simple one-to-many mapping function over each element in the collection. The many elements are flattened into the resulting collection. - -{{< button-colab url="https://colab.research.google.com/github/apache/beam/blob/master/examples/notebooks/documentation/transforms/python/elementwise/flatmap-py.ipynb" >}} - -#### Filter - -Given a predicate, filter out all elements that don’t satisfy that predicate. - -{{< button-colab url="https://colab.research.google.com/github/apache/beam/blob/master/examples/notebooks/documentation/transforms/python/elementwise/filter-py.ipynb" >}} - -#### Partition - -Separates elements in a collection into multiple output collections. - -{{< button-colab url="https://colab.research.google.com/github/apache/beam/blob/master/examples/notebooks/documentation/transforms/python/elementwise/partition-py.ipynb" >}} - -#### ParDo - -A transform for generic parallel processing. It's recommended to use `Map`, `FlatMap`, `Filter` or other more specific transforms when possible. - -{{< button-colab url="https://colab.research.google.com/github/apache/beam/blob/master/examples/notebooks/documentation/transforms/python/elementwise/pardo-py.ipynb" >}} +The "Tour of Beam" is an interactive way of learning to write Beam code with a sandbox, where you can write and run pipelines while walking through various concepts. Please [click here](https://tour.beam.apache.org/) to try it out. \ No newline at end of file diff --git a/website/www/site/content/en/get-started/try-beam-playground.md b/website/www/site/content/en/get-started/try-beam-playground.md index 354f9594a613..731d54cf5d43 100644 --- a/website/www/site/content/en/get-started/try-beam-playground.md +++ b/website/www/site/content/en/get-started/try-beam-playground.md @@ -32,78 +32,7 @@ You can try the available Apache Beam examples at {{< playground_snippet language="scio" path="SDK_SCIO_MinimalWordCount" >}} {{< /playground >}} -## How To Add New Examples - -To add an Apache Beam example/test/kata into Beam Playground catalog, -add the `beam-playground` tag into the file to be added. -`beam-playground` tag is a yaml format comment: - -{{< highlight java >}} -// beam-playground: -// name: Name of the example/test/kata -// description: Description of the example/test/kata -// multifile: false -// pipeline_options: --option1 value1 --option2 value2 -// default_example: false -// context_line: 10 -// categories: -// - category 1 -// - category 2 -// - category N - -// example code -{{< /highlight >}} -{{< highlight py >}} -# beam-playground: -# name: Name of the example/test/kata -# description: Description of the example/test/kata -# multifile: false -# pipeline_options: --option1 value1 --option2 value2 -# default_example: false -# context_line: 10 -# categories: -# - category 1 -# - category 2 -# - category N - -# example code -{{< /highlight >}} -{{< highlight go >}} -// beam-playground: -// name: Name of the example/test/kata -// description: Description of the example/test/kata -// multifile: false -// pipeline_options: --option1 value1 --option2 value2 -// default_example: false -// context_line: 10 -// categories: -// - category 1 -// - category 2 -// - category N - -// example code -{{< /highlight >}} - -The 'beam-playground' tag consists of the following **required** elements: - -- `beam-playground` - tag title. -- `name` - string field. Name of the Beam example/test/kata that will be displayed in the Beam Playground -examples catalog. -- `description` - string field. Description of the Beam example/test/kata that will be displayed in Beam Playground. -- `multifile` - boolean field. Specifies if the given example consists of multiple files or not. -- `pipeline_options` - string field (optional). Contains information about pipeline options of the Beam example/test/kata. -- `default_example` - boolean field (optional). Specifies if the given example is default or not. If some example is tagged - as default it means that this example is shown when its SDK is chosen in Beam Playground. - Only one example can be set as a default for each SDK. -- `context_line` - integer field. The line where the main part of the Beam example/test/kata begins. -- `categories` - list type field. -Lists categories this example is included into. Available categories are listed in -[playground/categories.yaml](https://github.com/apache/beam/blob/master/playground/categories.yaml). -If some Beam example/kata/test needs to add a new category, then please submit PR with the changes to `categories.yaml`. -After the category has been added, it can be used in the examples. - -More details on examples in Apache Beam Playground can be found -[here](https://docs.google.com/document/d/1LBeGVTYwJHYbtmLt06OjhBR1CJ1Wgz18MEZjvNkuofc/edit?usp=sharing). +See [here](https://github.com/apache/beam/blob/master/playground/load_your_code.md) for adding new examples. ## Next Steps diff --git a/website/www/site/content/en/get-started/wordcount-example.md b/website/www/site/content/en/get-started/wordcount-example.md index 332473d367dd..e91226c247ca 100644 --- a/website/www/site/content/en/get-started/wordcount-example.md +++ b/website/www/site/content/en/get-started/wordcount-example.md @@ -123,7 +123,7 @@ sections, we will specify the pipeline's runner. {{< /highlight >}} {{< highlight py >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/snippets.py" examples_wordcount_minimal_options >}} +{{< code_sample "sdks/python/apache_beam/examples/snippets/snippets_examples_wordcount_minimal.py" examples_wordcount_minimal_options >}} {{< /highlight >}} {{< paragraph class="language-java language-py" >}} @@ -143,7 +143,7 @@ Pipeline p = Pipeline.create(options); {{< /highlight >}} {{< highlight py >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/snippets.py" examples_wordcount_minimal_create >}} +{{< code_sample "sdks/python/apache_beam/examples/snippets/snippets_examples_wordcount_minimal.py" examples_wordcount_minimal_create >}} {{< /highlight >}} {{< highlight go >}} @@ -179,7 +179,7 @@ p.apply(TextIO.read().from("gs://apache-beam-samples/shakespeare/*")) {{< /highlight >}} {{< highlight py >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/snippets.py" examples_wordcount_minimal_read >}} +{{< code_sample "sdks/python/apache_beam/examples/snippets/snippets_examples_wordcount_minimal.py" examples_wordcount_minimal_read >}} {{< /highlight >}} {{< highlight go >}} @@ -204,7 +204,7 @@ lines := textio.Read(s, "gs://apache-beam-samples/shakespeare/*") {{< highlight py >}} # The Flatmap transform is a simplified version of ParDo. -{{< code_sample "sdks/python/apache_beam/examples/snippets/snippets.py" examples_wordcount_minimal_pardo >}} +{{< code_sample "sdks/python/apache_beam/examples/snippets/snippets_examples_wordcount_minimal.py" examples_wordcount_minimal_pardo >}} {{< /highlight >}} {{< highlight go >}} @@ -231,7 +231,7 @@ words := beam.ParDo(s, func(line string, emit func(string)) { {{< /highlight >}} {{< highlight py >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/snippets.py" examples_wordcount_minimal_count >}} +{{< code_sample "sdks/python/apache_beam/examples/snippets/snippets_examples_wordcount_minimal.py" examples_wordcount_minimal_count >}} {{< /highlight >}} {{< highlight go >}} @@ -253,7 +253,7 @@ counted := stats.Count(s, words) {{< /highlight >}} {{< highlight py >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/snippets.py" examples_wordcount_minimal_map >}} +{{< code_sample "sdks/python/apache_beam/examples/snippets/snippets_examples_wordcount_minimal.py" examples_wordcount_minimal_map >}} {{< /highlight >}} {{< highlight go >}} @@ -272,7 +272,7 @@ formatted := beam.ParDo(s, func(w string, c int) string { {{< /highlight >}} {{< highlight py >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/snippets.py" examples_wordcount_minimal_write >}} +{{< code_sample "sdks/python/apache_beam/examples/snippets/snippets_examples_wordcount_minimal.py" examples_wordcount_minimal_write >}} {{< /highlight >}} {{< highlight go >}} @@ -320,6 +320,14 @@ Note that the `run` method is asynchronous. For a blocking execution, call the returned by the call to `run`. {{< /paragraph >}} +### Try the full example in Playground + +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_MinimalWordCount" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_WordCountMinimal" >}} +{{< playground_snippet language="go" path="SDK_GO_MinimalWordCount" >}} +{{< /playground >}} + ## WordCount example This WordCount example introduces a few recommended programming practices that @@ -529,7 +537,7 @@ static class ExtractWordsFn extends DoFn { {{< highlight py >}} # In this example, the DoFns are defined as classes: -{{< code_sample "sdks/python/apache_beam/examples/snippets/snippets.py" examples_wordcount_wordcount_dofn >}} +{{< code_sample "sdks/python/apache_beam/examples/snippets/snippets_examples_wordcount_wordcount.py" examples_wordcount_wordcount_dofn >}} {{< /highlight >}} {{< highlight go >}} @@ -598,7 +606,7 @@ public static void main(String[] args) throws IOException { {{< /highlight >}} {{< highlight py >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/snippets.py" examples_wordcount_wordcount_composite >}} +{{< code_sample "sdks/python/apache_beam/examples/snippets/snippets_examples_wordcount_wordcount.py" examples_wordcount_wordcount_composite >}} {{< /highlight >}} {{< highlight go >}} @@ -647,7 +655,7 @@ public static void main(String[] args) { {{< /highlight >}} {{< highlight py >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/snippets.py" examples_wordcount_wordcount_options >}} +{{< code_sample "sdks/python/apache_beam/examples/snippets/snippets_examples_wordcount_wordcount.py" examples_wordcount_wordcount_options >}} {{< /highlight >}} {{< highlight go >}} @@ -662,6 +670,14 @@ func main() { ... {{< /highlight >}} +### Try the full example in Playground + +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_WordCount" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_WordCount" >}} +{{< playground_snippet language="go" path="SDK_GO_WordCount" >}} +{{< /playground >}} + ## DebuggingWordCount example The DebuggingWordCount example demonstrates some best practices for @@ -844,7 +860,7 @@ public class DebuggingWordCount { {{< /highlight >}} {{< highlight py >}} -{{< code_sample "sdks/python/apache_beam/examples/snippets/snippets.py" example_wordcount_debugging_logging >}} +{{< code_sample "sdks/python/apache_beam/examples/snippets/snippets_examples_wordcount_debugging.py" example_wordcount_debugging_logging >}} {{< /highlight >}} {{< highlight go >}} @@ -976,6 +992,14 @@ See [DebuggingWordCountTest](https://github.com/apache/beam/blob/master/examples for an example unit test. {{< /paragraph >}} +### Try the full example in Playground + +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_DebuggingWordCount" >}} +{{< playground_snippet language="py" path="SDK_PYTHON_WordCountDebugging" >}} +{{< playground_snippet language="go" path="SDK_GO_DebuggingWordCount" >}} +{{< /playground >}} + ## WindowedWordCount example The WindowedWordCount example counts words in text just as the previous @@ -1325,6 +1349,15 @@ word_counts = windowed_words | CountWords() counted := wordcount.CountWords(s, windowedLines) {{< /highlight >}} +{{< paragraph class="language-java language-go" >}} +### Try the full example in Playground +{{< /paragraph >}} + +{{< playground height="700px" >}} +{{< playground_snippet language="java" path="SDK_JAVA_WindowedWordCount" >}} +{{< playground_snippet language="go" path="SDK_GO_WindowedWordCount" >}} +{{< /playground >}} + ## StreamingWordCount example The StreamingWordCount example is a streaming pipeline that reads Pub/Sub diff --git a/website/www/site/data/authors.yml b/website/www/site/data/authors.yml index ec566a1b2b94..0458bda2c963 100644 --- a/website/www/site/data/authors.yml +++ b/website/www/site/data/authors.yml @@ -28,6 +28,9 @@ angoenka: anton: name: Anton Kedin email: anton@apache.org +bvolpato: + name: Bruno Volpato + email: bvolpato@google.com ccy: name: Charles Chen email: ccy@apache.org @@ -245,6 +248,10 @@ alexkosolapov: hermannb: name: Brittany Hermann email: hermannb@google.com +svetakvsundhar: + name: Svetak Sundhar + email: svetaksundhar@google.com + twitter: svetaksundhar iht: name: Israel Herraiz email: ihr@google.com @@ -256,3 +263,9 @@ sysede: name: Danielle Syse email: syse@google.com linkedin: desyse +riteshghorse: + name: Ritesh Ghorse + email: riteshghorse@apache.org +yhu: + name: Yi Hu + email: yhu@apache.org diff --git a/website/www/site/data/en/quotes.yaml b/website/www/site/data/en/quotes.yaml index a09cd35d85f3..550ceade4cc1 100644 --- a/website/www/site/data/en/quotes.yaml +++ b/website/www/site/data/en/quotes.yaml @@ -11,6 +11,16 @@ # limitations under the License. #Cards with quotes will be displayed by the order listed, e.g., first card will display the first quote +- text: HSBC leveraged Apache Beam as a computational platform and a risk engine that enabled 100x scaling, 2x faster performance, and simplified data distribution for assessing and managing XVA and counterparty credit risk at HSBC’s global scale. + icon: icons/quote-icon.svg + logoUrl: images/logos/powered-by/hsbc.png + linkUrl: case-studies/hsbc/index.html + linkText: Learn more +- text: Apache Beam supports Project Shield's mission to protect freedom of speech and make the web a safer space by enabling ~2x streaming efficiency at >10,000 QPS and real-time visibility into attack data for their >3K customers. + icon: icons/quote-icon.svg + logoUrl: images/logos/powered-by/project_shield.png + linkUrl: case-studies/projectshield/index.html + linkText: Learn more - text: Apache Beam powers the Booking.com global ad bidding for performance marketing and scans 2PB+ of data daily, accelerating processing by an eye-opening 36x and expediting time-to-market by as much as 4x. icon: icons/quote-icon.svg logoUrl: images/logos/powered-by/booking.png diff --git a/website/www/site/i18n/home/en.yaml b/website/www/site/i18n/home/en.yaml index faeb4083f964..98177f280e6e 100644 --- a/website/www/site/i18n/home/en.yaml +++ b/website/www/site/i18n/home/en.yaml @@ -24,6 +24,8 @@ translation: "Go Quickstart" - id: home-playground translation: "Try Playground" +- id: home-tour-of-beam + translation: "Tour of Beam" - id: home-hero-blog-title translation: "The latest from the blog" - id: home-cards-title diff --git a/website/www/site/layouts/index.html b/website/www/site/layouts/index.html index f1c8ce0734b6..99254978ccd2 100644 --- a/website/www/site/layouts/index.html +++ b/website/www/site/layouts/index.html @@ -124,7 +124,7 @@

- {{ range first 2 (after 1 (where .Site.Pages.ByPublishDate.Reverse "Section" "blog")) }} + {{ range first 2 (where .Site.Pages.ByPublishDate.Reverse "Section" "blog") }} +
{{ end }} diff --git a/website/www/site/layouts/partials/header.html b/website/www/site/layouts/partials/header.html index af0dad07462f..3fa8bdc9455c 100644 --- a/website/www/site/layouts/partials/header.html +++ b/website/www/site/layouts/partials/header.html @@ -202,12 +202,37 @@ -