├── .gitignore
├── LICENSE
├── README.md
├── backend
├── Dockerfile
├── poetry.lock
├── pyproject.toml
├── server
│ ├── __init__.py
│ ├── app.py
│ ├── setup.py
│ └── templates
│ │ └── index.html
└── tests
│ ├── __init__.py
│ └── test_backend.py
├── docker-compose.yml
├── frontend
├── .dockerignore
├── .gitignore
├── Dockerfile
├── package-lock.json
├── package.json
├── public
│ ├── favicon.ico
│ ├── index.html
│ ├── logo192.png
│ ├── logo512.png
│ ├── manifest.json
│ └── robots.txt
└── src
│ ├── App.css
│ ├── App.js
│ ├── App.test.js
│ ├── components
│ ├── CommunityDetection.js
│ └── PageRank.js
│ ├── index.css
│ ├── index.js
│ ├── logo.svg
│ ├── reportWebVitals.js
│ └── setupTests.js
├── img
├── karate-club-graph.png
├── karate-club-matplotlib.png
├── memgraph-tutorial-community-detection-stream.gif
├── memgraph-tutorial-pagerank-stream.gif
├── stream-processing-arc-01-01.png
└── twitter-dataset-01.png
├── memgraph
├── Dockerfile
├── procedures
│ ├── link_prediction.py
│ └── publisher.py
├── requirements.txt
└── transformations
│ └── twitter.py
├── run_kafka.sh
├── run_pulsar.sh
└── stream
├── Dockerfile
├── data
├── scraped_tweets.csv
└── scraped_tweets_old.csv
├── produce.py
└── requirements.txt
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 |
6 | # C extensions
7 | *.so
8 |
9 | # Distribution / packaging
10 | .Python
11 | build/
12 | develop-eggs/
13 | dist/
14 | downloads/
15 | eggs/
16 | .eggs/
17 | lib/
18 | lib64/
19 | parts/
20 | sdist/
21 | var/
22 | wheels/
23 | pip-wheel-metadata/
24 | share/python-wheels/
25 | *.egg-info/
26 | .installed.cfg
27 | *.egg
28 | MANIFEST
29 |
30 | # PyInstaller
31 | # Usually these files are written by a python script from a template
32 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
33 | *.manifest
34 | *.spec
35 |
36 | # Installer logs
37 | pip-log.txt
38 | pip-delete-this-directory.txt
39 |
40 | # Unit test / coverage reports
41 | htmlcov/
42 | .tox/
43 | .nox/
44 | .coverage
45 | .coverage.*
46 | .cache
47 | nosetests.xml
48 | coverage.xml
49 | *.cover
50 | *.py,cover
51 | .hypothesis/
52 | .pytest_cache/
53 |
54 | # Translations
55 | *.mo
56 | *.pot
57 |
58 | # Django stuff:
59 | *.log
60 | local_settings.py
61 | db.sqlite3
62 | db.sqlite3-journal
63 |
64 | # Flask stuff:
65 | instance/
66 | .webassets-cache
67 |
68 | # Scrapy stuff:
69 | .scrapy
70 |
71 | # Sphinx documentation
72 | docs/_build/
73 |
74 | # PyBuilder
75 | target/
76 |
77 | # Jupyter Notebook
78 | .ipynb_checkpoints
79 |
80 | # IPython
81 | profile_default/
82 | ipython_config.py
83 |
84 | # pyenv
85 | .python-version
86 |
87 | # pipenv
88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies
90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not
91 | # install all needed dependencies.
92 | #Pipfile.lock
93 |
94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow
95 | __pypackages__/
96 |
97 | # Celery stuff
98 | celerybeat-schedule
99 | celerybeat.pid
100 |
101 | # SageMath parsed files
102 | *.sage.py
103 |
104 | # Environments
105 | .env
106 | .venv
107 | env/
108 | venv/
109 | ENV/
110 | env.bak/
111 | venv.bak/
112 |
113 | # dependencies
114 | /node_modules
115 | /.pnp
116 | .pnp.js
117 |
118 | # Spyder project settings
119 | .spyderproject
120 | .spyproject
121 |
122 | # Rope project settings
123 | .ropeproject
124 |
125 | # mkdocs documentation
126 | /site
127 |
128 | # mypy
129 | .mypy_cache/
130 | .dmypy.json
131 | dmypy.json
132 |
133 | # Pyre type checker
134 | .pyre/
135 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 g-despot
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 | 🔍 Twitter Network Analytics Demo 🔍
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 | A web application with backend in Flask and frontend in React and D3.js that
24 | uses Memgraph to ingest real-time data scraped from Twitter. Data is streamed
25 | via [Apache Kafka](https://kafka.apache.org/) or [Apache
26 | Pulsar](https://pulsar.apache.org/), and stream processing is performed with
27 | Memgraph.
28 |
29 | ## App architecture
30 |
31 |
32 |
33 |
34 |
35 | ## Data model
36 |
37 |
38 |
39 |
40 |
41 | ## Prerequisites
42 |
43 | You will need:
44 |
45 | - [Docker](https://docs.docker.com/get-docker/)
46 | - [Docker Compose](https://docs.docker.com/compose/install/) (included with
47 | Docker Desktop on Windows and macOS)
48 |
49 | ## Running the app
50 |
51 | ### With a bash script
52 |
53 | You can start everything but the frontend client by **running the bash script**:
54 |
55 | ```
56 | bash run_kafka.sh
57 | ```
58 |
59 | If you want to run the app with Apache Pulsar, use the script `bash
60 | run_pulsar.sh`. After that, in another window, run the frontend app with:
61 |
62 | ```
63 | docker-compose up frontend-app
64 | ```
65 |
66 | The React application will be running on `http://localhost:3000`.
67 |
68 | ### Manually using Docker Compose
69 |
70 | If you want to start the app **without using the bash script**, then:
71 |
72 | **1.** Remove possibly running containers:
73 |
74 | ```
75 | docker-compose rm -fs
76 | ```
77 |
78 | **2.** Build all the needed images:
79 |
80 | ```
81 | docker-compose build
82 | ```
83 |
84 | **3.** Start the **Apache Kafka** and **Memgraph MAGE** services:
85 |
86 | ```
87 | docker-compose up -d kafka
88 | docker-compose up -d memgraph-mage-kafka
89 | ```
90 |
91 | **4.** Start the data stream:
92 |
93 | ```
94 | docker-compose up -d stream-kafka
95 | ```
96 |
97 | **5.** Start the backend application:
98 |
99 | ```
100 | docker-compose up backend-kafka
101 | ```
102 |
103 | **6.** Start the frontend application in a new terminal window:
104 |
105 | ```
106 | docker-compose up frontend-app
107 | ```
108 |
109 | The React application will be running on `http://localhost:3000`.
110 |
111 | ## The visualization
112 |
113 | **Dynamic Community detection**:
114 |
115 |
116 |
117 |
118 |
119 | 
120 |
121 | **Dynamic PageRank**:
122 |
123 | 
124 |
--------------------------------------------------------------------------------
/backend/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM python:3.9
2 |
3 | # Keeps Python from generating .pyc files in the container
4 | ENV PYTHONDONTWRITEBYTECODE 1
5 |
6 | # Turns off buffering for easier container logging
7 | ENV PYTHONUNBUFFERED 1
8 |
9 | # Install CMake for gqlalchemy
10 | RUN apt-get update && \
11 | apt-get --yes install cmake && \
12 | rm -rf /var/lib/apt/lists/*
13 |
14 | # Install poetry
15 | RUN pip install -U pip \
16 | && curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python
17 | ENV PATH="${PATH}:/root/.poetry/bin"
18 |
19 | WORKDIR /app
20 | COPY . .
21 | RUN poetry config virtualenvs.create false && \
22 | poetry install --no-interaction --no-ansi
23 |
24 | ENV FLASK_ENV=development
25 | ENV LC_ALL=C.UTF-8
26 | ENV LANG=C.UTF-8
27 |
--------------------------------------------------------------------------------
/backend/poetry.lock:
--------------------------------------------------------------------------------
1 | [[package]]
2 | name = "atomicwrites"
3 | version = "1.4.0"
4 | description = "Atomic file writes."
5 | category = "dev"
6 | optional = false
7 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
8 |
9 | [[package]]
10 | name = "attrs"
11 | version = "21.2.0"
12 | description = "Classes Without Boilerplate"
13 | category = "dev"
14 | optional = false
15 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
16 |
17 | [package.extras]
18 | dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"]
19 | docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"]
20 | tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"]
21 | tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"]
22 |
23 | [[package]]
24 | name = "certifi"
25 | version = "2021.10.8"
26 | description = "Python package for providing Mozilla's CA Bundle."
27 | category = "main"
28 | optional = false
29 | python-versions = "*"
30 |
31 | [[package]]
32 | name = "click"
33 | version = "8.0.1"
34 | description = "Composable command line interface toolkit"
35 | category = "main"
36 | optional = false
37 | python-versions = ">=3.6"
38 |
39 | [package.dependencies]
40 | colorama = {version = "*", markers = "platform_system == \"Windows\""}
41 |
42 | [[package]]
43 | name = "colorama"
44 | version = "0.4.4"
45 | description = "Cross-platform colored terminal text."
46 | category = "main"
47 | optional = false
48 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
49 |
50 | [[package]]
51 | name = "dnspython"
52 | version = "1.16.0"
53 | description = "DNS toolkit"
54 | category = "main"
55 | optional = false
56 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
57 |
58 | [package.extras]
59 | DNSSEC = ["pycryptodome", "ecdsa (>=0.13)"]
60 | IDNA = ["idna (>=2.1)"]
61 |
62 | [[package]]
63 | name = "eventlet"
64 | version = "0.30.2"
65 | description = "Highly concurrent networking library"
66 | category = "main"
67 | optional = false
68 | python-versions = "*"
69 |
70 | [package.dependencies]
71 | dnspython = ">=1.15.0,<2.0.0"
72 | greenlet = ">=0.3"
73 | six = ">=1.10.0"
74 |
75 | [[package]]
76 | name = "flask"
77 | version = "2.0.1"
78 | description = "A simple framework for building complex web applications."
79 | category = "main"
80 | optional = false
81 | python-versions = ">=3.6"
82 |
83 | [package.dependencies]
84 | click = ">=7.1.2"
85 | itsdangerous = ">=2.0"
86 | Jinja2 = ">=3.0"
87 | Werkzeug = ">=2.0"
88 |
89 | [package.extras]
90 | async = ["asgiref (>=3.2)"]
91 | dotenv = ["python-dotenv"]
92 |
93 | [[package]]
94 | name = "flask-cors"
95 | version = "3.0.10"
96 | description = "A Flask extension adding a decorator for CORS support"
97 | category = "main"
98 | optional = false
99 | python-versions = "*"
100 |
101 | [package.dependencies]
102 | Flask = ">=0.9"
103 | Six = "*"
104 |
105 | [[package]]
106 | name = "flask-socketio"
107 | version = "4.3.1"
108 | description = "Socket.IO integration for Flask applications"
109 | category = "main"
110 | optional = false
111 | python-versions = "*"
112 |
113 | [package.dependencies]
114 | Flask = ">=0.9"
115 | python-socketio = ">=4.3.0"
116 |
117 | [[package]]
118 | name = "gqlalchemy"
119 | version = "1.1.5"
120 | description = "GQLAlchemy is library developed with purpose of assisting writing and running queries on Memgraph."
121 | category = "main"
122 | optional = false
123 | python-versions = ">=3.7,<4.0"
124 |
125 | [package.dependencies]
126 | networkx = ">=2.5.1,<3.0.0"
127 | pydantic = ">=1.8.2,<2.0.0"
128 | pymgclient = "1.2.0"
129 |
130 | [[package]]
131 | name = "greenlet"
132 | version = "1.1.1"
133 | description = "Lightweight in-process concurrent programming"
134 | category = "main"
135 | optional = false
136 | python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*"
137 |
138 | [package.extras]
139 | docs = ["sphinx"]
140 |
141 | [[package]]
142 | name = "gunicorn"
143 | version = "20.1.0"
144 | description = "WSGI HTTP Server for UNIX"
145 | category = "main"
146 | optional = false
147 | python-versions = ">=3.5"
148 |
149 | [package.extras]
150 | eventlet = ["eventlet (>=0.24.1)"]
151 | gevent = ["gevent (>=1.4.0)"]
152 | setproctitle = ["setproctitle"]
153 | tornado = ["tornado (>=0.2)"]
154 |
155 | [[package]]
156 | name = "itsdangerous"
157 | version = "2.0.1"
158 | description = "Safely pass data to untrusted environments and back."
159 | category = "main"
160 | optional = false
161 | python-versions = ">=3.6"
162 |
163 | [[package]]
164 | name = "jinja2"
165 | version = "3.0.1"
166 | description = "A very fast and expressive template engine."
167 | category = "main"
168 | optional = false
169 | python-versions = ">=3.6"
170 |
171 | [package.dependencies]
172 | MarkupSafe = ">=2.0"
173 |
174 | [package.extras]
175 | i18n = ["Babel (>=2.7)"]
176 |
177 | [[package]]
178 | name = "kafka-python"
179 | version = "2.0.2"
180 | description = "Pure Python client for Apache Kafka"
181 | category = "main"
182 | optional = false
183 | python-versions = "*"
184 |
185 | [package.extras]
186 | crc32c = ["crc32c"]
187 |
188 | [[package]]
189 | name = "markupsafe"
190 | version = "2.0.1"
191 | description = "Safely add untrusted strings to HTML/XML markup."
192 | category = "main"
193 | optional = false
194 | python-versions = ">=3.6"
195 |
196 | [[package]]
197 | name = "more-itertools"
198 | version = "8.9.0"
199 | description = "More routines for operating on iterables, beyond itertools"
200 | category = "dev"
201 | optional = false
202 | python-versions = ">=3.5"
203 |
204 | [[package]]
205 | name = "networkx"
206 | version = "2.6.2"
207 | description = "Python package for creating and manipulating graphs and networks"
208 | category = "main"
209 | optional = false
210 | python-versions = ">=3.7"
211 |
212 | [package.extras]
213 | default = ["numpy (>=1.19)", "scipy (>=1.5,!=1.6.1)", "matplotlib (>=3.3)", "pandas (>=1.1)"]
214 | developer = ["black (==21.5b1)", "pre-commit (>=2.12)"]
215 | doc = ["sphinx (>=4.0,<5.0)", "pydata-sphinx-theme (>=0.6,<1.0)", "sphinx-gallery (>=0.9,<1.0)", "numpydoc (>=1.1)", "pillow (>=8.2)", "nb2plots (>=0.6)", "texext (>=0.6.6)"]
216 | extra = ["lxml (>=4.5)", "pygraphviz (>=1.7)", "pydot (>=1.4.1)"]
217 | test = ["pytest (>=6.2)", "pytest-cov (>=2.12)", "codecov (>=2.1)"]
218 |
219 | [[package]]
220 | name = "packaging"
221 | version = "21.0"
222 | description = "Core utilities for Python packages"
223 | category = "dev"
224 | optional = false
225 | python-versions = ">=3.6"
226 |
227 | [package.dependencies]
228 | pyparsing = ">=2.0.2"
229 |
230 | [[package]]
231 | name = "pluggy"
232 | version = "0.13.1"
233 | description = "plugin and hook calling mechanisms for python"
234 | category = "dev"
235 | optional = false
236 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
237 |
238 | [package.extras]
239 | dev = ["pre-commit", "tox"]
240 |
241 | [[package]]
242 | name = "pulsar-client"
243 | version = "2.10.0"
244 | description = "Apache Pulsar Python client library"
245 | category = "main"
246 | optional = false
247 | python-versions = "*"
248 |
249 | [package.dependencies]
250 | certifi = "*"
251 | six = "*"
252 |
253 | [package.extras]
254 | all = ["apache-bookkeeper-client (>=4.9.2)", "fastavro (==0.24.0)", "grpcio (>=1.8.2,<1.28)", "prometheus-client", "protobuf (>=3.6.1)", "ratelimit"]
255 | avro = ["fastavro (==0.24.0)"]
256 | functions = ["apache-bookkeeper-client (>=4.9.2)", "grpcio (>=1.8.2,<1.28)", "prometheus-client", "protobuf (>=3.6.1)", "ratelimit"]
257 |
258 | [[package]]
259 | name = "py"
260 | version = "1.10.0"
261 | description = "library with cross-python path, ini-parsing, io, code, log facilities"
262 | category = "dev"
263 | optional = false
264 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
265 |
266 | [[package]]
267 | name = "pydantic"
268 | version = "1.9.0"
269 | description = "Data validation and settings management using python 3.6 type hinting"
270 | category = "main"
271 | optional = false
272 | python-versions = ">=3.6.1"
273 |
274 | [package.dependencies]
275 | typing-extensions = ">=3.7.4.3"
276 |
277 | [package.extras]
278 | dotenv = ["python-dotenv (>=0.10.4)"]
279 | email = ["email-validator (>=1.0.3)"]
280 |
281 | [[package]]
282 | name = "pymgclient"
283 | version = "1.2.0"
284 | description = "Memgraph database adapter for Python language"
285 | category = "main"
286 | optional = false
287 | python-versions = ">=3.6"
288 |
289 | [[package]]
290 | name = "pyparsing"
291 | version = "2.4.7"
292 | description = "Python parsing module"
293 | category = "dev"
294 | optional = false
295 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
296 |
297 | [[package]]
298 | name = "pytest"
299 | version = "5.4.3"
300 | description = "pytest: simple powerful testing with Python"
301 | category = "dev"
302 | optional = false
303 | python-versions = ">=3.5"
304 |
305 | [package.dependencies]
306 | atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""}
307 | attrs = ">=17.4.0"
308 | colorama = {version = "*", markers = "sys_platform == \"win32\""}
309 | more-itertools = ">=4.0.0"
310 | packaging = "*"
311 | pluggy = ">=0.12,<1.0"
312 | py = ">=1.5.0"
313 | wcwidth = "*"
314 |
315 | [package.extras]
316 | checkqa-mypy = ["mypy (==v0.761)"]
317 | testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"]
318 |
319 | [[package]]
320 | name = "python-engineio"
321 | version = "3.13.2"
322 | description = "Engine.IO server"
323 | category = "main"
324 | optional = false
325 | python-versions = "*"
326 |
327 | [package.dependencies]
328 | six = ">=1.9.0"
329 |
330 | [package.extras]
331 | asyncio_client = ["aiohttp (>=3.4)"]
332 | client = ["requests (>=2.21.0)", "websocket-client (>=0.54.0)"]
333 |
334 | [[package]]
335 | name = "python-socketio"
336 | version = "4.6.0"
337 | description = "Socket.IO server"
338 | category = "main"
339 | optional = false
340 | python-versions = "*"
341 |
342 | [package.dependencies]
343 | python-engineio = ">=3.13.0"
344 | six = ">=1.9.0"
345 |
346 | [package.extras]
347 | asyncio_client = ["aiohttp (>=3.4)", "websockets (>=7.0)"]
348 | client = ["requests (>=2.21.0)", "websocket-client (>=0.54.0)"]
349 |
350 | [[package]]
351 | name = "six"
352 | version = "1.16.0"
353 | description = "Python 2 and 3 compatibility utilities"
354 | category = "main"
355 | optional = false
356 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
357 |
358 | [[package]]
359 | name = "typing-extensions"
360 | version = "4.1.1"
361 | description = "Backported and Experimental Type Hints for Python 3.6+"
362 | category = "main"
363 | optional = false
364 | python-versions = ">=3.6"
365 |
366 | [[package]]
367 | name = "wcwidth"
368 | version = "0.2.5"
369 | description = "Measures the displayed width of unicode strings in a terminal"
370 | category = "dev"
371 | optional = false
372 | python-versions = "*"
373 |
374 | [[package]]
375 | name = "werkzeug"
376 | version = "2.0.1"
377 | description = "The comprehensive WSGI web application library."
378 | category = "main"
379 | optional = false
380 | python-versions = ">=3.6"
381 |
382 | [package.extras]
383 | watchdog = ["watchdog"]
384 |
385 | [metadata]
386 | lock-version = "1.1"
387 | python-versions = "^3.9"
388 | content-hash = "1a6e0c3d332eeb9c12e2af3460fe15d401d4b3e6b42093dd1c390688338de72d"
389 |
390 | [metadata.files]
391 | atomicwrites = [
392 | {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"},
393 | {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"},
394 | ]
395 | attrs = [
396 | {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"},
397 | {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"},
398 | ]
399 | certifi = [
400 | {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"},
401 | {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"},
402 | ]
403 | click = [
404 | {file = "click-8.0.1-py3-none-any.whl", hash = "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"},
405 | {file = "click-8.0.1.tar.gz", hash = "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a"},
406 | ]
407 | colorama = [
408 | {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"},
409 | {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"},
410 | ]
411 | dnspython = [
412 | {file = "dnspython-1.16.0-py2.py3-none-any.whl", hash = "sha256:f69c21288a962f4da86e56c4905b49d11aba7938d3d740e80d9e366ee4f1632d"},
413 | {file = "dnspython-1.16.0.zip", hash = "sha256:36c5e8e38d4369a08b6780b7f27d790a292b2b08eea01607865bf0936c558e01"},
414 | ]
415 | eventlet = [
416 | {file = "eventlet-0.30.2-py2.py3-none-any.whl", hash = "sha256:89cc6dbfef47c4629cefead5fde21c5f2b33464d57f7df5fc5148f8b4de3fbb5"},
417 | {file = "eventlet-0.30.2.tar.gz", hash = "sha256:1811b122d9a45eb5bafba092d36911bca825f835cb648a862bbf984030acff9d"},
418 | ]
419 | flask = [
420 | {file = "Flask-2.0.1-py3-none-any.whl", hash = "sha256:a6209ca15eb63fc9385f38e452704113d679511d9574d09b2cf9183ae7d20dc9"},
421 | {file = "Flask-2.0.1.tar.gz", hash = "sha256:1c4c257b1892aec1398784c63791cbaa43062f1f7aeb555c4da961b20ee68f55"},
422 | ]
423 | flask-cors = [
424 | {file = "Flask-Cors-3.0.10.tar.gz", hash = "sha256:b60839393f3b84a0f3746f6cdca56c1ad7426aa738b70d6c61375857823181de"},
425 | {file = "Flask_Cors-3.0.10-py2.py3-none-any.whl", hash = "sha256:74efc975af1194fc7891ff5cd85b0f7478be4f7f59fe158102e91abb72bb4438"},
426 | ]
427 | flask-socketio = [
428 | {file = "Flask-SocketIO-4.3.1.tar.gz", hash = "sha256:36c1d5765010d1f4e4f05b4cc9c20c289d9dc70698c88d1addd0afcfedc5b062"},
429 | {file = "Flask_SocketIO-4.3.1-py2.py3-none-any.whl", hash = "sha256:3668675bf7763c5b5f56689d439f07356e89c0a52e0c9e9cd3cc08563c07b252"},
430 | ]
431 | gqlalchemy = [
432 | {file = "GQLAlchemy-1.1.5-py3-none-any.whl", hash = "sha256:ede033e33eeb358981136660467d45099b1530015224d3f5a891aac369e158cc"},
433 | {file = "GQLAlchemy-1.1.5.tar.gz", hash = "sha256:9f301b55873df696c2c99e2fdaf88db3056548d8b1efbc089bc7514d5b8f3af8"},
434 | ]
435 | greenlet = [
436 | {file = "greenlet-1.1.1-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:476ba9435afaead4382fbab8f1882f75e3fb2285c35c9285abb3dd30237f9142"},
437 | {file = "greenlet-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:44556302c0ab376e37939fd0058e1f0db2e769580d340fb03b01678d1ff25f68"},
438 | {file = "greenlet-1.1.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40abb7fec4f6294225d2b5464bb6d9552050ded14a7516588d6f010e7e366dcc"},
439 | {file = "greenlet-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:a11b6199a0b9dc868990456a2667167d0ba096c5224f6258e452bfbe5a9742c5"},
440 | {file = "greenlet-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e22a82d2b416d9227a500c6860cf13e74060cf10e7daf6695cbf4e6a94e0eee4"},
441 | {file = "greenlet-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bad269e442f1b7ffa3fa8820b3c3aa66f02a9f9455b5ba2db5a6f9eea96f56de"},
442 | {file = "greenlet-1.1.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:8ddb38fb6ad96c2ef7468ff73ba5c6876b63b664eebb2c919c224261ae5e8378"},
443 | {file = "greenlet-1.1.1-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:84782c80a433d87530ae3f4b9ed58d4a57317d9918dfcc6a59115fa2d8731f2c"},
444 | {file = "greenlet-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac991947ca6533ada4ce7095f0e28fe25d5b2f3266ad5b983ed4201e61596acf"},
445 | {file = "greenlet-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5317701c7ce167205c0569c10abc4bd01c7f4cf93f642c39f2ce975fa9b78a3c"},
446 | {file = "greenlet-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4870b018ca685ff573edd56b93f00a122f279640732bb52ce3a62b73ee5c4a92"},
447 | {file = "greenlet-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:990e0f5e64bcbc6bdbd03774ecb72496224d13b664aa03afd1f9b171a3269272"},
448 | {file = "greenlet-1.1.1-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:a414f8e14aa7bacfe1578f17c11d977e637d25383b6210587c29210af995ef04"},
449 | {file = "greenlet-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:e02780da03f84a671bb4205c5968c120f18df081236d7b5462b380fd4f0b497b"},
450 | {file = "greenlet-1.1.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:dfcb5a4056e161307d103bc013478892cfd919f1262c2bb8703220adcb986362"},
451 | {file = "greenlet-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:655ab836324a473d4cd8cf231a2d6f283ed71ed77037679da554e38e606a7117"},
452 | {file = "greenlet-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:6ce9d0784c3c79f3e5c5c9c9517bbb6c7e8aa12372a5ea95197b8a99402aa0e6"},
453 | {file = "greenlet-1.1.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:3fc6a447735749d651d8919da49aab03c434a300e9f0af1c886d560405840fd1"},
454 | {file = "greenlet-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8039f5fe8030c43cd1732d9a234fdcbf4916fcc32e21745ca62e75023e4d4649"},
455 | {file = "greenlet-1.1.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fddfb31aa2ac550b938d952bca8a87f1db0f8dc930ffa14ce05b5c08d27e7fd1"},
456 | {file = "greenlet-1.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b97a807437b81f90f85022a9dcfd527deea38368a3979ccb49d93c9198b2c722"},
457 | {file = "greenlet-1.1.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cf31e894dabb077a35bbe6963285d4515a387ff657bd25b0530c7168e48f167f"},
458 | {file = "greenlet-1.1.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eae94de9924bbb4d24960185363e614b1b62ff797c23dc3c8a7c75bbb8d187e"},
459 | {file = "greenlet-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:c1862f9f1031b1dee3ff00f1027fcd098ffc82120f43041fe67804b464bbd8a7"},
460 | {file = "greenlet-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:9b02e6039eafd75e029d8c58b7b1f3e450ca563ef1fe21c7e3e40b9936c8d03e"},
461 | {file = "greenlet-1.1.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:84488516639c3c5e5c0e52f311fff94ebc45b56788c2a3bfe9cf8e75670f4de3"},
462 | {file = "greenlet-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:3f8fc59bc5d64fa41f58b0029794f474223693fd00016b29f4e176b3ee2cfd9f"},
463 | {file = "greenlet-1.1.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:3e594015a2349ec6dcceda9aca29da8dc89e85b56825b7d1f138a3f6bb79dd4c"},
464 | {file = "greenlet-1.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e41f72f225192d5d4df81dad2974a8943b0f2d664a2a5cfccdf5a01506f5523c"},
465 | {file = "greenlet-1.1.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:75ff270fd05125dce3303e9216ccddc541a9e072d4fc764a9276d44dee87242b"},
466 | {file = "greenlet-1.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cde7ee190196cbdc078511f4df0be367af85636b84d8be32230f4871b960687"},
467 | {file = "greenlet-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:f253dad38605486a4590f9368ecbace95865fea0f2b66615d121ac91fd1a1563"},
468 | {file = "greenlet-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a91ee268f059583176c2c8b012a9fce7e49ca6b333a12bbc2dd01fc1a9783885"},
469 | {file = "greenlet-1.1.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:34e6675167a238bede724ee60fe0550709e95adaff6a36bcc97006c365290384"},
470 | {file = "greenlet-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:bf3725d79b1ceb19e83fb1aed44095518c0fcff88fba06a76c0891cfd1f36837"},
471 | {file = "greenlet-1.1.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:5c3b735ccf8fc8048664ee415f8af5a3a018cc92010a0d7195395059b4b39b7d"},
472 | {file = "greenlet-1.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2002a59453858c7f3404690ae80f10c924a39f45f6095f18a985a1234c37334"},
473 | {file = "greenlet-1.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04e1849c88aa56584d4a0a6e36af5ec7cc37993fdc1fda72b56aa1394a92ded3"},
474 | {file = "greenlet-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8d4ed48eed7414ccb2aaaecbc733ed2a84c299714eae3f0f48db085342d5629"},
475 | {file = "greenlet-1.1.1-cp38-cp38-win32.whl", hash = "sha256:2f89d74b4f423e756a018832cd7a0a571e0a31b9ca59323b77ce5f15a437629b"},
476 | {file = "greenlet-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:d15cb6f8706678dc47fb4e4f8b339937b04eda48a0af1cca95f180db552e7663"},
477 | {file = "greenlet-1.1.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:b050dbb96216db273b56f0e5960959c2b4cb679fe1e58a0c3906fa0a60c00662"},
478 | {file = "greenlet-1.1.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e0696525500bc8aa12eae654095d2260db4dc95d5c35af2b486eae1bf914ccd"},
479 | {file = "greenlet-1.1.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:07e6d88242e09b399682b39f8dfa1e7e6eca66b305de1ff74ed9eb1a7d8e539c"},
480 | {file = "greenlet-1.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98b491976ed656be9445b79bc57ed21decf08a01aaaf5fdabf07c98c108111f6"},
481 | {file = "greenlet-1.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e72db813c28906cdc59bd0da7c325d9b82aa0b0543014059c34c8c4ad20e16"},
482 | {file = "greenlet-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:090126004c8ab9cd0787e2acf63d79e80ab41a18f57d6448225bbfcba475034f"},
483 | {file = "greenlet-1.1.1-cp39-cp39-win32.whl", hash = "sha256:1796f2c283faab2b71c67e9b9aefb3f201fdfbee5cb55001f5ffce9125f63a45"},
484 | {file = "greenlet-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:4adaf53ace289ced90797d92d767d37e7cdc29f13bd3830c3f0a561277a4ae83"},
485 | {file = "greenlet-1.1.1.tar.gz", hash = "sha256:c0f22774cd8294078bdf7392ac73cf00bfa1e5e0ed644bd064fdabc5f2a2f481"},
486 | ]
487 | gunicorn = [
488 | {file = "gunicorn-20.1.0-py3-none-any.whl", hash = "sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e"},
489 | {file = "gunicorn-20.1.0.tar.gz", hash = "sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8"},
490 | ]
491 | itsdangerous = [
492 | {file = "itsdangerous-2.0.1-py3-none-any.whl", hash = "sha256:5174094b9637652bdb841a3029700391451bd092ba3db90600dea710ba28e97c"},
493 | {file = "itsdangerous-2.0.1.tar.gz", hash = "sha256:9e724d68fc22902a1435351f84c3fb8623f303fffcc566a4cb952df8c572cff0"},
494 | ]
495 | jinja2 = [
496 | {file = "Jinja2-3.0.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"},
497 | {file = "Jinja2-3.0.1.tar.gz", hash = "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"},
498 | ]
499 | kafka-python = [
500 | {file = "kafka-python-2.0.2.tar.gz", hash = "sha256:04dfe7fea2b63726cd6f3e79a2d86e709d608d74406638c5da33a01d45a9d7e3"},
501 | {file = "kafka_python-2.0.2-py2.py3-none-any.whl", hash = "sha256:2d92418c7cb1c298fa6c7f0fb3519b520d0d7526ac6cb7ae2a4fc65a51a94b6e"},
502 | ]
503 | markupsafe = [
504 | {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"},
505 | {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"},
506 | {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"},
507 | {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"},
508 | {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"},
509 | {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"},
510 | {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"},
511 | {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"},
512 | {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"},
513 | {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"},
514 | {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"},
515 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"},
516 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"},
517 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"},
518 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"},
519 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"},
520 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"},
521 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"},
522 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"},
523 | {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"},
524 | {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"},
525 | {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"},
526 | {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"},
527 | {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"},
528 | {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"},
529 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"},
530 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"},
531 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"},
532 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"},
533 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"},
534 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"},
535 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"},
536 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"},
537 | {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"},
538 | {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"},
539 | {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"},
540 | {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"},
541 | {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"},
542 | {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"},
543 | {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"},
544 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"},
545 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"},
546 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"},
547 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"},
548 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"},
549 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"},
550 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"},
551 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"},
552 | {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"},
553 | {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"},
554 | {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"},
555 | {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"},
556 | {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"},
557 | {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"},
558 | {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"},
559 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"},
560 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"},
561 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"},
562 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"},
563 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"},
564 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"},
565 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"},
566 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"},
567 | {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"},
568 | {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"},
569 | {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"},
570 | {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"},
571 | {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"},
572 | {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"},
573 | ]
574 | more-itertools = [
575 | {file = "more-itertools-8.9.0.tar.gz", hash = "sha256:8c746e0d09871661520da4f1241ba6b908dc903839733c8203b552cffaf173bd"},
576 | {file = "more_itertools-8.9.0-py3-none-any.whl", hash = "sha256:70401259e46e216056367a0a6034ee3d3f95e0bf59d3aa6a4eb77837171ed996"},
577 | ]
578 | networkx = [
579 | {file = "networkx-2.6.2-py3-none-any.whl", hash = "sha256:5fcb7004be69e8fbdf07dcb502efa5c77cadcaad6982164134eeb9721f826c2e"},
580 | {file = "networkx-2.6.2.tar.gz", hash = "sha256:2306f1950ce772c5a59a57f5486d59bb9cab98497c45fc49cbc45ac0dec119bb"},
581 | ]
582 | packaging = [
583 | {file = "packaging-21.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"},
584 | {file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"},
585 | ]
586 | pluggy = [
587 | {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"},
588 | {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"},
589 | ]
590 | pulsar-client = [
591 | {file = "pulsar_client-2.10.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:87cbdd3bd2da9a034d4444faf2ab2623cdae14fb7f43628efd2a4b5a9b278376"},
592 | {file = "pulsar_client-2.10.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:6eb23368799fc13928136431d7dabdf2464bc7a99ee2435434d727eb84fec63d"},
593 | {file = "pulsar_client-2.10.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:36c2ca2ec1219379a75fe863cacf7e456a12580cb406c529dc4e4af4ea98efbb"},
594 | {file = "pulsar_client-2.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72651266114f41d05085c4ceb3bfbd6ed9c83a304d8994354b0878beb9350dc3"},
595 | {file = "pulsar_client-2.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfd63716b937d95ee3e0f305b1ab6aca2806b2f93a1529d08c48e6fb21d98681"},
596 | {file = "pulsar_client-2.10.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6ff07f494793fb0471ad94bf52201403e7a4dcf526c070daa0fb452a8ce7dc2c"},
597 | {file = "pulsar_client-2.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:80c514405d4393e87c58b9332a10d34ee03e3120c11c0f5a54505eab0f29fde7"},
598 | {file = "pulsar_client-2.10.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:3889c8260320bbeb74f59aa4f592cab956570c66f9d82741225135a742a8c8b5"},
599 | {file = "pulsar_client-2.10.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:44246085c2bc183f2ec44df717e4d414b46b1eadcb117f521323b34d7daa820c"},
600 | {file = "pulsar_client-2.10.0-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:f76a307ac65cd1ea9070b0ae14804f8084371ea3bb14cb30aa82dfc1dd199a67"},
601 | {file = "pulsar_client-2.10.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:c18d3333015941588d066b423dca0e8d825318e14561edc66a3cfc0b20855a8f"},
602 | {file = "pulsar_client-2.10.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54d67e2bc11842949a35fd656180129aa979a712cebd0dac28b23a2f87aa5a89"},
603 | {file = "pulsar_client-2.10.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4a54c550ab91a7610d066e5070a4cbd5be9c2421b3569a324d25029dabb338b3"},
604 | {file = "pulsar_client-2.10.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6ae2928d1080afe1eb9d20677b856e2a72232c2c4c167926280ae9f12578ddf0"},
605 | {file = "pulsar_client-2.10.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:52ba4a1c609626d14a71297db3406c82a337b0f6dc111b84a396fe1aae002845"},
606 | {file = "pulsar_client-2.10.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:f6ffba8cc1a7a597787635db293a927f47192914eea3db07b8d33efd25f6ddf8"},
607 | {file = "pulsar_client-2.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02775ffe3d5a0afab2c949f89778d6b31d080625f3cc5968db67515c0294e085"},
608 | {file = "pulsar_client-2.10.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:26c5ebca7196d3f4eb88aedd329678106ac46a4abd7775c534278e827ccc086b"},
609 | {file = "pulsar_client-2.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:57e092fa0da9e7c31e0c563a2ddb6fe3fe3ca0cc4d99c11daafb1a62878931ad"},
610 | {file = "pulsar_client-2.10.0-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:1bd16a4ffd2cdef02774cd7e1f5b815eaef2ec10ea8ef8c01afaf54ccc1bdc59"},
611 | {file = "pulsar_client-2.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b62e57f79e74fea85660269315456ec61ab1cd33e506a0d67fd2535a29da15f"},
612 | {file = "pulsar_client-2.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7a5480b5e665a3898f4ba6e91efa0e2f4702d8c094a78023449e528693a688b"},
613 | {file = "pulsar_client-2.10.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:40d3215d115d6cd3925bd9352e7f839d785333807c735e4cefdf9189694f6ba1"},
614 | {file = "pulsar_client-2.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7b3e6363d216ac1ffe9fd3447b211d577b325d2e0acb76a6523e4d0087de1cf5"},
615 | ]
616 | py = [
617 | {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"},
618 | {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"},
619 | ]
620 | pydantic = [
621 | {file = "pydantic-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cb23bcc093697cdea2708baae4f9ba0e972960a835af22560f6ae4e7e47d33f5"},
622 | {file = "pydantic-1.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1d5278bd9f0eee04a44c712982343103bba63507480bfd2fc2790fa70cd64cf4"},
623 | {file = "pydantic-1.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab624700dc145aa809e6f3ec93fb8e7d0f99d9023b713f6a953637429b437d37"},
624 | {file = "pydantic-1.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c8d7da6f1c1049eefb718d43d99ad73100c958a5367d30b9321b092771e96c25"},
625 | {file = "pydantic-1.9.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3c3b035103bd4e2e4a28da9da7ef2fa47b00ee4a9cf4f1a735214c1bcd05e0f6"},
626 | {file = "pydantic-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3011b975c973819883842c5ab925a4e4298dffccf7782c55ec3580ed17dc464c"},
627 | {file = "pydantic-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:086254884d10d3ba16da0588604ffdc5aab3f7f09557b998373e885c690dd398"},
628 | {file = "pydantic-1.9.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0fe476769acaa7fcddd17cadd172b156b53546ec3614a4d880e5d29ea5fbce65"},
629 | {file = "pydantic-1.9.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8e9dcf1ac499679aceedac7e7ca6d8641f0193c591a2d090282aaf8e9445a46"},
630 | {file = "pydantic-1.9.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1e4c28f30e767fd07f2ddc6f74f41f034d1dd6bc526cd59e63a82fe8bb9ef4c"},
631 | {file = "pydantic-1.9.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c86229333cabaaa8c51cf971496f10318c4734cf7b641f08af0a6fbf17ca3054"},
632 | {file = "pydantic-1.9.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:c0727bda6e38144d464daec31dff936a82917f431d9c39c39c60a26567eae3ed"},
633 | {file = "pydantic-1.9.0-cp36-cp36m-win_amd64.whl", hash = "sha256:dee5ef83a76ac31ab0c78c10bd7d5437bfdb6358c95b91f1ba7ff7b76f9996a1"},
634 | {file = "pydantic-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9c9bdb3af48e242838f9f6e6127de9be7063aad17b32215ccc36a09c5cf1070"},
635 | {file = "pydantic-1.9.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ee7e3209db1e468341ef41fe263eb655f67f5c5a76c924044314e139a1103a2"},
636 | {file = "pydantic-1.9.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b6037175234850ffd094ca77bf60fb54b08b5b22bc85865331dd3bda7a02fa1"},
637 | {file = "pydantic-1.9.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b2571db88c636d862b35090ccf92bf24004393f85c8870a37f42d9f23d13e032"},
638 | {file = "pydantic-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8b5ac0f1c83d31b324e57a273da59197c83d1bb18171e512908fe5dc7278a1d6"},
639 | {file = "pydantic-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bbbc94d0c94dd80b3340fc4f04fd4d701f4b038ebad72c39693c794fd3bc2d9d"},
640 | {file = "pydantic-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e0896200b6a40197405af18828da49f067c2fa1f821491bc8f5bde241ef3f7d7"},
641 | {file = "pydantic-1.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bdfdadb5994b44bd5579cfa7c9b0e1b0e540c952d56f627eb227851cda9db77"},
642 | {file = "pydantic-1.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:574936363cd4b9eed8acdd6b80d0143162f2eb654d96cb3a8ee91d3e64bf4cf9"},
643 | {file = "pydantic-1.9.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c556695b699f648c58373b542534308922c46a1cda06ea47bc9ca45ef5b39ae6"},
644 | {file = "pydantic-1.9.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f947352c3434e8b937e3aa8f96f47bdfe6d92779e44bb3f41e4c213ba6a32145"},
645 | {file = "pydantic-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5e48ef4a8b8c066c4a31409d91d7ca372a774d0212da2787c0d32f8045b1e034"},
646 | {file = "pydantic-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:96f240bce182ca7fe045c76bcebfa0b0534a1bf402ed05914a6f1dadff91877f"},
647 | {file = "pydantic-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:815ddebb2792efd4bba5488bc8fde09c29e8ca3227d27cf1c6990fc830fd292b"},
648 | {file = "pydantic-1.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c5b77947b9e85a54848343928b597b4f74fc364b70926b3c4441ff52620640c"},
649 | {file = "pydantic-1.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c68c3bc88dbda2a6805e9a142ce84782d3930f8fdd9655430d8576315ad97ce"},
650 | {file = "pydantic-1.9.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a79330f8571faf71bf93667d3ee054609816f10a259a109a0738dac983b23c3"},
651 | {file = "pydantic-1.9.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f5a64b64ddf4c99fe201ac2724daada8595ada0d102ab96d019c1555c2d6441d"},
652 | {file = "pydantic-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a733965f1a2b4090a5238d40d983dcd78f3ecea221c7af1497b845a9709c1721"},
653 | {file = "pydantic-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cc6a4cb8a118ffec2ca5fcb47afbacb4f16d0ab8b7350ddea5e8ef7bcc53a16"},
654 | {file = "pydantic-1.9.0-py3-none-any.whl", hash = "sha256:085ca1de245782e9b46cefcf99deecc67d418737a1fd3f6a4f511344b613a5b3"},
655 | {file = "pydantic-1.9.0.tar.gz", hash = "sha256:742645059757a56ecd886faf4ed2441b9c0cd406079c2b4bee51bcc3fbcd510a"},
656 | ]
657 | pymgclient = [
658 | {file = "pymgclient-1.2.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:908b039188c31b0fc6117aacc040c0ed33067a9e09cb14c934eecf73e429f961"},
659 | {file = "pymgclient-1.2.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:a78a48c84ff77733fde72c29c2fbbafa3fb81150171ef336976c18e17a655b18"},
660 | {file = "pymgclient-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:a123eeda47d8c2cb90ea8fe765041f0324dd36b9db60664dad62969a5a581bd0"},
661 | {file = "pymgclient-1.2.0-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:c6e66f519d17995812be06ca3d4cf8c476e8b3740226abd1655bbd8817c572bd"},
662 | {file = "pymgclient-1.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:88d8809b0048a0cfc61636290d57f7230b34d28bbc8be429f8b4e7e84e697804"},
663 | {file = "pymgclient-1.2.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:660806bdb256ca3eb0220dea36f4bca5b7d2ce867295113b88c0ffacedcd011a"},
664 | {file = "pymgclient-1.2.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:f3197e71aa32df6069cef5bb8da74248bc4a3f260a9ccde5efc939f0ffce21a2"},
665 | {file = "pymgclient-1.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:2c6cb017e7e41ae47c1c23d5503ee2fc2dfee7166c08742dd7c83b1d4942517c"},
666 | {file = "pymgclient-1.2.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:b77941967bc7d24009a125d0dbf6bd4fa04dd5ba102d30360408fd609a397025"},
667 | {file = "pymgclient-1.2.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:d3855b32d6c011dcf85b6d0533e1546ba8cefd2cd936824156c313465a2f5c23"},
668 | {file = "pymgclient-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:49c47e9dc6d228607589494cafecf402e76c4d22c864951392495069c6ff95ec"},
669 | {file = "pymgclient-1.2.0.tar.gz", hash = "sha256:50143bd138880dd32218d17dada37ade12f7a7b35d7903605e76a1149fd8bb3e"},
670 | ]
671 | pyparsing = [
672 | {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"},
673 | {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"},
674 | ]
675 | pytest = [
676 | {file = "pytest-5.4.3-py3-none-any.whl", hash = "sha256:5c0db86b698e8f170ba4582a492248919255fcd4c79b1ee64ace34301fb589a1"},
677 | {file = "pytest-5.4.3.tar.gz", hash = "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8"},
678 | ]
679 | python-engineio = [
680 | {file = "python-engineio-3.13.2.tar.gz", hash = "sha256:36b33c6aa702d9b6a7f527eec6387a2da1a9a24484ec2f086d76576413cef04b"},
681 | {file = "python_engineio-3.13.2-py2.py3-none-any.whl", hash = "sha256:cfded18156862f94544a9f8ef37f56727df731c8552d7023f5afee8369be2db6"},
682 | ]
683 | python-socketio = [
684 | {file = "python-socketio-4.6.0.tar.gz", hash = "sha256:358d8fbbc029c4538ea25bcaa283e47f375be0017fcba829de8a3a731c9df25a"},
685 | {file = "python_socketio-4.6.0-py2.py3-none-any.whl", hash = "sha256:d437f797c44b6efba2f201867cf02b8c96b97dff26d4e4281ac08b45817cd522"},
686 | ]
687 | six = [
688 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
689 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
690 | ]
691 | typing-extensions = [
692 | {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"},
693 | {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"},
694 | ]
695 | wcwidth = [
696 | {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"},
697 | {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"},
698 | ]
699 | werkzeug = [
700 | {file = "Werkzeug-2.0.1-py3-none-any.whl", hash = "sha256:6c1ec500dcdba0baa27600f6a22f6333d8b662d22027ff9f6202e3367413caa8"},
701 | {file = "Werkzeug-2.0.1.tar.gz", hash = "sha256:1de1db30d010ff1af14a009224ec49ab2329ad2cde454c8a708130642d579c42"},
702 | ]
703 |
--------------------------------------------------------------------------------
/backend/pyproject.toml:
--------------------------------------------------------------------------------
1 | [tool.poetry]
2 | name = "server"
3 | version = "0.1.0"
4 | description = ""
5 | authors = []
6 |
7 | [tool.poetry.dependencies]
8 | python = "^3.9"
9 | Flask = "^2.0.1"
10 | Flask-SocketIO = "4.3.1"
11 | python-engineio = "3.13.2"
12 | python-socketio = "4.6.0"
13 | gqlalchemy = "^1.0.5"
14 | kafka-python = "^2.0.2"
15 | Flask-Cors = "^3.0.10"
16 | gunicorn = "^20.1.0"
17 | eventlet = "0.30.2"
18 | pulsar-client = "^2.9.1"
19 |
20 | [tool.poetry.dev-dependencies]
21 | pytest = "^5.2"
22 |
23 | [build-system]
24 | requires = ["poetry-core>=1.0.0"]
25 | build-backend = "poetry.core.masonry.api"
26 |
--------------------------------------------------------------------------------
/backend/server/__init__.py:
--------------------------------------------------------------------------------
1 | __version__ = '0.1.0'
2 |
--------------------------------------------------------------------------------
/backend/server/app.py:
--------------------------------------------------------------------------------
1 | from argparse import ArgumentParser
2 | from eventlet import greenthread
3 | from flask import Flask, Response
4 | from flask_cors import CORS, cross_origin
5 | from flask_socketio import SocketIO, emit
6 | from functools import wraps
7 | from kafka import KafkaConsumer
8 | import pulsar
9 | import eventlet
10 | import json
11 | import logging
12 | import os
13 | import server.setup as setup
14 | import time
15 |
16 | eventlet.monkey_patch()
17 |
18 | KAFKA_IP = os.getenv("KAFKA_IP", "kafka")
19 | KAFKA_PORT = os.getenv("KAFKA_PORT", "9092")
20 | KAFKA_TOPIC = os.getenv("KAFKA_TOPIC", "created_objects")
21 |
22 | PULSAR_IP = os.getenv("PULSAR_IP", "pulsar")
23 | PULSAR_PORT = os.getenv("PULSAR_PORT", "6650")
24 | PULSAR_TOPIC = os.getenv("PULSAR_TOPIC", "created_objects")
25 |
26 | MEMGRAPH_IP = os.getenv("MEMGRAPH_IP", "memgraph-mage")
27 | MEMGRAPH_PORT = os.getenv("MEMGRAPH_PORT", "7687")
28 |
29 | BROKER = os.getenv("BROKER", "kafka")
30 |
31 | logging.getLogger("server").setLevel(logging.ERROR)
32 | log = logging.getLogger("server")
33 |
34 |
35 | def init_log():
36 | logging.basicConfig(level=logging.DEBUG)
37 | log.info("Logging is enabled")
38 | logging.getLogger("werkzeug").setLevel(logging.WARNING)
39 |
40 |
41 | def log_time(func):
42 | @wraps(func)
43 | def wrapper(*args, **kwargs):
44 | start_time = time.time()
45 | result = func(*args, **kwargs)
46 | duration = time.time() - start_time
47 | log.info(f"Time for {func.__name__} is {duration}")
48 | return result
49 |
50 | return wrapper
51 |
52 |
53 | app = Flask(__name__)
54 | socketio = SocketIO(app, cors_allowed_origins="*", async_mode="eventlet")
55 | cors = CORS(app)
56 | memgraph = None
57 |
58 |
59 | def set_up_memgraph_and_broker():
60 | global memgraph
61 | memgraph = setup.connect_to_memgraph(MEMGRAPH_IP, MEMGRAPH_PORT)
62 | setup.run(memgraph)
63 |
64 |
65 | @app.route("/health", methods=["GET"])
66 | @cross_origin()
67 | def get_health():
68 | return Response(json.dumps("Health OK"), status=200)
69 |
70 |
71 | def kafkaconsumer():
72 | consumer = KafkaConsumer(KAFKA_TOPIC, bootstrap_servers=KAFKA_IP + ":" + KAFKA_PORT)
73 | try:
74 | while True:
75 | msg_pack = consumer.poll()
76 | if not msg_pack:
77 | greenthread.sleep(1)
78 | continue
79 | for _, messages in msg_pack.items():
80 | for message in messages:
81 | message = json.loads(message.value.decode("utf8"))
82 | log.info("Message: " + str(message))
83 | try:
84 | socketio.emit("consumer", {"data": message})
85 | except Exception as error:
86 | log.info(f"`{message}`, {repr(error)}")
87 | continue
88 | except KeyboardInterrupt:
89 | pass
90 |
91 |
92 | def pulsarconsumer():
93 | client = pulsar.Client("pulsar://" + PULSAR_IP + ":" + PULSAR_PORT)
94 | consumer = client.subscribe(
95 | PULSAR_TOPIC, "backend-subscription", consumer_type=pulsar.ConsumerType.Shared
96 | )
97 | while True:
98 | msg = consumer.receive()
99 | message = json.loads(msg.data().decode("utf8"))
100 | log.info(message)
101 | try:
102 | consumer.acknowledge(msg)
103 | socketio.emit("consumer", {"data": message})
104 | except Exception as error:
105 | log.info(f"`{message}`, {repr(error)}")
106 | consumer.negative_acknowledge(msg)
107 | client.close()
108 | greenthread.sleep(0.2)
109 |
110 |
111 | @app.before_first_request
112 | def execute_this():
113 | init_log()
114 | greenthread.spawn(set_up_memgraph_and_broker())
115 | if BROKER == 'kafka':
116 | greenthread.spawn(kafkaconsumer)
117 | else:
118 | greenthread.spawn(pulsarconsumer)
119 |
--------------------------------------------------------------------------------
/backend/server/setup.py:
--------------------------------------------------------------------------------
1 | from gqlalchemy import (
2 | Memgraph,
3 | MemgraphKafkaStream,
4 | MemgraphPulsarStream,
5 | MemgraphTrigger,
6 | )
7 | from gqlalchemy.models import (
8 | TriggerEventType,
9 | TriggerEventObject,
10 | TriggerExecutionPhase,
11 | )
12 | from time import sleep
13 | import logging
14 | import os
15 |
16 | BROKER = os.getenv("BROKER", "kafka")
17 |
18 | log = logging.getLogger("server")
19 |
20 |
21 | def connect_to_memgraph(memgraph_ip, memgraph_port):
22 | memgraph = Memgraph(host=memgraph_ip, port=int(memgraph_port))
23 | while True:
24 | try:
25 | if memgraph._get_cached_connection().is_active():
26 | return memgraph
27 | except:
28 | log.info("Memgraph probably isn't running.")
29 | sleep(1)
30 |
31 |
32 | def run(memgraph):
33 | try:
34 | memgraph.drop_database()
35 |
36 | log.info("Setting up PageRank")
37 | memgraph.execute("CALL pagerank_online.set(100, 0.2) YIELD *")
38 | memgraph.execute(
39 | """CREATE TRIGGER pagerank_trigger
40 | BEFORE COMMIT
41 | EXECUTE CALL pagerank_online.update(createdVertices, createdEdges, deletedVertices, deletedEdges) YIELD *
42 | SET node.rank = rank
43 | CALL publisher.update_rank(node, rank);"""
44 | )
45 |
46 | log.info("Setting up community detection")
47 | memgraph.execute(
48 | "CALL community_detection_online.set(False, False, 0.7, 4.0, 0.1, 'weight', 1.0, 100, 5) YIELD *;"
49 | )
50 | memgraph.execute(
51 | """CREATE TRIGGER labelrankt_trigger
52 | BEFORE COMMIT
53 | EXECUTE CALL community_detection_online.update(createdVertices, createdEdges, updatedVertices, updatedEdges, deletedVertices, deletedEdges)
54 | YIELD node, community_id
55 | SET node.cluster=community_id
56 | CALL publisher.update_cluster(node, community_id);"""
57 | )
58 |
59 | log.info("Creating stream connections on Memgraph")
60 | stream = None
61 | if BROKER == "kafka":
62 | stream = MemgraphKafkaStream(
63 | name="retweets",
64 | topics=["retweets"],
65 | transform="twitter.tweet",
66 | bootstrap_servers="'kafka:9092'",
67 | )
68 | else:
69 | stream = MemgraphPulsarStream(
70 | name="retweets",
71 | topics=["retweets"],
72 | transform="twitter.tweet",
73 | service_url="'pulsar://pulsar:6650'",
74 | )
75 | memgraph.create_stream(stream)
76 | memgraph.start_stream(stream)
77 |
78 | log.info("Creating triggers on Memgraph")
79 | trigger = MemgraphTrigger(
80 | name="created_trigger",
81 | event_type=TriggerEventType.CREATE,
82 | event_object=TriggerEventObject.ALL,
83 | execution_phase=TriggerExecutionPhase.AFTER,
84 | statement="CALL publisher.create(createdObjects)",
85 | )
86 | memgraph.create_trigger(trigger)
87 |
88 | except Exception as e:
89 | log.info(f"Error on stream and trigger creation: {e}")
90 | pass
91 |
--------------------------------------------------------------------------------
/backend/server/templates/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
24 |
25 |
26 |
27 |
30 | Logs
31 |
32 | Consumer
33 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/backend/tests/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/memgraph/twitter-network-analysis/a81f588d7d02fd99d445d57828ef8367fdf409b7/backend/tests/__init__.py
--------------------------------------------------------------------------------
/backend/tests/test_backend.py:
--------------------------------------------------------------------------------
1 | from backend import __version__
2 |
3 |
4 | def test_version():
5 | assert __version__ == '0.1.0'
6 |
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: "3"
2 |
3 | networks:
4 | app-tier:
5 | driver: bridge
6 |
7 | services:
8 | memgraph-mage-kafka:
9 | build: ./memgraph
10 | ports:
11 | - "7687:7687"
12 | - "7444:7444"
13 | environment:
14 | KAFKA_IP: kafka
15 | KAFKA_PORT: "9092"
16 | BROKER: "kafka"
17 | entrypoint:
18 | [
19 | "/usr/lib/memgraph/memgraph",
20 | "--telemetry-enabled=false",
21 | "--query-modules-directory=/procedures,/transformations,/usr/lib/memgraph/query_modules",
22 | "--log-level=TRACE",
23 | ]
24 | networks:
25 | - app-tier
26 |
27 | memgraph-mage-pulsar:
28 | build: ./memgraph
29 | ports:
30 | - "7687:7687"
31 | - "7444:7444"
32 | environment:
33 | PULSAR_IP: pulsar
34 | PULSAR_PORT: "6650"
35 | BROKER: "pulsar"
36 | entrypoint:
37 | [
38 | "/usr/lib/memgraph/memgraph",
39 | "--telemetry-enabled=false",
40 | "--query-modules-directory=/procedures,/transformations,/usr/lib/memgraph/query_modules",
41 | "--log-level=TRACE",
42 | ]
43 | networks:
44 | - app-tier
45 |
46 | zookeeper:
47 | image: "bitnami/zookeeper:3.7"
48 | ports:
49 | - "2181:2181"
50 | environment:
51 | - ALLOW_ANONYMOUS_LOGIN=yes
52 | networks:
53 | - app-tier
54 | logging:
55 | driver: none
56 |
57 | kafka:
58 | image: "bitnami/kafka:2"
59 | logging:
60 | driver: none
61 | ports:
62 | - "9092:9092"
63 | - "9093:9093"
64 | environment:
65 | - KAFKA_BROKER_ID=1
66 | - ALLOW_PLAINTEXT_LISTENER=yes
67 | - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
68 | - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CLIENT:PLAINTEXT,EXTERNAL:PLAINTEXT
69 | - KAFKA_CFG_LISTENERS=CLIENT://:9092,EXTERNAL://:9093
70 | - KAFKA_CFG_ADVERTISED_LISTENERS=CLIENT://kafka:9092,EXTERNAL://localhost:9093
71 | - KAFKA_INTER_BROKER_LISTENER_NAME=CLIENT
72 | depends_on:
73 | - zookeeper
74 | networks:
75 | - app-tier
76 |
77 | pulsar:
78 | image: apachepulsar/pulsar:2.10.0
79 | ports:
80 | - 8080:8080
81 | - 6650:6650
82 | environment:
83 | PULSAR_MEM: " -Xms512m -Xmx512m -XX:MaxDirectMemorySize=1g"
84 | command: bin/pulsar standalone
85 | networks:
86 | - app-tier
87 |
88 | stream-kafka:
89 | build:
90 | context: ./
91 | dockerfile: ./stream/Dockerfile
92 | entrypoint: ["python3", "produce.py", "--stream-delay", "2.0", "--broker", "kafka"]
93 | environment:
94 | KAFKA_IP: kafka
95 | KAFKA_PORT: 9092
96 | KAFKA_TOPIC: "retweets"
97 | networks:
98 | - app-tier
99 |
100 | stream-pulsar:
101 | build:
102 | context: ./
103 | dockerfile: ./stream/Dockerfile
104 | entrypoint: ["python3", "produce.py", "--stream-delay", "2.0", "--broker", "pulsar"]
105 | environment:
106 | PULSAR_IP: pulsar
107 | PULSAR_PORT: 6650
108 | PULSAR_TOPIC: "retweets"
109 | networks:
110 | - app-tier
111 |
112 | backend-pulsar:
113 | build: ./backend
114 | entrypoint: ["gunicorn", "--worker-class", "eventlet", "-w", "1", "-b", "0.0.0.0:5000", "--preload", "server.app:app"]
115 | volumes:
116 | - ./backend:/app
117 | ports:
118 | - "5000:5000"
119 | environment:
120 | PULSAR_IP: pulsar
121 | PULSAR_PORT: 6650
122 | PULSAR_TOPIC: "created_objects"
123 | MEMGRAPH_IP: memgraph-mage-pulsar
124 | MEMGRAPH_PORT: "7687"
125 | BROKER: "pulsar"
126 | depends_on:
127 | - pulsar
128 | networks:
129 | - app-tier
130 |
131 | backend-kafka:
132 | build: ./backend
133 | entrypoint: ["gunicorn", "--worker-class", "eventlet", "-w", "1", "-b", "0.0.0.0:5000", "--preload", "server.app:app"]
134 | volumes:
135 | - ./backend:/app
136 | ports:
137 | - "5000:5000"
138 | environment:
139 | KAFKA_IP: kafka
140 | KAFKA_PORT: 9092
141 | KAFKA_TOPIC: "created_objects"
142 | MEMGRAPH_IP: memgraph-mage-kafka
143 | MEMGRAPH_PORT: "7687"
144 | BROKER: "kafka"
145 | depends_on:
146 | - kafka
147 | networks:
148 | - app-tier
149 |
150 | frontend-app:
151 | build: ./frontend
152 | volumes:
153 | - ./frontend:/app
154 | - /app/node_modules
155 | ports:
156 | - "3000:3000"
157 | networks:
158 | - app-tier
159 |
--------------------------------------------------------------------------------
/frontend/.dockerignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | build
3 | .dockerignore
4 | Dockerfile
--------------------------------------------------------------------------------
/frontend/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
--------------------------------------------------------------------------------
/frontend/Dockerfile:
--------------------------------------------------------------------------------
1 | # pull official base image
2 | FROM node:14.17.5-alpine
3 |
4 | # set working directory
5 | WORKDIR /app
6 |
7 | # add `/app/node_modules/.bin` to $PATH
8 | ENV PATH /app/node_modules/.bin:$PATH
9 |
10 | # install app dependencies
11 | COPY package.json ./
12 | COPY package-lock.json ./
13 | RUN npm install --silent
14 | RUN npm install react-scripts@3.4.1 -g --silent
15 |
16 | # add app
17 | COPY . ./
18 |
19 | # start app
20 | CMD ["npm", "start"]
--------------------------------------------------------------------------------
/frontend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "frontend",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@testing-library/jest-dom": "^5.16.1",
7 | "@testing-library/react": "^12.1.2",
8 | "@testing-library/user-event": "^13.5.0",
9 | "d3": "^7.2.0",
10 | "react": "^17.0.2",
11 | "react-dom": "^17.0.2",
12 | "react-scripts": "5.0.0",
13 | "socket.io-client": "^2.3.1",
14 | "web-vitals": "^2.1.2"
15 | },
16 | "scripts": {
17 | "start": "react-scripts start",
18 | "build": "react-scripts build",
19 | "test": "react-scripts test",
20 | "eject": "react-scripts eject"
21 | },
22 | "eslintConfig": {
23 | "extends": [
24 | "react-app",
25 | "react-app/jest"
26 | ]
27 | },
28 | "browserslist": {
29 | "production": [
30 | ">0.2%",
31 | "not dead",
32 | "not op_mini all"
33 | ],
34 | "development": [
35 | "last 1 chrome version",
36 | "last 1 firefox version",
37 | "last 1 safari version"
38 | ]
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/frontend/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/memgraph/twitter-network-analysis/a81f588d7d02fd99d445d57828ef8367fdf409b7/frontend/public/favicon.ico
--------------------------------------------------------------------------------
/frontend/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
12 |
13 |
17 |
18 |
27 | React App
28 |
29 |
30 | You need to enable JavaScript to run this app.
31 |
32 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/frontend/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/memgraph/twitter-network-analysis/a81f588d7d02fd99d445d57828ef8367fdf409b7/frontend/public/logo192.png
--------------------------------------------------------------------------------
/frontend/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/memgraph/twitter-network-analysis/a81f588d7d02fd99d445d57828ef8367fdf409b7/frontend/public/logo512.png
--------------------------------------------------------------------------------
/frontend/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/frontend/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/frontend/src/App.css:
--------------------------------------------------------------------------------
1 | .App {
2 | text-align: center;
3 | }
4 |
5 | .App-logo {
6 | height: 40vmin;
7 | pointer-events: none;
8 | }
9 |
10 | @media (prefers-reduced-motion: no-preference) {
11 | .App-logo {
12 | animation: App-logo-spin infinite 20s linear;
13 | }
14 | }
15 |
16 | .App-header {
17 | background-color: #282c34;
18 | min-height: 100vh;
19 | display: flex;
20 | flex-direction: column;
21 | align-items: center;
22 | justify-content: center;
23 | font-size: calc(10px + 2vmin);
24 | color: white;
25 | }
26 |
27 | .App-link {
28 | color: #61dafb;
29 | }
30 |
31 | @keyframes App-logo-spin {
32 | from {
33 | transform: rotate(0deg);
34 | }
35 | to {
36 | transform: rotate(360deg);
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/frontend/src/App.js:
--------------------------------------------------------------------------------
1 | //import { useState } from 'react';
2 | import './App.css';
3 | import CommunityDetection from './components/CommunityDetection';
4 | import PageRank from './components/PageRank';
5 | import React from 'react';
6 | import io from "socket.io-client"
7 |
8 |
9 |
10 | export default class App extends React.Component {
11 | render() {
12 | const socket = io("http://localhost:5000/", { transports: ["websocket"] })
13 | return (
14 |
18 | );
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/frontend/src/App.test.js:
--------------------------------------------------------------------------------
1 | import { render, screen } from '@testing-library/react';
2 | import App from './App';
3 |
4 | test('renders learn react link', () => {
5 | render( );
6 | const linkElement = screen.getByText(/learn react/i);
7 | expect(linkElement).toBeInTheDocument();
8 | });
9 |
--------------------------------------------------------------------------------
/frontend/src/components/CommunityDetection.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import * as d3 from "d3";
3 |
4 | var node;
5 | var link;
6 | var simulation;
7 | var forceLink;
8 | var width = 1000;
9 | var height = 700;
10 | var tooltip;
11 | var clusterColors = {};
12 |
13 | /**
14 | * Component that draws nodes and edges as a part of different communities in real-time.
15 | */
16 | export default class CommunityDetection extends React.Component {
17 |
18 | constructor(props) {
19 | super(props);
20 | this.myReference = React.createRef();
21 | this.state = {
22 | nodes: [],
23 | links: []
24 | }
25 | this.socket = this.props.socket
26 | }
27 |
28 |
29 | async firstRequest() {
30 | let response = await fetch("http://localhost:5000/health")
31 |
32 | if (!response.ok) {
33 | throw new Error(`HTTP error! status: ${response.status}`);
34 | }
35 | else
36 | console.log(response)
37 | }
38 |
39 | transformData(data) {
40 | var nodes = data.vertices.map((vertex) => {
41 | return {
42 | id: vertex.id,
43 | type: vertex.labels[0],
44 | username: vertex.username,
45 | cluster: vertex.cluster,
46 | };
47 | });
48 | var links = data.edges.map((edge) => {
49 | return {
50 | id: edge.id,
51 | source: edge.source,
52 | target: edge.target,
53 | type: edge.type,
54 | };
55 | });
56 |
57 | return { nodes, links };
58 | }
59 |
60 | isRankUpdated(msg) {
61 | let nodes = msg.data.vertices
62 | if (nodes.length !== 1)
63 | return false
64 | return !("cluster" in nodes["0"])
65 | }
66 |
67 | componentDidMount() {
68 | this.initializeGraph()
69 | this.firstRequest();
70 |
71 | this.socket.on("connect", () => {
72 | //this.socket.emit('consumer')
73 | console.log("Connected to socket ", this.socket.id)
74 | });
75 |
76 | this.socket.on("connect_error", (err) => { console.log(err) });
77 | this.socket.on("disconnect", () => {
78 | console.log("Disconnected from socket.")
79 | });
80 |
81 | this.socket.on("consumer", (msg) => {
82 |
83 | console.log('Received a message from the WebSocket service: ', msg.data);
84 |
85 | var oldNodes = this.state.nodes
86 | var oldLinks = this.state.links
87 | var updatedNodes = []
88 |
89 | var myData = this.transformData(msg.data)
90 | var newNodes = myData.nodes
91 | var newLinks = myData.links
92 | var newNode = newNodes["0"]
93 |
94 | // ignore rank updates
95 | if (this.isRankUpdated(msg)) {
96 | return
97 | }
98 |
99 | // if cluster update or simple msg
100 | var value = oldNodes.find((node) => node.id === newNode.id)
101 | if (typeof value === 'undefined') {
102 | updatedNodes = oldNodes.concat(newNodes)
103 | }
104 | else {
105 | value.cluster = newNode.cluster
106 | updatedNodes = oldNodes
107 | }
108 |
109 | // filter new edges to have only the ones that have source and target node
110 | var filteredLinks = newLinks.filter((link) => {
111 | return (
112 | updatedNodes.find((node) => node.id === link.source) &&
113 | updatedNodes.find((node) => node.id === link.target)
114 | );
115 | })
116 |
117 | var updatedLinks = oldLinks.concat(filteredLinks)
118 |
119 | this.setState({ nodes: updatedNodes, links: updatedLinks })
120 | });
121 |
122 | }
123 |
124 | componentDidUpdate() {
125 | this.updateGraph()
126 | }
127 |
128 | componentWillUnmount() {
129 | this.socket.emit('disconnect');
130 | this.socket.disconnect();
131 | }
132 |
133 | drag() {
134 | function dragstarted(event) {
135 | if (!event.active) simulation.alphaTarget(0.3).restart();
136 | tooltip.style("visibility", "hidden")
137 | event.subject.fx = event.subject.x;
138 | event.subject.fy = event.subject.y;
139 | }
140 |
141 | function dragged(event) {
142 | tooltip.style("visibility", "hidden")
143 | event.subject.fx = event.x;
144 | event.subject.fy = event.y;
145 |
146 | }
147 |
148 | function dragended(event) {
149 | tooltip.style("visibility", "hidden")
150 | if (!event.active) simulation.alphaTarget(0);
151 | event.subject.fx = null;
152 | event.subject.fy = null;
153 | }
154 |
155 | return d3
156 | .drag()
157 | .on("start", dragstarted)
158 | .on("drag", dragged)
159 | .on("end", dragended);
160 | }
161 |
162 | handleZoom(e) {
163 | d3.selectAll(".CommunityDetectionSvg g")
164 | .attr("transform", e.transform)
165 | }
166 |
167 | initZoom(zoom) {
168 | d3.select('.CommunityDetectionSvg')
169 | .call(zoom);
170 | }
171 |
172 | createTooltip() {
173 | return (d3.select(".CommunityDetectionDiv")
174 | .append("div")
175 | .attr("class", "tooltip-cd")
176 | .style("position", "absolute")
177 | .style("z-index", "10")
178 | .style("visibility", "hidden"));
179 | }
180 |
181 | /**
182 | * Method that initializes everything that will be drawn.
183 | */
184 | initializeGraph(nodes, links) {
185 | var svg = d3.select(this.myReference.current);
186 | svg.selectAll("*").remove();
187 |
188 | var zoom = d3.zoom()
189 | .on("zoom", this.handleZoom)
190 | this.initZoom(zoom)
191 | d3.select(".CommunityDetectionSvg")
192 | .call(zoom)
193 |
194 | tooltip = this.createTooltip()
195 | forceLink = d3.forceLink(this.state.links).id(function (n) { return n.id; })
196 |
197 | // set up simulation, link and node
198 | simulation = d3
199 | .forceSimulation(nodes)
200 | .force('link', forceLink)
201 | .force(
202 | 'collide',
203 | d3
204 | .forceCollide()
205 | .radius(function (d) {
206 | return 20;
207 | })
208 | )
209 | .force("center", d3.forceCenter(width / 2, height / 2))
210 | .force(
211 | "x",
212 | d3.forceX().strength(0.05)
213 | )
214 | .force(
215 | "y",
216 | d3.forceY().strength(0.05)
217 | );
218 |
219 |
220 | simulation.on("tick", () => {
221 | node.attr("cx", (d) => d.x).attr("cy", (d) => d.y);
222 | link
223 | .attr('x1', (d) => d.source.x)
224 | .attr('y1', (d) => d.source.y)
225 | .attr('x2', (d) => d.target.x)
226 | .attr('y2', (d) => d.target.y);
227 | });
228 |
229 | link = svg.append("g")
230 | .attr('stroke', 'black')
231 | .attr('stroke-opacity', 0.8)
232 | .selectAll('line')
233 | .data(this.state.links)
234 | .join('line')
235 | .attr('id', (d) => d.source.id + '-' + d.target.id)
236 | .attr('stroke-width', 1.5);
237 |
238 |
239 | node = svg.append("g")
240 | .selectAll("circle")
241 | .data(this.state.nodes)
242 | .join("circle")
243 | .attr("r", function (d) {
244 | return 7;
245 | })
246 | .attr("class", "node")
247 | .attr('fill', function (d) {
248 | let cluster = d.cluster
249 | let key = cluster.toString()
250 | if (!(key in clusterColors)) {
251 | clusterColors[key] = "#" + Math.floor(Math.random() * 16777215).toString(16)
252 | }
253 | return clusterColors[key]
254 | })
255 | .on("mouseover", function (d) {
256 | tooltip.text(d.srcElement["__data__"]["username"])
257 | tooltip.style("visibility", "visible")
258 | })
259 | .on("mousemove", function (event, d) { return tooltip.style("top", (event.y - 10) + "px").style("left", (event.x + 10) + "px"); })
260 | .on("mouseout", function (event, d) { return tooltip.style("visibility", "hidden"); })
261 | .call(this.drag(simulation));
262 |
263 |
264 | }
265 |
266 | /**
267 | * Method that is called on every new node/edge and draws updated graph.
268 | */
269 | updateGraph() {
270 |
271 | // Remove old nodes
272 | node.exit().remove();
273 |
274 | // Give attributes to all nodes that enter -> new ones + merge - update the existing DOM elements
275 | node = node.data(this.state.nodes, (d) => d.id);
276 | node = node
277 | .enter()
278 | .append('circle')
279 | .merge(node)
280 | .attr("r", function (d) {
281 | return 7;
282 | })
283 | .attr('fill', function (d) {
284 | let cluster = d.cluster
285 | let key = cluster.toString()
286 | if (!(key in clusterColors)) {
287 | clusterColors[key] = "#" + Math.floor(Math.random() * 16777215).toString(16)
288 | }
289 | return clusterColors[key]
290 | })
291 | .on("mouseover", function (d) {
292 | tooltip.text(d.srcElement["__data__"]["username"])
293 | tooltip.style("visibility", "visible")
294 | })
295 | .on("mousemove", function (event, d) { return tooltip.style("top", (event.y - 10) + "px").style("left", (event.x + 10) + "px"); })
296 | .on("mouseout", function (event, d) { return tooltip.style("visibility", "hidden"); })
297 | .call(this.drag());
298 |
299 | link.exit().remove();
300 | link = link.data(this.state.links, (d) => {
301 | return d.source.id + '-' + d.target.id;
302 | });
303 | link = link
304 | .enter()
305 | .append('line')
306 | .merge(link)
307 | .attr('id', (d) => d.source.id + '-' + d.target.id)
308 | .attr('stroke', 'black')
309 | .attr('stroke-opacity', 0.8)
310 | .attr('stroke-width', 1.5);
311 |
312 | // Set up simulation on new nodes and links
313 | try {
314 | simulation
315 | .nodes(this.state.nodes)
316 | forceLink.links(this.state.links)
317 | } catch (err) {
318 | console.log('err', err);
319 | }
320 |
321 | simulation.alphaTarget(0.1).restart();
322 | }
323 |
324 | render() {
325 | return (
326 |
Community Detection
327 |
335 | );
336 | }
337 |
338 | }
--------------------------------------------------------------------------------
/frontend/src/components/PageRank.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import * as d3 from "d3";
3 |
4 |
5 | var node;
6 | var link;
7 | var forceCollide;
8 | var forceLink;
9 | var simulation;
10 | var width = 1000;
11 | var height = 700;
12 | var tooltip;
13 |
14 | /**
15 | * Component that draws nodes and edges in real-time.
16 | * Size of each node is proportional to the value of its rank property.
17 | */
18 | export default class PageRank extends React.Component {
19 |
20 | constructor(props) {
21 | super(props);
22 | this.myReference = React.createRef();
23 | this.state = {
24 | nodes: [],
25 | links: []
26 | }
27 | this.socket = this.props.socket
28 | }
29 |
30 | async firstRequest() {
31 | let response = await fetch("http://localhost:5000/health")
32 |
33 | if (!response.ok){
34 | throw new Error(`HTTP error! status: ${response.status}`);
35 | }
36 | else
37 | console.log(response)
38 | }
39 |
40 | transformData(data) {
41 | var nodes = data.vertices.map((vertex) => {
42 | return {
43 | id: vertex.id,
44 | type: vertex.labels[0],
45 | username: vertex.username,
46 | rank: vertex.rank,
47 | };
48 | });
49 | var links = data.edges.map((edge) => {
50 | return {
51 | id: edge.id,
52 | source: edge.source,
53 | target: edge.target,
54 | type: edge.type,
55 | };
56 | });
57 |
58 | return { nodes, links };
59 | }
60 |
61 | isClusterUpdated(msg) {
62 | let nodes = msg.data.vertices
63 | if(nodes.length !== 1)
64 | return false
65 | return !("rank" in nodes["0"])
66 | }
67 |
68 |
69 | componentDidMount() {
70 | this.initializeGraph()
71 | this.firstRequest()
72 |
73 | this.socket.on("connect", () => {
74 | //this.socket.emit('consumer')
75 | console.log("Connected to socket ", this.socket.id)
76 | });
77 |
78 | this.socket.on("connect_error", (err) => { console.log(err) });
79 | this.socket.on("disconnect", () => {
80 | console.log("Disconnected from socket.")
81 | });
82 |
83 | this.socket.on("consumer", (msg) => {
84 | console.log('Received a message from the WebSocket service: ', msg.data);
85 |
86 | var oldNodes = this.state.nodes
87 | var oldLinks = this.state.links
88 | var updatedNodes = []
89 |
90 | var myData = this.transformData(msg.data)
91 | var newNodes = myData.nodes
92 | var newLinks = myData.links
93 | var newNode = newNodes["0"]
94 |
95 | // ignore cluster updates
96 | if(this.isClusterUpdated(msg))
97 | return
98 |
99 | // if rank update or simple msg
100 | var value = oldNodes.find((node) => node.id === newNode.id)
101 | if(typeof value === 'undefined'){
102 | updatedNodes = oldNodes.concat(newNodes)
103 | }
104 | else {
105 | value.rank = newNode.rank
106 | updatedNodes = oldNodes
107 | }
108 |
109 | // filter new edges to have only the ones that have source and target node
110 | var filteredLinks = newLinks.filter((link) => {
111 | return (
112 | updatedNodes.find((node) => node.id === link.source) &&
113 | updatedNodes.find((node) => node.id === link.target)
114 | );
115 | })
116 |
117 | var updatedLinks = oldLinks.concat(filteredLinks)
118 |
119 | this.setState({ nodes: updatedNodes, links: updatedLinks })
120 | });
121 |
122 | }
123 |
124 | componentDidUpdate() {
125 | this.updateGraph()
126 | }
127 |
128 | componentWillUnmount() {
129 | this.socket.emit('disconnect');
130 | this.socket.disconnect();
131 | }
132 |
133 | drag() {
134 | function dragstarted(event) {
135 | if (!event.active) simulation.alphaTarget(0.3).restart();
136 | tooltip.style("visibility", "hidden")
137 | event.subject.fx = event.subject.x;
138 | event.subject.fy = event.subject.y;
139 | }
140 |
141 | function dragged(event) {
142 | tooltip.style("visibility", "hidden")
143 | event.subject.fx = event.x;
144 | event.subject.fy = event.y;
145 |
146 | }
147 |
148 | function dragended(event) {
149 | tooltip.style("visibility", "hidden")
150 | if (!event.active) simulation.alphaTarget(0);
151 | event.subject.fx = null;
152 | event.subject.fy = null;
153 | }
154 |
155 | return d3
156 | .drag()
157 | .on("start", dragstarted)
158 | .on("drag", dragged)
159 | .on("end", dragended);
160 | }
161 |
162 | handleZoom(e) {
163 | d3.selectAll(".PageRankSvg g")
164 | .attr("transform", e.transform)
165 | }
166 |
167 | initZoom(zoom) {
168 | d3.select('.PageRankSvg')
169 | .call(zoom);
170 | }
171 |
172 | defineGradient(svg) {
173 | // Memgraph brand colors
174 | const colors = ["#FFC500", "#FB6E00", "#DD2222", "#FF0092", "#720096"]
175 | // Define the gradient
176 | const gradient = svg.append("svg:defs")
177 | .append("svg:linearGradient")
178 | .attr("id", "gradient")
179 | .attr("x1", "0%")
180 | .attr("y1", "0%")
181 | .attr("x2", "100%")
182 | .attr("y2", "100%")
183 | .attr("spreadMethod", "pad");
184 |
185 | gradient.selectAll("stop")
186 | .data(colors)
187 | .enter()
188 | .append("svg:stop")
189 | .style("stop-color", function (d) { return d; })
190 | .attr("offset", function (d, i) { return 100 * (i / (colors.length - 1)) + "%"; })
191 | .attr("stop-opacity", function (d, i) { return 1.0; });
192 | }
193 |
194 | createTooltip() {
195 | return (d3.select(".PageRankDiv")
196 | .append("div")
197 | .attr("class", "tooltip-cd")
198 | .style("position", "absolute")
199 | .style("z-index", "10")
200 | .style("visibility", "hidden"));
201 | }
202 |
203 | /**
204 | * Method that initializes everything that will be drawn.
205 | */
206 | initializeGraph() {
207 | var svg = d3.select(this.myReference.current);
208 |
209 | svg.selectAll("*").remove();
210 |
211 | var zoom = d3.zoom()
212 | .on("zoom", this.handleZoom)
213 | this.initZoom(zoom)
214 | d3.select(".PageRankSvg")
215 | .call(zoom)
216 |
217 | tooltip = this.createTooltip()
218 |
219 | this.defineGradient(svg)
220 |
221 | forceCollide = d3.forceCollide().strength(1).radius(function (d) {
222 | return d.rank * 1500;
223 | })
224 |
225 | forceLink = d3.forceLink(this.state.links).id(function (n) { return n.id; })
226 |
227 | simulation = d3
228 | .forceSimulation(this.state.nodes)
229 | .force('link', forceLink)
230 | .force('collide', forceCollide)
231 | .force("center", d3.forceCenter(width / 2, height / 2))
232 | .force(
233 | "x",
234 | d3.forceX().strength(0.05)
235 | )
236 | .force(
237 | "y",
238 | d3.forceY().strength(0.05)
239 | );
240 |
241 | simulation.on("tick", () => {
242 | node.attr("cx", (d) => d.x).attr("cy", (d) => d.y);
243 | link
244 | .attr('x1', (d) => d.source.x)
245 | .attr('y1', (d) => d.source.y)
246 | .attr('x2', (d) => d.target.x)
247 | .attr('y2', (d) => d.target.y);
248 | });
249 |
250 | link = svg.append("g")
251 | .attr("class", "links")
252 | .selectAll('line')
253 | .data(this.state.links)
254 | .join('line')
255 | .attr('stroke', 'black')
256 | .attr('id', (d) => d.source.id + '-' + d.target.id)
257 | .attr('stroke-width', 1.2);
258 |
259 | node = svg.append("g")
260 | .attr("class", "nodes")
261 | .selectAll("circle")
262 | .data(this.state.nodes)
263 | .join("circle")
264 | .attr("r", function (d) {
265 | return d.rank * 700;
266 | })
267 | .attr('fill', 'url(#gradient)')
268 | .on("mouseover", function (d) {
269 | tooltip.text(d.srcElement["__data__"]["username"])
270 | tooltip.style("visibility", "visible")
271 | })
272 | .on("mousemove", function (event, d) { return tooltip.style("top", (event.y - 15) + "px").style("left", (event.x + 15) + "px"); })
273 | .on("mouseout", function (event, d) { return tooltip.style("visibility", "hidden"); })
274 | .call(this.drag(simulation));
275 |
276 | }
277 |
278 | /**
279 | * Method that is called on every new incoming msg and draws updated graph.
280 | */
281 | updateGraph() {
282 |
283 | // Remove anything that was removed from nodes array
284 | node.exit().remove();
285 |
286 | // Give attributes to all nodes that enter -> new ones + merge - update the existing DOM elements
287 | node = node.data(this.state.nodes, (d) => d.id);
288 | node = node
289 | .enter()
290 | .append('circle')
291 | .merge(node) //returns a brand new selection that contains both enter and update selection
292 | .attr("r", function (d) {
293 | return d.rank * 700;
294 | })
295 | .attr('fill', 'url(#gradient)')
296 | .on("mouseover", function (d) {
297 | tooltip.text(d.srcElement["__data__"]["username"])
298 | tooltip.style("visibility", "visible")
299 | })
300 | .on("mousemove", function (event, d) { return tooltip.style("top", (event.y - 15) + "px").style("left", (event.x + 15) + "px"); })
301 | .on("mouseout", function (event, d) { return tooltip.style("visibility", "hidden"); })
302 | .call(this.drag());
303 |
304 |
305 | link.exit().remove();
306 | link = link.data(this.state.links, (d) => {
307 | return d.source.id + '-' + d.target.id;
308 | });
309 | link = link
310 | .enter()
311 | .append('line')
312 | .merge(link)
313 | .attr('id', (d) => d.source.id + '-' + d.target.id)
314 | .attr('stroke', 'black')
315 | .attr('stroke-width', 1.2);
316 |
317 | // Update simulation
318 | try {
319 | simulation
320 | .nodes(this.state.nodes)
321 | .force('collide', forceCollide)
322 | forceLink.links(this.state.links)
323 | } catch (err) {
324 | console.log('err', err);
325 | }
326 |
327 | simulation.alphaTarget(0.1).restart();
328 | }
329 |
330 | render() {
331 | return (
332 |
Number of users that retweeted so far: {this.state.nodes.length}
333 | PageRank
334 |
342 | );
343 |
344 | }
345 |
346 | }
--------------------------------------------------------------------------------
/frontend/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
5 | sans-serif;
6 | -webkit-font-smoothing: antialiased;
7 | -moz-osx-font-smoothing: grayscale;
8 | }
9 |
10 | code {
11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
12 | monospace;
13 | }
14 |
--------------------------------------------------------------------------------
/frontend/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import './index.css';
4 | import App from './App';
5 | import reportWebVitals from './reportWebVitals';
6 |
7 | ReactDOM.render(
8 |
9 |
10 | ,
11 | document.getElementById('root')
12 | );
13 |
14 | // If you want to start measuring performance in your app, pass a function
15 | // to log results (for example: reportWebVitals(console.log))
16 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
17 | reportWebVitals();
18 |
--------------------------------------------------------------------------------
/frontend/src/logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/frontend/src/reportWebVitals.js:
--------------------------------------------------------------------------------
1 | const reportWebVitals = onPerfEntry => {
2 | if (onPerfEntry && onPerfEntry instanceof Function) {
3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
4 | getCLS(onPerfEntry);
5 | getFID(onPerfEntry);
6 | getFCP(onPerfEntry);
7 | getLCP(onPerfEntry);
8 | getTTFB(onPerfEntry);
9 | });
10 | }
11 | };
12 |
13 | export default reportWebVitals;
14 |
--------------------------------------------------------------------------------
/frontend/src/setupTests.js:
--------------------------------------------------------------------------------
1 | // jest-dom adds custom jest matchers for asserting on DOM nodes.
2 | // allows you to do things like:
3 | // expect(element).toHaveTextContent(/react/i)
4 | // learn more: https://github.com/testing-library/jest-dom
5 | import '@testing-library/jest-dom';
6 |
--------------------------------------------------------------------------------
/img/karate-club-graph.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/memgraph/twitter-network-analysis/a81f588d7d02fd99d445d57828ef8367fdf409b7/img/karate-club-graph.png
--------------------------------------------------------------------------------
/img/karate-club-matplotlib.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/memgraph/twitter-network-analysis/a81f588d7d02fd99d445d57828ef8367fdf409b7/img/karate-club-matplotlib.png
--------------------------------------------------------------------------------
/img/memgraph-tutorial-community-detection-stream.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/memgraph/twitter-network-analysis/a81f588d7d02fd99d445d57828ef8367fdf409b7/img/memgraph-tutorial-community-detection-stream.gif
--------------------------------------------------------------------------------
/img/memgraph-tutorial-pagerank-stream.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/memgraph/twitter-network-analysis/a81f588d7d02fd99d445d57828ef8367fdf409b7/img/memgraph-tutorial-pagerank-stream.gif
--------------------------------------------------------------------------------
/img/stream-processing-arc-01-01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/memgraph/twitter-network-analysis/a81f588d7d02fd99d445d57828ef8367fdf409b7/img/stream-processing-arc-01-01.png
--------------------------------------------------------------------------------
/img/twitter-dataset-01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/memgraph/twitter-network-analysis/a81f588d7d02fd99d445d57828ef8367fdf409b7/img/twitter-dataset-01.png
--------------------------------------------------------------------------------
/memgraph/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM memgraph/memgraph-mage:1.1.1
2 |
3 | USER root
4 |
5 | # Install Python
6 | RUN apt-get update && apt-get install -y \
7 | python3-pip \
8 | python3-setuptools \
9 | python3-dev \
10 | && pip3 install -U pip
11 |
12 | # Install pip packages
13 | COPY requirements.txt ./
14 | RUN pip3 install -r requirements.txt
15 |
16 | # Copy the local query modules
17 | COPY transformations/ /transformations
18 | COPY procedures/ /procedures
19 |
20 | USER memgraph
21 |
--------------------------------------------------------------------------------
/memgraph/procedures/link_prediction.py:
--------------------------------------------------------------------------------
1 | import gc
2 | import itertools
3 | import numpy as np
4 | from typing import Dict, List, Tuple
5 | import mgp
6 |
7 | TOP_K_PREDICTIONS = 8
8 |
9 |
10 | def calculate_adjacency_matrix(embeddings: Dict[int, List[float]], threshold=0.0) -> Dict[Tuple[int, int], float]:
11 | def get_edge_weight(i, j) -> float:
12 | if embeddings[i] is None or embeddings[j] is None:
13 | return -1
14 | return np.dot(embeddings[i], embeddings[j])
15 |
16 | nodes = list(embeddings.keys())
17 | nodes = sorted(nodes)
18 | adj_mtx_r = {}
19 | cnt = 0
20 | for pair in itertools.combinations(nodes, 2):
21 |
22 | if cnt % 1000000 == 0:
23 | adj_mtx_r = {k: v for k, v in sorted(adj_mtx_r.items(), key=lambda item: -1 * item[1])}
24 | adj_mtx_r = {k: adj_mtx_r[k] for k in list(adj_mtx_r)[:TOP_K_PREDICTIONS]}
25 | gc.collect()
26 |
27 | weight = get_edge_weight(pair[0], pair[1])
28 | if weight <= threshold:
29 | continue
30 | cnt += 1
31 | adj_mtx_r[(pair[0], pair[1])] = get_edge_weight(pair[0], pair[1])
32 |
33 | return adj_mtx_r
34 |
35 |
36 | @mgp.read_proc
37 | def predict(ctx: mgp.ProcCtx) -> mgp.Record(edges=mgp.List[mgp.List[mgp.Vertex]]):
38 | embeddings: Dict[int, List[float]] = {}
39 |
40 | for vertex in ctx.graph.vertices:
41 | embedding = vertex.properties.get("embedding", None)
42 | if embedding is None:
43 | continue
44 | embeddings[int(vertex.id)] = embedding
45 |
46 | adj_matrix = calculate_adjacency_matrix(embeddings)
47 | sorted_predicted_edges = {k: v for k, v in sorted(adj_matrix.items(), key=lambda item: -1 * item[1])}
48 |
49 | edges: List[mgp.List[mgp.Vertex]] = []
50 |
51 | for edge, similarity in sorted_predicted_edges.items():
52 | vertex_from = ctx.graph.get_vertex_by_id(edge[0])
53 | vertex_to = ctx.graph.get_vertex_by_id(edge[1])
54 |
55 | edges.append([vertex_from, vertex_to])
56 |
57 | return mgp.Record(edges=edges)
58 |
--------------------------------------------------------------------------------
/memgraph/procedures/publisher.py:
--------------------------------------------------------------------------------
1 | import json
2 | import mgp
3 | import os
4 | import pulsar
5 | from kafka import KafkaProducer
6 |
7 | KAFKA_IP = os.getenv("KAFKA_IP", "kafka")
8 | KAFKA_PORT = os.getenv("KAFKA_PORT", "9092")
9 |
10 | PULSAR_IP = os.getenv("PULSAR_IP", "localhost")
11 | PULSAR_PORT = os.getenv("PULSAR_PORT", "6650")
12 |
13 | BROKER = os.getenv("BROKER", "kafka")
14 |
15 |
16 | @mgp.read_proc
17 | def create(created_objects: mgp.Any) -> mgp.Record():
18 | created_objects_info = {"vertices": [], "edges": []}
19 |
20 | for obj in created_objects:
21 | if obj["event_type"] == "created_vertex":
22 | created_object = {
23 | "id": obj["vertex"].id,
24 | "labels": [label.name for label in obj["vertex"].labels],
25 | "username": obj["vertex"].properties["username"],
26 | "rank": obj["vertex"].properties["rank"],
27 | "cluster": obj["vertex"].properties["cluster"],
28 | }
29 | created_objects_info["vertices"].append(created_object)
30 | else:
31 | created_objects_info["edges"].append(
32 | {
33 | "id": obj["edge"].id,
34 | "type": obj["edge"].type.name,
35 | "source": obj["edge"].from_vertex.id,
36 | "target": obj["edge"].to_vertex.id,
37 | }
38 | )
39 |
40 | if BROKER == "kafka":
41 | kafka_producer = KafkaProducer(bootstrap_servers=KAFKA_IP + ":" + KAFKA_PORT)
42 | kafka_producer.send(
43 | "created_objects", json.dumps(created_objects_info).encode("utf8")
44 | )
45 | else:
46 | pulsar_producer = pulsar.Client(
47 | "pulsar://" + PULSAR_IP + ":" + PULSAR_PORT
48 | ).create_producer("created_objects")
49 | pulsar_producer.send(json.dumps(created_objects_info).encode("utf8"))
50 |
51 | return mgp.Record()
52 |
53 |
54 | @mgp.read_proc
55 | def update_rank(node: mgp.Vertex, rank: float) -> mgp.Record():
56 | updated_objects_info = {"vertices": [], "edges": []}
57 |
58 | updated_object = {
59 | "id": node.id,
60 | "labels": [label.name for label in node.labels],
61 | "username": node.properties["username"],
62 | "rank": rank,
63 | }
64 | updated_objects_info["vertices"].append(updated_object)
65 |
66 | if BROKER == "kafka":
67 | kafka_producer = KafkaProducer(bootstrap_servers=KAFKA_IP + ":" + KAFKA_PORT)
68 | kafka_producer.send(
69 | "created_objects", json.dumps(updated_objects_info).encode("utf8")
70 | )
71 | else:
72 | pulsar_producer = pulsar.Client(
73 | "pulsar://" + PULSAR_IP + ":" + PULSAR_PORT
74 | ).create_producer("created_objects")
75 | pulsar_producer.send(json.dumps(updated_objects_info).encode("utf8"))
76 |
77 | return mgp.Record()
78 |
79 |
80 | @mgp.read_proc
81 | def update_cluster(node: mgp.Vertex, community_id: int) -> mgp.Record():
82 | updated_objects_info = {"vertices": [], "edges": []}
83 |
84 | updated_object = {
85 | "id": node.id,
86 | "labels": [label.name for label in node.labels],
87 | "username": node.properties["username"],
88 | "cluster": community_id,
89 | }
90 | updated_objects_info["vertices"].append(updated_object)
91 |
92 | if BROKER == "kafka":
93 | kafka_producer = KafkaProducer(bootstrap_servers=KAFKA_IP + ":" + KAFKA_PORT)
94 | kafka_producer.send(
95 | "created_objects", json.dumps(updated_objects_info).encode("utf8")
96 | )
97 | else:
98 | pulsar_producer = pulsar.Client(
99 | "pulsar://" + PULSAR_IP + ":" + PULSAR_PORT
100 | ).create_producer("created_objects")
101 | pulsar_producer.send(json.dumps(updated_objects_info).encode("utf8"))
102 |
103 | return mgp.Record()
104 |
--------------------------------------------------------------------------------
/memgraph/requirements.txt:
--------------------------------------------------------------------------------
1 | kafka-python==2.0.2
2 | pulsar-client==2.10.0
3 |
--------------------------------------------------------------------------------
/memgraph/transformations/twitter.py:
--------------------------------------------------------------------------------
1 | import mgp
2 | import json
3 |
4 |
5 | @mgp.transformation
6 | def tweet(
7 | messages: mgp.Messages,
8 | ) -> mgp.Record(query=str, parameters=mgp.Nullable[mgp.Map]):
9 | result_queries = []
10 |
11 | for i in range(messages.total_messages()):
12 | message = messages.message_at(i)
13 | tweet_dict = json.loads(message.payload().decode("utf8"))
14 | if tweet_dict["target_username"]:
15 | result_queries.append(
16 | mgp.Record(
17 | query=(
18 | "MERGE (u1:User {username: $source_username}) "
19 | "MERGE (u2:User {username: $target_username}) "
20 | "MERGE (u1)-[:RETWEETED]->(u2)"
21 | ),
22 | parameters={
23 | "source_username": tweet_dict["source_username"],
24 | "target_username": tweet_dict["target_username"],
25 | },
26 | )
27 | )
28 | else:
29 | result_queries.append(
30 | mgp.Record(
31 | query=("MERGE (:User {username: $source_username})"),
32 | parameters={"source_username": tweet_dict["source_username"]},
33 | )
34 | )
35 | return result_queries
36 |
--------------------------------------------------------------------------------
/run_kafka.sh:
--------------------------------------------------------------------------------
1 | echo Killing old Docker processes
2 | docker-compose rm -fs
3 |
4 | echo Building Docker images
5 | docker-compose build kafka
6 | docker-compose build memgraph-mage-kafka
7 | docker-compose build stream-kafka
8 | docker-compose build backend-kafka
9 |
10 | echo Starting Docker containers
11 | docker-compose up -d kafka
12 | docker-compose up -d memgraph-mage-kafka
13 | sleep 1
14 | docker-compose up -d stream-kafka
15 | docker-compose up backend-kafka
16 |
--------------------------------------------------------------------------------
/run_pulsar.sh:
--------------------------------------------------------------------------------
1 | echo Killing old Docker processes
2 | docker-compose rm -fs
3 |
4 | echo Building Docker images
5 | docker-compose build pulsar
6 | docker-compose build memgraph-mage-pulsar
7 | docker-compose build stream-pulsar
8 | docker-compose build backend-pulsar
9 |
10 | echo Starting Docker containers
11 | docker-compose up -d pulsar
12 | docker-compose up -d memgraph-mage-pulsar
13 | sleep 1
14 | docker-compose up -d stream-pulsar
15 | docker-compose up backend-pulsar
16 |
--------------------------------------------------------------------------------
/stream/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM python:3.8
2 |
3 | COPY /stream /app/
4 | WORKDIR /app
5 |
6 | # Install packages
7 | RUN pip3 install -r requirements.txt
8 |
--------------------------------------------------------------------------------
/stream/data/scraped_tweets.csv:
--------------------------------------------------------------------------------
1 | source_username,target_username
2 | CapeCodGiftShop,RetroCEO
3 | CodeAttBot,LeeHillerLondon
4 | BattlegroundHs,getwhalinvest
5 | botpokemongofr1,TrevorAllenPKMN
6 | AnyaSha13331181,WORLDMUSICAWARD
7 | WCD7G2JNS6LWe1R,HuobiGlobal
8 | a_artindia,HuobiGlobal
9 | granvillestudio,Mommaparker2
10 | stannesrcp,Mommaparker2
11 | Saurabh17549421,HuobiGlobal
12 | ShebbearHead,HuobiGlobal
13 | VirtualJobs,LincsConnect
14 | hmmmi7,WORLDMUSICAWARD
15 | SkyRTRblxBot,wikioccult
16 | thomasoflondon1,greengagedesign
17 | a_artindia,greengagedesign
18 | NicoleVTae,WORLDMUSICAWARD
19 | kth7sins,WORLDMUSICAWARD
20 | jgmacleodauthor,DerekRKing2
21 | yougotgift,DerekRKing2
22 | VirtualJobs,LincsConnect
23 | janemanuelabras,MarcoMariani_IT
24 | CapeCodGiftShop,birdhousebooks
25 | FranckPontais,birdhousebooks
26 | Iunra,bmstores
27 | SuzieTullett,mandybaggot
28 | superteamml,CartersCollecta
29 | sea36984675,WORLDMUSICAWARD
30 | FriedPiperTK,WORLDMUSICAWARD
31 | TrevorAllenPKMN,WORLDMUSICAWARD
32 | Jilliemary,PenelopeRuzy
33 | HeartToHeartPri,kblacey
34 | _typo_queen,WORLDMUSICAWARD
35 | Teignbridge,RecycleDevon
36 | clasfras1,mikestokoe
37 | mnbm_bbytk,WORLDMUSICAWARD
38 | CeeDeeNo1,Amandalavan1
39 | tae_Anne_v,WORLDMUSICAWARD
40 | CathrynPearce,PenwithLP
41 | OST__king__V,WORLDMUSICAWARD
42 | KoothEngagement,WORLDMUSICAWARD
43 | LeslieWPGarland,AuthorJRose
44 | allin4675,WORLDMUSICAWARD
45 | tata04_10,WORLDMUSICAWARD
46 | kamera_one,WORLDMUSICAWARD
47 | thomasoflondon1,CartersCollecta
48 | conor_kostick,NLIreland
49 | beeley52,bmstores
50 | noonavnim,WORLDMUSICAWARD
51 | tistabene,WORLDMUSICAWARD
52 | sautterlas65,WORLDMUSICAWARD
53 | AshGrover2,workstatusapp
54 | falmouthjen,thelaceylondon
55 | CoralSherriffs,beautys_legacy
56 | msfowling,beautys_legacy
57 | GrahamR82067146,PetMunchies
58 | GreetPrimary,PetMunchies
59 | YinOhh,WORLDMUSICAWARD
60 | HarkwellLabels,WORLDMUSICAWARD
61 | LizanneLloyd,LynnsWPics
62 | NIAROBI__,NoniDiba
63 | MariaOD05737730,servicerotties
64 | deweyjaci76,AnneGWoodhead1
65 | CoralSherriffs,beautys_legacy
66 | SubirDa87742949,beautys_legacy
67 | fantasymsinfo,beautys_legacy
68 | inverclyde,totbcreditunion
69 | Pakbrewog,totbcreditunion
70 | granvillestudio,MugsofFunGifts
71 | GovanoNathan,Kuri_Nyann
72 | rido_kate,letterland
73 | taehyungsnoona7,WORLDMUSICAWARD
74 | BobbyDazzlers5,shrewsmorris
75 | FizzFozz,HuobiGlobal
76 | Alince6,WORLDMUSICAWARD
77 | OctanormUK,WORLDMUSICAWARD
78 | THEHugoDrax1979,russty_russ
79 | rozvnuit,WORLDMUSICAWARD
80 | Rezkiansyah_14,WhiteDogeToken
81 | ff_joanna,shrewsmorris
82 | granvillestudio,MugsofFunGifts
83 | craftginclub,MechelleRoweJ
84 | EwaMariaDerrick,AnnaCampbelloz
85 | FreshTomatoesMP,AnnaCampbelloz
86 | SubirDa87742949,MEXC_Global
87 | Grand_Theatre,bpoolsocialclub
88 | EXPO2020Croatia,bpoolsocialclub
89 | Masoud74115192,HuobiGlobal
90 | inbusiness4good,HuobiGlobal
91 | OxfordshireCF,oxhomelessmvt
92 | EwaMariaDerrick,LRL8
93 | EwaMariaDerrick,LRL8
94 | TRFT_Charity,LRL8
95 | mandybaggot,The__SadieRyan
96 | NatKleinman,mandybaggot
97 | blackcatbutton,TwystedRoots
98 | AramarSolutions,TwystedRoots
99 | GrowURStream,RoverDov123
100 | LachimolalaMnl,RoverDov123
101 | SarahDaisyBlue,CosimacraftsSue
102 | GHC97050895,HuobiGlobal
103 | MrsMinaF,RDCSolicitors
104 | Lariyu26,JosieRiki
105 | GriefProbate,JosieRiki
106 | WaterToGo_,JosieRiki
107 | ADG_IQ,JosieRiki
108 | MyWatering,JosieRiki
109 | Lariyu26,JosieRiki
110 | SDFpodcast,jangles
111 | Liran_idk,ilan_profile
112 | broadwaypublish,ilan_profile
113 | carolioncats,getdexterhome
114 | AlleynCourtFrst,getdexterhome
115 | privkth95,WORLDMUSICAWARD
116 | loobyjaynegames,HamleysOfficial
117 | cindy_griffen,HamleysOfficial
118 | matthewrw1978,BloomsburyEd
119 | eggsypony,TheHugsFoundat1
120 | mikay2999,WORLDMUSICAWARD
121 | NorthmeadSquare,WORLDMUSICAWARD
122 | TopBananaMall,WORLDMUSICAWARD
123 | CornwallClld,WORLDMUSICAWARD
124 | OdooJobss,Serpent_CS
125 | nicotatsuta,Dreamer_Lennon
126 | kirana_dns,WORLDMUSICAWARD
127 | jolenehunter,WORLDMUSICAWARD
128 | nalafer,SzamerM
129 | ComnectTech,SzamerM
130 | granvillestudio,The_Bottle_Bin
131 | beyoutifulni,The_Bottle_Bin
132 | JKThv_vk,WORLDMUSICAWARD
133 | mellors_karen,getdexterhome
134 | bloggeray23,ChloeLe39602964
135 | segura_quesada,AnteriosGame
136 | ElectronNest,PenelopeRuzy
137 | thegaudidragon,Rachael57354278
138 | gosquad22,paramsatwadhar
139 | Radio247UK,paramsatwadhar
140 | haowen80878155,HuobiGlobal
141 | Sue71319850,mandybaggot
142 | PurplehandsomeV,WORLDMUSICAWARD
143 | elxxxfndr,WORLDMUSICAWARD
144 | lje0407,WORLDMUSICAWARD
145 | WaterWorxUK,VisitLancashire
146 | LoriDeSalvo32,christmas_clock
147 | sashal_distaun,WORLDMUSICAWARD
148 | Ariell1524,ameensajwani
149 | SheilaM74102879,WORLDMUSICAWARD
150 | AutomaticEarth,OnlyBlueHat
151 | annefutch,Montydogge
152 | Emmatrevillion1,a1clutches
153 | paramsatwadhar,a1clutches
154 | cazajuguetes,a1clutches
155 | Outmodedpoem,Thi4go_Luz
156 | GreenPinkTeam,Thi4go_Luz
157 | vkkthcore,WORLDMUSICAWARD
158 | SpecialBoee,Austeiin
159 | BennyMeadows,Austeiin
160 | otamaNRC,WORLDMUSICAWARD
161 | EpicDeerToken,WORLDMUSICAWARD
162 | KTHLUUH,WORLDMUSICAWARD
163 | ECC_malta,WORLDMUSICAWARD
164 | thomasoflondon1,Ness_SeaGlass
165 | MAB_Bingley,Ness_SeaGlass
166 | FusicMilm,Serpent_CS
167 | Olhahoneynight,WORLDMUSICAWARD
168 | IzzyJon67069546,KarenBa10864733
169 | anitabellibooks,emmarobinsonuk
170 | DianeK40697479,Cooper_Lechat
171 | MadhumantiMukh5,WORLDMUSICAWARD
172 | CounterspellCo,BriallenJones
173 | kkr9912,WORLDMUSICAWARD
174 | Sinders21,tyhafan
175 | superteamml,IBaubliene
176 | HrochPavel,IBaubliene
177 | KTHpraiser,WORLDMUSICAWARD
178 | WaterWorxUK,SocialMedia4i
179 | taki7x,rojiurastreet
180 | GlenisKellet,MainChannel_
181 | ladiesthatlift2,SheweeWC
182 | Owsou1xrBFk4fJ9,WORLDMUSICAWARD
183 | memysamoor,WORLDMUSICAWARD
184 | inbusiness4good,WORLDMUSICAWARD
185 | IBaubliene,WORLDMUSICAWARD
186 | dani198800,WORLDMUSICAWARD
187 | SPMVOAK,WORLDMUSICAWARD
188 | savvysykoolober,denijedi
189 | bunnytaekv,WORLDMUSICAWARD
190 | AriesTanjuan,Shan3593
191 | your_harrogate,PeteEgerton
192 | WaterWorxUK,ParkSquareWF5
193 | RABJr3030,christmas_clock
194 | jangles,christmas_clock
195 | harmony_kent,christmas_clock
196 | iKVA_ai,christmas_clock
197 | BlithehaleThe,christmas_clock
198 | mytete3,WORLDMUSICAWARD
199 | VxK901230,WORLDMUSICAWARD
200 | najme99x,HuobiGlobal
201 | PeteEgerton,HuobiGlobal
202 | i_use_joycons,SzamerM
203 | Davood16747173,MEXC_Global
204 | IUmusic_forALL,ChloeLe39602964
205 | thegiftbox_irl,ChloeLe39602964
206 | DadJokesNow,ChloeLe39602964
207 | potato9_sweet,WORLDMUSICAWARD
208 | VapourCloud_,WORLDMUSICAWARD
209 | amini54art,sofiartmedia
210 | GoldCareHomes,sofiartmedia
211 | mist1121,WORLDMUSICAWARD
212 | IamFayeAmanda,tiktok_best_of
213 | HodderShal,ataxiascot
214 | TheresaAlison1,HamleysOfficial
215 | bbh_rubix,HamleysOfficial
216 | WaterWorxUK,ShoutExpo
217 | EmmaFieldhouse,ShoutExpo
218 | Sana61361735,WORLDMUSICAWARD
219 | Sneekyhen2,LucyLogical
220 | donthideBhind7,WORLDMUSICAWARD
221 | Davood16747173,WORLDMUSICAWARD
222 | whitegablesgwy,WORLDMUSICAWARD
223 | chibichi24,WORLDMUSICAWARD
224 | wolfbunny09,WORLDMUSICAWARD
225 | whitegablesgwy,JohnFromPBurg
226 | EnergyRA,JohnFromPBurg
227 | Elva_Eco_Dragon,R_Tsakalidis
228 | whitegablesgwy,R_Tsakalidis
229 | HollikMiklos,PetMunchies
230 | VTaehyungbear,WORLDMUSICAWARD
231 | dawnhalliday,WORLDMUSICAWARD
232 | OneChippenham,youlovegifts
233 | purdyme123,youlovegifts
234 | MaxMust63302429,allianceonline
235 | afterbuzztv,allianceonline
236 | uxbookreviews,uxlinks
237 | HeuwRonald,HuobiGlobal
238 | R_Tsakalidis,HuobiGlobal
239 | ClearChannelNI,HuobiGlobal
240 | peasandpeonies,FLChefNicole
241 | non01,uxlinks
242 | sothye,WORLDMUSICAWARD
243 | blackcatbutton,Ness_SeaGlass
244 | _Floutchi_,getwhalinvest
245 | Taestan_Only,WORLDMUSICAWARD
246 | ShaunAshmore2,WORLDMUSICAWARD
247 | Davood16747173,WORLDMUSICAWARD
248 | MKTheatre,My_MiltonKeynes
249 | dani198800,My_MiltonKeynes
250 | Fafou_breeh,getwhalinvest
251 | HollikMiklos,pbshop_store
252 | SaubKhare,SaurabhKhare009
253 | PierreLecheval1,getwhalinvest
254 | Parveen50063828,SaurabhKhare009
255 | bokohalal,KhaledAjib
256 | ___bored_af,WORLDMUSICAWARD
257 | lavidaholoka,WORLDMUSICAWARD
258 | taebrownSuga,WORLDMUSICAWARD
259 | Eastgatecare,WORLDMUSICAWARD
260 | Radio247UK,WORLDMUSICAWARD
261 | ChristnResource,WORLDMUSICAWARD
262 | Ksnproductions1,WORLDMUSICAWARD
263 | B17sallyb,beanies_masato
264 | ADG_IQ,beanies_masato
265 | taeRivetted,WORLDMUSICAWARD
266 | Ali_Leith,WORLDMUSICAWARD
267 | miki_ki15,WORLDMUSICAWARD
268 | blackcatbutton,BadgerCrafty
269 | cragga1982,EV2Sportswear
270 | MrsP_A,ChloeLe39602964
271 | stannesrcp,ChloeLe39602964
272 | apextraxs,ChloeLe39602964
273 | apextraxs,ChloeLe39602964
274 | SaurabhRashtra1,SaurabhKhare009
275 | apextraxs,SaurabhKhare009
276 | F4Pinfo,SaurabhKhare009
277 | RibbleValleysue,frome_maude
278 | apextraxs,frome_maude
279 | Sylvia_FineArt,cjsrustictouch
280 | inbusiness4good,cjsrustictouch
281 | LinnBHalton,cjsrustictouch
282 | RibbleValleysue,frome_maude
283 | SSadyand,getwhalinvest
284 | works_mettle,getwhalinvest
285 | Dajong0606,PeggyNg05
286 | NFIU_Latvia,PeggyNg05
287 | alluringTAEbae,WORLDMUSICAWARD
288 | sengelchen1976,bmstores
289 | kthhaebaragi,WORLDMUSICAWARD
290 | Quantum_Dragon,WORLDMUSICAWARD
291 | RibbleValleysue,frome_maude
292 | ECOLOGIA1000,beincrypto
293 | CapeCodGiftShop,Robinsontb21
294 | bts_1365244_v,WORLDMUSICAWARD
295 | ChooseLife_CC,WORLDMUSICAWARD
296 | PoplarNurseries,WORLDMUSICAWARD
297 | School_RdSafety,WORLDMUSICAWARD
298 | HamdiBadat,Phemex_official
299 | taehapppppy1230,WORLDMUSICAWARD
300 | DennisKoch10,WORLDMUSICAWARD
301 | ellezeta23,christmas_clock
302 | LingaWine,christmas_clock
303 | PauletteC_V,WORLDMUSICAWARD
304 | littlefabshop,CartersCollecta
305 | Arnie_Boyle,CartersCollecta
306 | followyouswap,CartersCollecta
307 | followyouswap,pbshop_store
308 | blackcatbutton,GlassCrafty
309 | HowellsSchool,GlassCrafty
310 | ergo_STORE,GlassCrafty
311 | Scieducation1,BloomsburyEd
312 | gabbryden,WORLDMUSICAWARD
313 | multifandom_art,CadenReigns
314 | wivk1077,CadenReigns
315 | Bae43_Ls,toon_app
316 | __Ladynash,Alfonzowords2
317 | PenwithLP,Alfonzowords2
318 | 7q4hNFJ7mAf2iiT,WORLDMUSICAWARD
319 | GeorReader,aswayners
320 | Fati66257665,WORLDMUSICAWARD
321 | comrie4ever,GroupKaczmarek
322 | littlefabshop,elliestreasures
323 | babul08598468,MEXC_Global
324 | Minarasaei,ranamansourvar
325 | canelo_co,ranamansourvar
326 | blackcatbutton,GlassCrafty
327 | Julien74744980,getwhalinvest
328 | inbusiness4good,getwhalinvest
329 | JoanneJ96366976,nico_gaia
330 | Gata_Lechucera,Cooper_Lechat
331 | Jalal87910984,YM110011
332 | Nisah77024888,WORLDMUSICAWARD
333 | CentralHairAcad,WORLDMUSICAWARD
334 | dimplegowda013,WORLDMUSICAWARD
335 | letterland,WORLDMUSICAWARD
336 | NKPRODUCTION13,Cooper_Lechat
337 | BenchOriginal,Cooper_Lechat
338 | blueberry0022,HamleysOfficial
339 | dani198800,HamleysOfficial
340 | Kelvinl13127827,Tripcandyio
341 | Riki04,aswayners
342 | AHPrimary,aswayners
343 | KingsLynnLive,cranesheds
344 | SaurabhKhare009,cranesheds
345 | MHHSBD,CartersCollecta
346 | jkyle2184,RobuxCity
347 | Naya30121995,WORLDMUSICAWARD
348 | kartikahiro,WORLDMUSICAWARD
349 | scholasticuk,newscothill
350 | LlandoughSchool,newscothill
351 | PushpaP68626550,WORLDMUSICAWARD
352 | offeroasis,WORLDMUSICAWARD
353 | MHHSBD,youth_tree
354 | littlefabshop,TheGingerMint
355 | 25yrsMusssa,WVSouthSudan
356 | laescandella,WVSouthSudan
357 | TTabbyshack,WorksUncommon
358 | peasandpeonies,trendymomreview
359 | UPSCPractice,trendymomreview
360 | KONKSTYLE,trendymomreview
361 | Rockringlady,trendymomreview
362 | Tedd_Heating,trendymomreview
363 | SundrySupplies,trendymomreview
364 | fbeonline,trendymomreview
365 | CartersCollecta,trendymomreview
366 | littlefabshop,cjsrustictouch
367 | V_1twt,WORLDMUSICAWARD
368 | BalancedHut,WORLDMUSICAWARD
369 | DonnaPh79122599,getdexterhome
370 | bpoolsocialclub,getdexterhome
371 | origato,mikestokoe
372 | verger_st,mikestokoe
373 | _PocketMemories,mikestokoe
374 | CoburgBanks,mikestokoe
375 | totbcreditunion,mikestokoe
376 | anitadagg,bmstores
377 | risestudios,bmstores
378 | Naylorwintersg,bmstores
379 | InfansyS,bmstores
380 | MHHSBD,littlefabshop
381 | DCLAReadingRoom,NLIreland
382 | billboardsa,NLIreland
383 | KuroShamu,KayzinArts
384 | BSOPBedford,KayzinArts
385 | RAINYDAYTRUST,KayzinArts
386 | FRONTIERFM,KayzinArts
387 | Rediscova1,KayzinArts
388 | rocks_infinity,KayzinArts
389 | MHHSBD,TheCraftyNoo
390 | essentialcuisin,TheCraftyNoo
391 | MicrosoftUK,TheCraftyNoo
392 | RHolmesSW19,TheCraftyNoo
393 | PolDep_Cohesion,TheCraftyNoo
394 | FulcrumKitchens,TheCraftyNoo
395 | littlecogs,TheCraftyNoo
396 | TYDE_Plumbing,TheCraftyNoo
397 | FlyfreEllie,DAFTrucksUK
398 | AngelAdvanceUk,DAFTrucksUK
399 | SonnerToys,DAFTrucksUK
400 | BaristaBrews,DAFTrucksUK
401 | easyGuide_UK,DAFTrucksUK
402 | ChrishaModis,DAFTrucksUK
403 | PorcupinePR,DAFTrucksUK
404 | Business_Micros,DAFTrucksUK
405 | Ozdealsonline1,DAFTrucksUK
406 | StylistMagazine,DAFTrucksUK
407 | bnb952,EV2Sportswear
408 | cult_edge,AdamManning
409 | SteveK157DFC,ThePLSA
410 | Anand78551928,HuobiGlobal
411 | theorldn,mediashotz
412 | Sky360org,shadowsmagazine
413 | AxieElSanchos,getwhalinvest
414 | Cavime,getwhalinvest
415 | EWebDigital1,getwhalinvest
416 | mihomiho0035,WORLDMUSICAWARD
417 | taekook_oonly,WORLDMUSICAWARD
418 | Bam19960,WhiteDogeToken
419 | GardnerAntiques,WhiteDogeToken
420 | MHHSBD,CartersCollecta
421 | KokoArmy10,WORLDMUSICAWARD
422 | RobertsO10,ZatuHome
423 | Browsholme,VisitLancashire
424 | NoonaTae__,WORLDMUSICAWARD
425 | nargis__sheikh_,WORLDMUSICAWARD
426 | yudhapati88,maysaa_ajami
427 | MillieMoonlight,bmstores
428 | savvysykoolober,IrynaLopushans3
429 | pediox,EastTNSoldier
430 | thek7777,WORLDMUSICAWARD
431 | yudhapati88,KhaledAjib
432 | MindUndisputed,wealthsmith_ltd
433 | MHHSBD,CartersCollecta
434 | pamskylar,WORLDMUSICAWARD
435 | WaFa40991717,WORLDMUSICAWARD
436 | boraVpurpleV,WORLDMUSICAWARD
437 | Radio247UK,WORLDMUSICAWARD
438 | NesilCrypto,MEXC_Global
439 | Cecilia_CruzM,WORLDMUSICAWARD
440 | Devina080,WORLDMUSICAWARD
441 | COP27_Egypt,inbusiness4good
442 | emacorona10,Landycool_37
443 | lovefaehyung,WORLDMUSICAWARD
444 | cutetaetae25,WORLDMUSICAWARD
445 | DeEva21759005,ScribblesWorth1
446 | CatholicShareC,ScribblesWorth1
447 | mr_garyfish1980,DAFTrucksUK
448 | msstraighty180,DAFTrucksUK
449 | LeedsNews,DAFTrucksUK
450 | GloriatibiTri,MarcoMariani_IT
451 | DsPhamVanHung,MarcoMariani_IT
452 | PodNationPods,podlyirregular
453 | v_kx2mama,WORLDMUSICAWARD
454 | littlefabshop,Canarylittle
455 | BoleynLoyalist,WORLDMUSICAWARD
456 | nzl829,WORLDMUSICAWARD
457 | NyssaWest,WORLDMUSICAWARD
458 | pilinyan,mikestokoe
459 | CheemsInu_Army,mikestokoe
460 | silvernemesis,HamleysOfficial
461 | VANT3TA3,WORLDMUSICAWARD
462 | DLStrokeSupGrp,HealthPromoLUH
463 | yudhapati88,nur_chaaban
464 | EmmaHughesEvan1,KittyWilson23
465 | FluxRotherham,CliftonParkMus
466 | CZ05032126,steemit
467 | Antonia_Author,KatieMettner
468 | GerryNeill2021,KatieMettner
469 | stillovebritain,LucyLogical
470 | Lctaehyung1,WORLDMUSICAWARD
471 | Cazcham,bmstores
472 | yourkpopsoul,WORLDMUSICAWARD
473 | IKhoroshaeva,DebsDesignsUK
474 | Agris2,DebsDesignsUK
475 | mobizcorp,DebsDesignsUK
476 | Calis_tae,WORLDMUSICAWARD
477 | jane__eden,ChloeLe39602964
478 | MaisonDieuDover,ChloeLe39602964
479 | deacon_adrian,ChloeLe39602964
480 | Bananatie_,Dreamer_Lennon
481 | gab_lemonade,AxieFreedom
482 | tobygoldsmith,EV2Sportswear
483 | LindaHuber19,The__SadieRyan
484 | Xientifica,The__SadieRyan
485 | Antonia_Author,DebbieViggiano
486 | judetheconfused,mikestokoe
487 | yudhapati88,AbirachedNaji
488 | Firegoddess_8,pbshop_store
489 | uxlinks,pbshop_store
490 | vcr_i7,WORLDMUSICAWARD
491 | MendozaSheh,WORLDMUSICAWARD
492 | AdamManning,WORLDMUSICAWARD
493 | LaxmiNiraula9,Sharon98422405
494 | dr_hick,agnesjuliet
495 | littlefabshop,kblacey
496 | indiedailynews,pixmain
497 | ReGamertron,May48067575
498 | blackcatbutton,ArgyllSeaGlass
499 | RobKeeleyAuthor,ArgyllSeaGlass
500 | EwaMariaDerrick,cleanse29
501 | PopCafe_,cleanse29
502 | JordyMevissen,cleanse29
503 | ShireBrokers,PDSA_HQ
504 | vam237,confundustria
505 | MyBodyIsMeBooks,Autismstoke
506 | Suttonvegan,Autismstoke
507 | TopBananaMall,Autismstoke
508 | Quickbadge,Autismstoke
509 | Londoncryptoex,Autismstoke
510 | FlexiHex,s_cellars
511 | TheBTCMaker,LQS_Media
512 | pozhilovai,WORLDMUSICAWARD
513 | recordsetterTAE,WORLDMUSICAWARD
514 | sugarbooseokjin,Min_Genius1994
515 | TaesMoMajie,WORLDMUSICAWARD
516 | EraseAllKittens,WORLDMUSICAWARD
517 | bbeetleko,LoveEnmu
518 | joshuatreekids,LoveEnmu
519 | peasandpeonies,HipMamasPlace
520 | cmsturk_,Phemex_official
521 | cheerrymate,Phemex_official
522 | superteamml,howarths63
523 | steemit,howarths63
524 | MaxMust63302429,AullorNothing
525 | ItalianKidProbs,YLDFRA
526 | GreetPrimary,YLDFRA
527 | Ermaerv82143308,WORLDMUSICAWARD
528 | TATIJewelry,howarths63
529 | star100x,BaskersBoutique
530 | BejoLesmana,BaskersBoutique
531 | blackcatbutton,GermanderCC
532 | TaeBearAlways,WORLDMUSICAWARD
533 | lor_gill,ChloeLe39602964
534 | Lenijayn_btsV,WORLDMUSICAWARD
535 | makewebbetter,WORLDMUSICAWARD
536 | socentie,buysocialie
537 | El_Gatito89,GeneralCattis
538 | armyleecious97,WORLDMUSICAWARD
539 | mookie0613,WORLDMUSICAWARD
540 | SAMPAuk_,getdexterhome
541 | Yevhen43278272,HuobiGlobal
542 | SPMVOAK,HuobiGlobal
543 | harmony_kent,BetteAStevens
544 | pixmain,BetteAStevens
545 | majestictete,WORLDMUSICAWARD
546 | 32_Alpha_Press,LucyLogical
547 | jjfizz,pbshop_store
548 | My_winTaebear,WORLDMUSICAWARD
549 | soonshim3,WORLDMUSICAWARD
550 | 4Tchat,SDWorx
551 | EwaMariaDerrick,MaryLSchmidt
552 | 5140481bittu,HuobiGlobal
553 | FashionKair,HuobiGlobal
554 | itselliekim,WORLDMUSICAWARD
555 | IKhoroshaeva,RegaResearch
556 | EwaMariaDerrick,dani_haviland
557 | MarilynShimmie1,b_bella_doxies
558 | peasandpeonies,MySweetZepol
559 | EwaMariaDerrick,KatieMettner
560 | Taebaee3,WORLDMUSICAWARD
561 | MarlaWeezie,TheStourbridge
562 | SeanGaret,Guide4Nutrition
563 | redroxyxxx,CocoDeMerUK
564 | sarcellec,aj_pritchett
565 | HarlesdenNews,Chana_Chemist
566 | Sospan75,Chana_Chemist
567 | LekAung,WORLDMUSICAWARD
568 | jjfizz,HamleysOfficial
569 | DrDWaterhouse,Eastenglanduk
570 | Yordanka,Eastenglanduk
571 | SarahofScrubs,SSStrays
572 | georginascull,MckinlayCaron
573 | Largobaycomber,KittyWilson23
574 | Kriptoaslani,ChintaiNetwork
575 | buysocialie,ChintaiNetwork
576 | WestLancsFLF,WLancsCollege
577 | WhyMehrab,WLancsCollege
578 | MrSidC64,bitmap_books
579 | assalnajian,Sepidart8
580 | EffinSeaGull,BeepDoctors
581 | junub_bot,Atekertv
582 | thescarface99,Cooper_Lechat
583 | Radio247UK,Cooper_Lechat
584 | Grandkathy,PussycatNaughty
585 | ClaudiaGMorell,LauraG_RM
586 | DVachirawit,WORLDMUSICAWARD
587 | authorkatyrose,WORLDMUSICAWARD
588 | Atekertv,WORLDMUSICAWARD
589 | MarcoMariani_IT,WORLDMUSICAWARD
590 | sanya25S,WORLDMUSICAWARD
591 | vvtaetae97,WORLDMUSICAWARD
592 | LeinadDOP80,HamleysOfficial
593 | LluisLis_GK,Eric_HODL
594 | GouravY68884863,Serpent_CS
595 | drumpfbot2016,THAIHOMESHOP
596 | Antonia_Author,KatieMettner
597 | izmarktuan,WORLDMUSICAWARD
598 | ShowersOfLightx,WORLDMUSICAWARD
599 | blackcatbutton,TheCraftyNoo
600 | OneCreativeCat1,GermanderCC
601 | KieranGaming94,Pixel_Pumpkin_
602 | blackcatbutton,littlefabshop
603 | BriallenJones,littlefabshop
604 | tavwp,yns_gh
605 | myHansungTae,WORLDMUSICAWARD
606 | IKhoroshaeva,samylovesbags
607 | moha1530,RobuxCity
608 | IKhoroshaeva,ArgyllSeaGlass
609 | lemoned1230,WORLDMUSICAWARD
610 | AndreasK1848,GERonAsia
611 | THAIHOMESHOP,GERonAsia
612 | naghma_atlasia,ChristiesDirect
613 | GoelBook,ChristiesDirect
614 | bookmarkmccree,OrkneyLibrary
615 | YANINA015625464,WORLDMUSICAWARD
616 | khriste5,ChloeLe39602964
617 | heevminwoo,WORLDMUSICAWARD
618 | ronmillington2,WORLDMUSICAWARD
619 | PrincessPKaur,WORLDMUSICAWARD
620 | Supermom25,HuobiGlobal
621 | KarlKavanagh69,crontoncoll
622 | GANDEEVASAN,crontoncoll
623 | i_am_secretcat,Canarylittle
624 | blackcatbutton,youth_tree
625 | PoshJocks,youth_tree
626 | FSatriaN,CubemanArt
627 | MartechScroll,CubemanArt
628 | jasonorz1003,MEXC_Global
629 | Londonbeachspa,MEXC_Global
630 | MarieMartinx,MEXC_Global
631 | Somy29jk2,WORLDMUSICAWARD
632 | SGK74,WORLDMUSICAWARD
633 | bnb952,getwhalinvest
634 | TammyDevoll,dineshswami1
635 | BarnCardington,dineshswami1
636 | cbd_hour,dotty4paws
637 | taevely6,WORLDMUSICAWARD
638 | SkyRTRblxBot,wikioccult
639 | Mediawatcher36,shawarmatizing
640 | DinaFerrer5,WORLDMUSICAWARD
641 | BotOfDogecoin,msam74511
642 | glanoer,msam74511
643 | CHAMANS62708039,MRSTEVESCORNER1
644 | the_news_21,MRSTEVESCORNER1
645 | barmanmridu3,WORLDMUSICAWARD
646 | IKhoroshaeva,Canarylittle
647 | BuckarooCrypto,Mayra_9797
648 | IKhoroshaeva,MegMusicManiac
649 | wntrbr_blsd,WORLDMUSICAWARD
650 | michael15071997,christmas_clock
651 | SparklyCooper,ACGoatham
652 | ScribnScratch54,PaulWatkins14
653 | michael15071997,christmas_clock
654 | don_pelf,CabanaGrills
655 | Get_Optimal,CabanaGrills
656 | gosquad22,bored_wine
657 | JohnDanielShop,bored_wine
658 | Welshman211,bored_wine
659 | MindTrainCIC,WLancsCollege
660 | BrackenLanePA,WLancsCollege
661 | blueparrot_10,WORLDMUSICAWARD
662 | Yolk_Recruit,WORLDMUSICAWARD
663 | johnrhueston,WORLDMUSICAWARD
664 | KatP1812,HamleysOfficial
665 | JacyBrean,pawpaw_ray
666 | yu100_kun,ReinaLove88
667 | hugsforTaehyung,WORLDMUSICAWARD
668 | Comedypodcastde,podlyirregular
669 | LSHeadHarrowHK,Harrow_HK
670 | TATIJewelry,leo_tyrell3
671 | TaeBear_3191,WORLDMUSICAWARD
672 | TheRealFs0c1eTy,Whichwaygameso1
673 | theDomainBot,bored_wine
674 | FaultsCog,bored_wine
675 | txrxdata,getwhalinvest
676 | Maharaja_bhog,getwhalinvest
677 | bored_wine,getwhalinvest
678 | lconlin,ChloeLe39602964
679 | COPYTRACK,ChloeLe39602964
680 | VBoxysmile,WORLDMUSICAWARD
681 | MyWatering,WORLDMUSICAWARD
682 | humna_naseer,WORLDMUSICAWARD
683 | ennomnom,e_eglobalpress
684 | RuddyPluck,ChloeLe39602964
685 | Ness_SeaGlass,cjsrustictouch
686 | LauraG_RM,cjsrustictouch
687 | jhay012341,thinkofthefun
688 | Celine_shia,WORLDMUSICAWARD
689 | BeauchampPC,HarboroughDC
690 | Camper_UK,BottleGlassPub
691 | niall_flynn,NLIreland
692 | BTSV_PAK,WORLDMUSICAWARD
693 | cooksgalleyltd,WORLDMUSICAWARD
694 | MIMICHA19951230,WORLDMUSICAWARD
695 | paulandkateloy1,EV2Sportswear
696 | KelleniDr,EV2Sportswear
697 | JaklynnSmith,Thi4go_Luz
698 | Grandkathy,adriannarenee09
699 | superteamml,ClothesForCat
700 | kookv8874,WORLDMUSICAWARD
701 | KatP1812,pbshop_store
702 | taechwita1230,WORLDMUSICAWARD
703 | IKhoroshaeva,ClothesForCat
704 | RobinBoiO7,CiervoKing
705 | RobertsO10,BaskersBoutique
706 | HertsPolice,roadsafetyherts
707 | msam74511,roadsafetyherts
708 | MillieLm888,BaskersBoutique
709 | LGmFv8jDLLriLv9,WORLDMUSICAWARD
710 | st_kurniawan,farghaly76
711 | ChristmasCo2021,farghaly76
712 | KerryWaite7,quickbydesign
713 | FSBSussex,FSBSurrey
714 | mattgraveling,HelenHampton
715 | oxfam_harpenden,HelenHampton
716 | yudhapati88,farghaly76
717 | 6Colne,bmstores
718 | CuteForeveerrr,WORLDMUSICAWARD
719 | PatKennyNT,WORLDMUSICAWARD
720 | Masp48275454,HuobiGlobal
721 | VbaritoneLegend,WORLDMUSICAWARD
722 | Emmatrevillion1,HamleysOfficial
723 | londonbel0w,NZBatman
724 | e_eglobalpress,NZBatman
725 | class5aWLP,NZBatman
726 | peyrugue,b_bella_doxies
727 | 1230THVKIM,WORLDMUSICAWARD
728 | garysouter,EV2Sportswear
729 | MissSummer_Rain,Wahlbonkers
730 | judetheconfused,wickedleeksmag
731 | Wacomi31,getwhalinvest
732 | YasilAdd,2021Gingerbread
733 | Taehyugism_123,WORLDMUSICAWARD
734 | Lostlain1,HelenHampton
735 | DjYayaOzawa,HelenHampton
736 | stephi_glasgow,bmstores
737 | shijianjiulehu1,DoodlePoodleNFT
738 | KeantoAlfha,ApazaradoSparky
739 | irishgerontsoc,ApazaradoSparky
740 | sergimagugliani,GoogleExpertUK
741 | celestiaallewin,LQS_Media
742 | aDoddle_UK,LQS_Media
743 | JudyNagy8,ToyLockerUK
744 | GerardBrowne16,TheStourbridge
745 | MoonDragonAsha,TheStourbridge
746 | viyomjain,Nagarro
747 | b3vantae,WORLDMUSICAWARD
748 | ReevesDesign,WORLDMUSICAWARD
749 | VallelyClare,PhillysDiner
750 | _Tina_7_5,WORLDMUSICAWARD
751 | OInterreg,WORLDMUSICAWARD
752 | campdenonline,WORLDMUSICAWARD
753 | CabanaGrills,WORLDMUSICAWARD
754 | nikkiyowo,WORLDMUSICAWARD
755 | ppjk_twtpp,WORLDMUSICAWARD
756 | brighterbunnies,WORLDMUSICAWARD
757 | alina_janelle,WORLDMUSICAWARD
758 | yamahdi31351,WORLDMUSICAWARD
759 | Thazin90762499,WORLDMUSICAWARD
760 | andyetc,ChloeLe39602964
761 | DarkKnight_888,Top3_betsofday
762 | thvspace,WORLDMUSICAWARD
763 | SerdarDrmz,HuobiGlobal
764 | Radio247UK,HuobiGlobal
765 | PS_taetae,WORLDMUSICAWARD
766 | thvinions,WORLDMUSICAWARD
767 | SnowFairy29,ChloeLe39602964
768 | hyung90219,WORLDMUSICAWARD
769 | Lymestoneales,WORLDMUSICAWARD
770 | hamzah_bayati,EastTNSoldier
771 | youth_tree,EastTNSoldier
772 | ggong_710,WORLDMUSICAWARD
773 | Hasarp2,marcuslemonis
774 | Almighty_B_Doge,HuobiGlobal
775 | radiocartoonist,mikestokoe
776 | AngelaV59500207,WORLDMUSICAWARD
777 | SDaNessuno,Roofero3
778 | FeelBetter2day,A_ZPoint
779 | PandAlmighty,HuobiGlobal
780 | walk1961,gamerstudioltd
781 | ITWalford,ChloeLe39602964
782 | lUwIb024pmEWwg4,WORLDMUSICAWARD
783 | Carriecakes80,HamleysOfficial
784 | RobertsO10,SnuggHomes
785 | Eden_Shopping,SnuggHomes
786 | C70WNW0R7D,Cooper_Lechat
787 | TopBananaMall,Cooper_Lechat
788 | taehyunglowkey,WORLDMUSICAWARD
789 | VeritatisetLum1,WORLDMUSICAWARD
790 | masato_jones,beanies_masato
791 | Dolaus71,getwhalinvest
792 | Ness_SeaGlass,beezyandco
793 | masato_jones,beanies_masato
794 | BrendenMoore29,beanies_masato
795 | PhoenixYork,beanies_masato
796 | pray4kenny_,JoshRoomsburg
797 | maturetrade,JoshRoomsburg
798 | _KrisAngels,JoshRoomsburg
799 | roadsafetyherts,JoshRoomsburg
800 | BarryLibrary,pplscollection
801 | LaunchburyClai1,frogmomblog
802 | annamac48498443,SSStrays
803 | masum0112,MEXC_Global
804 | COLA_Trust,Galleywall_CoLA
805 | HagTeenzcoolit,Kidzcoolit
806 | walk1961,BloomsburyEd
807 | LBBeautySpa,TenterdenDeals
808 | FSTL90,TenterdenDeals
809 | HagTeenzcoolit,Kidzcoolit
810 | Ness_SeaGlass,atKilaKitu
811 | PraptiDas17,WORLDMUSICAWARD
812 | ReGamertron,ccstellarsweets
813 | RajiPriyonoNFT,CubemanArt
814 | ToyLockerUK,CubemanArt
815 | HagTeenzcoolit,Kidzcoolit
816 | Ness_SeaGlass,MiambaBoutique
817 | TrotecUK,MimakiEurope
818 | HagTeenzcoolit,Kidzcoolit
819 | Jojangles55,AvonBooksUK
820 | PurpleMic_0901,WORLDMUSICAWARD
821 | Lavande85164944,WORLDMUSICAWARD
822 | khoodeelaar,Cooper_Lechat
823 | HagTeenzcoolit,Kidzcoolit
824 | Srvvnz,Kidzcoolit
825 | v_luv_12,WORLDMUSICAWARD
826 | HagTeenzcoolit,Kidzcoolit
827 | rubysamyoungz,JoanneDewberry
828 | HagTeenzcoolit,Kidzcoolit
829 | hearteaj,LQS_Media
830 | HagTeenzcoolit,Kidzcoolit
831 | HargroveFire,divinemotherCtr
832 | antant_ariari,divinemotherCtr
833 | Ness_SeaGlass,BagsofFavours
834 | voxantweets,_Islamicat
835 | HagTeenzcoolit,Kidzcoolit
836 | ladycatlover,TheStourbridge
837 | x_jupiterhart,TheStourbridge
838 | HEDTKD,walk4alzheimers
839 | Rashbhari_,DailySeoTips1
840 | samm_designs,MiambaBoutique
841 | HagTeenzcoolit,Kidzcoolit
842 | TATIJewelry,ClothesForCat
843 | retweetbossman,Yordanka
844 | TheLondonBeach,TenterdenDeals
845 | HagTeenzcoolit,Kidzcoolit
846 | BarrieHargrove,AgeUKLS
847 | chrisderrick1,KatieMettner
848 | HagTeenzcoolit,Kidzcoolit
849 | nagangsta,0mega001
850 | HagTeenzcoolit,Kidzcoolit
851 | LeeHillerLondon,Kidzcoolit
852 | mucho_mawi,BobbiesBrownies
853 | vtae_25,WORLDMUSICAWARD
854 | Kdg25fbjr1GKLsR,WORLDMUSICAWARD
855 | HagTeenzcoolit,Kidzcoolit
856 | HagTeenzcoolit,Kidzcoolit
857 | chrisderrick1,dani_haviland
858 | vhappytae,WORLDMUSICAWARD
859 | TATIJewelry,ClothesForCat
860 | HagTeenzcoolit,Kidzcoolit
861 | Man_Of_IKEA,Kidzcoolit
862 | kamasys,_Islamicat
863 | Max_Rebates,_Islamicat
864 | independntlife,_Islamicat
865 | khoodeelaar,TheStourbridge
866 | MaxMust63302429,TheWiganRunner
867 | HagTeenzcoolit,Kidzcoolit
868 | HagTeenzcoolit,Kidzcoolit
869 | samm_designs,candykissesltd
870 | MsRyanSCMJ,candykissesltd
871 | strandnixe99,ChloeLe39602964
872 | chrisderrick1,MaryLSchmidt
873 | HagTeenzcoolit,Kidzcoolit
874 | morganfahey,ChloeLe39602964
875 | HagTeenzcoolit,Kidzcoolit
876 | J_Swallow_LD,ThoseGuys_TRS
877 | candmclub,ThoseGuys_TRS
878 | superteamml,coolbargainhunt
879 | kokozidou,WORLDMUSICAWARD
880 | superteamml,coolbargainhunt
881 | VictoriaVets_,coolbargainhunt
882 | 27bstrok6,getdexterhome
883 | Only_V_tae,WORLDMUSICAWARD
884 | Qiwawa_BtsArmy,WORLDMUSICAWARD
885 | HagTeenzcoolit,Kidzcoolit
886 | BuckarooCrypto,Mayra_9797
887 | TenterdenDeals,Mayra_9797
888 | coolbargainhunt,Mayra_9797
889 | MyBestFriendV,WORLDMUSICAWARD
890 | KibworthKiT,HarboroughDC
891 | Sheffieldis,NapsSheffield
892 | Grasshopper2407,madeleinefwhite
893 | cpggtp,ProtestNews_EN
894 | KatyaBertrand,_Islamicat
895 | anAlienMaybe,WORLDMUSICAWARD
896 | MelAndTheWhale,palace_exile
897 | EwpVitality,palace_exile
898 | HagTeenzcoolit,Kidzcoolit
899 | clair_sherwood,PetMunchies
900 | MyboyVshi,WORLDMUSICAWARD
901 | HagTeenzcoolit,Kidzcoolit
902 | coolbargainhunt,Kidzcoolit
903 | formone37676146,Phemex_official
904 | coolbargainhunt,cuthbert_church
905 | coolbargainhunt,cuthbert_church
906 | welshregan,cuthbert_church
907 | andysmanclubuk,GiantsCT
908 | coolbargainhunt,GiantsCT
909 | ism08,TheStourbridge
910 | HagTeenzcoolit,Kidzcoolit
911 | TATIJewelry,ClothesForCat
912 | chelstae,WORLDMUSICAWARD
913 | coolbargainhunt,WORLDMUSICAWARD
914 | HagTeenzcoolit,Kidzcoolit
915 | HagTeenzcoolit,Kidzcoolit
916 | Cartmannnnnnnn,Rachael57354278
917 | HagTeenzcoolit,Kidzcoolit
918 | mdmremodeling,Kidzcoolit
919 | MrLindo78367288,WORLDMUSICAWARD
920 | BelvoirBolton,WORLDMUSICAWARD
921 | Priyaavni1,WORLDMUSICAWARD
922 | ravinder_del,b_bella_doxies
923 | trulyirishcf,b_bella_doxies
924 | Jekeeey2,WORLDMUSICAWARD
925 | katfan4eva,TheStourbridge
926 | DinkyWorld,TheStourbridge
927 | CashHippyAU,TheStourbridge
928 | nattylara,allianceonline
929 | HagTeenzcoolit,Kidzcoolit
930 | Purple_Bear66,WORLDMUSICAWARD
931 | SparkBestSeller,RealFloydKelly1
932 | HagTeenzcoolit,Kidzcoolit
933 | capt_dildo,Kidzcoolit
934 | armyb5529,WORLDMUSICAWARD
935 | HagTeenzcoolit,Kidzcoolit
936 | Rob_rolla,Kidzcoolit
937 | Eatmyguitar1,HamleysOfficial
938 | KelleniDr,HamleysOfficial
939 | HagTeenzcoolit,Kidzcoolit
940 | AskChefDennis,FLChefNicole
941 | Radio247UK,FLChefNicole
942 | TopBananaMall,FLChefNicole
943 | PeggyMountPod,FLChefNicole
944 | TopBananaMall,FLChefNicole
945 | Wishes_Quotes,FLChefNicole
946 | HagTeenzcoolit,Kidzcoolit
947 | WindaVanessa2,WORLDMUSICAWARD
948 | LilliannyM,WORLDMUSICAWARD
949 | Aria_Fiction,mandybaggot
950 | DexterCavalier,b_bella_doxies
951 | HagTeenzcoolit,Kidzcoolit
952 | AgeFriendlyDCC,NLIreland
953 | HagTeenzcoolit,Kidzcoolit
954 | HECParisMasters,HECParis
955 | HagTeenzcoolit,Kidzcoolit
956 | HagTeenzcoolit,Kidzcoolit
957 | HagTeenzcoolit,Kidzcoolit
958 | aus_shine,WORLDMUSICAWARD
959 | HagTeenzcoolit,Kidzcoolit
960 | cameyrick1,AnnaCampbelloz
961 | HagTeenzcoolit,Kidzcoolit
962 | HagTeenzcoolit,Kidzcoolit
963 | noha26096186,WORLDMUSICAWARD
964 | fireworksdhp,WORLDMUSICAWARD
965 | forestwines,WORLDMUSICAWARD
966 | Yordanka,WORLDMUSICAWARD
967 | Elphyblue21,bmstores
968 | HagTeenzcoolit,Kidzcoolit
969 | hcogyam,joojeeworld
970 | kucingdotexe,TheStourbridge
971 | HagTeenzcoolit,Kidzcoolit
972 | dobbyliciousy,WORLDMUSICAWARD
973 | dhumpachika,TitaniumGeek
974 | HarrowHKMusic,Harrow_HK
975 | HagTeenzcoolit,Kidzcoolit
976 | IOPTeaching,MarshallPhysics
977 | NingenNoSeDa,TheStourbridge
978 | HagTeenzcoolit,Kidzcoolit
979 | StCuthbertsRC1,Kidzcoolit
980 | Antenna_UK,bottletopdesign
981 | bevjoneswriting,KittyWilson23
982 | SharpNEC_UK,SaharaAV
983 | MoiraSwan,IMBottleShop
984 | nadiaippo,WORLDMUSICAWARD
985 | HagTeenzcoolit,Kidzcoolit
986 | CllrPhilKing,HarboroughDC
987 | SpDas18,269Justice
988 | samm_designs,littlefabshop
989 | armyhanataebts,WORLDMUSICAWARD
990 | HagTeenzcoolit,Kidzcoolit
991 | ExeterCathedral,Kidzcoolit
992 | jeonkimm7,WORLDMUSICAWARD
993 | kevin_feltham,HarboroughDC
994 | HagTeenzcoolit,Kidzcoolit
995 | Chandan61265758,DeFiWarriorGame
996 | olivia20130613,WORLDMUSICAWARD
997 | HagTeenzcoolit,Kidzcoolit
998 | KATODAI04900594,Dreame_tech
999 | georgiawrites,ChloeLe39602964
1000 | allsaintscsch,ChloeLe39602964
1001 | HagTeenzcoolit,Kidzcoolit
1002 | Lindsay04076821,bmstores
1003 | HagTeenzcoolit,Kidzcoolit
1004 | carlachrisellis,Find_Kemo
1005 | Works4Uorg,Find_Kemo
1006 | HagTeenzcoolit,Kidzcoolit
1007 | howltaev,WORLDMUSICAWARD
1008 | HagTeenzcoolit,Kidzcoolit
1009 | OneHaleyStar,Amandalavan1
1010 | rayment_max,SwanstonRobert
1011 | HagTeenzcoolit,Kidzcoolit
1012 | IHEARTVEGAN,ChloeLe39602964
1013 | HagTeenzcoolit,Kidzcoolit
1014 | FazilBetting,Phemex_official
1015 | Nice26923195,JacobLi63329419
1016 | vanteplum7,WORLDMUSICAWARD
1017 | HagTeenzcoolit,Kidzcoolit
1018 | HagTeenzcoolit,Kidzcoolit
1019 | Mehakgul02,Phemex_official
1020 | Jess_P95,SnuggHomes
1021 | FilmMusicTracks,trulymusicalark
1022 | Pantrade_SG,trulymusicalark
1023 | USP_college,trulymusicalark
1024 | StMartinDublin,trulymusicalark
1025 | thegrainteam,trulymusicalark
1026 | HagTeenzcoolit,Kidzcoolit
1027 | leicestermuseum,Kidzcoolit
1028 | HagTeenzcoolit,Kidzcoolit
1029 | LesleyClerk,HarboroughDC
1030 | AnNa99263591,WORLDMUSICAWARD
1031 | TheHugsFoundat1,WORLDMUSICAWARD
1032 | R72Rachel,Mersey_Care
1033 | HagTeenzcoolit,Kidzcoolit
1034 | DublinTraveller,Kidzcoolit
1035 | amini54art,littlefabshop
1036 | HagTeenzcoolit,Kidzcoolit
1037 | nguyenl04081327,Kidzcoolit
1038 | CCardanos,Kidzcoolit
1039 | tae_asie,WORLDMUSICAWARD
1040 | HagTeenzcoolit,Kidzcoolit
1041 | Antolepoulet,getwhalinvest
1042 | donnalburnell,ChloeLe39602964
1043 | MerseyRDC,LRecycles
1044 | HagTeenzcoolit,Kidzcoolit
1045 | TaeV1030,WORLDMUSICAWARD
1046 | HagTeenzcoolit,Kidzcoolit
1047 | HagTeenzcoolit,Kidzcoolit
1048 | HagTeenzcoolit,Kidzcoolit
1049 | KingOfTheCoven,WORLDMUSICAWARD
1050 | HagTeenzcoolit,Kidzcoolit
1051 | WelcommComms,Kidzcoolit
1052 | CarlosZarateV,christmas_clock
1053 | thesupermomlife,yeahlifestyle
1054 | HagTeenzcoolit,Kidzcoolit
1055 | vzonkful,WORLDMUSICAWARD
1056 | purpleV9512,WORLDMUSICAWARD
1057 | kookiekrim,_Islamicat
1058 | sergiosanch94,beincrypto
1059 | gosquad22,gectouch
1060 | Spi_des_ign,gectouch
1061 | EmmaCale1,allianceonline
1062 | nguyennhi2501,WORLDMUSICAWARD
1063 | HagTeenzcoolit,Kidzcoolit
1064 | HagTeenzcoolit,Kidzcoolit
1065 | HagTeenzcoolit,Kidzcoolit
1066 | AuntieK18,Kidzcoolit
1067 | Jazario2x,DoodlePoodleNFT
1068 | BuckarooCrypto,OpeoluwaFalodun
1069 | kazzyhow,bmstores
1070 | ljfly10,torix_nft
1071 | PhillysDiner,torix_nft
1072 | regz_KTH,WORLDMUSICAWARD
1073 | HagTeenzcoolit,Kidzcoolit
1074 | HagTeenzcoolit,Kidzcoolit
1075 | chyperskies,WORLDMUSICAWARD
1076 | MillieMoonlight,BaskersBoutique
1077 | RidgmontStation,BaskersBoutique
1078 | HagTeenzcoolit,Kidzcoolit
1079 | Circle2Success,TheNelsonTrust
1080 | Sasakim41929992,WORLDMUSICAWARD
1081 | NewHopeHQ,WORLDMUSICAWARD
1082 | IBT_BuildTimber,RAINYDAYTRUST
1083 | 27260014k,WORLDMUSICAWARD
1084 | lavenderdreamf1,scribbled_hand
1085 | HagTeenzcoolit,Kidzcoolit
1086 | NatalieKTH,WORLDMUSICAWARD
1087 | TPositiveTC,WORLDMUSICAWARD
1088 | HagTeenzcoolit,Kidzcoolit
1089 | englishprepa8,Kidzcoolit
1090 | kalai_designer,gectouch
1091 | HagTeenzcoolit,Kidzcoolit
1092 | TopBananaMall,Kidzcoolit
1093 | stephmrainey,NKPrimary
1094 | DanielPoss,EV2Sportswear
1095 | SwanstonRobert,EV2Sportswear
1096 | LiljinxB,WORLDMUSICAWARD
1097 | HagTeenzcoolit,Kidzcoolit
1098 | BuckarooCrypto,OpeoluwaFalodun
1099 | cbj42813606,torix_nft
1100 | Ximena29Ps,WORLDMUSICAWARD
1101 | CountessofW,WORLDMUSICAWARD
1102 | HagTeenzcoolit,Kidzcoolit
1103 | HagTeenzcoolit,Kidzcoolit
1104 | SahShaah,Kidzcoolit
1105 | HagTeenzcoolit,Kidzcoolit
1106 | NondyeboJojo,Alfonzowords2
1107 | jessica9x_,RobuxCity
1108 | ruby_redsky,RobuxCity
1109 | HagTeenzcoolit,Kidzcoolit
1110 | ParallelLTrust,_SuttonHouse_
1111 | safeplaceforV,WORLDMUSICAWARD
1112 | theonettey,WORLDMUSICAWARD
1113 | HagTeenzcoolit,Kidzcoolit
1114 | ParallelLTrust,_SuttonHouse_
1115 | chrismarriott6,Camerados_org
1116 | MimieNorsya,ChloeLe39602964
1117 | ParallelLTrust,_SuttonHouse_
1118 | HelenHampton,_SuttonHouse_
1119 | psbaidoo,UmodziGin
1120 | wickedleeksmag,UmodziGin
1121 | HagTeenzcoolit,Kidzcoolit
1122 | sarojrao74,CryptoM216
1123 | NorCalWineLady,junedarville
1124 | Be7Tomov,WORLDMUSICAWARD
1125 | HagTeenzcoolit,Kidzcoolit
1126 | KerryLibrary,NLIreland
1127 | BuckarooCrypto,OpeoluwaFalodun
1128 | HAN07040223,WORLDMUSICAWARD
1129 | HagTeenzcoolit,Kidzcoolit
1130 | UrLocal_Cat,RobuxCity
1131 | JohnDanielShop,drstephencarver
1132 | CYBCards,bloom_jewellery
1133 | HagTeenzcoolit,Kidzcoolit
1134 | mikeiron65,BaskersBoutique
1135 | HagTeenzcoolit,Kidzcoolit
1136 | LuciFortoon,pbshop_store
1137 | LuciFortoon,PetMunchies
1138 | booly_supply,manwhitevanhire
1139 | JudyNagy8,believeinbubu
1140 | HagTeenzcoolit,Kidzcoolit
1141 | dareadeyy,Austeiin
1142 | taedelweis,WORLDMUSICAWARD
1143 | HagTeenzcoolit,Kidzcoolit
1144 | Henshalls,Kidzcoolit
1145 | protocolpills,Kidzcoolit
1146 | BuckarooCrypto,OpeoluwaFalodun
1147 | Iain13955,ChloeLe39602964
1148 | TasteKnutsford,KnutsfordTown
1149 | 3DRecruitEd,KnutsfordTown
1150 | misun580,WORLDMUSICAWARD
1151 | agnesjuliet,WORLDMUSICAWARD
1152 | Yldrmmhmt23,Phemex_official
1153 | keremgullee,Phemex_official
1154 | christmas_clock,Phemex_official
1155 | ShunShu14127262,WORLDMUSICAWARD
1156 | mylove_9290,WORLDMUSICAWARD
1157 | Epiliolaser,WORLDMUSICAWARD
1158 | jungshe_02,WORLDMUSICAWARD
1159 | Taeyeontannie1,WORLDMUSICAWARD
1160 | lauracranetrust,WeAreNorthlight
1161 | ashayeria,HuobiGlobal
1162 | Nayelis13213949,WORLDMUSICAWARD
1163 | knutsmarket,KnutsfordTown
1164 | HagTeenzcoolit,Kidzcoolit
1165 | Desitan18,WORLDMUSICAWARD
1166 | RailMags,manwhitevanhire
1167 | JudyNagy8,SnuggHomes
1168 | nattylara,bmstores
1169 | TaegramV,WORLDMUSICAWARD
1170 | uCloudify,elitees_NI
1171 | hot3Dviews,the_AI_gang
1172 | sassytaehy,WORLDMUSICAWARD
1173 | elitees_NI,WORLDMUSICAWARD
1174 | dijaminmasih,WORLDMUSICAWARD
1175 | IvaP36604823,WORLDMUSICAWARD
1176 | SLHertfordshire,WORLDMUSICAWARD
1177 | feltnyarn,BadgerCrafty
1178 | Giovanna84F,pintofscienceNO
1179 | Rel3ound,gamerstudioltd
1180 | staafme,AlyTheKitten
1181 | RogueStitchery,greengagedesign
1182 | ymcaamy,YMCALincs
1183 | ashayeria,HuobiGlobal
1184 | AsyalataeZ,WORLDMUSICAWARD
1185 | LukeRoper,WORLDMUSICAWARD
1186 | DonGiooo,ogcrystals
1187 | PowysArchives,pplscollection
1188 | le_jerriais,bunscoill
1189 | HagTeenzcoolit,YouthGottit
1190 | CatFanatic9,Cooper_Lechat
1191 | ianhallk9,HelmsleyWines
1192 | FAhankar,ranamansourvar
1193 | aquestingvole,ranamansourvar
1194 | LesleyClerk,HarboroughDC
1195 | ArascaMedical,HarboroughDC
1196 | lugones1980,HarboroughDC
1197 | rcn_rccg,HarboroughDC
1198 | janj2301,PetMunchies
1199 | ymcaamy,YMCALincs
1200 | TDainton,YMCALincs
1201 | AltreGunn,RobuxCity
1202 | RobuxRetweeter,RedNinjaNotMuch
1203 | TotalBath,RedNinjaNotMuch
1204 | kieborg1,northern_elves
1205 | HenryKimbell,GallopingToGive
1206 | freebirdsfly,lucindahawksley
1207 | NoOne345679,b_bella_doxies
1208 | Faizanh43347943,WORLDMUSICAWARD
1209 | BuckarooCrypto,OpeoluwaFalodun
1210 | blueberry0022,ZatuHome
1211 | RedNinjaNotMuch,ZatuHome
1212 | NBGLLP,RAINYDAYTRUST
1213 | ymcaamy,YMCALincs
1214 | BabyKoo53961584,WORLDMUSICAWARD
1215 | HenleySwim,WORLDMUSICAWARD
1216 | DraycotChurches,WORLDMUSICAWARD
1217 | JudyNagy8,pbshop_store
1218 | janj2301,pbshop_store
1219 | sudesna_ghosh,DebbieViggiano
1220 | Andy__Bullock,Sue_Woodward
1221 | whycantitouchit,HubLewisham
1222 | AmorKimTae,WORLDMUSICAWARD
1223 | CultureVannin,bunscoill
1224 | Cruzgopi1,HuobiGlobal
1225 | MiambaBoutique,SueCanSew1
1226 | Radio247UK,SueCanSew1
1227 | Vsguarde,WORLDMUSICAWARD
1228 | tim_hi2,RobuxCity
1229 | Bryers12,EV2Sportswear
1230 | JudyNagy8,poppyscupcakes
1231 | kusanagi391,hiroizumi1
1232 | RedNinjaNotMuch,hiroizumi1
1233 | iammichiewill,hiroizumi1
1234 | schnoddelbotz,Italia
1235 | allaboutnewport,ChloeLe39602964
1236 | FreemanTech,ChloeLe39602964
1237 | KnutsfordX,KnutsfordTown
1238 | ymcaamy,YMCALincs
1239 | lisdapm,WORLDMUSICAWARD
1240 | gungdekarart,Shiruht1
1241 | winterbear_0930,WORLDMUSICAWARD
1242 | NLIreland,WORLDMUSICAWARD
1243 | BuckarooCrypto,OpeoluwaFalodun
1244 | kusanagi391,hiroizumi1
1245 | MischievousBri1,WORLDMUSICAWARD
1246 | Deborah39946479,WORLDMUSICAWARD
1247 | ErikacarolinaGS,WORLDMUSICAWARD
1248 | Mason1Lorraine,ItuEastbourne
1249 | fairway_lady,ItuEastbourne
1250 | FightMeHoe8,WORLDMUSICAWARD
1251 | sweetboy951230,WORLDMUSICAWARD
1252 | AccessoriesbyC_,Austeiin
1253 | RuthCrane_MPC,TeresaYarnold
1254 | SelanikliTrk,HuobiGlobal
1255 | Robinho21086025,HamleysOfficial
1256 | WeCleanWeGreen,HamleysOfficial
1257 | entr_academy,HamleysOfficial
1258 | GrungeGetAway,bmstores
1259 | TOYin3D,the_AI_gang
1260 | JudyOlo,b_bella_doxies
1261 | walk1961,pbshop_store
1262 | manwhitevanhire,pbshop_store
1263 | FuturumG,The_ACG
1264 | BtS_PsK,WORLDMUSICAWARD
1265 | amberscenery,WORLDMUSICAWARD
1266 | ktyu114,WORLDMUSICAWARD
1267 | HelloHappy0402,mrjoewalker
1268 | ShadesOfSofiya,Austeiin
1269 | NCHC_CF,Austeiin
1270 | pubrooms,Austeiin
1271 | NJ_fresh,Austeiin
1272 | tatatkm1,WORLDMUSICAWARD
1273 | f_cryp1,northern_elves
1274 | holdfastnetwork,1607WestEgg
1275 | MamaTazzy13,RoseVioletDeb
1276 | damuax,WORLDMUSICAWARD
1277 | BuckarooCrypto,OpeoluwaFalodun
1278 | frecklejam1,OpeoluwaFalodun
1279 | mick859,OpeoluwaFalodun
1280 | ExeXmasMarket,OpeoluwaFalodun
1281 | JudyNagy8,PetMunchies
1282 | SynStarIT,PetMunchies
1283 | MaddockLucie,TASCharity
1284 | MerseyRoyalGFC,EV2Sportswear
1285 | erfan35969995,HuobiGlobal
1286 | yujulia999,WORLDMUSICAWARD
1287 | JiaoLily1,WORLDMUSICAWARD
1288 | SDWorx,WORLDMUSICAWARD
1289 | AnimatorsPal,RealFloydKelly1
1290 | moncarbone,RealFloydKelly1
1291 | ChrimboPunks,RealFloydKelly1
1292 | TrustVictorious,VTrustWellbeing
1293 | Riawan08997503,DeFiWarriorGame
1294 | bel_avocat,DeFiWarriorGame
1295 | ymcaamy,YMCALincs
1296 | newsoneplace,YMCALincs
1297 | BuckarooCrypto,OpeoluwaFalodun
1298 | worthingcats,OpeoluwaFalodun
1299 | missBangwanLSA,OpeoluwaFalodun
1300 | taehyung_v_1004,WORLDMUSICAWARD
1301 | sweetnight555,WORLDMUSICAWARD
1302 | MentalHRetweet,SparkScotland
1303 | lucindahawksley,SparkScotland
1304 | JagJoyu,dailybannerapp
1305 | uranylchloride,WORLDMUSICAWARD
1306 | JoanneDewberry,WORLDMUSICAWARD
1307 | UncleBeard1978,ChloeLe39602964
1308 | ent_con,Kidzcoolit
1309 | taetaetata199,WORLDMUSICAWARD
1310 | Matty2kRoyal,EV2Sportswear
1311 | natrellabot,SpsWirral
1312 | Amiraqa80,HuobiGlobal
1313 | Hope7Theingi,WORLDMUSICAWARD
1314 | ent_con,Kidzcoolit
1315 | ent_con,Kidzcoolit
1316 | gamesleyschool,VTrustWellbeing
1317 | ent_con,Kidzcoolit
1318 | trulymusicalark,Kidzcoolit
1319 | zippydjh,Hypnogoria
1320 | london2024,mattjlondon
1321 | JonsCrazyTweets,mattjlondon
1322 | ent_con,Kidzcoolit
1323 | gabriell9a,WORLDMUSICAWARD
1324 | CraftyGenes,littlefabshop
1325 | ent_con,Kidzcoolit
1326 | Inspire_Ashton,VTrustWellbeing
1327 | MonicaOP,TheStourbridge
1328 | ent_con,Kidzcoolit
1329 | Jeaniewah1,Amandalavan1
1330 | jluvtannies,WORLDMUSICAWARD
1331 | ent_con,Kidzcoolit
1332 | 2005fuchsia,womensart1
1333 | CraftyGenes,MiambaBoutique
1334 | ShorelineStudi3,WorksUncommon
1335 | hybesucks,WORLDMUSICAWARD
1336 | MumTazA00841940,WORLDMUSICAWARD
1337 | ent_con,Kidzcoolit
1338 | TCSInterview,Kidzcoolit
1339 | UPSCPractice,Kidzcoolit
1340 | vuongvinhvien,GenshinFloki
1341 | RealFloydKelly1,GenshinFloki
1342 | svacomps,bmstores
1343 | ent_con,Kidzcoolit
1344 | MentalHealthBo5,SparkScotland
1345 | Gennaliz_17,WORLDMUSICAWARD
1346 | ChapelGuards,TheGuardsChapel
1347 | ent_con,Kidzcoolit
1348 | atkcryb,WORLDMUSICAWARD
1349 | YewTreePrimSch,VTrustWellbeing
1350 | LOOK_UK,VTrustWellbeing
1351 | jokertoons,VTrustWellbeing
1352 | econrsa,VTrustWellbeing
1353 | JewelsGiftBox,VTrustWellbeing
1354 | jiei_yushi,adriannarenee09
1355 | sceneryforkthTR,WORLDMUSICAWARD
1356 | SparkScotland,WORLDMUSICAWARD
1357 | mmcatsdesign,darlingscatcafe
1358 | ent_con,Kidzcoolit
1359 | MyWatering,Kidzcoolit
1360 | MyWatering,Kidzcoolit
1361 | nscgroup,Kidzcoolit
1362 | BesaCare,Kidzcoolit
1363 | taetae_taebear,WORLDMUSICAWARD
1364 | woodentek,WORLDMUSICAWARD
1365 | RotolokGroup,WORLDMUSICAWARD
1366 | Madonna86049046,NewMadonna1
1367 | EncourageLove2,NewMadonna1
1368 | ent_con,Kidzcoolit
1369 | leicestermuseum,Kidzcoolit
1370 | TopBananaMall,Kidzcoolit
1371 | BuckarooCrypto,OpeoluwaFalodun
1372 | My_MiltonKeynes,OpeoluwaFalodun
1373 | ent_con,Kidzcoolit
1374 | manwhitevanhire,Kidzcoolit
1375 | ent_con,Kidzcoolit
1376 | Cryptookk,northern_elves
1377 | ent_con,Kidzcoolit
1378 | JanetHinton01,ChloeLe39602964
1379 | suseaslowknitta,Dorotheacalm
1380 | BTS_Bangtan07_,WORLDMUSICAWARD
1381 | PoplarStreetHT,VTrustWellbeing
1382 | ClydesdaleASN,VTrustWellbeing
1383 | ent_con,Kidzcoolit
1384 | MBrouazin,northern_elves
1385 | Grandkathy,TheStourbridge
1386 | ColleenMacLean5,TheStourbridge
1387 | moon_tae_v,WORLDMUSICAWARD
1388 | bluetaepeony,WORLDMUSICAWARD
1389 | ent_con,Kidzcoolit
1390 | Weetons,Kidzcoolit
1391 | MovementUnit,Kidzcoolit
1392 | johnnyrico93,getwhalinvest
1393 | ent_con,Kidzcoolit
1394 | diriririe2,LQS_Media
1395 | ent_con,Kidzcoolit
1396 | Vyplummy,RobuxCity
1397 | DongRa61,WORLDMUSICAWARD
1398 | ent_con,Kidzcoolit
1399 | moulanapanji,PussycatNaughty
1400 | ent_con,Kidzcoolit
1401 | asvcprb117,WORLDMUSICAWARD
1402 | BetMessenger1,christmas_clock
1403 | Vantaeinscenery,WORLDMUSICAWARD
1404 | MrGulaks13,Phemex_official
1405 | ent_con,Kidzcoolit
1406 | oenfownfofnfi,RobuxCity
1407 | happy_tete7,WORLDMUSICAWARD
1408 | ent_con,Kidzcoolit
1409 | wild_bank,VTrustWellbeing
1410 | Rupali76512507,WORLDMUSICAWARD
1411 | ent_con,Kidzcoolit
1412 | ent_con,Kidzcoolit
1413 | PEWmag,Kidzcoolit
1414 | ravinder_del,PussycatNaughty
1415 | keal_linda,HamleysOfficial
1416 | ent_con,Kidzcoolit
1417 | NewMadonna1,Kidzcoolit
1418 | coopersarmsSW3,Kidzcoolit
1419 | HelpCen56447707,dailybannerapp
1420 | ccpscotland,CapabilityScot
1421 | nofearnopause,nico_gaia
1422 | ent_con,Kidzcoolit
1423 | noribaka_,WORLDMUSICAWARD
1424 | ent_con,Kidzcoolit
1425 | BuckarooCrypto,OpeoluwaFalodun
1426 | ent_con,Kidzcoolit
1427 | OjitosVerdeAzul,WORLDMUSICAWARD
1428 | IreneAReid,dementiacentre
1429 | JudyNagy8,HamleysOfficial
1430 | mafia_squirrel,ChloeLe39602964
1431 | dillinger4010,ChloeLe39602964
1432 | ent_con,Kidzcoolit
1433 | BarninghamCEVCP,Kidzcoolit
1434 | WonderfulChoc,Kidzcoolit
1435 | ABFEastAnglia,Kidzcoolit
1436 | ent_con,Kidzcoolit
1437 | MolleCollection,littlefabshop
1438 | ok32650586,allfeltnofilter
1439 | ent_con,Kidzcoolit
1440 | SuesArt,littlefabshop
1441 | ent_con,Kidzcoolit
1442 | Ladyroni,Kidzcoolit
1443 | NatKleinman,The__SadieRyan
1444 | ivylieve1230,WORLDMUSICAWARD
1445 | ent_con,Kidzcoolit
1446 | IngeBonneux,drpeachy
1447 | LAG_Hagley,drpeachy
1448 | ent_con,Kidzcoolit
1449 | ent_con,Kidzcoolit
1450 | fizzykv,WORLDMUSICAWARD
1451 | ent_con,Kidzcoolit
1452 | KoobalCrypto,getwhalinvest
1453 | kthlovevoi,WORLDMUSICAWARD
1454 | tasteofbandon,WORLDMUSICAWARD
1455 | kaya_pain,buwuchi
1456 | walk1961,PetMunchies
1457 | Dreamer_Lennon,PetMunchies
1458 | ent_con,Kidzcoolit
1459 | MineCartMayhem,Kidzcoolit
1460 | TheBroadwayBrad,visitBradford
1461 | ent_con,Kidzcoolit
1462 | ent_con,Kidzcoolit
1463 | CraftyL96082557,getdexterhome
1464 | ent_con,Kidzcoolit
1465 | VoIPon,YealinkNews
1466 | ent_con,Kidzcoolit
1467 | BuckarooCrypto,OpeoluwaFalodun
1468 | fieldpast,TheStourbridge
1469 | kth1waiting,WORLDMUSICAWARD
1470 | PikuSubhu,WORLDMUSICAWARD
1471 | GrineHoney,WORLDMUSICAWARD
1472 | Andrea6Mitchell,ChloeLe39602964
1473 | EliteLuxury3,ChloeLe39602964
1474 | kevinpendry,JoshSabarra
1475 | ent_con,Kidzcoolit
1476 | TATIJewelry,pinkhenstudio
1477 | janemanuelabras,pRUSZKIEWICZ
1478 | Xsquaretec,dailybannerapp
1479 | RedHouseSchool,dailybannerapp
1480 | ActorsWhoGarden,SarahLidsActor
1481 | suntae24986210,WORLDMUSICAWARD
1482 | ent_con,Kidzcoolit
1483 | j________gar__,WORLDMUSICAWARD
1484 | Firegoddess_8,PetMunchies
1485 | ent_con,Kidzcoolit
1486 | XveltM,HuobiGlobal
1487 | ent_con,Kidzcoolit
1488 | Taethebest30,WORLDMUSICAWARD
1489 | ent_con,Kidzcoolit
1490 | ent_con,Kidzcoolit
1491 | adimontefalco__,AudreyNesbitt11
1492 | NoMoreDream_V,WORLDMUSICAWARD
1493 | VabyVear,WORLDMUSICAWARD
1494 | ent_con,Kidzcoolit
1495 | EleCCgan,WORLDMUSICAWARD
1496 | SpDas18,CHAM02313921
1497 | ent_con,Kidzcoolit
1498 | Kim79430780,WORLDMUSICAWARD
1499 | KadenzeOfficial,WORLDMUSICAWARD
1500 | MarthaMcnair36,OKMagazine
1501 | makotaev,WORLDMUSICAWARD
1502 | ent_con,Kidzcoolit
1503 | 7aibon7,WORLDMUSICAWARD
1504 | ggukthgi,WORLDMUSICAWARD
1505 | ent_con,Kidzcoolit
1506 | NidhinJ09287560,HuobiGlobal
1507 | CeriseHiver,visitportugal
1508 | ent_con,Kidzcoolit
1509 | ent_con,Kidzcoolit
1510 | JohnnyMilkovich,JpRepublic
1511 | tastytae95,WORLDMUSICAWARD
1512 | TaanviD,DailySeoTips1
1513 | ent_con,Kidzcoolit
1514 | ZarateCreations,Kidzcoolit
1515 | LymmTruckWash,DAFTrucksUK
1516 | cypiao,HuobiGlobal
1517 | ent_con,Kidzcoolit
1518 | AvetissianMaya,WFPArmenia
1519 | Melanie_PTD,WORLDMUSICAWARD
1520 | AliceBlack2020,ilan_profile
1521 | ent_con,Kidzcoolit
1522 | ffm2019,WORLDMUSICAWARD
1523 | ent_con,Kidzcoolit
1524 | NaturalCement,Kidzcoolit
1525 | h_craggs,AuthorJRose
1526 | greencatbooks,AuthorJRose
1527 | 23_Gee_23,WORLDMUSICAWARD
1528 | torridgedc,RecycleDevon
1529 | MiambaBoutique,RecycleDevon
1530 | ent_con,Kidzcoolit
1531 | BuckarooCrypto,OpeoluwaFalodun
1532 | lamdongnd,MEXC_Global
1533 | ent_con,Kidzcoolit
1534 | Mellowianaaa,RobuxCity
1535 | ent_con,Kidzcoolit
1536 | CohimeMalo,womensart1
1537 | MelTBessent,BookSuperhero2
1538 | TitaniumGeek,BookSuperhero2
1539 | ent_con,Kidzcoolit
1540 | Niamh_Ni_A,Kidzcoolit
1541 | TOMRACollection,Kidzcoolit
1542 | ent_con,Kidzcoolit
1543 | jvstjax,RobuxCity
1544 | ent_con,Kidzcoolit
1545 | KentHandmade,littlefabshop
1546 | Heyry17,WORLDMUSICAWARD
1547 | ent_con,Kidzcoolit
1548 | Missnoname03,pbshop_store
1549 | dinaapratiwi85,Min_Genius1994
1550 | ent_con,Kidzcoolit
1551 | MalvarAngela,WORLDMUSICAWARD
1552 | polisded,Cooper_Lechat
1553 | Taestreams,WORLDMUSICAWARD
1554 | TheGuardsChapel,WORLDMUSICAWARD
1555 | ym04022800,WORLDMUSICAWARD
1556 | vgukktae,WORLDMUSICAWARD
1557 | AnMinggg,RobuxCity
1558 | RajAgra0124221,aristavault
1559 | boracosmos,WORLDMUSICAWARD
1560 | ent_con,Kidzcoolit
1561 | FansFair,Kidzcoolit
1562 | romarmy1,WORLDMUSICAWARD
1563 | ent_con,Kidzcoolit
1564 | prakashmodel41,WORLDMUSICAWARD
1565 | ent_con,Kidzcoolit
1566 | ameensajwani,Kidzcoolit
1567 | cosmicboy79,Kidzcoolit
1568 | vantearchives_,WORLDMUSICAWARD
1569 | hmvMansfield,WORLDMUSICAWARD
1570 | iMotivateAfrica,NoniDiba
1571 | VortalV,WORLDMUSICAWARD
1572 | StevenGNorman,Sue_Woodward
1573 | QuotesBot1,Whichwaygameso1
1574 | Milina88195397,WORLDMUSICAWARD
1575 | taeflowerily,WORLDMUSICAWARD
1576 | Missnoname03,PetMunchies
1577 | ent_con,Kidzcoolit
1578 | ent_con,Kidzcoolit
1579 | SY95038469,WORLDMUSICAWARD
1580 | ent_con,Kidzcoolit
1581 | QuotesBot1,Meet_The_Pods
1582 | OTV118,WORLDMUSICAWARD
1583 | BennyHall17,bmstores
1584 | YanaAxar,bmstores
1585 | ent_con,Kidzcoolit
1586 | thisaintjimbeam,HecticGifts
1587 | empowerdigi,ShelterBox
1588 | navigatexo,KoreanTravel
1589 | QuotesBot1,lucoinshirt
1590 | ent_con,Kidzcoolit
1591 | sueatkilmeedy,lizaadamczewski
1592 | DMSMaster2,dailybannerapp
1593 | ent_con,Kidzcoolit
1594 | BTSxARMY1210,WORLDMUSICAWARD
1595 | lowpoly_tweeter,Figoyg1
1596 | ent_con,Kidzcoolit
1597 | Oop2Alley,Iza_2021
1598 | Byeol_Noona,WORLDMUSICAWARD
1599 | YogiSap35883978,HuobiGlobal
1600 | ent_con,Kidzcoolit
1601 | UKMumstv,Kidzcoolit
1602 | Radio247UK,Kidzcoolit
1603 | ent_con,Kidzcoolit
1604 | wnterchld,WORLDMUSICAWARD
1605 | Arabella_KTH,WORLDMUSICAWARD
1606 | TaanviD,DailySeoTips1
1607 | QuotesBot1,stuffedofficial
1608 | LikaNandy2601,WORLDMUSICAWARD
1609 | Figoyg1,WORLDMUSICAWARD
1610 | ent_con,Kidzcoolit
1611 | Hobbycraft_EPP,Hobbycraft_TTN
1612 | vtaehyungv19,WORLDMUSICAWARD
1613 | ent_con,Kidzcoolit
1614 | cpj1971,EV2Sportswear
1615 | YvonneShaw4,NewbyLeisureLtd
1616 | ent_con,Kidzcoolit
1617 | YealinkNews,Kidzcoolit
1618 | taeaddi,WORLDMUSICAWARD
1619 | bethanjohn16,beautys_legacy
1620 | FengShuiPyramid,BySvoon
1621 | bangtannice7,WORLDMUSICAWARD
1622 | Shahxyb,HuobiGlobal
1623 | HecticGifts,HuobiGlobal
1624 | ent_con,Kidzcoolit
1625 | inbusiness4good,Kidzcoolit
1626 | davozinni,Austeiin
1627 | ent_con,Kidzcoolit
1628 | Missnoname03,HamleysOfficial
1629 | ent_con,Kidzcoolit
1630 | MrsMummaGarner,HamleysOfficial
1631 | dukhjoy,nestrocklimited
1632 | tete_angelkv,WORLDMUSICAWARD
1633 | SSSSnowflower,WORLDMUSICAWARD
1634 | ent_con,Kidzcoolit
1635 | Yoselin17905717,WORLDMUSICAWARD
1636 | Hobbycraft_STK,WORLDMUSICAWARD
1637 | cloudtamers,MBIpublishers
1638 | ent_con,Kidzcoolit
1639 | BASICS_HQ,BeepDoctors
1640 | Craftville,rosesworkshop
1641 | BlackettMusic,RecklessVelvet
1642 | forster_mr,Dorotheacalm
1643 | FengShuiPyramid,Wild_Lotus_Fun
1644 | ent_con,Kidzcoolit
1645 | Vwinterbear5,WORLDMUSICAWARD
1646 | scotsbint,HamleysOfficial
1647 | railwaybear,allianceonline
1648 | SpsWirral,allianceonline
1649 | yesssAce,WORLDMUSICAWARD
1650 | ent_con,Kidzcoolit
1651 | NatalieFR10,ESPPlayNatalie
1652 | BlackettPromo,RecklessVelvet
1653 | blinkkittylove,RecklessVelvet
1654 | ConnieD16845594,ChloeLe39602964
1655 | AndyPennefather,pamlecky
1656 | Wizard_707,SzamerM
1657 | MrRajput2212,SzamerM
1658 | shirochanUwU,WORLDMUSICAWARD
1659 | YourSanctum,WORLDMUSICAWARD
1660 | Whichwaygameso1,WORLDMUSICAWARD
1661 | DogDuckLark,WORLDMUSICAWARD
1662 | AnsoChan,WORLDMUSICAWARD
1663 | eatodtouenoon,WORLDMUSICAWARD
1664 | ent_con,Kidzcoolit
1665 | jollydollie2019,pbshop_store
1666 | treatnorwich,pbshop_store
1667 | lyyynda8,bslcourses
1668 | AnthonySmithPhD,shrewsmorris
1669 | DanETee80,shrewsmorris
1670 | ngocanh111111,WORLDMUSICAWARD
1671 | san_in_marino,WORLDMUSICAWARD
1672 | crystal_vluv,WORLDMUSICAWARD
1673 | Littlelambtales,WORLDMUSICAWARD
1674 | TomRattray22,ladybirdandleaf
1675 | westieorourke58,getdexterhome
1676 | MoneyWeedPuzzy,getdexterhome
1677 | JGjerdrum,getdexterhome
1678 | FosterCareToday,IntellectBusin1
1679 | DiavloKTH,WORLDMUSICAWARD
1680 | kth_idolofidols,WORLDMUSICAWARD
1681 | anya_kth,WORLDMUSICAWARD
1682 | ScottishHistSoc,WORLDMUSICAWARD
1683 | Vante_bear_,WORLDMUSICAWARD
1684 | bishbishbishbij,WORLDMUSICAWARD
1685 | Taeblackbrown,WORLDMUSICAWARD
1686 | rosesworkshop,WORLDMUSICAWARD
1687 | taeberry_kth,WORLDMUSICAWARD
1688 | SkSazia,WORLDMUSICAWARD
1689 | snowttaee,WORLDMUSICAWARD
1690 | KVTaehyung1230,WORLDMUSICAWARD
1691 | designmyholida,WORLDMUSICAWARD
1692 | MoneyWeedPuzzy,WORLDMUSICAWARD
1693 | matthewrw1978,StDuthusFC
1694 | SammieMcIntyr14,Wahlbonkers
1695 | todaykth,WORLDMUSICAWARD
1696 | taeloveofmylife,WORLDMUSICAWARD
1697 | VTeamBase,WORLDMUSICAWARD
1698 | ent_con,YouthGottit
1699 | izzah_shaf,ChloeLe39602964
1700 | Spongebob23497,ChloeLe39602964
1701 | LogshaIsHot,b_bella_doxies
1702 | AlresfordCofC,tngwine
1703 | EconomicsinTen,tngwine
1704 | EconomicsinTen,tngwine
1705 | DeepikaMehta93,tngwine
1706 | hsbsnsc,WORLDMUSICAWARD
1707 | hmvIpswich,WORLDMUSICAWARD
1708 | DrNeilHoare,tweetingdexter
1709 | lillywhite1980,DT_Darlington
1710 | BTSV_Malaysia,WORLDMUSICAWARD
1711 | HowellsSchool,WORLDMUSICAWARD
1712 | MrRajput2212,fevicreate
1713 | paletwo2019,BigCatRescue
1714 | Dharapa62909461,WORLDMUSICAWARD
1715 | littlefabshop,WORLDMUSICAWARD
1716 | Cutepie003,269Justice
1717 | DeepikaMehta93,fevicreate
1718 | Cerry05055815,WORLDMUSICAWARD
1719 | Hypnogoria,WORLDMUSICAWARD
1720 | penguinclass5,WORLDMUSICAWARD
1721 | visitportugal,WORLDMUSICAWARD
1722 | canjulied,HuobiGlobal
1723 | Anilabibi11,WORLDMUSICAWARD
1724 | IndepenCottages,WORLDMUSICAWARD
1725 | burgonandball,WORLDMUSICAWARD
1726 | TelfordCentre,WORLDMUSICAWARD
1727 | Adri_Supr_Emo,Cooper_Lechat
1728 | adorevngel,WORLDMUSICAWARD
1729 | SebWrites,WORLDMUSICAWARD
1730 | 2getaticket,WORLDMUSICAWARD
1731 | thejanuarymedia,WORLDMUSICAWARD
1732 | mygiftmarketgb,FawaShah
1733 | PGSweeps,FawaShah
1734 | Wahlbonkers,FawaShah
1735 | pintofscienceNO,FawaShah
1736 | IntellectBusin1,FawaShah
1737 | LondonForXmas,FawaShah
1738 | LondonForXmas,FawaShah
1739 | WBialystok,PremierRP_en
1740 | ali7_bts,WORLDMUSICAWARD
1741 | meldridge13,45Petworth
1742 | TashmiAmadi,WORLDMUSICAWARD
1743 | eclipse1473,ChloeLe39602964
1744 | RosheleTantin,WORLDMUSICAWARD
1745 | NickGM,Kidzcoolit
1746 | GuillArchi,godless_mom
1747 | FRomeoAlphaY,godless_mom
1748 | arpita_sana,WORLDMUSICAWARD
1749 | LawrenceC1983,TheMOSnetwork
1750 | NickGM,Kidzcoolit
1751 | GoddardBooks,mikestokoe
1752 | Gabe55Gabe,DorsetMuseum
1753 | NickGM,Kidzcoolit
1754 | RobertN58520057,SSStrays
1755 | allsaintscsch,SSStrays
1756 | NickGM,Kidzcoolit
1757 | yvonneqqm,oxhomelessmvt
1758 | Meysamtajik1994,HuobiGlobal
1759 | janice__mesa,WORLDMUSICAWARD
1760 | NickGM,Kidzcoolit
1761 | t___a___e,WORLDMUSICAWARD
1762 | proelectrician,WORLDMUSICAWARD
1763 | NickGM,Kidzcoolit
1764 | dnahomeimprove,Kidzcoolit
1765 | PISALESUK,Kidzcoolit
1766 | NickGM,Kidzcoolit
1767 | BL_Girlie,WORLDMUSICAWARD
1768 | VaritoneLegend,WORLDMUSICAWARD
1769 | inbusiness4good,WORLDMUSICAWARD
1770 | NickGM,Kidzcoolit
1771 | alaa_express,Kidzcoolit
1772 | NickGM,Kidzcoolit
1773 | TinaAslan,Vixie_Cat_Kig
1774 | Vyplummy,RobuxCity
1775 | BlackCatVideos1,Cooper_Lechat
1776 | TheCraftyNoo,Cooper_Lechat
1777 | CraftyL96082557,beautys_legacy
1778 | uniquelove76,WORLDMUSICAWARD
1779 | Yolo60409794,getwhalinvest
1780 | NickGM,Kidzcoolit
1781 | NickGM,Kidzcoolit
1782 | DianaelleTv,WORLDMUSICAWARD
1783 | LysaTran19,WORLDMUSICAWARD
1784 | RetweetDc,Kidzcoolit
1785 | NickGM,Kidzcoolit
1786 | Adamylotaeloto,WORLDMUSICAWARD
1787 | RolandStautZ_,RolandStautz
1788 | Armyfor64738561,WORLDMUSICAWARD
1789 | NickGM,Kidzcoolit
1790 | WilderCoe,Kidzcoolit
1791 | NickGM,Kidzcoolit
1792 | NickGM,Kidzcoolit
1793 | NickGM,Kidzcoolit
1794 | Corstorphnchiro,Kidzcoolit
1795 | Oojoodeboo,Dorotheacalm
1796 | NickGM,Kidzcoolit
1797 | freywilleglobal,Kidzcoolit
1798 | SoSoGifted1,Kidzcoolit
1799 | amycema_333,WORLDMUSICAWARD
1800 | NickGM,Kidzcoolit
1801 | DianeHargo,frogmomblog
1802 | ksjndoll,WORLDMUSICAWARD
1803 | HomeInstead10,WORLDMUSICAWARD
1804 | NickGM,Kidzcoolit
1805 | NickGM,Kidzcoolit
1806 | ThomasOrthmann,ChloeLe39602964
1807 | Rebecca53565736,FlashLC
1808 | Meet_The_Pods,FlashLC
1809 | gkhn1762,HuobiGlobal
1810 | postcardcentury,HuobiGlobal
1811 | kthvaya,WORLDMUSICAWARD
1812 | scheerenberger,GarageItalian
1813 | NickGM,Kidzcoolit
1814 | thecopperfruit,Kidzcoolit
1815 | KavyaaGuptaa,WORLDMUSICAWARD
1816 | djutewfh1lhyd,WORLDMUSICAWARD
1817 | onielolies_,WORLDMUSICAWARD
1818 | NickGM,Kidzcoolit
1819 | AryaAbi5,WORLDMUSICAWARD
1820 | rebecca_lipkin,WORLDMUSICAWARD
1821 | NickGM,Kidzcoolit
1822 | andoffices,Kidzcoolit
1823 | AlinurKurbanova,HuobiGlobal
1824 | ViosecSystems,HuobiGlobal
1825 | mSunloVe99127,WORLDMUSICAWARD
1826 | elda_dc,wellwildcom
1827 | TrendyBendy3,ShelfEdge
1828 | ZiaBiaEvents,ShelfEdge
1829 | ange1230v,WORLDMUSICAWARD
1830 | NickGM,Kidzcoolit
1831 | loupurplechoc,AberhondduWi
1832 | NickGM,Kidzcoolit
1833 | BowkerIT,Kidzcoolit
1834 | rose01756733,WORLDMUSICAWARD
1835 | SwapAirfield,WoodlandTrust
1836 | NickGM,Kidzcoolit
1837 | emmamonkman,i_love_dolly
1838 | AmrutaChopkar22,fevicreate
1839 | NickGM,Kidzcoolit
1840 | jujutaesu,WORLDMUSICAWARD
1841 | headspacegroup,WORLDMUSICAWARD
1842 | ShelfEdge,WORLDMUSICAWARD
1843 | KamkamDC,getwhalinvest
1844 | Always4V,WORLDMUSICAWARD
1845 | NickGM,Kidzcoolit
1846 | DaysofKate,PetMunchies
1847 | NickGM,Kidzcoolit
1848 | NickGM,Kidzcoolit
1849 | Vholic_,WORLDMUSICAWARD
1850 | NickGM,Kidzcoolit
1851 | inbusiness4good,Kidzcoolit
1852 | ChristineMinch1,Cooper_Lechat
1853 | lucoinshirt,Cooper_Lechat
1854 | bluejan32,bmstores
1855 | NickGM,Kidzcoolit
1856 | tae_babe1,WORLDMUSICAWARD
1857 | mathgril,getwhalinvest
1858 | mathgril,youbiquity_uk
1859 | NickGM,Kidzcoolit
1860 | Singularity1905,WORLDMUSICAWARD
1861 | BEoffices,WORLDMUSICAWARD
1862 | WendyClarke99,The__SadieRyan
1863 | NickGM,Kidzcoolit
1864 | lucy_bunnies,TheStourbridge
1865 | rebornblessing,KahayangKopi
1866 | NickGM,Kidzcoolit
1867 | jaycotts,Kidzcoolit
1868 | ginsterman,SparklingDirect
1869 | TopBananaMall,SparklingDirect
1870 | annemariebrear,SparklingDirect
1871 | DoMoreRed,SparklingDirect
1872 | NickGM,Kidzcoolit
1873 | VarietyDotShow,Kidzcoolit
1874 | NickGM,Kidzcoolit
1875 | Coffeelink,Kidzcoolit
1876 | Dijawcem,_Islamicat
1877 | NickGM,Kidzcoolit
1878 | tataaland,WORLDMUSICAWARD
1879 | NickGM,Kidzcoolit
1880 | NickGM,Kidzcoolit
1881 | ArmyErlinda,WORLDMUSICAWARD
1882 | KnitClaire,CartersCollecta
1883 | NickGM,Kidzcoolit
1884 | 6f7000d1e4f2402,ReinaLove88
1885 | _BCT_,NZBatman
1886 | ItzCharlie69,Austeiin
1887 | NickGM,Kidzcoolit
1888 | AntonioDelSur1,Molliebloom8
1889 | NickGM,Kidzcoolit
1890 | LazarovMartin7,jenkers_en
1891 | NickGM,Kidzcoolit
1892 | NickGM,Kidzcoolit
1893 | madeleinefwhite,Kidzcoolit
1894 | KnitClaire,GermanderCC
1895 | whaliev13_,WORLDMUSICAWARD
1896 | MySoulfulthv,WORLDMUSICAWARD
1897 | NickGM,Kidzcoolit
1898 | zziru67,WORLDMUSICAWARD
1899 | Execell1,buwuchi
1900 | altrinchamtoday,ConClubAlty
1901 | escza,SzamerM
1902 | HhXapa,_ahsanR
1903 | NickGM,Kidzcoolit
1904 | maketimecountuk,Kidzcoolit
1905 | o_taemiko,WORLDMUSICAWARD
1906 | jini1531,WORLDMUSICAWARD
1907 | NickGM,Kidzcoolit
1908 | arukasvoo,WORLDMUSICAWARD
1909 | d1Gb4IFUU9rpVcm,nico_gaia
1910 | Yoongikessiah,WORLDMUSICAWARD
1911 | genghisgirl,KarenBa10864733
1912 | NickGM,Kidzcoolit
1913 | reydanoel,DoodlePoodleNFT
1914 | JBD_10,DeFiWarriorGame
1915 | BorahaeLala,WORLDMUSICAWARD
1916 | NickGM,Kidzcoolit
1917 | William56068718,LilMonkiNFT
1918 | Francois_thblt,getwhalinvest
1919 | Sagartron,getwhalinvest
1920 | NickGM,Kidzcoolit
1921 | bignic16,PeterHenshaw9
1922 | max_camp1,PeterHenshaw9
1923 | NickGM,Kidzcoolit
1924 | NickGM,Kidzcoolit
1925 | inbusiness4good,Kidzcoolit
1926 | NickGM,Kidzcoolit
1927 | 5FBwICBer77dGrs,WORLDMUSICAWARD
1928 | stuffedofficial,WORLDMUSICAWARD
1929 | AngelsUnitedFC,EV2Sportswear
1930 | NickGM,Kidzcoolit
1931 | itsumademoV,WORLDMUSICAWARD
1932 | TaeTae49911119,WORLDMUSICAWARD
1933 | NickGM,Kidzcoolit
1934 | NickGM,Kidzcoolit
1935 | YMhWs9LywcQfq7r,WORLDMUSICAWARD
1936 | FawaShah,sewmorethanbags
1937 | NickGM,Kidzcoolit
1938 | NickGM,Kidzcoolit
1939 | babyjiminie_16_,WORLDMUSICAWARD
1940 | TheCXMagazine,WORLDMUSICAWARD
1941 | form_bot,yeahlifestyle
1942 | zee_row_ex,2021Gingerbread
1943 | NickGM,Kidzcoolit
1944 | NickGM,Kidzcoolit
1945 | miashortfilm,TheSusanGeorge
1946 | frentae,WORLDMUSICAWARD
1947 | TopBananaMall,WORLDMUSICAWARD
1948 | ragtseedsuk,WORLDMUSICAWARD
1949 | pamlecky,WORLDMUSICAWARD
1950 | oxhomelessmvt,WORLDMUSICAWARD
1951 | Clare02238187,HamleysOfficial
1952 | ZzimiH,buwuchi
1953 | TraceyLindon,HamleysOfficial
1954 | NickGM,Kidzcoolit
1955 | NickGM,Kidzcoolit
1956 | nosicknosick,WORLDMUSICAWARD
1957 | hamiltonsmotel,WORLDMUSICAWARD
1958 | michaelberry,WORLDMUSICAWARD
1959 | malcolmlum75,7NewsGoldCoast
1960 | NickGM,Kidzcoolit
1961 | Taekook_Cosmos,WORLDMUSICAWARD
1962 | applotzdigital,WORLDMUSICAWARD
1963 | NickGM,Kidzcoolit
1964 | NickGM,Kidzcoolit
1965 | astronomicca,Vinkelmule
1966 | NickGM,Kidzcoolit
1967 | bitbit83723117,northern_elves
1968 | golwgymor,AlisonGeorge10
1969 |
--------------------------------------------------------------------------------
/stream/data/scraped_tweets_old.csv:
--------------------------------------------------------------------------------
1 | source_username,target_username
2 | MHHSBD,LovesVintage43
3 | eclary84,eclary84
4 | inbusiness4good,eclary84
5 | itsasherz,eclary84
6 | BenteHemmingsen,BeaGee3
7 | Squidygame,BeaGee3
8 | TaraReid,BeaGee3
9 | david_demaine,manxscenes
10 | LeoOfMontreal,manxscenes
11 | Nigeblue,govisitdonegal
12 | Dusty_Coog20,gracelynhunt
13 | Chris5anne,Whitproduce
14 | AmandaBergloff,ForgottenBeauty
15 | waitari1,ForgottenBeauty
16 | RebaIsbell,runoutofaname
17 | lousfeey,Elyonblackstars
18 | MyOutSpace,MyOutSpace
19 | Deserttrvlr,StellaMoris1
20 | petbond_ireland,petbond_ireland
21 | stefano2114,StellaMoris1
22 | bridie4,RacecarBox
23 | FBSteaching,RacecarBox
24 | DiscoverWyre,RacecarBox
25 | pnp_aim,RacecarBox
26 | AlexButterfly01,AlexButterfly01
27 | SteveAikenUUP,ForcesNews
28 | GinnGamer,ForcesNews
29 | lynne_mckenzie,MissingPetsGB
30 | LauraPearse2,Cliffdickenson
31 | katyfederman,Cliffdickenson
32 | elainecchao,Cliffdickenson
33 | MHHSBD,LovesVintage43
34 | sineadlarry,mcd_productions
35 | JestressBooks,mcd_productions
36 | q_choa,GameIdentityV
37 | mt_essex,GameIdentityV
38 | shib_Ind,GameIdentityV
39 | JammyNotSpammy,storywhispers
40 | miniaussiejax,guccidog2020
41 | YannMottazPhoto,SantaInu_BSC
42 | FNBNPodcast,SantaInu_BSC
43 | Mishanja_S,PokerListings
44 | DontzSenpai,vas_90s
45 | Sweetnene28,RacecarBox
46 | DogsofTooting,MissingPetsGB
47 | loootex,SAMPAuk_
48 | St_Martins_Care,SAMPAuk_
49 | odiebev69,RubesCartoons
50 | KatieCorr54,RDCSolicitors
51 | OrtegaResult20,Forever1GoChi
52 | TwosApp,Forever1GoChi
53 | Sreejit40765940,Forever1GoChi
54 | DeeCeeByTheSea,BCTG_Group
55 | MHHSBD,LovesVintage43
56 | lunalcht,HwanniePromotes
57 | ALPsTrust1,thegrangesch
58 | InsightDIY,thegrangesch
59 | stream_caster,Keira_Burns1
60 | Plan9Alehouse,Keira_Burns1
61 | MHHSBD,CartersCollecta
62 | deemcki,MissingPetsGB
63 | shib_Ind,MissingPetsGB
64 | SabaChay,StellaMoris1
65 | Keira_Burns1,StellaMoris1
66 | USMEagle98,LDYPrefers2Save
67 | BotBama,MagalyRo5a5
68 | tera_culverwell,412Tickets
69 | DCentifolia,BestRecipesUK
70 | arnold_loz,StellaMoris1
71 | Muhamma79255820,StellaMoris1
72 | Max_Pow20,StellaMoris1
73 | HinduNotorious,KreatelyMedia
74 | MagalyRo5a5,KreatelyMedia
75 | Route66RoadFest,KreatelyMedia
76 | psycholineman,PetMunchies
77 | _McOatt,BasiliKitChen
78 | networktweets,BasiliKitChen
79 | drocktrot,kemrichardson7
80 | shib_Ind,kemrichardson7
81 | MHHSBD,CartersCollecta
82 | clark74_matt,TurfaceC
83 | DeniseCop1,HamleysOfficial
84 | CloutEtc,SAMPAuk_
85 | CardinalFangBot,DDCrochetDesign
86 | purdyme123,DDCrochetDesign
87 | fpcomms,DDCrochetDesign
88 | UnfreezYourMind,afbranco
89 | DeeCeeByTheSea,afbranco
90 | MWardplus3,simmademoiselle
91 | lyconpolis,simmademoiselle
92 | PEwiger,ProtestNews_EN
93 | techvai,ProtestNews_EN
94 | qu1ncey,MissingPetsGB
95 | beavan_lesley,MissingPetsGB
96 | RaphaelFinal,MissingPetsGB
97 | MaeveMeabhkerr,netzfrauen
98 | susie_retro,storywhispers
99 | NordbergValerie,annamoor1995
100 | PainFreeLove,annamoor1995
101 | RibbleValleysue,Fabstainedglass
102 | moviecriticbot,beavan_lesley
103 | ChadmanPJ,TheWiganRunner
104 | StormoftheSouth,ABeaumontWriter
105 | artyny59,AnnaCampbelloz
106 | MHHSBD,CartersCollecta
107 | inbusiness4good,CartersCollecta
108 | blue21sky,KreatelyMedia
109 | CreatorsAngel,KreatelyMedia
110 | MHHSBD,CraftyGenes
111 | GHS_Librarian_,CraftyGenes
112 | RathboneKim,_Aloominati_
113 | mis_tykl,mick859
114 | LittleStarrBear,mick859
115 | moreHarrogate,Commercial_St
116 | BeithKatie,feelaliveuk
117 | MHHSBD,BombsandBubbles
118 | RossBrookeDent,MocoDentalAccts
119 | addict_slash,MocoDentalAccts
120 | GatelyElizabeth,TheStourbridge
121 | DeeCeeByTheSea,TheWiganRunner
122 | shib_Ind,TheWiganRunner
123 | megrawc,PetMunchies
124 | inbusiness4good,PetMunchies
125 | MihaelaPopova7,WWFCEE
126 | beavan_lesley,WWFCEE
127 | DuoInspirations,WWFCEE
128 | gaelic4parents,WWFCEE
129 | ThriveTrafford,KarenWroeArtist
130 | RHBoydCo,KarenWroeArtist
131 | abimbol56049358,Solarful
132 | southcitymedic,Solarful
133 | StaffsMummy,storywhispers
134 | bnb952,TurfaceC
135 | MHHSBD,CartersCollecta
136 | DDCrochetDesign,CartersCollecta
137 | RAM_Toys,CartersCollecta
138 | Its_a_Mister_B,kuhne_uk
139 | shib_Ind,kuhne_uk
140 | arundohle,StellaMoris1
141 | Justis4u3,StellaMoris1
142 | halkerstone,storywhispers
143 | funEbone2u,afbranco
144 | OnTheClockLLC,afbranco
145 | inn_norway,afbranco
146 | forrest_sheila,rivesci
147 | shib_Ind,rivesci
148 | NikOfLaa,rivesci
149 | SmallTxTown,SmallTxTown
150 | idkflowers1,find_charlotte
151 | Greg_A_Salyer,TurfaceC
152 | vegan_v_vegan,vegan_v_vegan
153 | angeldaisy2002,BrokerDirectPlc
154 | AlanAlan5240751,_Aloominati_
155 | ShazShazchy,MissingPetsGB
156 | pockwy,zepeto_official
157 | beth_ballew,DogDeskAction
158 | LCGangOfficial,pancakecali_
159 | hilltopgina,_Aloominati_
160 | Shetudeary,Solarful
161 | MHHSBD,CartersCollecta
162 | radiohead_bot_,find_charlotte
163 | kaboomsf,find_charlotte
164 | realslobo,FirstUnitedDTES
165 | IandFDesign,FirstUnitedDTES
166 | dalischone,MissingPetsGB
167 | NinaLewis16,hilltopgina
168 | Angie_RejoinEU,Angie_RejoinEU
169 | ThecLEMont,ANZZUART
170 | Miss_Mathsgeek,DrEmsLord
171 | WWFCEE,DrEmsLord
172 | shib_Ind,DrEmsLord
173 | TrendingBot2,beavan_lesley
174 | fairytaleflash,EnchantedEzine
175 | WDStoryTime,culture_debate
176 | chandra013,KreatelyMedia
177 | MurdochJem,sjlhollister
178 | beavan_lesley,sjlhollister
179 | ShaneDoty1,TurfaceC
180 | shib_Ind,TurfaceC
181 | FeeGrammer,storywhispers
182 | AnnabelleAsylum,pancakecali_
183 | thehindu121,KreatelyMedia
184 | find_charlotte,KreatelyMedia
185 | LizzieBiff15,MissingPetsGB
186 | BBCDevon,MissingPetsGB
187 | SmithNeil82,TheWiganRunner
188 | AnneThompson10,storywhispers
189 | Thiru_Nithiin,Nithin65161400
190 | HMC_School,Garbett_HMCS
191 | YiewsleyMatters,Garbett_HMCS
192 | Forever1GoChi,Garbett_HMCS
193 | LydiaHopeTaylor,bandbtractors
194 | LucymwH,rhlonghurst
195 | itsjaidenmarie,Kartzmark
196 | Anita11578064,Saavik_Tits420
197 | charlottequay1,Saavik_Tits420
198 | MeeshNoo7,MissingPetsGB
199 | LightOrgan,MissingPetsGB
200 | MomsWhoSave,MissingPetsGB
201 | EnchantedEzine,MissingPetsGB
202 | KatieMettner,PrettyHotPink6
203 | tuuchytoons,GameIdentityV
204 | LaikaTwat,MissingPetsGB
205 | AOLMahuaDS,siljanvibeke
206 | QuestarVideo,TVandFilmNews
207 | shib_Ind,TVandFilmNews
208 | LARideShareGuy,teamdreamhunter
209 | TimoKuba,IstariVision
210 | find_charlotte,IstariVision
211 | UPSCPractice,IstariVision
212 | hey_jude_67,MyVoucherCodes
213 | efa_duffy,MyVoucherCodes
214 | PuzzleVehicles,MyVoucherCodes
215 | shib_Ind,MyVoucherCodes
216 | glossopcreates,newsinglossop
217 | Sotera_Legacy,Sotera_Legacy
218 | techvai,Sotera_Legacy
219 | ShaliniAustin,Sotera_Legacy
220 | pancakecali_,Sotera_Legacy
221 | JanLever,Rosieartwork
222 | TammyTokley,TheWiganRunner
223 | asianenews,TheWiganRunner
224 | brumnordie,TheWiganRunner
225 | kuhne_uk,TheWiganRunner
226 | Moomettes,TheWiganRunner
227 | EvieThats,BooksAtBluebird
228 | NinaLewis16,hilltopgina
229 | teamdreamhunter,hilltopgina
230 | Attwaters,hilltopgina
231 | spinningdove,storywhispers
232 | MyWatering,storywhispers
233 | jakeurcityxx,funky_punks
234 | sTheDreamHunter,funky_punks
235 | AlphasEverAfter,AlphasEverAfter
236 | NiFTGnomes,Jim_Dippin_
237 | GoodVetPetGuide,Jim_Dippin_
238 | AMindOnFire,Jim_Dippin_
239 | silversandscorp,Jim_Dippin_
240 | skitguys,Jim_Dippin_
241 | steviebarto1,Chinese_Wellb
242 | Ella__Guthrie,LeukaemiaCareUK
243 | HumbleAttitude1,PCMCamisetas
244 | Best_of_PT,PortugalCNFDTL
245 | annamagique,VisitGermanyUK
246 | musicaudiostory,StorytimewithAC
247 | booly_tier1,ushomenc
248 | TJsaucier209,gabnft_official
249 | PaddyBoyceTrave,ashcmtb
250 | Antonii616,taneysha3
251 | mOQIl,PatriotSubtle
252 | kevingeerhart,sladeforlife
253 | WatersidePA,potterandford
254 | soanesy180,potterandford
255 | shib_Ind,potterandford
256 | KirkTanaka62,HallowsHaunts
257 | AquiferPartners,HallowsHaunts
258 | WDStoryTime,YNFMoviePod
259 | DebbieOppermann,FlaneurPhotos
260 | NeneFestival,_NeneValley
261 | _VINGLISH,AvallenSpirits
262 | donnyfarmshop,Keane_Creative
263 | AccentPress,JennyKaneAuthor
264 | PatriotSubtle,JennyKaneAuthor
265 | rbr_dux,JennyKaneAuthor
266 | Nettymanning,mcd_productions
267 | snoopysue71,littlefabshop
268 | ark_flower,littlefabshop
269 | junjia961,DrHananAshrawi
270 | uttoxetercc,CleanHitCricket
271 | JeromeMazandar1,CleanHitCricket
272 | DoSafeCrypto,zadabsc
273 | ProjectFreeroam,zadabsc
274 | StephanieisLive,zadabsc
275 | apextraxs,zadabsc
276 | apextraxs,zadabsc
277 | apextraxs,zadabsc
278 | apextraxs,zadabsc
279 | PTwister,SquatBunnie
280 | MagalyRo5a5,SquatBunnie
281 | EMO_harra,ZendingMachine1
282 | jude_pragasam,humster3d
283 | SPOFarrell3,Anthony_OBrien_
284 | karlosleeos,Intrinsic_Paper
285 | junjia961,PalMissionUK
286 | Louthchat,kcs_irl
287 | pdeblassieiii,JulieKusma
288 | EMO_harra,Yeaceelovesdogs
289 | RinKagamine2222,JJArt25
290 | dailyfishingBot,ShadyPawsInc
291 | MtotheZ81,IstariVision
292 | MrCrackMorris,IstariVision
293 | NickHow13764609,IstariVision
294 | Joriginals1,Tonyharrisonart
295 | LindaPinpoint,womeninvisionuk
296 | ToisutaChiquira,womeninvisionuk
297 | shib_Ind,womeninvisionuk
298 | the_sugar_cove,womeninvisionuk
299 | FCCVictory,womeninvisionuk
300 | newsbluntmedia,womeninvisionuk
301 | moonlightbae6ix,TWlSTIE
302 | barfires,Rustmomentcom
303 | Weimadogxxx,MissingPetsGB
304 | gracelynhunt,MissingPetsGB
305 | KBMArtWriting,MissingPetsGB
306 | Yeaceelovesdogs,MissingPetsGB
307 | opiumdot,MissingPetsGB
308 | habourque,StellaMoris1
309 | ch_foto,StellaMoris1
310 | Lawyers4Life,articleeighteen
311 | LadyRebecca_AM,412Tickets
312 | shib_Ind,412Tickets
313 | WDStoryTime,talkin_shiz
314 | KatyMParkinson,LexonikST
315 | thakur_anupam01,KreatelyMedia
316 | jragmusic,KreatelyMedia
317 | treveraeon,jason32796
318 | KolbeSteven,OverbeckRandy
319 | melodeeaaron,elusive_6788
320 | JenandGoo,elusive_6788
321 | TaniaCrosse,fkleitch
322 | JohnnieGoodwin,LoDoDistrict
323 | shib_Ind,LoDoDistrict
324 | ShorelineStudi3,PaperKinsCrafts
325 | xoliaopied,GameIdentityV
326 | marysuzanneaita,colleengrott
327 | annamagique,VodkaWardrobe
328 | TaniaCrosse,annemariebrear
329 | spookyfigures,annemariebrear
330 | Shammu1516,UrbanAsian
331 | jason32796,UrbanAsian
332 | Pepe_joju,Rustmomentcom
333 | ScoutsAndinos,ContraApostasia
334 | mugsfunnyeu,ContraApostasia
335 | BrittanySoFly86,ContraApostasia
336 | L0nELyR0sE85,HwanniePromotes
337 | carrie_clarke,HwanniePromotes
338 | Deborah00411691,RRR_LUF
339 | M30PRJ,alt_cardiff
340 | navya_moghe,KreatelyMedia
341 | Benjamminhere,KeithMcilwain
342 | xBelinx,storywhispers
343 | KBMArtWriting,KBMArtWriting
344 | otaku_lottie,storywhispers
345 | ToytownKe,storywhispers
346 | ushomenc,storywhispers
347 | KBMArtWriting,KBMArtWriting
348 | gwleckythompson,KBMArtWriting
349 | Spencersretford,worksopcollege
350 | mugs_funny,worksopcollege
351 | MrDoombastic,SomeCrypt0Guy
352 | katie0147c,storywhispers
353 | Rishigautam009,KreatelyMedia
354 | wallE_bear,FTroote
355 | RGIS_Intl,FTroote
356 | AndrewONielsen,FTroote
357 | GoughCharley,FTroote
358 | beavan_lesley,FTroote
359 | rk70534,PlaceKaths
360 | VickyMi99564413,MissingPetsGB
361 | HotelNews_ie,lougheskecastle
362 | PlaceKaths,lougheskecastle
363 | VintageSoviet,LovesVintage43
364 | GabrielConstans,JulieKusma
365 | DorlingGini,HamleysOfficial
366 | srheasbot,ShadowDogDesign
367 | hiseulvir,HwanniePromotes
368 | fazfilmmedia,StellaMoris1
369 | shib_Ind,StellaMoris1
370 | maureen_ward,kcs_irl
371 | AashuMi44,KreatelyMedia
372 | kloubear88,holland_barrett
373 | LynRadioDeeside,holland_barrett
374 | CarverLiddy,holland_barrett
375 | HDYogiz,holland_barrett
376 | TanagerScarlett,VictorBadass
377 | ZPWLC,LeukaemiaCareUK
378 | theaquadolls,MoshTimes
379 | VRiffault,MoshTimes
380 | SandboxGrrl,NataniaBarron
381 | Enemy_Is_Great,Enemy_Is_Great
382 | mariocarlosmami,Enemy_Is_Great
383 | VintageSoviet,BCsBargainBin
384 | shib_Ind,BCsBargainBin
385 | gunswordfist,gunswordfist
386 | birdythurs,NataniaBarron
387 | NMBAbakery,NataniaBarron
388 | FaithCompassion,KBMArtWriting
389 | Spcbll_1,412Tickets
390 | FruitfulForever,412Tickets
391 | HivTinker,412Tickets
392 | mapsofantiquity,412Tickets
393 | mis_tykl,JennyKaneAuthor
394 | MissingPetsGB,JennyKaneAuthor
395 | VucuSC,IstariVision
396 | AhernJoanne,mcd_productions
397 | mis_tykl,bridportbooks
398 | AevansMarvelDC,storywhispers
399 | bornelsewhere,HullImages
400 | EWarynick,HullImages
401 | bellescharms,_RaeRadford
402 | FaithCompassion,KBMArtWriting
403 | TaniaCrosse,JennyKaneAuthor
404 | MTB_Cycler,Cliffdickenson
405 | JonWrong9,pert_brian
406 | MassimoSongs,MusicmanSinger
407 | Jones45Maxwell,MusicmanSinger
408 | Mowood2,RDCSolicitors
409 | VintageSoviet,NutmegCottage2
410 | DogeKnightRises,saint_sols
411 | TeboulMichele,RGE_Art
412 | CollectiveWors1,MissionalGen
413 | _ThinkBot,brainbubbles_de
414 | TrophyPetFoods,TrophyPet
415 | LeukaemiaCareUK,TrophyPet
416 | JewelsGiftBox,TrophyPet
417 | TyDye_Tweets,TrophyPet
418 | Topazrat,storywhispers
419 | AevansMarvelDC,Timberwise
420 | ProHomeOne,Timberwise
421 | magnetamerica,Timberwise
422 | Good_healthshop,AbsoluteAromas
423 | KBMArtWriting,AbsoluteAromas
424 | andy_reds,StellaMoris1
425 | MorganCactus,StellaMoris1
426 | kanediking,SurfMoonToken
427 | dazmu2,mcd_productions
428 | _LiyahThreadz,QueenFendij
429 | COPYWRITE614,steaminkettlepr
430 | mis_tykl,LucyColemanauth
431 | leimthart,mcd_productions
432 | cjshepp,PetMunchies
433 | TrophyPet,PetMunchies
434 | britchford9,GillianMcKeith
435 | SMGSimon,getwhalinvest
436 | xsunsetari,manueldesigner_
437 | bhartiymanus,KreatelyMedia
438 | LucyCK,KreatelyMedia
439 | VisiblyVincent,KreatelyMedia
440 | DpsJadoun,KreatelyMedia
441 | StorytimewithAC,musicaudiostory
442 | AHumbleHobbit,Timberwise
443 | MellysHandmade,Timberwise
444 | winsforfelicity,SantaBeazzz
445 | Its_Rachael_XX,storywhispers
446 | ZombieRocker86,RDCSolicitors
447 | deafangel1080,RDCSolicitors
448 | BestRecipesUK,BestRecipesUK
449 | JEANMIC36258403,Plaza_Athenee
450 | shxxnsa,HwanniePromotes
451 | StorySpirit4U,morgankwyatt
452 | designerluv1,morgankwyatt
453 | mrdavidhopper,morgankwyatt
454 | VisitYork,barconventyork
455 | brainbubbles_de,barconventyork
456 | Amourfoxx,hilltopgina
457 | BertieSaved,KateBeinder
458 | TaniaCrosse,carol_thomas2
459 | leviteking,carol_thomas2
460 | Gus_802,TheStourbridge
461 | militarymemos,SSAFA
462 | Detail_DMC,SSAFA
463 | BramleyBaptist,SSAFA
464 | AHumbleHobbit,storywhispers
465 | maola_varalli,SAMPAuk_
466 | TopBananaMall,SAMPAuk_
467 | KBMArtWriting,SAMPAuk_
468 | designerundies,designerundies
469 | Johnny24450,shib_Ind
470 | ioan_humphreys,FridgeSwansea
471 | Jbriggsy_14,FridgeSwansea
472 | beth_ballew,DogDeskAction
473 | IamHinduatheart,missionkaali
474 | HolySepulchreUK,missionkaali
475 | olivetnazarene,missionkaali
476 | bozzo1931,gsrescueelite
477 | SMARTeducation6,gsrescueelite
478 | MyWatering,gsrescueelite
479 | elvisbulldoguk1,guccidog2020
480 | sixhdhcityx,HwanniePromotes
481 | Demcia97,kwkresin
482 | babbles82,412Tickets
483 | KenarryIdeas,412Tickets
484 | JoanneCangal,ruthmkb
485 | TaniaCrosse,mick859
486 | SkyRTRblxBot,scenefren
487 | inbusiness4good,scenefren
488 | TheReinvention1,ViewOchil
489 | HeardThatNoise,isle7crossing
490 | beinglight_,missionkaali
491 | FaithCompassion,KBMArtWriting
492 | OutdoorImagesNW,Mandsby
493 | TheCarlyBrown,xuetingni
494 | StorytimewithAC,xuetingni
495 | winterlysnow,FOXYGIVES
496 | kakenzie101,storywhispers
497 | GordonsSch,storywhispers
498 | tobyhora2012,holland_barrett
499 | Johnny24450,shib_Ind
500 | KBMArtWriting,KBMArtWriting
501 | MegalsMerch,KBMArtWriting
502 | SFRestoration,KBMArtWriting
503 | FaithCompassion,KBMArtWriting
504 | donnas92,KBMArtWriting
505 | jaimiephoenixea,EAToday
506 | Isynze1,ArtistByron
507 | ZebraMingo,kblacey
508 | cocklewoman,FridgeSwansea
509 | ravenhcrafted,NaturaEmporium
510 | DaveGordonArt,eclectorium
511 | suedelacour,CI_Coop
512 | GlenroydHouse,CI_Coop
513 | LydiaHopeTaylor,storywhispers
514 | CReutcke,barconventyork
515 | Trazlersgal,VodkaWardrobe
516 | GoodVintageArt1,KBMArtWriting
517 | free_pradeep,KreatelyMedia
518 | OuiSuzette,LadyTeapots
519 | danikhamptons,holland_barrett
520 | Multigamer,ArtsyMystic
521 | Team_English1,ec_publishing2
522 | lauramarsh70,ec_publishing2
523 | wind323lu,ec_publishing2
524 | NYartwarp,ec_publishing2
525 | Sbharden15,TurfaceC
526 | So_Lippy,TurfaceC
527 | FaithCompassion,KBMArtWriting
528 | HashyNFTs,Superman_2106
529 | spencer_helen,storywhispers
530 | SianD91_,storywhispers
531 | rotiendolita,storywhispers
532 | ItsukaKasuga,MyoZin_
533 | clubfoody1,MyoZin_
534 | PlaceKaths,PlaceKaths
535 | rotiendolita,PlaceKaths
536 | FaithCompassion,KBMArtWriting
537 | LrFerrier,BettinaSRoss1
538 | HorneyMedia,HobeckBooks
539 | markscattergoo2,ViktorsPaws
540 | the_ksphoto,ViktorsPaws
541 | Pharhan360,ViktorsPaws
542 | mcroberts_jesse,saint_sols
543 | hodder_neil,CitronHygiene
544 | ByJayClemons,CitronHygiene
545 | RBXRetweetBot,wikioccult
546 | thornbridgefay,wikioccult
547 | coldharbourroad,Beautologyuk
548 | HivTinker,Beautologyuk
549 | SkyRTRblxBot,wikioccult
550 | redbeardgamez,wikioccult
551 | FaithCompassion,KBMArtWriting
552 | PlaceKaths,KBMArtWriting
553 | mythical_rosie,KBMArtWriting
554 | ParsonRex,storywhispers
555 | snoopysue71,HalonMenswear
556 | stuntnuts,CrackersNFT
557 | ZeroELVS,Tsikiiyo
558 | Evelyn_0805,Loveisblind2021
559 | RBXRetweetBot,wikioccult
560 | CJ41002028,StellaMoris1
561 | AmordeMujer0308,Roofero3
562 | Tanyawarren,BagsofFavours
563 | barbea88,Timberwise
564 | PRCPadova,StellaMoris1
565 | inbusiness4good,StellaMoris1
566 | TopBananaMall,StellaMoris1
567 | Caluvsdogs,StellaMoris1
568 | StanleyJames05,StellaMoris1
569 | theindustryfash,StellaMoris1
570 | StMatthewsLuton,ActiveStMatts
571 | EAFocusInc,TurningPointMac
572 | SteelCityAdy,HMSLedbury
573 | IndieBrag,HMSLedbury
574 | PonyMalarkey,taneysha3
575 | SkyRTRblxBot,wikioccult
576 | marilynflower27,wikioccult
577 | TopBananaMall,wikioccult
578 | kush_tracey,wikioccult
579 | Tanyawarren,MugsofFunGifts
580 | real_canuck,MugsofFunGifts
581 | Zachfarris6,TurfaceC
582 | NYisBLUE,agreatbigcity
583 | taniaxmichele,agreatbigcity
584 | hayley_loves_xx,SheHairUK
585 | PalmBeachLCA,LarnakaRegion
586 | Kingcooper74,storywhispers
587 | SmestowSchool,storywhispers
588 | DaveGordonArt,BCsBargainBin
589 | Jeanettel1979,storywhispers
590 | xoxlululaurence,aussomemiko
591 | owenchrisjones,SheHairUK
592 | author_barr,m_morganauthor
593 | Lordoftheboard3,m_morganauthor
594 | deaninwaukesha,BrownDogGadgets
595 | leszektojatak,1streetart
596 | comicbookrpt,FiguresToyCo
597 | Sloths7777,Sloths7777
598 | KBMArtWriting,KBMArtWriting
599 | PCMCamisetas,IvankaKolchakov
600 | DaveGordonArt,lisainsocali
601 | Island_Pearls,lisainsocali
602 | Fluf2021,IstariVision
603 | natisthecure3,_Aloominati_
604 | GilljazzCook,JazzHullabaloo
605 | Perina4,pbshop_store
606 | Annecdotist,storywhispers
607 | PCMCamisetas,PawsInProfile
608 | kcs_irl,PawsInProfile
609 | CodeAttBot,LeeHillerDesign
610 | KBMArtWriting,KBMArtWriting
611 | DeniseCoughlan1,mcd_productions
612 | discovery_remax,discovery_remax
613 | crypt0bish,SomeCrypt0Guy
614 | ruby__mew,chubbydpp
615 | kojowithdamojo,OcaRockaRina
616 | xobrree_,OcaRockaRina
617 | dollydolly14,StellaMoris1
618 | KBMArtWriting,KBMArtWriting
619 | LynRadioDeeside,KBMArtWriting
620 | NalaNannie,depot_pets
621 | IzzyJon67069546,DementiaUK
622 | mrs_meep,storywhispers
623 | JasperManUtd,_Aloominati_
624 | maharrison_21,TurfaceC
625 | KBMArtWriting,KBMArtWriting
626 | NEW40608072,GameIdentityV
627 | Tanyawarren,KrasnayaDolls
628 | joelivany,edmontonopera
629 | promotenorthsol,MellSquare_UK
630 | alexis_1108,MellSquare_UK
631 | affordantq,MellSquare_UK
632 | Angie_RejoinEU,MellSquare_UK
633 | erangatennakoon,MellSquare_UK
634 | cjbahr,AuthorKathrynH
635 | Goldmatters_,AuthorKathrynH
636 | Vamplified,AuthorKathrynH
637 | paigerpenland,FI_Conservation
638 | DrShankar26,missionkaali
639 | JKperfumer,ArtistByron
640 | swedbo,KuglerElisabeth
641 | bronwenhyde,KuglerElisabeth
642 | PopescuCo,Plaza_Athenee
643 | TaniaCrosse,ImogenMartin9
644 | BPolimer,TurfaceC
645 | jennifercgrant,TurfaceC
646 | JohnWilkinspsyc,Rokewood
647 | junperjack,WORLDMUSICAWARD
648 | realmikedwc,Calcify_
649 | TiaLudwick,412Tickets
650 | Raj07687541,KreatelyMedia
651 | OiShinyThings,Fabstainedglass
652 | GrammaChris1,Elidanza
653 | Cricketsongsale,Elidanza
654 | DonitaJose,Elidanza
655 | Shoguun1,JulieKusma
656 | boneham1989,storywhispers
657 | DawnParry,storywhispers
658 | HarryStote4,TruckyLuckyApp
659 | Tanyawarren,Betsysbowbouti1
660 | AndreaCoventry,TheTipToeFairy
661 | ukwondering,_Aloominati_
662 | EmmaMerrygold,storywhispers
663 | SerpentXael,QueeenLolli
664 | mis_tykl,JulieKusma
665 | Signaduk,MYSTLiverpool
666 | WeAreWaterlooUK,MYSTLiverpool
667 | indiax2050,missionkaali
668 | lindgrensmith,missionkaali
669 | EnigmediaM,pinklizardpromo
670 | JaneJago1,JulieKusma
671 | FCCVictory,JulieKusma
672 | cjbahr,AuthorKathrynH
673 | JJmac300015,__KISH
674 | therealdaxlee,TurfaceC
675 | vaayumitra,KreatelyMedia
676 | KarelRoman10,SantaInu_BSC
677 | Imskooo,littlebabydoge1
678 | ambered_haze,taneysha3
679 | _NeneValley,taneysha3
680 | chriskavanagh5,mcd_productions
681 | XelDBL,itsuroki
682 | mohamadsamurai3,C_Shangchi
683 | G_MXSHANA,C_Shangchi
684 | Plaza_Athenee,C_Shangchi
685 | ProphetsReal,IUICOfficial
686 | TaniaCrosse,birdhousebooks
687 | donk48,storywhispers
688 | LenVeigaZ,JellybeanReds
689 | StigandrBushcra,JellybeanReds
690 | mis_tykl,Lizones1
691 | LiaBeltrami,Lizones1
692 | UnircornWrap,412Tickets
693 | Fabstainedglass,412Tickets
694 | mis_tykl,BrionyMaySmith
695 | HDYogiz,BrionyMaySmith
696 | castelcivita48,DrHananAshrawi
697 | LinnBHalton,DrHananAshrawi
698 | MainSouth1,DrHananAshrawi
699 | HedgieDesigns,DrHananAshrawi
700 | lodge662,VictorBadass
701 | TwystedRoots,BeeHappyUK
702 | ToshioK,BeeHappyUK
703 | MyWatering,BeeHappyUK
704 | jc_cannon13,DementiaUK
705 | BarbaraBettis,OverbeckRandy
706 | YugoBrit,OverbeckRandy
707 | castelcivita48,StellaMoris1
708 | SkillsNetworkUK,StellaMoris1
709 | temi,wendy_seun
710 | Timewalkproject,weR500Together
711 | explosionmurdex,AlyTheKitten
712 | birdwriter7,birdwriter7
713 | sj_mccormack,kimhornsby
714 | DainesP,BrokerDirectPlc
715 | mis_tykl,carol_thomas2
716 | ArcEng9154644,carol_thomas2
717 | HumbleS97599245,carol_thomas2
718 | mis_tykl,birdhousebooks
719 | ThingsYouNeed2K,irishdailytimes
720 | Pikapupvee,GodlyeoA
721 | SuperSoftKnits,vintagobsession
722 | geethsaraonline,vintagobsession
723 | LupineAssassin,Michael_Racer1
724 | dear_noly,Michael_Racer1
725 | VanessaLYbarra,Michael_Racer1
726 | ajnamdeplume,Michael_Racer1
727 | jgmacleodauthor,JulieKusma
728 | Matthew70700968,BaggaleyLiz
729 | jragmusic,BaggaleyLiz
730 | NRJuniors,BaggaleyLiz
731 | JuliaViolinista,brandsintheair
732 | RyanKrolAuthor,AuthorJDumas
733 | Convenzis_Group,10to8ltd
734 | ReArtistron,mattwnelson
735 | twbgd,thechequeredsk1
736 | myfizzypop,myfizzypop
737 | RMannanDesigns,myfizzypop
738 | jgmacleodauthor,JulieKusma
739 | Kimmikimm91,JulieKusma
740 | Calcify_,JulieKusma
741 | ObjectiveTravel,JulieKusma
742 | Carole71024753,StellaMoris1
743 | ECC_malta,StellaMoris1
744 | selfishgenie,StellaMoris1
745 | MellSquare_UK,StellaMoris1
746 | TheEcoStuff,StellaMoris1
747 | belleearth_soap,StellaMoris1
748 | CarolinaTulsi,StellaMoris1
749 | TheExtremeMusi1,TheExtremeMusi1
750 | lulu82824,blinverted
751 | Bekah23198223,storywhispers
752 | YamahaWH,storywhispers
753 | SuperSoftKnits,mlnostalgia
754 | JamiePickles14,simoncotton69
755 | ravipartap_1,KreatelyMedia
756 | pnp_aim,KreatelyMedia
757 | un_lucky_clover,BeautyKitchen
758 | JohnSchreiber8,StellaMoris1
759 | SuperSoftKnits,eclectorium
760 | teatroparaguas,eclectorium
761 | WestCorkDistill,eclectorium
762 | jgmacleodauthor,JulieKusma
763 | TopBananaMall,JulieKusma
764 | SJTheaters,BroadwaySanJose
765 | JEANMIC36258403,LeMeurice
766 | SuperSoftKnits,birdhousebooks
767 | tweetjoyarora,birdhousebooks
768 | face_b0rn,FelizAnn_nft
769 | rsimmon19,FelizAnn_nft
770 | LeclercVicky,hilltopgina
771 | joerivera82,hilltopgina
772 | FridgeSwansea,hilltopgina
773 | Sharifebarnes1W,hilltopgina
774 | MBeddis,mcd_productions
775 | Windsphere1,GameIdentityV
776 | Michael80979900,aussomemiko
777 | furkannn_ko,Rustmomentcom
778 | DJ_Corinna,Rustmomentcom
779 | MfanwyEvans,aussomemiko
780 | pixlpudding,aussomemiko
781 | jgmacleodauthor,JulieKusma
782 | herecomesrufus_,JulieKusma
783 | LoveThe1970s,JulieKusma
784 | NuttlyR,KBMArtWriting
785 | bsc_shills,KBMArtWriting
786 | serena_oceana,KBMArtWriting
787 | 3_sebz,CameronCortina1
788 | rsimmon19,CameronCortina1
789 | Autismmomof7,412Tickets
790 | ms_b17,feelaliveuk
791 | KMB73,ChrstmsCntdwn
792 | SuperSoftKnits,RetroCEO
793 | KurokonekoKamen,JulieKusma
794 | SyncSunMoon,StellaMoris1
795 | HpoolLife,StellaMoris1
796 | ShadyPawsInc,StellaMoris1
797 | ArtistByron,StellaMoris1
798 | selikopiti,StellaMoris1
799 | demossoft,StellaMoris1
800 | anna_jayne_blog,storywhispers
801 | ElenskyRuslan,drying_equip
802 | ForgottenAstro2,JulieKusma
803 | colingarrow,alicerauthor
804 | Tony_Cghn,irishdailytimes
805 | TIHWbot,HorrorPack
806 | spruett123,412Tickets
807 | ForgottenAstro2,JulieKusma
808 | SuperSoftKnits,Lizones1
809 | drying_equip,Lizones1
810 | Shoguun1,JulieKusma
811 | SuperSoftKnits,Lizones1
812 | LeilaO2014,ViktorsPaws
813 | AJoiousOccasion,GerryGreek
814 | MCufflinks,MugsofFunGifts
815 | ruby_redsky,MugsofFunGifts
816 | KBMArtWriting,MugsofFunGifts
817 | kokoiruwa,hiroizumi1
818 | Jocanlose,storywhispers
819 | jgmacleodauthor,JulieKusma
820 | ScrappyDaDog14,TheMiloDog
821 | magical_mooni,taneysha3
822 | Anthony_OBrien_,taneysha3
823 | MalawiTravel,RIPPLEAfrica
824 | SledgerLedger,LexonikST
825 | USAPLUMBINGSVCS,LexonikST
826 | mcampbelfast,the_rivermill
827 | OldSkullGames,the_rivermill
828 | bmurphypointman,the_rivermill
829 | LemonadeGianna,LunpiStore
830 | MindfulMoody,LunpiStore
831 | MarilynHatlady,ZaverDesigns
832 | PCMCamisetas,MuzaDotco
833 | Mandy96936981,412Tickets
834 | KBMArtWriting,412Tickets
835 | felixbelix,storywhispers
836 | SuperSoftKnits,mlnostalgia
837 | jholmie89,StellaMoris1
838 | Winston6079ws,MrPeepsSays
839 | SuperSoftKnits,texastwins2004
840 | blossomactor,SkylarkArtist
841 | WSC2000,SkylarkArtist
842 | JayDeMoir,SkylarkArtist
843 | thedualworks,CoffinWorks
844 | DalmataDamien,desmaan
845 | PCMCamisetas,MuzaDotco
846 | iambilljeffery,MuzaDotco
847 | AnjaOlaf,LStewart_books
848 | supershadio,HelpDiYutesJa
849 | khristaki,JimJatras
850 | BotBama,toet_st
851 | Seller9991,AllOldStuffbyS1
852 | Bromattcbd,AllOldStuffbyS1
853 | Hazeleyes_0,412Tickets
854 | LoriRennie,412Tickets
855 | heychica,Elidanza
856 | IaconaRiccardo,StellaMoris1
857 | cfahullstreet,StellaMoris1
858 | YellowSalmon,Elidanza
859 | hey_jude_67,storywhispers
860 | KBMArtWriting,storywhispers
861 | MummytoFrank1,BeautyKitchen
862 | sonicsstevie,BrokerDirectPlc
863 | toet_st,BrokerDirectPlc
864 | CasaDoradaCabo,BrokerDirectPlc
865 | nwrxj9,RHDR
866 | PCMCamisetas,KrappyThings
867 | Lunathenaked,KrappyThings
868 | PieMakers,KrappyThings
869 | hammered2019,Timberwise
870 | KimMerville,reviewwales
871 | EmilyAmazon,ShadowDogDesign
872 | Shoguun1,joanne_paulson
873 | Ono78725903,Keircc1
874 | myvetsocial,Keircc1
875 | jeollyi,HwanniePromotes
876 | manuinverafic,BlueCornerCreas
877 | Okami_mxsamurai,C_Shangchi
878 | MoneyQuote,C_Shangchi
879 | lewis_herbert,FoodCambridge
880 | PChrisDavid,NathanSquire3
881 | valbaldi,ARofuoo
882 | themixbristol,ARofuoo
883 | jestersdreamIE,mcd_productions
884 | manobanlalisa__,CaledonianKitty
885 | mis_tykl,wenfancyart
886 | WEIRDCHRISTMAS,tonypaulway
887 | heychica,kblacey
888 | mis_tykl,fkleitch
889 | Temprell1,fkleitch
890 | UPSCPractice,fkleitch
891 | Mealzo_uk,fkleitch
892 | DebzHolland,storywhispers
893 | Asset_Alliance,storywhispers
894 | GipsonBusiness,storywhispers
895 | kurapikxs_hoe,GameIdentityV
896 | lepetluxe,GameIdentityV
897 | CadmiumLemon,SalfordChoral
898 | LetsGoOut_BH,SalfordChoral
899 | arcofmanning,SalfordChoral
900 | JockeyClubRooms,SalfordChoral
901 | Leopardprintsxx,RacecarBox
902 | CWSellors,RacecarBox
903 | JuraWatches,RacecarBox
904 | glassoflemonaid,ANZZUART
905 | rtItBot,HouseOfSeb
906 | DooNorthTexas,HouseOfSeb
907 | QueeenLolli,HouseOfSeb
908 | williamlstuart,HouseOfSeb
909 | WhisperAmber,icsfblog
910 | Susan10124954,Cliffdickenson
911 | CartersCollecta,Cliffdickenson
912 | Yatesmark001,BringOnTheSpice
913 | DMGSLLC,BringOnTheSpice
914 | RubyPerry11,BringOnTheSpice
915 | KryptoGodsNFTs,BringOnTheSpice
916 | NutmegDiaries,BringOnTheSpice
917 | AFdosChapeus,BringOnTheSpice
918 | dian_simplethin,donnas92
919 | CadmiumLemon,CongletonCS
920 | drumpfbot2016,Rediscova1
921 | ONSIGHT_UK,Rediscova1
922 | Citizenccltd,Rediscova1
923 | theDomainBot,SavageDomains
924 | thisisgoradio,SavageDomains
925 | DetroitRadioAdv,SavageDomains
926 | Rediscova1,SavageDomains
927 | mmcatsdesign,lmgilson5927
928 | VivlioTekka,Tsikiiyo
929 | Lorranstz,Rustmomentcom
930 | Shoguun1,JulieKusma
931 | BeBeautiful_In,JulieKusma
932 | Ruy_Jorge_yuR,JulieKusma
933 | Stratus_health,JulieKusma
934 | BeautySkinYourN,JulieKusma
935 | LeeHillerDesign,JulieKusma
936 | RecordMoney_,JulieKusma
937 | fancydresstown,JulieKusma
938 | LicensedProduct,JulieKusma
939 | BirkdaleHome,JulieKusma
940 | SavageDomains,JulieKusma
941 | roylmurry425,JulieKusma
942 | CarolineRach_,JulieKusma
943 | albedopasta,GameIdentityV
944 | LeMeurice,GameIdentityV
945 | birdwriter7,katey_sewell
946 | EatingOur,katey_sewell
947 | maltachristmas,katey_sewell
948 | SuzyYoung24,gordo_dog
949 | RoarLoudTravel,DemiCassiani
950 | nunningtoncow,PetMunchies
951 | VictorBadass,PetMunchies
952 | yvensew,SueCanSew1
953 | SarahMRomance,HarperCollinsUK
954 | biscuitttown,StellaMoris1
955 | vicky_whedbee,drusillacarr5
956 | DoffuMC,ImRespawning
957 | FightyWoman,netzfrauen
958 | KBMArtWriting,netzfrauen
959 | SuperSoftKnits,YouAreTheExpert
960 | Vinayak687,hilltopgina
961 | BeBartletts,hilltopgina
962 | TaehongChowa,ferozwala
963 | jorgeft5180,IstariVision
964 | kmljjj,DementiaUK
965 | AnthonyFlintPC,DementiaUK
966 | yelbuggs,DementiaUK
967 | TwolvesU,ClubBrockport
968 | HouseOfSeb,ClubBrockport
969 | rebeccacoleman,ClubBrockport
970 | Aubade85Emilie,jojo_marsh
971 | FlyerWhitstable,Whitproduce
972 | KBMArtWriting,Whitproduce
973 | yinsguys,WacoRunningCo
974 | SadiraStone,WacoRunningCo
975 | SuperSoftKnits,cerolana
976 | LindaNord9,StellaMoris1
977 | lamaletademaggi,bakeitwithlove
978 | yakwaxlips,SquaredSeven
979 | MrsOsborne123,Tonyharrisonart
980 | GholamiNoble,C_Shangchi
981 | SuperSoftKnits,TheStrandline
982 | yvensew,Amorejewellery
983 | MaryEllenGallac,storywhispers
984 | gahan_marty,NCBI_sightloss
985 | EmilyAmazon,BlueCornerCreas
986 | FalHolidayHomes,BlueCornerCreas
987 | Yeoldetripnott,WelbeckAbbeyBry
988 | PCMCamisetas,WelbeckAbbeyBry
989 | keithclaire95,ClubBrockport
990 | LukeHarrohcafc,mcd_productions
991 | SuperSoftKnits,GrannyFireside
992 | berlin_samurai2,C_Shangchi
993 | mis_tykl,annemariebrear
994 | iuicsacramento,annemariebrear
995 | RubyPerry11,annemariebrear
996 | _Aware_Citizen,KreatelyMedia
997 | DellOlioMario,JulieKusma
998 | newsoneplace,JulieKusma
999 | liveurlifenotme,patmarsh
1000 | mediocremeee,AdamTurcotte6
1001 | SteveStevens47,DementiaUK
1002 |
--------------------------------------------------------------------------------
/stream/produce.py:
--------------------------------------------------------------------------------
1 | import argparse
2 | import csv
3 | import os
4 | import json
5 | import pulsar
6 | from kafka import KafkaProducer
7 | from kafka.admin import KafkaAdminClient, NewTopic
8 | from kafka.errors import TopicAlreadyExistsError, NoBrokersAvailable
9 | from time import sleep
10 |
11 | KAFKA_IP = os.getenv("KAFKA_IP", "kafka")
12 | KAFKA_PORT = os.getenv("KAFKA_PORT", "9092")
13 | KAFKA_TOPIC = os.getenv("KAFKA_TOPIC", "retweets")
14 |
15 | PULSAR_IP = os.getenv("PULSAR_IP", "pulsar")
16 | PULSAR_PORT = os.getenv("PULSAR_PORT", "6650")
17 | PULSAR_TOPIC = os.getenv("PULSAR_TOPIC", "retweets")
18 |
19 | TWITTER_DATA = "data/scraped_tweets.csv"
20 |
21 |
22 | def restricted_float(x):
23 | try:
24 | x = float(x)
25 | except ValueError:
26 | raise argparse.ArgumentTypeError("%r not a floating-point literal" % (x,))
27 | if x < 0.0 or x > 3.0:
28 | raise argparse.ArgumentTypeError("%r not in range [0.0, 3.0]" % (x,))
29 | return x
30 |
31 |
32 | def parse_arguments():
33 | parser = argparse.ArgumentParser()
34 | parser.add_argument(
35 | "--stream-delay",
36 | type=restricted_float,
37 | default=2.0,
38 | help="Seconds to wait before producing a new message (MIN=0.0, MAX=3.0)",
39 | )
40 | parser.add_argument("--broker", choices=["kafka", "pulsar"])
41 | return parser.parse_args()
42 |
43 |
44 | def generate_tweets():
45 | while True:
46 | with open(TWITTER_DATA) as file:
47 | csvReader = csv.DictReader(file)
48 | for rows in csvReader:
49 | data = {
50 | "source_username": rows["source_username"],
51 | "target_username": rows["target_username"],
52 | }
53 | yield data
54 |
55 |
56 | def get_admin_client(ip, port):
57 | retries = 30
58 | while True:
59 | try:
60 | admin_client = KafkaAdminClient(
61 | bootstrap_servers=ip + ":" + port, client_id="test"
62 | )
63 | return admin_client
64 | except NoBrokersAvailable:
65 | retries -= 1
66 | if not retries:
67 | raise
68 | sleep(1)
69 |
70 |
71 | def create_topic(ip, port, topic):
72 | admin_client = get_admin_client(ip, port)
73 | my_topic = [NewTopic(name=topic, num_partitions=1, replication_factor=1)]
74 | try:
75 | admin_client.create_topics(new_topics=my_topic, validate_only=False)
76 | except TopicAlreadyExistsError:
77 | pass
78 | print("All topics:")
79 | print(admin_client.list_topics())
80 |
81 |
82 | def create_kafka_producer(ip, port):
83 | retries = 30
84 | while True:
85 | try:
86 | producer = KafkaProducer(bootstrap_servers=ip + ":" + port)
87 | return producer
88 | except NoBrokersAvailable:
89 | retries -= 1
90 | if not retries:
91 | raise
92 | print("Failed to connect to Kafka")
93 | sleep(1)
94 |
95 |
96 | def kafka_producer(ip, port, topic, generate, stream_delay):
97 | producer = create_kafka_producer(ip, port)
98 | message = generate()
99 | while True:
100 | try:
101 | producer.send(topic, json.dumps(next(message)).encode("utf8"))
102 | print("Produce: ", message)
103 | producer.flush()
104 | sleep(stream_delay)
105 | except Exception as e:
106 | print(f"Error: {e}")
107 |
108 |
109 | def pulsar_producer(ip, port, topic, generate, stream_delay):
110 | client = pulsar.Client("pulsar://" + ip + ":" + port)
111 | producer = client.create_producer(topic)
112 | message = generate()
113 | while True:
114 | try:
115 | msg = json.dumps(next(message))
116 | producer.send(msg.encode("utf8"))
117 | print("Produce: ", msg)
118 | producer.flush()
119 | sleep(stream_delay)
120 | except Exception as e:
121 | print(f"Error: {e}")
122 |
123 |
124 | def main():
125 | args = parse_arguments()
126 | sleep(15)
127 | if args.broker == "kafka":
128 | create_topic(KAFKA_IP, KAFKA_PORT, KAFKA_TOPIC)
129 | kafka_producer(
130 | KAFKA_IP, KAFKA_PORT, KAFKA_TOPIC, generate_tweets, args.stream_delay
131 | )
132 | else:
133 | pulsar_producer(
134 | PULSAR_IP, PULSAR_PORT, PULSAR_TOPIC, generate_tweets, args.stream_delay
135 | )
136 |
137 |
138 | if __name__ == "__main__":
139 | main()
140 |
--------------------------------------------------------------------------------
/stream/requirements.txt:
--------------------------------------------------------------------------------
1 | kafka-python==2.0.2
2 | pulsar-client==2.10.0
3 |
--------------------------------------------------------------------------------