From 0ab45209044e6ce9b1386eb61e6021be9cc19328 Mon Sep 17 00:00:00 2001 From: Czar Echavez Date: Tue, 20 Jun 2023 10:41:30 +0100 Subject: [PATCH 01/17] #1386: added the ability to set deterministic and seeding RNG when training and evaluating + the fix provided in #1535 --- .gitignore | 6 + docs/source/primaite-dependencies.rst | 708 ++++++++---------- src/primaite/config/training_config.py | 6 + src/primaite/environment/primaite_env.py | 14 +- src/primaite/main.py | 35 +- ..._deterministic_seeded_training_config.yaml | 98 +++ .../deterministic_a2c.csv | 61 ++ .../deterministic_generic.csv | 4 + .../deterministic_ppo.csv | 61 ++ ..._deterministic_seeded_training_config.yaml | 98 +++ ..._deterministic_seeded_training_config.yaml | 98 +++ tests/conftest.py | 68 +- .../test_session_repeatability.py | 359 +++++++++ 13 files changed, 1217 insertions(+), 399 deletions(-) create mode 100644 tests/config/e2e/a2c_deterministic_seeded_training_config.yaml create mode 100644 tests/config/e2e/deterministic_test_outputs/deterministic_a2c.csv create mode 100644 tests/config/e2e/deterministic_test_outputs/deterministic_generic.csv create mode 100644 tests/config/e2e/deterministic_test_outputs/deterministic_ppo.csv create mode 100644 tests/config/e2e/generic_deterministic_seeded_training_config.yaml create mode 100644 tests/config/e2e/ppo_deterministic_seeded_training_config.yaml create mode 100644 tests/e2e_integration_tests/test_session_repeatability.py diff --git a/.gitignore b/.gitignore index eed6c903..260a980b 100644 --- a/.gitignore +++ b/.gitignore @@ -137,3 +137,9 @@ dmypy.json # Cython debug symbols cython_debug/ + +# IDE +.idea/ + +# outputs +src/primaite/outputs/ \ No newline at end of file diff --git a/docs/source/primaite-dependencies.rst b/docs/source/primaite-dependencies.rst index bf6bd6e3..10685223 100644 --- a/docs/source/primaite-dependencies.rst +++ b/docs/source/primaite-dependencies.rst @@ -1,385 +1,323 @@ -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| Name | Version | License | URL | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| Babel | 2.12.1 | BSD License | https://babel.pocoo.org/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| GPUtil | 1.4.0 | MIT | https://github.com/anderskm/gputil | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| Gymnasium | 0.26.3 | MIT | https://gymnasium.farama.org/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| Jinja2 | 3.1.2 | BSD License | https://palletsprojects.com/p/jinja/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| Markdown | 3.4.3 | BSD License | https://Python-Markdown.github.io/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| MarkupSafe | 2.1.2 | BSD License | https://palletsprojects.com/p/markupsafe/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| Pillow | 9.5.0 | Historical Permission Notice and Disclaimer (HPND) | https://python-pillow.org | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| PyWavelets | 1.4.1 | MIT License | https://github.com/PyWavelets/pywt | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| PyYAML | 6.0 | MIT License | https://pyyaml.org/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| Pygments | 2.15.1 | BSD License | https://pygments.org | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| Send2Trash | 1.8.2 | BSD License | https://github.com/arsenetar/send2trash | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| Sphinx | 6.1.3 | BSD License | https://www.sphinx-doc.org/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| Werkzeug | 2.3.4 | BSD License | UNKNOWN | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| absl-py | 1.4.0 | Apache Software License | https://github.com/abseil/abseil-py | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| aiofiles | 22.1.0 | Apache Software License | https://github.com/Tinche/aiofiles | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| aiosignal | 1.3.1 | Apache Software License | https://github.com/aio-libs/aiosignal | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| aiosqlite | 0.19.0 | MIT License | UNKNOWN | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| alabaster | 0.7.13 | BSD License | https://alabaster.readthedocs.io | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| anyio | 3.7.0 | MIT License | https://anyio.readthedocs.io/en/stable/versionhistory.html | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| argon2-cffi | 21.3.0 | MIT License | https://github.com/hynek/argon2-cffi/blob/main/CHANGELOG.md | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| argon2-cffi-bindings | 21.2.0 | MIT License | https://github.com/hynek/argon2-cffi-bindings | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| arrow | 1.2.3 | Apache Software License | https://arrow.readthedocs.io | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| asttokens | 2.2.1 | Apache 2.0 | https://github.com/gristlabs/asttokens | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| attrs | 23.1.0 | MIT License | https://www.attrs.org/en/stable/changelog.html | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| backcall | 0.2.0 | BSD License | https://github.com/takluyver/backcall | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| beautifulsoup4 | 4.12.2 | MIT License | https://www.crummy.com/software/BeautifulSoup/bs4/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| bleach | 6.0.0 | Apache Software License | https://github.com/mozilla/bleach | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| build | 0.10.0 | MIT License | UNKNOWN | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| cachetools | 5.3.0 | MIT License | https://github.com/tkem/cachetools/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| certifi | 2023.5.7 | Mozilla Public License 2.0 (MPL 2.0) | https://github.com/certifi/python-certifi | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| cffi | 1.15.1 | MIT License | http://cffi.readthedocs.org | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| cfgv | 3.3.1 | MIT License | https://github.com/asottile/cfgv | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| charset-normalizer | 3.1.0 | MIT License | https://github.com/Ousret/charset_normalizer | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| click | 8.1.3 | BSD License | https://palletsprojects.com/p/click/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| cloudpickle | 2.2.1 | BSD License | https://github.com/cloudpipe/cloudpickle | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| colorama | 0.4.6 | BSD License | https://github.com/tartley/colorama | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| comm | 0.1.3 | BSD License | https://github.com/ipython/comm | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| contourpy | 1.0.7 | BSD License | UNKNOWN | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| coverage | 7.2.6 | Apache Software License | https://github.com/nedbat/coveragepy | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| cycler | 0.11.0 | BSD License | https://github.com/matplotlib/cycler | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| debugpy | 1.6.7 | Eclipse Public License 2.0 (EPL-2.0); MIT License | https://aka.ms/debugpy | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| decorator | 5.1.1 | BSD License | https://github.com/micheles/decorator | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| defusedxml | 0.7.1 | Python Software Foundation License | https://github.com/tiran/defusedxml | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| distlib | 0.3.6 | Python Software Foundation License | https://github.com/pypa/distlib | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| dm-tree | 0.1.8 | Apache Software License | https://github.com/deepmind/tree | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| docutils | 0.19 | BSD License; GNU General Public License (GPL); Public Domain; Python Software Foundation License | https://docutils.sourceforge.io/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| exceptiongroup | 1.1.1 | MIT License | https://github.com/agronholm/exceptiongroup/blob/main/CHANGES.rst | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| executing | 1.2.0 | MIT License | https://github.com/alexmojaki/executing | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| fastjsonschema | 2.17.1 | BSD License | https://github.com/horejsek/python-fastjsonschema | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| filelock | 3.12.0 | The Unlicense (Unlicense) | https://github.com/tox-dev/py-filelock | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| flake8 | 6.0.0 | MIT License | https://github.com/pycqa/flake8 | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| fonttools | 4.39.4 | MIT License | http://github.com/fonttools/fonttools | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| fqdn | 1.5.1 | Mozilla Public License 2.0 (MPL 2.0) | https://github.com/ypcrts/fqdn | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| frozenlist | 1.3.3 | Apache Software License | https://github.com/aio-libs/frozenlist | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| furo | 2023.3.27 | MIT License | UNKNOWN | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| google-auth | 2.19.0 | Apache Software License | https://github.com/googleapis/google-auth-library-python | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| google-auth-oauthlib | 1.0.0 | Apache Software License | https://github.com/GoogleCloudPlatform/google-auth-library-python-oauthlib | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| grpcio | 1.51.3 | Apache Software License | https://grpc.io | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| gym | 0.21.0 | UNKNOWN | https://github.com/openai/gym | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| gymnasium-notices | 0.0.1 | MIT License | https://github.com/Farama-Foundation/gym-notices | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| identify | 2.5.24 | MIT License | https://github.com/pre-commit/identify | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| idna | 3.4 | BSD License | https://github.com/kjd/idna | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| imageio | 2.29.0 | BSD License | https://github.com/imageio/imageio | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| imagesize | 1.4.1 | MIT License | https://github.com/shibukawa/imagesize_py | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| importlib-metadata | 4.13.0 | Apache Software License | https://github.com/python/importlib_metadata | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| iniconfig | 2.0.0 | MIT License | https://github.com/pytest-dev/iniconfig | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| ipykernel | 6.23.1 | BSD License | https://ipython.org | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| ipython | 8.13.2 | BSD License | https://ipython.org | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| ipython-genutils | 0.2.0 | BSD License | http://ipython.org | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| isoduration | 20.11.0 | ISC License (ISCL) | https://github.com/bolsote/isoduration | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| jedi | 0.18.2 | MIT License | https://github.com/davidhalter/jedi | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| json5 | 0.9.14 | Apache Software License | https://github.com/dpranke/pyjson5 | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| jsonpointer | 2.3 | BSD License | https://github.com/stefankoegl/python-json-pointer | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| jsonschema | 4.17.3 | MIT License | https://github.com/python-jsonschema/jsonschema | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| jupyter-events | 0.6.3 | BSD License | http://jupyter.org | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| jupyter-ydoc | 0.2.4 | BSD 3-Clause License | https://jupyter.org | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| jupyter_client | 8.2.0 | BSD License | https://jupyter.org | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| jupyter_core | 5.3.0 | BSD License | https://jupyter.org | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| jupyter_server | 2.6.0 | BSD License | https://jupyter-server.readthedocs.io | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| jupyter_server_fileid | 0.9.0 | BSD License | UNKNOWN | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| jupyter_server_terminals | 0.4.4 | BSD License | https://jupyter.org | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| jupyter_server_ydoc | 0.6.1 | BSD License | https://jupyter.org | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| jupyterlab | 3.6.1 | BSD License | https://jupyter.org | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| jupyterlab-pygments | 0.2.2 | BSD | https://github.com/jupyterlab/jupyterlab_pygments | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| jupyterlab_server | 2.22.1 | BSD License | https://jupyterlab-server.readthedocs.io | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| kiwisolver | 1.4.4 | BSD License | UNKNOWN | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| lazy_loader | 0.2 | BSD License | https://github.com/scientific-python/lazy_loader | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| lz4 | 4.3.2 | BSD License | https://github.com/python-lz4/python-lz4 | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| markdown-it-py | 2.2.0 | MIT License | https://github.com/executablebooks/markdown-it-py | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| matplotlib | 3.7.1 | Python Software Foundation License | https://matplotlib.org | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| matplotlib-inline | 0.1.6 | BSD 3-Clause | https://github.com/ipython/matplotlib-inline | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| mccabe | 0.7.0 | MIT License | https://github.com/pycqa/mccabe | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| mdurl | 0.1.2 | MIT License | https://github.com/executablebooks/mdurl | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| mistune | 2.0.5 | BSD License | https://github.com/lepture/mistune | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| mock | 5.0.2 | BSD License | http://mock.readthedocs.org/en/latest/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| mpmath | 1.3.0 | BSD License | http://mpmath.org/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| msgpack | 1.0.5 | Apache Software License | https://msgpack.org/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| nbclassic | 1.0.0 | BSD License | https://github.com/jupyter/nbclassic | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| nbclient | 0.8.0 | BSD License | https://jupyter.org | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| nbconvert | 7.4.0 | BSD License | https://jupyter.org | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| nbformat | 5.9.0 | BSD License | https://jupyter.org | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| nest-asyncio | 1.5.6 | BSD License | https://github.com/erdewit/nest_asyncio | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| networkx | 3.1 | BSD License | https://networkx.org/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| nodeenv | 1.8.0 | BSD License | https://github.com/ekalinin/nodeenv | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| notebook | 6.5.4 | BSD License | http://jupyter.org | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| notebook_shim | 0.2.3 | BSD License | UNKNOWN | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| numpy | 1.23.5 | BSD License | https://www.numpy.org | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| oauthlib | 3.2.2 | BSD License | https://github.com/oauthlib/oauthlib | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| overrides | 7.3.1 | Apache License, Version 2.0 | https://github.com/mkorpela/overrides | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| packaging | 23.1 | Apache Software License; BSD License | https://github.com/pypa/packaging | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| pandas | 2.0.1 | BSD License | UNKNOWN | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| pandocfilters | 1.5.0 | BSD License | http://github.com/jgm/pandocfilters | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| parso | 0.8.3 | MIT License | https://github.com/davidhalter/parso | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| pickleshare | 0.7.5 | MIT License | https://github.com/pickleshare/pickleshare | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| platformdirs | 3.5.1 | MIT License | https://github.com/platformdirs/platformdirs | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| pluggy | 1.0.0 | MIT License | https://github.com/pytest-dev/pluggy | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| pre-commit | 2.20.0 | MIT License | https://github.com/pre-commit/pre-commit | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| primaite | 1.2.1 | GFX | UNKNOWN | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| prometheus-client | 0.17.0 | Apache Software License | https://github.com/prometheus/client_python | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| prompt-toolkit | 3.0.38 | BSD License | https://github.com/prompt-toolkit/python-prompt-toolkit | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| protobuf | 3.20.3 | BSD-3-Clause | https://developers.google.com/protocol-buffers/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| psutil | 5.9.5 | BSD License | https://github.com/giampaolo/psutil | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| pure-eval | 0.2.2 | MIT License | http://github.com/alexmojaki/pure_eval | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| pyasn1 | 0.5.0 | BSD License | https://github.com/pyasn1/pyasn1 | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| pyasn1-modules | 0.3.0 | BSD License | https://github.com/pyasn1/pyasn1-modules | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| pycodestyle | 2.10.0 | MIT License | https://pycodestyle.pycqa.org/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| pycparser | 2.21 | BSD License | https://github.com/eliben/pycparser | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| pyflakes | 3.0.1 | MIT License | https://github.com/PyCQA/pyflakes | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| pyparsing | 3.0.9 | MIT License | https://github.com/pyparsing/pyparsing/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| pyproject_hooks | 1.0.0 | MIT License | https://github.com/pypa/pyproject-hooks | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| pyrsistent | 0.19.3 | MIT License | https://github.com/tobgu/pyrsistent/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| pytest | 7.2.0 | MIT License | https://docs.pytest.org/en/latest/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| pytest-cov | 4.0.0 | MIT License | https://github.com/pytest-dev/pytest-cov | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| pytest-flake8 | 1.1.1 | BSD License | https://github.com/tholo/pytest-flake8 | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| python-dateutil | 2.8.2 | Apache Software License; BSD License | https://github.com/dateutil/dateutil | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| python-json-logger | 2.0.7 | BSD License | http://github.com/madzak/python-json-logger | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| pytz | 2023.3 | MIT License | http://pythonhosted.org/pytz | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| pywin32 | 306 | Python Software Foundation License | https://github.com/mhammond/pywin32 | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| pywinpty | 2.0.10 | MIT | UNKNOWN | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| pyzmq | 25.1.0 | BSD License; GNU Library or Lesser General Public License (LGPL) | https://pyzmq.readthedocs.org | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| ray | 2.2.0 | Apache 2.0 | https://github.com/ray-project/ray | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| requests | 2.31.0 | Apache Software License | https://requests.readthedocs.io | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| requests-oauthlib | 1.3.1 | BSD License | https://github.com/requests/requests-oauthlib | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| rfc3339-validator | 0.1.4 | MIT License | https://github.com/naimetti/rfc3339-validator | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| rfc3986-validator | 0.1.1 | MIT License | https://github.com/naimetti/rfc3986-validator | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| rich | 13.3.5 | MIT License | https://github.com/Textualize/rich | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| rsa | 4.9 | Apache Software License | https://stuvel.eu/rsa | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| scikit-image | 0.20.0 | BSD License | https://scikit-image.org | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| scipy | 1.10.1 | BSD License | https://scipy.org/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| shellingham | 1.5.0.post1 | ISC License (ISCL) | https://github.com/sarugaku/shellingham | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| six | 1.16.0 | MIT License | https://github.com/benjaminp/six | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| sniffio | 1.3.0 | Apache Software License; MIT License | https://github.com/python-trio/sniffio | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| snowballstemmer | 2.2.0 | BSD License | https://github.com/snowballstem/snowball | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| soupsieve | 2.4.1 | MIT License | https://github.com/facelessuser/soupsieve | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| sphinx-basic-ng | 1.0.0b1 | MIT License | https://github.com/pradyunsg/sphinx-basic-ng | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| sphinx-code-tabs | 0.5.3 | The Unlicense (Unlicense) | https://github.com/coldfix/sphinx-code-tabs | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| sphinx-copybutton | 0.5.2 | MIT License | https://github.com/executablebooks/sphinx-copybutton | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| sphinxcontrib-applehelp | 1.0.4 | BSD License | https://www.sphinx-doc.org/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| sphinxcontrib-devhelp | 1.0.2 | BSD License | http://sphinx-doc.org/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| sphinxcontrib-htmlhelp | 2.0.1 | BSD License | https://www.sphinx-doc.org/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| sphinxcontrib-jsmath | 1.0.1 | BSD License | http://sphinx-doc.org/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| sphinxcontrib-qthelp | 1.0.3 | BSD License | http://sphinx-doc.org/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| sphinxcontrib-serializinghtml | 1.1.5 | BSD License | http://sphinx-doc.org/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| stable-baselines3 | 1.6.2 | MIT | https://github.com/DLR-RM/stable-baselines3 | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| stack-data | 0.6.2 | MIT License | http://github.com/alexmojaki/stack_data | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| sympy | 1.12 | BSD License | https://sympy.org | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| tabulate | 0.9.0 | MIT License | https://github.com/astanin/python-tabulate | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| tensorboard | 2.12.3 | Apache Software License | https://github.com/tensorflow/tensorboard | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| tensorboard-data-server | 0.7.0 | Apache Software License | https://github.com/tensorflow/tensorboard/tree/master/tensorboard/data/server | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| tensorboard-plugin-wit | 1.8.1 | Apache 2.0 | https://whatif-tool.dev | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| tensorboardX | 2.6 | MIT License | https://github.com/lanpa/tensorboardX | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| terminado | 0.17.1 | BSD License | https://github.com/jupyter/terminado | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| tifffile | 2023.4.12 | BSD License | https://www.cgohlke.com | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| tinycss2 | 1.2.1 | BSD License | https://www.courtbouillon.org/tinycss2 | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| toml | 0.10.2 | MIT License | https://github.com/uiri/toml | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| tomli | 2.0.1 | MIT License | https://github.com/hukkin/tomli | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| torch | 2.0.1 | BSD License | https://pytorch.org/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| tornado | 6.3.2 | Apache Software License | http://www.tornadoweb.org/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| traitlets | 5.9.0 | BSD License | https://github.com/ipython/traitlets | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| typer | 0.9.0 | MIT License | https://github.com/tiangolo/typer | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| typing_extensions | 4.6.2 | Python Software Foundation License | https://github.com/python/typing_extensions/issues | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| tzdata | 2023.3 | Apache Software License | https://github.com/python/tzdata | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| uri-template | 1.2.0 | MIT License | https://github.com/plinss/uri_template/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| urllib3 | 1.26.16 | MIT License | https://urllib3.readthedocs.io/ | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| virtualenv | 20.21.0 | MIT License | https://github.com/pypa/virtualenv | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| webcolors | 1.13 | BSD License | UNKNOWN | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| webencodings | 0.5.1 | BSD License | https://github.com/SimonSapin/python-webencodings | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| websocket-client | 1.5.2 | Apache Software License | https://github.com/websocket-client/websocket-client.git | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| y-py | 0.5.9 | MIT License | https://github.com/y-crdt/ypy | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| ypy-websocket | 0.8.2 | UNKNOWN | https://github.com/y-crdt/ypy-websocket | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ -| zipp | 3.15.0 | MIT License | https://github.com/jaraco/zipp | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------+ ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| Name | Version | License | URL | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| Babel | 2.12.1 | BSD License | https://babel.pocoo.org/ | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| Jinja2 | 3.1.2 | BSD License | https://palletsprojects.com/p/jinja/ | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| MarkupSafe | 2.1.3 | BSD License | https://palletsprojects.com/p/markupsafe/ | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| Pillow | 9.5.0 | Historical Permission Notice and Disclaimer (HPND) | https://python-pillow.org | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| PyYAML | 6.0 | MIT License | https://pyyaml.org/ | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| Pygments | 2.15.1 | BSD License | https://pygments.org | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| Send2Trash | 1.8.2 | BSD License | https://github.com/arsenetar/send2trash | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| Sphinx | 6.1.3 | BSD License | https://www.sphinx-doc.org/ | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| aiofiles | 22.1.0 | Apache Software License | https://github.com/Tinche/aiofiles | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| aiosqlite | 0.19.0 | MIT License | UNKNOWN | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| alabaster | 0.7.13 | BSD License | https://alabaster.readthedocs.io | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| anyio | 3.7.0 | MIT License | https://anyio.readthedocs.io/en/stable/versionhistory.html | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| argon2-cffi | 21.3.0 | MIT License | https://github.com/hynek/argon2-cffi/blob/main/CHANGELOG.md | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| argon2-cffi-bindings | 21.2.0 | MIT License | https://github.com/hynek/argon2-cffi-bindings | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| arrow | 1.2.3 | Apache Software License | https://arrow.readthedocs.io | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| asttokens | 2.2.1 | Apache 2.0 | https://github.com/gristlabs/asttokens | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| attrs | 23.1.0 | MIT License | https://www.attrs.org/en/stable/changelog.html | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| backcall | 0.2.0 | BSD License | https://github.com/takluyver/backcall | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| beautifulsoup4 | 4.12.2 | MIT License | https://www.crummy.com/software/BeautifulSoup/bs4/ | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| bleach | 6.0.0 | Apache Software License | https://github.com/mozilla/bleach | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| build | 0.10.0 | MIT License | UNKNOWN | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| certifi | 2023.5.7 | Mozilla Public License 2.0 (MPL 2.0) | https://github.com/certifi/python-certifi | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| cffi | 1.15.1 | MIT License | http://cffi.readthedocs.org | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| cfgv | 3.3.1 | MIT License | https://github.com/asottile/cfgv | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| charset-normalizer | 3.1.0 | MIT License | https://github.com/Ousret/charset_normalizer | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| click | 8.1.3 | BSD License | https://palletsprojects.com/p/click/ | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| cloudpickle | 2.2.1 | BSD License | https://github.com/cloudpipe/cloudpickle | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| colorama | 0.4.6 | BSD License | https://github.com/tartley/colorama | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| comm | 0.1.3 | BSD License | https://github.com/ipython/comm | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| contourpy | 1.0.7 | BSD License | UNKNOWN | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| coverage | 7.2.7 | Apache Software License | https://github.com/nedbat/coveragepy | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| cycler | 0.11.0 | BSD License | https://github.com/matplotlib/cycler | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| debugpy | 1.6.7 | Eclipse Public License 2.0 (EPL-2.0); MIT License | https://aka.ms/debugpy | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| decorator | 5.1.1 | BSD License | https://github.com/micheles/decorator | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| defusedxml | 0.7.1 | Python Software Foundation License | https://github.com/tiran/defusedxml | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| distlib | 0.3.6 | Python Software Foundation License | https://github.com/pypa/distlib | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| docutils | 0.19 | BSD License; GNU General Public License (GPL); Public Domain; Python Software Foundation License | https://docutils.sourceforge.io/ | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| exceptiongroup | 1.1.1 | MIT License | https://github.com/agronholm/exceptiongroup/blob/main/CHANGES.rst | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| executing | 1.2.0 | MIT License | https://github.com/alexmojaki/executing | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| fastjsonschema | 2.17.1 | BSD License | https://github.com/horejsek/python-fastjsonschema | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| filelock | 3.12.1 | The Unlicense (Unlicense) | https://github.com/tox-dev/py-filelock | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| flake8 | 6.0.0 | MIT License | https://github.com/pycqa/flake8 | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| fonttools | 4.40.0 | MIT License | http://github.com/fonttools/fonttools | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| fqdn | 1.5.1 | Mozilla Public License 2.0 (MPL 2.0) | https://github.com/ypcrts/fqdn | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| furo | 2023.3.27 | MIT License | UNKNOWN | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| gym | 0.21.0 | UNKNOWN | https://github.com/openai/gym | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| identify | 2.5.24 | MIT License | https://github.com/pre-commit/identify | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| idna | 3.4 | BSD License | https://github.com/kjd/idna | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| imagesize | 1.4.1 | MIT License | https://github.com/shibukawa/imagesize_py | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| importlib-metadata | 4.13.0 | Apache Software License | https://github.com/python/importlib_metadata | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| importlib-resources | 5.12.0 | Apache Software License | https://github.com/python/importlib_resources | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| iniconfig | 2.0.0 | MIT License | https://github.com/pytest-dev/iniconfig | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| ipykernel | 6.23.2 | BSD License | https://ipython.org | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| ipython | 8.12.2 | BSD License | https://ipython.org | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| ipython-genutils | 0.2.0 | BSD License | http://ipython.org | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| isoduration | 20.11.0 | ISC License (ISCL) | https://github.com/bolsote/isoduration | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| jedi | 0.18.2 | MIT License | https://github.com/davidhalter/jedi | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| json5 | 0.9.14 | Apache Software License | https://github.com/dpranke/pyjson5 | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| jsonpointer | 2.3 | BSD License | https://github.com/stefankoegl/python-json-pointer | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| jsonschema | 4.17.3 | MIT License | https://github.com/python-jsonschema/jsonschema | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| jupyter-events | 0.6.3 | BSD License | http://jupyter.org | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| jupyter-ydoc | 0.2.4 | BSD 3-Clause License | https://jupyter.org | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| jupyter_client | 8.2.0 | BSD License | https://jupyter.org | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| jupyter_core | 5.3.0 | BSD License | https://jupyter.org | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| jupyter_server | 2.6.0 | BSD License | https://jupyter-server.readthedocs.io | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| jupyter_server_fileid | 0.9.0 | BSD License | UNKNOWN | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| jupyter_server_terminals | 0.4.4 | BSD License | https://jupyter.org | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| jupyter_server_ydoc | 0.6.1 | BSD License | https://jupyter.org | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| jupyterlab | 3.6.1 | BSD License | https://jupyter.org | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| jupyterlab-pygments | 0.2.2 | BSD | https://github.com/jupyterlab/jupyterlab_pygments | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| jupyterlab_server | 2.23.0 | BSD License | https://jupyterlab-server.readthedocs.io | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| kiwisolver | 1.4.4 | BSD License | UNKNOWN | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| markdown-it-py | 3.0.0 | MIT License | https://github.com/executablebooks/markdown-it-py | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| matplotlib | 3.7.1 | Python Software Foundation License | https://matplotlib.org | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| matplotlib-inline | 0.1.6 | BSD 3-Clause | https://github.com/ipython/matplotlib-inline | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| mccabe | 0.7.0 | MIT License | https://github.com/pycqa/mccabe | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| mdurl | 0.1.2 | MIT License | https://github.com/executablebooks/mdurl | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| mistune | 2.0.5 | BSD License | https://github.com/lepture/mistune | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| mpmath | 1.3.0 | BSD License | http://mpmath.org/ | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| nbclassic | 1.0.0 | BSD License | https://github.com/jupyter/nbclassic | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| nbclient | 0.8.0 | BSD License | https://jupyter.org | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| nbconvert | 7.4.0 | BSD License | https://jupyter.org | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| nbformat | 5.9.0 | BSD License | https://jupyter.org | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| nest-asyncio | 1.5.6 | BSD License | https://github.com/erdewit/nest_asyncio | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| networkx | 3.1 | BSD License | https://networkx.org/ | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| nodeenv | 1.8.0 | BSD License | https://github.com/ekalinin/nodeenv | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| notebook | 6.5.4 | BSD License | http://jupyter.org | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| notebook_shim | 0.2.3 | BSD License | UNKNOWN | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| numpy | 1.23.5 | BSD License | https://www.numpy.org | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| overrides | 7.3.1 | Apache License, Version 2.0 | https://github.com/mkorpela/overrides | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| packaging | 23.1 | Apache Software License; BSD License | https://github.com/pypa/packaging | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| pandas | 2.0.2 | BSD License | UNKNOWN | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| pandocfilters | 1.5.0 | BSD License | http://github.com/jgm/pandocfilters | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| parso | 0.8.3 | MIT License | https://github.com/davidhalter/parso | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| pickleshare | 0.7.5 | MIT License | https://github.com/pickleshare/pickleshare | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| pkgutil_resolve_name | 1.3.10 | MIT License | https://github.com/graingert/pkgutil-resolve-name | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| platformdirs | 3.5.1 | MIT License | https://github.com/platformdirs/platformdirs | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| pluggy | 1.0.0 | MIT License | https://github.com/pytest-dev/pluggy | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| pre-commit | 2.20.0 | MIT License | https://github.com/pre-commit/pre-commit | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| primaite | 2.0.0.dev0 | GFX | UNKNOWN | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| primaite | 2.0.0.dev0 | GFX | UNKNOWN | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| prometheus-client | 0.17.0 | Apache Software License | https://github.com/prometheus/client_python | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| prompt-toolkit | 3.0.38 | BSD License | https://github.com/prompt-toolkit/python-prompt-toolkit | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| psutil | 5.9.5 | BSD License | https://github.com/giampaolo/psutil | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| pure-eval | 0.2.2 | MIT License | http://github.com/alexmojaki/pure_eval | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| pycodestyle | 2.10.0 | MIT License | https://pycodestyle.pycqa.org/ | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| pycparser | 2.21 | BSD License | https://github.com/eliben/pycparser | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| pyflakes | 3.0.1 | MIT License | https://github.com/PyCQA/pyflakes | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| pyparsing | 3.0.9 | MIT License | https://github.com/pyparsing/pyparsing/ | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| pyproject_hooks | 1.0.0 | MIT License | https://github.com/pypa/pyproject-hooks | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| pyrsistent | 0.19.3 | MIT License | https://github.com/tobgu/pyrsistent/ | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| pytest | 7.2.0 | MIT License | https://docs.pytest.org/en/latest/ | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| pytest-cov | 4.0.0 | MIT License | https://github.com/pytest-dev/pytest-cov | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| pytest-flake8 | 1.1.1 | BSD License | https://github.com/tholo/pytest-flake8 | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| python-dateutil | 2.8.2 | Apache Software License; BSD License | https://github.com/dateutil/dateutil | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| python-json-logger | 2.0.7 | BSD License | http://github.com/madzak/python-json-logger | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| pytz | 2023.3 | MIT License | http://pythonhosted.org/pytz | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| pywin32 | 306 | Python Software Foundation License | https://github.com/mhammond/pywin32 | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| pywinpty | 2.0.10 | MIT | UNKNOWN | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| pyzmq | 25.1.0 | BSD License; GNU Library or Lesser General Public License (LGPL) | https://pyzmq.readthedocs.org | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| requests | 2.31.0 | Apache Software License | https://requests.readthedocs.io | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| rfc3339-validator | 0.1.4 | MIT License | https://github.com/naimetti/rfc3339-validator | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| rfc3986-validator | 0.1.1 | MIT License | https://github.com/naimetti/rfc3986-validator | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| rich | 13.4.2 | MIT License | https://github.com/Textualize/rich | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| shellingham | 1.5.0.post1 | ISC License (ISCL) | https://github.com/sarugaku/shellingham | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| six | 1.16.0 | MIT License | https://github.com/benjaminp/six | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| sniffio | 1.3.0 | Apache Software License; MIT License | https://github.com/python-trio/sniffio | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| snowballstemmer | 2.2.0 | BSD License | https://github.com/snowballstem/snowball | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| soupsieve | 2.4.1 | MIT License | https://github.com/facelessuser/soupsieve | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| sphinx-basic-ng | 1.0.0b1 | MIT License | https://github.com/pradyunsg/sphinx-basic-ng | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| sphinx-code-tabs | 0.5.3 | The Unlicense (Unlicense) | https://github.com/coldfix/sphinx-code-tabs | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| sphinx-copybutton | 0.5.2 | MIT License | https://github.com/executablebooks/sphinx-copybutton | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| sphinxcontrib-applehelp | 1.0.4 | BSD License | https://www.sphinx-doc.org/ | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| sphinxcontrib-devhelp | 1.0.2 | BSD License | http://sphinx-doc.org/ | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| sphinxcontrib-htmlhelp | 2.0.1 | BSD License | https://www.sphinx-doc.org/ | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| sphinxcontrib-jsmath | 1.0.1 | BSD License | http://sphinx-doc.org/ | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| sphinxcontrib-qthelp | 1.0.3 | BSD License | http://sphinx-doc.org/ | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| sphinxcontrib-serializinghtml | 1.1.5 | BSD License | http://sphinx-doc.org/ | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| stable-baselines3 | 1.6.2 | MIT | https://github.com/DLR-RM/stable-baselines3 | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| stack-data | 0.6.2 | MIT License | http://github.com/alexmojaki/stack_data | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| sympy | 1.12 | BSD License | https://sympy.org | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| terminado | 0.17.1 | BSD License | https://github.com/jupyter/terminado | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| tinycss2 | 1.2.1 | BSD License | https://www.courtbouillon.org/tinycss2 | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| toml | 0.10.2 | MIT License | https://github.com/uiri/toml | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| tomli | 2.0.1 | MIT License | https://github.com/hukkin/tomli | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| torch | 2.0.1 | BSD License | https://pytorch.org/ | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| tornado | 6.3.2 | Apache Software License | http://www.tornadoweb.org/ | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| traitlets | 5.9.0 | BSD License | https://github.com/ipython/traitlets | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| typer | 0.9.0 | MIT License | https://github.com/tiangolo/typer | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| typing_extensions | 4.6.3 | Python Software Foundation License | https://github.com/python/typing_extensions/issues | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| tzdata | 2023.3 | Apache Software License | https://github.com/python/tzdata | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| uri-template | 1.2.0 | MIT License | https://github.com/plinss/uri_template/ | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| urllib3 | 2.0.3 | MIT License | https://github.com/urllib3/urllib3/blob/main/CHANGES.rst | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| virtualenv | 20.23.0 | MIT License | https://github.com/pypa/virtualenv | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| webcolors | 1.13 | BSD License | UNKNOWN | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| webencodings | 0.5.1 | BSD License | https://github.com/SimonSapin/python-webencodings | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| websocket-client | 1.5.3 | Apache Software License | https://github.com/websocket-client/websocket-client.git | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| y-py | 0.5.9 | MIT License | https://github.com/y-crdt/ypy | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| ypy-websocket | 0.8.2 | UNKNOWN | https://github.com/y-crdt/ypy-websocket | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ +| zipp | 3.15.0 | MIT License | https://github.com/jaraco/zipp | ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/primaite/config/training_config.py b/src/primaite/config/training_config.py index 4af36abe..87a473e0 100644 --- a/src/primaite/config/training_config.py +++ b/src/primaite/config/training_config.py @@ -137,6 +137,12 @@ class TrainingConfig: file_system_scanning_limit: int = 5 "The time taken to scan the file system." + deterministic: bool = False + "If true, the training will be deterministic" + + seed: int = None + "The random number generator seed to be used while training the agent" + def to_dict(self, json_serializable: bool = True): """ Serialise the ``TrainingConfig`` as dict. diff --git a/src/primaite/environment/primaite_env.py b/src/primaite/environment/primaite_env.py index da235971..a4b69ba6 100644 --- a/src/primaite/environment/primaite_env.py +++ b/src/primaite/environment/primaite_env.py @@ -45,6 +45,7 @@ from primaite.pol.ier import IER from primaite.pol.red_agent_pol import apply_red_agent_iers, \ apply_red_agent_node_pol from primaite.transactions.transaction import Transaction +from primaite.transactions.transactions_to_file import write_transaction_to_file _LOGGER = logging.getLogger(__name__) _LOGGER.setLevel(logging.INFO) @@ -221,7 +222,7 @@ class Primaite(Env): # [0, 3] - action on property (0 = nothing, On / Scan, Off / Repair, Reset / Patch / Restore) # noqa # [0, num services] - resolves to service ID (0 = nothing, resolves to service) # noqa self.action_dict = self.create_node_action_dict() - self.action_space = spaces.Discrete(len(self.action_dict)) + self.action_space = spaces.Discrete(len(self.action_dict), seed=self.training_config.seed) elif self.training_config.action_type == ActionType.ACL: _LOGGER.info("Action space type ACL selected") # Terms (for ACL action space): @@ -232,11 +233,11 @@ class Primaite(Env): # [0, num services] - Protocol (0 = any, then 1 -> x resolving to protocol) # [0, num ports] - Port (0 = any, then 1 -> x resolving to port) self.action_dict = self.create_acl_action_dict() - self.action_space = spaces.Discrete(len(self.action_dict)) + self.action_space = spaces.Discrete(len(self.action_dict), seed=self.training_config.seed) elif self.training_config.action_type == ActionType.ANY: _LOGGER.info("Action space type ANY selected - Node + ACL") self.action_dict = self.create_node_and_acl_action_dict() - self.action_space = spaces.Discrete(len(self.action_dict)) + self.action_space = spaces.Discrete(len(self.action_dict), seed=self.training_config.seed) else: _LOGGER.info(f"Invalid action type selected: {self.training_config.action_type}") # Set up a csv to store the results of the training @@ -405,8 +406,13 @@ class Primaite(Env): # Return return self.env_obs, reward, done, self.step_info + def close(self): + self.__close__() + def __close__(self): - """Override close function.""" + """ + Override close function + """ self.csv_file.close() def init_acl(self): diff --git a/src/primaite/main.py b/src/primaite/main.py index ac32a018..fc549590 100644 --- a/src/primaite/main.py +++ b/src/primaite/main.py @@ -14,8 +14,8 @@ from pathlib import Path from typing import Final, Union from uuid import uuid4 +import numpy as np from stable_baselines3 import A2C, PPO -from stable_baselines3.common.evaluation import evaluate_policy from stable_baselines3.common.on_policy_algorithm import OnPolicyAlgorithm from stable_baselines3.ppo import MlpPolicy as PPOMlp @@ -54,9 +54,6 @@ def run_generic(env: Primaite, config_values: TrainingConfig): # Introduce a delay between steps time.sleep(config_values.time_delay / 1000) - - # Reset the environment at the end of the episode - env.close() @@ -90,7 +87,7 @@ def run_stable_baselines3_ppo( _LOGGER.error("Could not load agent") _LOGGER.error("Exception occured", exc_info=True) else: - agent = PPO(PPOMlp, env, verbose=0, n_steps=config_values.num_steps) + agent = PPO(PPOMlp, env, verbose=0, n_steps=config_values.num_steps, seed=env.training_config.seed) if config_values.session_type == "TRAINING": # We're in a training session @@ -103,8 +100,19 @@ def run_stable_baselines3_ppo( # Default to being in an evaluation session print("Starting evaluation session...") _LOGGER.debug("Starting evaluation session...") - evaluate_policy(agent, env, n_eval_episodes=config_values.num_episodes) + for episode in range(0, config_values.num_episodes): + obs = env.reset() + + for step in range(0, config_values.num_steps): + action, _states = agent.predict( + obs, + deterministic=env.training_config.deterministic + ) + # convert to int if action is a numpy array + if isinstance(action, np.ndarray): + action = np.int64(action) + obs, rewards, done, info = env.step(action) env.close() @@ -138,7 +146,7 @@ def run_stable_baselines3_a2c( _LOGGER.error("Could not load agent") _LOGGER.error("Exception occured", exc_info=True) else: - agent = A2C("MlpPolicy", env, verbose=0, n_steps=config_values.num_steps) + agent = A2C("MlpPolicy", env, verbose=0, n_steps=config_values.num_steps, seed=env.training_config.seed) if config_values.session_type == "TRAINING": # We're in a training session @@ -151,7 +159,18 @@ def run_stable_baselines3_a2c( # Default to being in an evaluation session print("Starting evaluation session...") _LOGGER.debug("Starting evaluation session...") - evaluate_policy(agent, env, n_eval_episodes=config_values.num_episodes) + for episode in range(0, config_values.num_episodes): + obs = env.reset() + + for step in range(0, config_values.num_steps): + action, _states = agent.predict( + obs, + deterministic=env.training_config.deterministic + ) + # convert to int if action is a numpy array + if isinstance(action, np.ndarray): + action = np.int64(action) + obs, rewards, done, info = env.step(action) env.close() diff --git a/tests/config/e2e/a2c_deterministic_seeded_training_config.yaml b/tests/config/e2e/a2c_deterministic_seeded_training_config.yaml new file mode 100644 index 00000000..7dad0d4d --- /dev/null +++ b/tests/config/e2e/a2c_deterministic_seeded_training_config.yaml @@ -0,0 +1,98 @@ +# Main Config File + +# Generic config values +# Choose one of these (dependent on Agent being trained) +# "STABLE_BASELINES3_PPO" +# "STABLE_BASELINES3_A2C" +# "GENERIC" +agent_identifier: STABLE_BASELINES3_A2C +# Sets How the Action Space is defined: +# "NODE" +# "ACL" +# "ANY" node and acl actions +action_type: ANY +# Number of episodes to run per session +num_episodes: 3 +# Number of time_steps per episode +num_steps: 20 +# Time delay between steps (for generic agents) +time_delay: 1 +# Type of session to be run (TRAINING or EVALUATION) +session_type: TRAINING +# Determine whether to load an agent from file +load_agent: False +# File path and file name of agent if you're loading one in +agent_load_file: C:\[Path]\[agent_saved_filename.zip] + +# Environment config values +# The high value for the observation space +observation_space_high_value: 1000000000 + +# Reward values +# Generic +all_ok: 0 +# Node Operating State +off_should_be_on: -10 +off_should_be_resetting: -5 +on_should_be_off: -2 +on_should_be_resetting: -5 +resetting_should_be_on: -5 +resetting_should_be_off: -2 +resetting: -3 +# Node O/S or Service State +good_should_be_patching: 2 +good_should_be_compromised: 5 +good_should_be_overwhelmed: 5 +patching_should_be_good: -5 +patching_should_be_compromised: 2 +patching_should_be_overwhelmed: 2 +patching: -3 +compromised_should_be_good: -20 +compromised_should_be_patching: -20 +compromised_should_be_overwhelmed: -20 +compromised: -20 +overwhelmed_should_be_good: -20 +overwhelmed_should_be_patching: -20 +overwhelmed_should_be_compromised: -20 +overwhelmed: -20 +# Node File System State +good_should_be_repairing: 2 +good_should_be_restoring: 2 +good_should_be_corrupt: 5 +good_should_be_destroyed: 10 +repairing_should_be_good: -5 +repairing_should_be_restoring: 2 +repairing_should_be_corrupt: 2 +repairing_should_be_destroyed: 0 +repairing: -3 +restoring_should_be_good: -10 +restoring_should_be_repairing: -2 +restoring_should_be_corrupt: 1 +restoring_should_be_destroyed: 2 +restoring: -6 +corrupt_should_be_good: -10 +corrupt_should_be_repairing: -10 +corrupt_should_be_restoring: -10 +corrupt_should_be_destroyed: 2 +corrupt: -10 +destroyed_should_be_good: -20 +destroyed_should_be_repairing: -20 +destroyed_should_be_restoring: -20 +destroyed_should_be_corrupt: -20 +destroyed: -20 +scanning: -2 +# IER status +red_ier_running: -5 +green_ier_blocked: -10 + +# Patching / Reset durations +os_patching_duration: 5 # The time taken to patch the OS +node_reset_duration: 5 # The time taken to reset a node (hardware) +service_patching_duration: 5 # The time taken to patch a service +file_system_repairing_limit: 5 # The time take to repair the file system +file_system_restoring_limit: 5 # The time take to restore the file system +file_system_scanning_limit: 5 # The time taken to scan the file system + +# deterministic +deterministic: False +seed: 1 diff --git a/tests/config/e2e/deterministic_test_outputs/deterministic_a2c.csv b/tests/config/e2e/deterministic_test_outputs/deterministic_a2c.csv new file mode 100644 index 00000000..8f1a8912 --- /dev/null +++ b/tests/config/e2e/deterministic_test_outputs/deterministic_a2c.csv @@ -0,0 +1,61 @@ +Timestamp,Episode,Step,Reward,AS_0,OSI_0_0,OSI_0_1,OSI_0_2,OSI_0_3,OSI_0_4,OSI_0_5,OSI_0_6,OSI_1_0,OSI_1_1,OSI_1_2,OSI_1_3,OSI_1_4,OSI_1_5,OSI_1_6,OSI_2_0,OSI_2_1,OSI_2_2,OSI_2_3,OSI_2_4,OSI_2_5,OSI_2_6,OSI_3_0,OSI_3_1,OSI_3_2,OSI_3_3,OSI_3_4,OSI_3_5,OSI_3_6,OSI_4_0,OSI_4_1,OSI_4_2,OSI_4_3,OSI_4_4,OSI_4_5,OSI_4_6,OSI_5_0,OSI_5_1,OSI_5_2,OSI_5_3,OSI_5_4,OSI_5_5,OSI_5_6,OSI_6_0,OSI_6_1,OSI_6_2,OSI_6_3,OSI_6_4,OSI_6_5,OSI_6_6,OSI_7_0,OSI_7_1,OSI_7_2,OSI_7_3,OSI_7_4,OSI_7_5,OSI_7_6,OSI_8_0,OSI_8_1,OSI_8_2,OSI_8_3,OSI_8_4,OSI_8_5,OSI_8_6,OSI_9_0,OSI_9_1,OSI_9_2,OSI_9_3,OSI_9_4,OSI_9_5,OSI_9_6,OSI_10_0,OSI_10_1,OSI_10_2,OSI_10_3,OSI_10_4,OSI_10_5,OSI_10_6,OSI_11_0,OSI_11_1,OSI_11_2,OSI_11_3,OSI_11_4,OSI_11_5,OSI_11_6,OSI_12_0,OSI_12_1,OSI_12_2,OSI_12_3,OSI_12_4,OSI_12_5,OSI_12_6,OSI_13_0,OSI_13_1,OSI_13_2,OSI_13_3,OSI_13_4,OSI_13_5,OSI_13_6,OSI_14_0,OSI_14_1,OSI_14_2,OSI_14_3,OSI_14_4,OSI_14_5,OSI_14_6,OSI_15_0,OSI_15_1,OSI_15_2,OSI_15_3,OSI_15_4,OSI_15_5,OSI_15_6,OSI_16_0,OSI_16_1,OSI_16_2,OSI_16_3,OSI_16_4,OSI_16_5,OSI_16_6,OSI_17_0,OSI_17_1,OSI_17_2,OSI_17_3,OSI_17_4,OSI_17_5,OSI_17_6,OSN_0_0,OSN_0_1,OSN_0_2,OSN_0_3,OSN_0_4,OSN_0_5,OSN_0_6,OSN_1_0,OSN_1_1,OSN_1_2,OSN_1_3,OSN_1_4,OSN_1_5,OSN_1_6,OSN_2_0,OSN_2_1,OSN_2_2,OSN_2_3,OSN_2_4,OSN_2_5,OSN_2_6,OSN_3_0,OSN_3_1,OSN_3_2,OSN_3_3,OSN_3_4,OSN_3_5,OSN_3_6,OSN_4_0,OSN_4_1,OSN_4_2,OSN_4_3,OSN_4_4,OSN_4_5,OSN_4_6,OSN_5_0,OSN_5_1,OSN_5_2,OSN_5_3,OSN_5_4,OSN_5_5,OSN_5_6,OSN_6_0,OSN_6_1,OSN_6_2,OSN_6_3,OSN_6_4,OSN_6_5,OSN_6_6,OSN_7_0,OSN_7_1,OSN_7_2,OSN_7_3,OSN_7_4,OSN_7_5,OSN_7_6,OSN_8_0,OSN_8_1,OSN_8_2,OSN_8_3,OSN_8_4,OSN_8_5,OSN_8_6,OSN_9_0,OSN_9_1,OSN_9_2,OSN_9_3,OSN_9_4,OSN_9_5,OSN_9_6,OSN_10_0,OSN_10_1,OSN_10_2,OSN_10_3,OSN_10_4,OSN_10_5,OSN_10_6,OSN_11_0,OSN_11_1,OSN_11_2,OSN_11_3,OSN_11_4,OSN_11_5,OSN_11_6,OSN_12_0,OSN_12_1,OSN_12_2,OSN_12_3,OSN_12_4,OSN_12_5,OSN_12_6,OSN_13_0,OSN_13_1,OSN_13_2,OSN_13_3,OSN_13_4,OSN_13_5,OSN_13_6,OSN_14_0,OSN_14_1,OSN_14_2,OSN_14_3,OSN_14_4,OSN_14_5,OSN_14_6,OSN_15_0,OSN_15_1,OSN_15_2,OSN_15_3,OSN_15_4,OSN_15_5,OSN_15_6,OSN_16_0,OSN_16_1,OSN_16_2,OSN_16_3,OSN_16_4,OSN_16_5,OSN_16_6,OSN_17_0,OSN_17_1,OSN_17_2,OSN_17_3,OSN_17_4,OSN_17_5,OSN_17_6 +2023-06-20 10:34:31.092446,1,1,0,204,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,0,0,0,11,0,0,0,0,0,0,12,0,0,0,0,0,0,13,0,0,0,0,0,0,14,0,0,0,0,0,0,15,0,0,0,0,0,0,16,0,0,0,0,0,0,17,0,0,0,0,0,0,18,0,0,0,0,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.113447,1,2,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.144446,1,3,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.173448,1,4,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.201447,1,5,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.219447,1,6,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.247447,1,7,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.264447,1,8,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.284447,1,9,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.304447,1,10,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.320447,1,11,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.345450,1,12,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.362448,1,13,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.378449,1,14,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.397451,1,15,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.414448,1,16,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.430452,1,17,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.453449,1,18,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.470451,1,19,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.488450,1,20,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.504450,2,1,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.521451,2,2,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.545452,2,3,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.568453,2,4,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.587451,2,5,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.603453,2,6,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.619454,2,7,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.638454,2,8,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.658452,2,9,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.681452,2,10,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.698454,2,11,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.726452,2,12,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.741451,2,13,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.769455,2,14,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.787452,2,15,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.817452,2,16,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.841454,2,17,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.862454,2,18,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.880454,2,19,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.898459,2,20,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.918455,3,1,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.941453,3,2,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.964454,3,3,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:31.982456,3,4,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:32.005454,3,5,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:32.036456,3,6,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:32.061459,3,7,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:32.078456,3,8,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:32.096459,3,9,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:32.122458,3,10,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:32.146459,3,11,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:32.175456,3,12,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:32.198466,3,13,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:32.217456,3,14,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:32.235457,3,15,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:32.258458,3,16,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:32.280457,3,17,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:32.297457,3,18,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:32.318459,3,19,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:34:32.345468,3,20,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 diff --git a/tests/config/e2e/deterministic_test_outputs/deterministic_generic.csv b/tests/config/e2e/deterministic_test_outputs/deterministic_generic.csv new file mode 100644 index 00000000..4498ecdf --- /dev/null +++ b/tests/config/e2e/deterministic_test_outputs/deterministic_generic.csv @@ -0,0 +1,4 @@ +Episode,Average Reward +0,0 +1,-10.5 +2,-1.0 diff --git a/tests/config/e2e/deterministic_test_outputs/deterministic_ppo.csv b/tests/config/e2e/deterministic_test_outputs/deterministic_ppo.csv new file mode 100644 index 00000000..61d7d35a --- /dev/null +++ b/tests/config/e2e/deterministic_test_outputs/deterministic_ppo.csv @@ -0,0 +1,61 @@ +Timestamp,Episode,Step,Reward,AS_0,OSI_0_0,OSI_0_1,OSI_0_2,OSI_0_3,OSI_0_4,OSI_0_5,OSI_0_6,OSI_1_0,OSI_1_1,OSI_1_2,OSI_1_3,OSI_1_4,OSI_1_5,OSI_1_6,OSI_2_0,OSI_2_1,OSI_2_2,OSI_2_3,OSI_2_4,OSI_2_5,OSI_2_6,OSI_3_0,OSI_3_1,OSI_3_2,OSI_3_3,OSI_3_4,OSI_3_5,OSI_3_6,OSI_4_0,OSI_4_1,OSI_4_2,OSI_4_3,OSI_4_4,OSI_4_5,OSI_4_6,OSI_5_0,OSI_5_1,OSI_5_2,OSI_5_3,OSI_5_4,OSI_5_5,OSI_5_6,OSI_6_0,OSI_6_1,OSI_6_2,OSI_6_3,OSI_6_4,OSI_6_5,OSI_6_6,OSI_7_0,OSI_7_1,OSI_7_2,OSI_7_3,OSI_7_4,OSI_7_5,OSI_7_6,OSI_8_0,OSI_8_1,OSI_8_2,OSI_8_3,OSI_8_4,OSI_8_5,OSI_8_6,OSI_9_0,OSI_9_1,OSI_9_2,OSI_9_3,OSI_9_4,OSI_9_5,OSI_9_6,OSI_10_0,OSI_10_1,OSI_10_2,OSI_10_3,OSI_10_4,OSI_10_5,OSI_10_6,OSI_11_0,OSI_11_1,OSI_11_2,OSI_11_3,OSI_11_4,OSI_11_5,OSI_11_6,OSI_12_0,OSI_12_1,OSI_12_2,OSI_12_3,OSI_12_4,OSI_12_5,OSI_12_6,OSI_13_0,OSI_13_1,OSI_13_2,OSI_13_3,OSI_13_4,OSI_13_5,OSI_13_6,OSI_14_0,OSI_14_1,OSI_14_2,OSI_14_3,OSI_14_4,OSI_14_5,OSI_14_6,OSI_15_0,OSI_15_1,OSI_15_2,OSI_15_3,OSI_15_4,OSI_15_5,OSI_15_6,OSI_16_0,OSI_16_1,OSI_16_2,OSI_16_3,OSI_16_4,OSI_16_5,OSI_16_6,OSI_17_0,OSI_17_1,OSI_17_2,OSI_17_3,OSI_17_4,OSI_17_5,OSI_17_6,OSN_0_0,OSN_0_1,OSN_0_2,OSN_0_3,OSN_0_4,OSN_0_5,OSN_0_6,OSN_1_0,OSN_1_1,OSN_1_2,OSN_1_3,OSN_1_4,OSN_1_5,OSN_1_6,OSN_2_0,OSN_2_1,OSN_2_2,OSN_2_3,OSN_2_4,OSN_2_5,OSN_2_6,OSN_3_0,OSN_3_1,OSN_3_2,OSN_3_3,OSN_3_4,OSN_3_5,OSN_3_6,OSN_4_0,OSN_4_1,OSN_4_2,OSN_4_3,OSN_4_4,OSN_4_5,OSN_4_6,OSN_5_0,OSN_5_1,OSN_5_2,OSN_5_3,OSN_5_4,OSN_5_5,OSN_5_6,OSN_6_0,OSN_6_1,OSN_6_2,OSN_6_3,OSN_6_4,OSN_6_5,OSN_6_6,OSN_7_0,OSN_7_1,OSN_7_2,OSN_7_3,OSN_7_4,OSN_7_5,OSN_7_6,OSN_8_0,OSN_8_1,OSN_8_2,OSN_8_3,OSN_8_4,OSN_8_5,OSN_8_6,OSN_9_0,OSN_9_1,OSN_9_2,OSN_9_3,OSN_9_4,OSN_9_5,OSN_9_6,OSN_10_0,OSN_10_1,OSN_10_2,OSN_10_3,OSN_10_4,OSN_10_5,OSN_10_6,OSN_11_0,OSN_11_1,OSN_11_2,OSN_11_3,OSN_11_4,OSN_11_5,OSN_11_6,OSN_12_0,OSN_12_1,OSN_12_2,OSN_12_3,OSN_12_4,OSN_12_5,OSN_12_6,OSN_13_0,OSN_13_1,OSN_13_2,OSN_13_3,OSN_13_4,OSN_13_5,OSN_13_6,OSN_14_0,OSN_14_1,OSN_14_2,OSN_14_3,OSN_14_4,OSN_14_5,OSN_14_6,OSN_15_0,OSN_15_1,OSN_15_2,OSN_15_3,OSN_15_4,OSN_15_5,OSN_15_6,OSN_16_0,OSN_16_1,OSN_16_2,OSN_16_3,OSN_16_4,OSN_16_5,OSN_16_6,OSN_17_0,OSN_17_1,OSN_17_2,OSN_17_3,OSN_17_4,OSN_17_5,OSN_17_6 +2023-06-20 10:31:20.769116,1,1,0,1084,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,0,0,0,11,0,0,0,0,0,0,12,0,0,0,0,0,0,13,0,0,0,0,0,0,14,0,0,0,0,0,0,15,0,0,0,0,0,0,16,0,0,0,0,0,0,17,0,0,0,0,0,0,18,0,0,0,0,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.772116,1,2,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.775116,1,3,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.778116,1,4,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.781116,1,5,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.785116,1,6,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.788116,1,7,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.791116,1,8,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.794116,1,9,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.797116,1,10,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.803115,1,11,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.809116,1,12,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.814117,1,13,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.817117,1,14,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.820117,1,15,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.823117,1,16,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.827117,1,17,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.830117,1,18,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.833119,1,19,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.837117,1,20,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.840117,2,1,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.843117,2,2,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.847116,2,3,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.850116,2,4,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.854116,2,5,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.857117,2,6,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.860116,2,7,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.863117,2,8,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.866117,2,9,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.870118,2,10,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.874117,2,11,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.877119,2,12,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.881117,2,13,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.884121,2,14,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.887119,2,15,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.891119,2,16,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.894117,2,17,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.898118,2,18,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.901118,2,19,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.904117,2,20,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.908117,3,1,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.911117,3,2,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.915117,3,3,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.918117,3,4,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.921117,3,5,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.927117,3,6,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.933118,3,7,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.938118,3,8,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.942118,3,9,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.947120,3,10,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.952118,3,11,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.956118,3,12,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.960118,3,13,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.964118,3,14,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.967118,3,15,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.971118,3,16,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.975118,3,17,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.978118,3,18,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.981118,3,19,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 +2023-06-20 10:31:20.987118,3,20,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 diff --git a/tests/config/e2e/generic_deterministic_seeded_training_config.yaml b/tests/config/e2e/generic_deterministic_seeded_training_config.yaml new file mode 100644 index 00000000..5c5426d3 --- /dev/null +++ b/tests/config/e2e/generic_deterministic_seeded_training_config.yaml @@ -0,0 +1,98 @@ +# Main Config File + +# Generic config values +# Choose one of these (dependent on Agent being trained) +# "STABLE_BASELINES3_PPO" +# "STABLE_BASELINES3_A2C" +# "GENERIC" +agent_identifier: GENERIC +# Sets How the Action Space is defined: +# "NODE" +# "ACL" +# "ANY" node and acl actions +action_type: ANY +# Number of episodes to run per session +num_episodes: 3 +# Number of time_steps per episode +num_steps: 20 +# Time delay between steps (for generic agents) +time_delay: 1 +# Type of session to be run (TRAINING or EVALUATION) +session_type: TRAINING +# Determine whether to load an agent from file +load_agent: False +# File path and file name of agent if you're loading one in +agent_load_file: C:\[Path]\[agent_saved_filename.zip] + +# Environment config values +# The high value for the observation space +observation_space_high_value: 1000000000 + +# Reward values +# Generic +all_ok: 0 +# Node Operating State +off_should_be_on: -10 +off_should_be_resetting: -5 +on_should_be_off: -2 +on_should_be_resetting: -5 +resetting_should_be_on: -5 +resetting_should_be_off: -2 +resetting: -3 +# Node O/S or Service State +good_should_be_patching: 2 +good_should_be_compromised: 5 +good_should_be_overwhelmed: 5 +patching_should_be_good: -5 +patching_should_be_compromised: 2 +patching_should_be_overwhelmed: 2 +patching: -3 +compromised_should_be_good: -20 +compromised_should_be_patching: -20 +compromised_should_be_overwhelmed: -20 +compromised: -20 +overwhelmed_should_be_good: -20 +overwhelmed_should_be_patching: -20 +overwhelmed_should_be_compromised: -20 +overwhelmed: -20 +# Node File System State +good_should_be_repairing: 2 +good_should_be_restoring: 2 +good_should_be_corrupt: 5 +good_should_be_destroyed: 10 +repairing_should_be_good: -5 +repairing_should_be_restoring: 2 +repairing_should_be_corrupt: 2 +repairing_should_be_destroyed: 0 +repairing: -3 +restoring_should_be_good: -10 +restoring_should_be_repairing: -2 +restoring_should_be_corrupt: 1 +restoring_should_be_destroyed: 2 +restoring: -6 +corrupt_should_be_good: -10 +corrupt_should_be_repairing: -10 +corrupt_should_be_restoring: -10 +corrupt_should_be_destroyed: 2 +corrupt: -10 +destroyed_should_be_good: -20 +destroyed_should_be_repairing: -20 +destroyed_should_be_restoring: -20 +destroyed_should_be_corrupt: -20 +destroyed: -20 +scanning: -2 +# IER status +red_ier_running: -5 +green_ier_blocked: -10 + +# Patching / Reset durations +os_patching_duration: 5 # The time taken to patch the OS +node_reset_duration: 5 # The time taken to reset a node (hardware) +service_patching_duration: 5 # The time taken to patch a service +file_system_repairing_limit: 5 # The time take to repair the file system +file_system_restoring_limit: 5 # The time take to restore the file system +file_system_scanning_limit: 5 # The time taken to scan the file system + +# deterministic +deterministic: False +seed: 1 diff --git a/tests/config/e2e/ppo_deterministic_seeded_training_config.yaml b/tests/config/e2e/ppo_deterministic_seeded_training_config.yaml new file mode 100644 index 00000000..4dbf7cef --- /dev/null +++ b/tests/config/e2e/ppo_deterministic_seeded_training_config.yaml @@ -0,0 +1,98 @@ +# Main Config File + +# Generic config values +# Choose one of these (dependent on Agent being trained) +# "STABLE_BASELINES3_PPO" +# "STABLE_BASELINES3_A2C" +# "GENERIC" +agent_identifier: STABLE_BASELINES3_PPO +# Sets How the Action Space is defined: +# "NODE" +# "ACL" +# "ANY" node and acl actions +action_type: ANY +# Number of episodes to run per session +num_episodes: 3 +# Number of time_steps per episode +num_steps: 20 +# Time delay between steps (for generic agents) +time_delay: 1 +# Type of session to be run (TRAINING or EVALUATION) +session_type: TRAINING +# Determine whether to load an agent from file +load_agent: False +# File path and file name of agent if you're loading one in +agent_load_file: C:\[Path]\[agent_saved_filename.zip] + +# Environment config values +# The high value for the observation space +observation_space_high_value: 1000000000 + +# Reward values +# Generic +all_ok: 0 +# Node Operating State +off_should_be_on: -10 +off_should_be_resetting: -5 +on_should_be_off: -2 +on_should_be_resetting: -5 +resetting_should_be_on: -5 +resetting_should_be_off: -2 +resetting: -3 +# Node O/S or Service State +good_should_be_patching: 2 +good_should_be_compromised: 5 +good_should_be_overwhelmed: 5 +patching_should_be_good: -5 +patching_should_be_compromised: 2 +patching_should_be_overwhelmed: 2 +patching: -3 +compromised_should_be_good: -20 +compromised_should_be_patching: -20 +compromised_should_be_overwhelmed: -20 +compromised: -20 +overwhelmed_should_be_good: -20 +overwhelmed_should_be_patching: -20 +overwhelmed_should_be_compromised: -20 +overwhelmed: -20 +# Node File System State +good_should_be_repairing: 2 +good_should_be_restoring: 2 +good_should_be_corrupt: 5 +good_should_be_destroyed: 10 +repairing_should_be_good: -5 +repairing_should_be_restoring: 2 +repairing_should_be_corrupt: 2 +repairing_should_be_destroyed: 0 +repairing: -3 +restoring_should_be_good: -10 +restoring_should_be_repairing: -2 +restoring_should_be_corrupt: 1 +restoring_should_be_destroyed: 2 +restoring: -6 +corrupt_should_be_good: -10 +corrupt_should_be_repairing: -10 +corrupt_should_be_restoring: -10 +corrupt_should_be_destroyed: 2 +corrupt: -10 +destroyed_should_be_good: -20 +destroyed_should_be_repairing: -20 +destroyed_should_be_restoring: -20 +destroyed_should_be_corrupt: -20 +destroyed: -20 +scanning: -2 +# IER status +red_ier_running: -5 +green_ier_blocked: -10 + +# Patching / Reset durations +os_patching_duration: 5 # The time taken to patch the OS +node_reset_duration: 5 # The time taken to reset a node (hardware) +service_patching_duration: 5 # The time taken to patch a service +file_system_repairing_limit: 5 # The time take to repair the file system +file_system_restoring_limit: 5 # The time take to restore the file system +file_system_scanning_limit: 5 # The time taken to scan the file system + +# deterministic +deterministic: False +seed: 1 diff --git a/tests/conftest.py b/tests/conftest.py index f1411ba9..7d552d7c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -3,9 +3,12 @@ import tempfile import time from datetime import datetime from pathlib import Path -from typing import Union +from typing import Union, Final + +import pandas as pd from primaite.environment.primaite_env import Primaite +from primaite.main import _get_session_path, _write_session_metadata_file ACTION_SPACE_NODE_VALUES = 1 ACTION_SPACE_NODE_ACTION_VALUES = 1 @@ -27,7 +30,7 @@ def _get_temp_session_path(session_timestamp: datetime) -> Path: def _get_primaite_env_from_config( - training_config_path: Union[str, Path], lay_down_config_path: Union[str, Path] + training_config_path: Union[str, Path], lay_down_config_path: Union[str, Path] ): """Takes a config path and returns the created instance of Primaite.""" session_timestamp: datetime = datetime.now() @@ -78,3 +81,64 @@ def run_generic(env, config_values): # env.reset() # env.close() + + +def compare_file_content(output_a_file_path: str, output_b_file_path: str): + """Function used to check if output of both given files are the same""" + with open(output_a_file_path) as f1: + with open(output_b_file_path) as f2: + f1_content = f1.read() + f2_content = f2.read() + + # check that both files are not empty and are matching + if len(f1_content) > 0 and len(f2_content) > 0 and f1_content == f2_content: + # both files have the same content + return True + # both files have different content + print(f"{output_a_file_path} and {output_b_file_path} has different contents") + + return False + + +def compare_transaction_file(output_a_file_path: str, output_b_file_path: str): + """Function used to check if contents of transaction files are the same""" + # load output a file + data_a = pd.read_csv(output_a_file_path) + + # load output b file + data_b = pd.read_csv(output_b_file_path) + + # remove the time stamp column + data_a.drop('Timestamp', inplace=True, axis=1) + data_b.drop('Timestamp', inplace=True, axis=1) + + # if the comparison is empty, both files are the same i.e. True + return data_a.compare(data_b).empty + + +class TestSession: + def __init__( + self, + training_config_path, + laydown_config_path + ): + self.session_timestamp: Final[datetime] = datetime.now() + self.session_dir = _get_session_path(self.session_timestamp) + self.timestamp_str = self.session_timestamp.strftime("%Y-%m-%d_%H-%M-%S") + self.transaction_list = [] + + print(f"The output directory for this session is: {self.session_dir}") + + self.env = Primaite( + training_config_path=training_config_path, + lay_down_config_path=laydown_config_path, + transaction_list=self.transaction_list, + session_path=self.session_dir, + timestamp_str=self.timestamp_str, + ) + + print("Writing Session Metadata file...") + + _write_session_metadata_file( + session_dir=self.session_dir, uuid="test", session_timestamp=self.session_timestamp, env=self.env + ) diff --git a/tests/e2e_integration_tests/test_session_repeatability.py b/tests/e2e_integration_tests/test_session_repeatability.py new file mode 100644 index 00000000..587b8501 --- /dev/null +++ b/tests/e2e_integration_tests/test_session_repeatability.py @@ -0,0 +1,359 @@ +import time + +from primaite import getLogger +from primaite.config.lay_down_config import data_manipulation_config_path +from primaite.main import run_stable_baselines3_a2c, \ + run_stable_baselines3_ppo, run_generic, _update_session_metadata_file, _get_session_path +from primaite.transactions.transactions_to_file import write_transaction_to_file +from tests import TEST_CONFIG_ROOT +from tests.conftest import TestSession, compare_file_content, compare_transaction_file + +_LOGGER = getLogger(__name__) + + +def test_generic_same_results(): + """Runs seeded and deterministic Generic Primaite sessions and checks that the results are the same""" + print("") + print("=======================") + print("Generic test run") + print("=======================") + print("") + + + # run session 1 + session1 = TestSession( + TEST_CONFIG_ROOT / "e2e/generic_deterministic_seeded_training_config.yaml", + data_manipulation_config_path() + ) + + config_values = session1.env.training_config + + # Get the number of steps (which is stored in the child config file) + config_values.num_steps = session1.env.episode_steps + + run_generic( + env=session1.env, + config_values=session1.env.training_config + ) + + _update_session_metadata_file(session_dir=session1.session_dir, env=session1.env) + + # run session 2 + session2 = TestSession( + TEST_CONFIG_ROOT / "e2e/generic_deterministic_seeded_training_config.yaml", + data_manipulation_config_path() + ) + + config_values = session2.env.training_config + + # Get the number of steps (which is stored in the child config file) + config_values.num_steps = session2.env.episode_steps + + run_generic( + env=session2.env, + config_values=session2.env.training_config + ) + + _update_session_metadata_file(session_dir=session2.session_dir, env=session2.env) + + # wait until the csv files have been closed + while (not session1.env.csv_file.closed) or (not session2.env.csv_file.closed): + time.sleep(1) + + # check if both outputs are the same + assert compare_file_content( + session1.env.csv_file.name, + session2.env.csv_file.name, + ) is True + + # deterministic run + deterministic = TestSession( + TEST_CONFIG_ROOT / "e2e/generic_deterministic_seeded_training_config.yaml", + data_manipulation_config_path() + ) + + deterministic.env.training_config.deterministic = True + + run_generic( + env=deterministic.env, + config_values=deterministic.env.training_config + ) + + _update_session_metadata_file(session_dir=deterministic.session_dir, env=deterministic.env) + + # check if both outputs are the same + assert compare_file_content( + deterministic.env.csv_file.name, + TEST_CONFIG_ROOT / "e2e/deterministic_test_outputs/deterministic_generic.csv", + ) is True + + +def test_ppo_same_results(): + """Runs seeded and deterministic PPO Primaite sessions and checks that the results are the same""" + + print("") + print("=======================") + print("PPO test run") + print("=======================") + print("") + + training_session = TestSession( + TEST_CONFIG_ROOT / "e2e/ppo_deterministic_seeded_training_config.yaml", + data_manipulation_config_path() + ) + + # Train agent + training_session.env.training_config.session_type = "TRAINING" + + config_values = training_session.env.training_config + + # Get the number of steps (which is stored in the child config file) + config_values.num_steps = training_session.env.episode_steps + + run_stable_baselines3_ppo( + env=training_session.env, + config_values=config_values, + session_path=training_session.session_dir, + timestamp_str=training_session.timestamp_str, + ) + + write_transaction_to_file( + transaction_list=training_session.transaction_list, + session_path=training_session.session_dir, + timestamp_str=training_session.timestamp_str, + ) + + _update_session_metadata_file(session_dir=training_session.session_dir, env=training_session.env) + + # Evaluate Agent again + eval_session1 = TestSession( + TEST_CONFIG_ROOT / "e2e/ppo_deterministic_seeded_training_config.yaml", + data_manipulation_config_path() + ) + + # Get the number of steps (which is stored in the child config file) + config_values.num_steps = eval_session1.env.episode_steps + eval_session1.env.training_config.session_type = "EVALUATE" + + # load the agent that was trained previously + eval_session1.env.training_config.load_agent = True + eval_session1.env.training_config.agent_load_file = _get_session_path(training_session.session_timestamp) / f"agent_saved_{training_session.timestamp_str}.zip" + + config_values = eval_session1.env.training_config + + run_stable_baselines3_ppo( + env=eval_session1.env, + config_values=config_values, + session_path=eval_session1.session_dir, + timestamp_str=eval_session1.timestamp_str, + ) + + write_transaction_to_file( + transaction_list=eval_session1.transaction_list, + session_path=eval_session1.session_dir, + timestamp_str=eval_session1.timestamp_str, + ) + + _update_session_metadata_file(session_dir=eval_session1.session_dir, env=eval_session1.env) + + eval_session2 = TestSession( + TEST_CONFIG_ROOT / "e2e/ppo_deterministic_seeded_training_config.yaml", + data_manipulation_config_path() + ) + + # Get the number of steps (which is stored in the child config file) + config_values.num_steps = eval_session2.env.episode_steps + eval_session2.env.training_config.session_type = "EVALUATE" + + # load the agent that was trained previously + eval_session2.env.training_config.load_agent = True + eval_session2.env.training_config.agent_load_file = _get_session_path( + training_session.session_timestamp) / f"agent_saved_{training_session.timestamp_str}.zip" + + config_values = eval_session2.env.training_config + + run_stable_baselines3_ppo( + env=eval_session2.env, + config_values=config_values, + session_path=eval_session2.session_dir, + timestamp_str=eval_session2.timestamp_str, + ) + + write_transaction_to_file( + transaction_list=eval_session2.transaction_list, + session_path=eval_session2.session_dir, + timestamp_str=eval_session2.timestamp_str, + ) + + _update_session_metadata_file(session_dir=eval_session2.session_dir, env=eval_session2.env) + + # check if both eval outputs are the same + assert compare_transaction_file( + eval_session1.session_dir / f"all_transactions_{eval_session1.timestamp_str}.csv", + eval_session2.session_dir / f"all_transactions_{eval_session2.timestamp_str}.csv", + ) is True + + # deterministic run + deterministic = TestSession( + TEST_CONFIG_ROOT / "e2e/ppo_deterministic_seeded_training_config.yaml", + data_manipulation_config_path() + ) + + deterministic.env.training_config.deterministic = True + + run_stable_baselines3_ppo( + env=deterministic.env, + config_values=config_values, + session_path=deterministic.session_dir, + timestamp_str=deterministic.timestamp_str, + ) + + write_transaction_to_file( + transaction_list=deterministic.transaction_list, + session_path=deterministic.session_dir, + timestamp_str=deterministic.timestamp_str, + ) + + _update_session_metadata_file(session_dir=deterministic.session_dir, env=deterministic.env) + + # check if both outputs are the same + assert compare_transaction_file( + deterministic.session_dir / f"all_transactions_{deterministic.timestamp_str}.csv", + TEST_CONFIG_ROOT / "e2e/deterministic_test_outputs/deterministic_ppo.csv", + ) is True + + +def test_a2c_same_results(): + """Runs seeded and deterministic A2C Primaite sessions and checks that the results are the same""" + + print("") + print("=======================") + print("A2C test run") + print("=======================") + print("") + + training_session = TestSession( + TEST_CONFIG_ROOT / "e2e/a2c_deterministic_seeded_training_config.yaml", + data_manipulation_config_path() + ) + + # Train agent + training_session.env.training_config.session_type = "TRAINING" + + config_values = training_session.env.training_config + + # Get the number of steps (which is stored in the child config file) + config_values.num_steps = training_session.env.episode_steps + + run_stable_baselines3_a2c( + env=training_session.env, + config_values=config_values, + session_path=training_session.session_dir, + timestamp_str=training_session.timestamp_str, + ) + + write_transaction_to_file( + transaction_list=training_session.transaction_list, + session_path=training_session.session_dir, + timestamp_str=training_session.timestamp_str, + ) + + _update_session_metadata_file(session_dir=training_session.session_dir, env=training_session.env) + + # Evaluate Agent again + eval_session1 = TestSession( + TEST_CONFIG_ROOT / "e2e/a2c_deterministic_seeded_training_config.yaml", + data_manipulation_config_path() + ) + + # Get the number of steps (which is stored in the child config file) + config_values.num_steps = eval_session1.env.episode_steps + eval_session1.env.training_config.session_type = "EVALUATE" + + # load the agent that was trained previously + eval_session1.env.training_config.load_agent = True + eval_session1.env.training_config.agent_load_file = _get_session_path( + training_session.session_timestamp) / f"agent_saved_{training_session.timestamp_str}.zip" + + config_values = eval_session1.env.training_config + + run_stable_baselines3_a2c( + env=eval_session1.env, + config_values=config_values, + session_path=eval_session1.session_dir, + timestamp_str=eval_session1.timestamp_str, + ) + + write_transaction_to_file( + transaction_list=eval_session1.transaction_list, + session_path=eval_session1.session_dir, + timestamp_str=eval_session1.timestamp_str, + ) + + _update_session_metadata_file(session_dir=eval_session1.session_dir, env=eval_session1.env) + + eval_session2 = TestSession( + TEST_CONFIG_ROOT / "e2e/a2c_deterministic_seeded_training_config.yaml", + data_manipulation_config_path() + ) + + # Get the number of steps (which is stored in the child config file) + config_values.num_steps = eval_session2.env.episode_steps + eval_session2.env.training_config.session_type = "EVALUATE" + + # load the agent that was trained previously + eval_session2.env.training_config.load_agent = True + eval_session2.env.training_config.agent_load_file = _get_session_path( + training_session.session_timestamp) / f"agent_saved_{training_session.timestamp_str}.zip" + + config_values = eval_session2.env.training_config + + run_stable_baselines3_a2c( + env=eval_session2.env, + config_values=config_values, + session_path=eval_session2.session_dir, + timestamp_str=eval_session2.timestamp_str, + ) + + write_transaction_to_file( + transaction_list=eval_session2.transaction_list, + session_path=eval_session2.session_dir, + timestamp_str=eval_session2.timestamp_str, + ) + + _update_session_metadata_file(session_dir=eval_session2.session_dir, env=eval_session2.env) + + # check if both eval outputs are the same + assert compare_transaction_file( + eval_session1.session_dir / f"all_transactions_{eval_session1.timestamp_str}.csv", + eval_session2.session_dir / f"all_transactions_{eval_session2.timestamp_str}.csv", + ) is True + + # deterministic run + deterministic = TestSession( + TEST_CONFIG_ROOT / "e2e/a2c_deterministic_seeded_training_config.yaml", + data_manipulation_config_path() + ) + + deterministic.env.training_config.deterministic = True + + run_stable_baselines3_a2c( + env=deterministic.env, + config_values=config_values, + session_path=deterministic.session_dir, + timestamp_str=deterministic.timestamp_str, + ) + + write_transaction_to_file( + transaction_list=deterministic.transaction_list, + session_path=deterministic.session_dir, + timestamp_str=deterministic.timestamp_str, + ) + + _update_session_metadata_file(session_dir=deterministic.session_dir, env=deterministic.env) + + # check if both outputs are the same + assert compare_transaction_file( + deterministic.session_dir / f"all_transactions_{deterministic.timestamp_str}.csv", + TEST_CONFIG_ROOT / "e2e/deterministic_test_outputs/deterministic_a2c.csv", + ) is True From db67a829d5e47f3429130c3dc281c5782017afa4 Mon Sep 17 00:00:00 2001 From: Czar Echavez Date: Tue, 20 Jun 2023 11:19:05 +0100 Subject: [PATCH 02/17] #1386: added documentation + dealing with pre-commit checks --- .gitignore | 2 +- README.md | 62 ++++++ docs/source/config.rst | 8 + docs/source/primaite-dependencies.rst | 2 +- src/primaite/__init__.py | 2 +- src/primaite/cli.py | 5 +- src/primaite/config/training_config.py | 14 +- src/primaite/environment/primaite_env.py | 39 ++-- src/primaite/main.py | 27 ++- src/primaite/nodes/node.py | 5 +- src/primaite/nodes/service_node.py | 4 +- src/primaite/notebooks/__init__.py | 1 - tests/conftest.py | 29 +-- .../test_session_repeatability.py | 187 +++++++++++------- tests/test_observation_space.py | 9 +- tests/test_resetting_node.py | 98 +++++---- tests/test_single_action_space.py | 9 +- 17 files changed, 311 insertions(+), 192 deletions(-) diff --git a/.gitignore b/.gitignore index 260a980b..4bb700b2 100644 --- a/.gitignore +++ b/.gitignore @@ -142,4 +142,4 @@ cython_debug/ .idea/ # outputs -src/primaite/outputs/ \ No newline at end of file +src/primaite/outputs/ diff --git a/README.md b/README.md index 78f36fba..7782e8a9 100644 --- a/README.md +++ b/README.md @@ -1 +1,63 @@ # PrimAITE + +## Getting Started with PrimAITE + +### Pre-Requisites + +In order to get **PrimAITE** installed, you will need to have the following installed: + +- `python3.8+` +- `python3-pip` +- `virtualenv` + +**PrimAITE** is designed to be OS-agnostic, and thus should work on most variations/distros of Linux, Windows, and MacOS. + +### Installation from source +#### 1. Navigate to the PrimAITE folder and create a new python virtual environment (venv) + +```unix +python3 -m venv +``` + +#### 2. Activate the venv + +##### Unix +```bash +source /bin/activate +``` + +##### Windows +```powershell +.\\Scripts\activate +``` + +#### 3. Install `primaite` into the venv along with all of it's dependencies + +```bash +python3 -m pip install -e . +``` + +### Development Installation +To install the development dependencies, postfix the command in step 3 above with the `[dev]` extra. Example: + +```bash +python3 -m pip install -e .[dev] + +## Building documentation +The PrimAITE documentation can be built with the following commands: + +##### Unix +```bash +cd docs +make html +``` + +##### Windows +```powershell +cd docs +.\make.bat html +``` + +This will build the documentation as a collection of HTML files which uses the Read The Docs sphinx theme. Other build +options are available but may require additional dependencies such as LaTeX and PDF. Please refer to the Sphinx documentation +for your specific output requirements. diff --git a/docs/source/config.rst b/docs/source/config.rst index 74898ec1..5410a877 100644 --- a/docs/source/config.rst +++ b/docs/source/config.rst @@ -293,6 +293,14 @@ Rewards are calculated based on the difference between the current state and ref The number of steps to take when scanning the file system +* **deterministic** [bool] + + Set to true if the agent should use deterministic actions. Default is ``False`` + +* **seed** [int] + + Seed used in the randomisation in training / evaluation. Default is ``None`` + The Lay Down Config ******************* diff --git a/docs/source/primaite-dependencies.rst b/docs/source/primaite-dependencies.rst index 10685223..800235a8 100644 --- a/docs/source/primaite-dependencies.rst +++ b/docs/source/primaite-dependencies.rst @@ -320,4 +320,4 @@ | ypy-websocket | 0.8.2 | UNKNOWN | https://github.com/y-crdt/ypy-websocket | +-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ | zipp | 3.15.0 | MIT License | https://github.com/jaraco/zipp | -+-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ \ No newline at end of file ++-------------------------------+-------------+--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ diff --git a/src/primaite/__init__.py b/src/primaite/__init__.py index 1ea110c9..420420f4 100644 --- a/src/primaite/__init__.py +++ b/src/primaite/__init__.py @@ -31,7 +31,7 @@ def _get_primaite_config(): "INFO": logging.INFO, "WARN": logging.WARN, "ERROR": logging.ERROR, - "CRITICAL": logging.CRITICAL + "CRITICAL": logging.CRITICAL, } primaite_config["log_level"] = log_level_map[primaite_config["log_level"]] return primaite_config diff --git a/src/primaite/cli.py b/src/primaite/cli.py index 19746d01..319d643c 100644 --- a/src/primaite/cli.py +++ b/src/primaite/cli.py @@ -3,8 +3,8 @@ import logging import os import shutil -from pathlib import Path from enum import Enum +from pathlib import Path from typing import Optional import pkg_resources @@ -44,6 +44,7 @@ def logs(last_n: Annotated[int, typer.Option("-n")]): :param last_n: The number of lines to print. Default value is 10. """ import re + from primaite import LOG_PATH if os.path.isfile(LOG_PATH): @@ -53,7 +54,7 @@ def logs(last_n: Annotated[int, typer.Option("-n")]): print(re.sub(r"\n*", "", line)) -_LogLevel = Enum("LogLevel", {k: k for k in logging._levelToName.values()}) # noqa +_LogLevel = Enum("LogLevel", {k: k for k in logging._levelToName.values()}) # noqa @app.command() diff --git a/src/primaite/config/training_config.py b/src/primaite/config/training_config.py index 87a473e0..50970d56 100644 --- a/src/primaite/config/training_config.py +++ b/src/primaite/config/training_config.py @@ -1,7 +1,7 @@ # Crown Copyright (C) Dstl 2022. DEFCON 703. Shared in confidence. from dataclasses import dataclass, field from pathlib import Path -from typing import Any, Dict, Final, Union, Optional +from typing import Any, Dict, Final, Optional, Union import yaml @@ -173,8 +173,7 @@ def main_training_config_path() -> Path: return path -def load(file_path: Union[str, Path], - legacy_file: bool = False) -> TrainingConfig: +def load(file_path: Union[str, Path], legacy_file: bool = False) -> TrainingConfig: """ Read in a training config yaml file. @@ -219,9 +218,7 @@ def load(file_path: Union[str, Path], def convert_legacy_training_config_dict( - legacy_config_dict: Dict[str, Any], - num_steps: int = 256, - action_type: str = "ANY" + legacy_config_dict: Dict[str, Any], num_steps: int = 256, action_type: str = "ANY" ) -> Dict[str, Any]: """ Convert a legacy training config dict to the new format. @@ -233,10 +230,7 @@ def convert_legacy_training_config_dict( don't have action_type values. :return: The converted training config dict. """ - config_dict = { - "num_steps": num_steps, - "action_type": action_type - } + config_dict = {"num_steps": num_steps, "action_type": action_type} for legacy_key, value in legacy_config_dict.items(): new_key = _get_new_key_from_legacy(legacy_key) if new_key: diff --git a/src/primaite/environment/primaite_env.py b/src/primaite/environment/primaite_env.py index a4b69ba6..1955bfb0 100644 --- a/src/primaite/environment/primaite_env.py +++ b/src/primaite/environment/primaite_env.py @@ -14,8 +14,7 @@ from gym import Env, spaces from matplotlib import pyplot as plt from primaite.acl.access_control_list import AccessControlList -from primaite.agents.utils import is_valid_acl_action_extra, \ - is_valid_node_action +from primaite.agents.utils import is_valid_acl_action_extra, is_valid_node_action from primaite.common.custom_typing import NodeUnion from primaite.common.enums import ( ActionType, @@ -24,8 +23,9 @@ from primaite.common.enums import ( NodePOLInitiator, NodePOLType, NodeType, + ObservationType, Priority, - SoftwareState, ObservationType, + SoftwareState, ) from primaite.common.service import Service from primaite.config import training_config @@ -35,17 +35,14 @@ from primaite.environment.reward import calculate_reward_function from primaite.links.link import Link from primaite.nodes.active_node import ActiveNode from primaite.nodes.node import Node -from primaite.nodes.node_state_instruction_green import \ - NodeStateInstructionGreen +from primaite.nodes.node_state_instruction_green import NodeStateInstructionGreen from primaite.nodes.node_state_instruction_red import NodeStateInstructionRed from primaite.nodes.passive_node import PassiveNode from primaite.nodes.service_node import ServiceNode from primaite.pol.green_pol import apply_iers, apply_node_pol from primaite.pol.ier import IER -from primaite.pol.red_agent_pol import apply_red_agent_iers, \ - apply_red_agent_node_pol +from primaite.pol.red_agent_pol import apply_red_agent_iers, apply_red_agent_node_pol from primaite.transactions.transaction import Transaction -from primaite.transactions.transactions_to_file import write_transaction_to_file _LOGGER = logging.getLogger(__name__) _LOGGER.setLevel(logging.INFO) @@ -178,7 +175,6 @@ class Primaite(Env): # It will be initialised later. self.obs_handler: ObservationsHandler - # Open the config file and build the environment laydown with open(self._lay_down_config_path, "r") as file: # Open the config file and build the environment laydown @@ -200,7 +196,6 @@ class Primaite(Env): try: plt.tight_layout() nx.draw_networkx(self.network, with_labels=True) - now = datetime.now() # current date and time file_path = session_path / f"network_{timestamp_str}.png" plt.savefig(file_path, format="PNG") @@ -222,7 +217,9 @@ class Primaite(Env): # [0, 3] - action on property (0 = nothing, On / Scan, Off / Repair, Reset / Patch / Restore) # noqa # [0, num services] - resolves to service ID (0 = nothing, resolves to service) # noqa self.action_dict = self.create_node_action_dict() - self.action_space = spaces.Discrete(len(self.action_dict), seed=self.training_config.seed) + self.action_space = spaces.Discrete( + len(self.action_dict), seed=self.training_config.seed + ) elif self.training_config.action_type == ActionType.ACL: _LOGGER.info("Action space type ACL selected") # Terms (for ACL action space): @@ -233,13 +230,19 @@ class Primaite(Env): # [0, num services] - Protocol (0 = any, then 1 -> x resolving to protocol) # [0, num ports] - Port (0 = any, then 1 -> x resolving to port) self.action_dict = self.create_acl_action_dict() - self.action_space = spaces.Discrete(len(self.action_dict), seed=self.training_config.seed) + self.action_space = spaces.Discrete( + len(self.action_dict), seed=self.training_config.seed + ) elif self.training_config.action_type == ActionType.ANY: _LOGGER.info("Action space type ANY selected - Node + ACL") self.action_dict = self.create_node_and_acl_action_dict() - self.action_space = spaces.Discrete(len(self.action_dict), seed=self.training_config.seed) + self.action_space = spaces.Discrete( + len(self.action_dict), seed=self.training_config.seed + ) else: - _LOGGER.info(f"Invalid action type selected: {self.training_config.action_type}") + _LOGGER.info( + f"Invalid action type selected: {self.training_config.action_type}" + ) # Set up a csv to store the results of the training try: header = ["Episode", "Average Reward"] @@ -380,7 +383,7 @@ class Primaite(Env): self.step_count, self.training_config, ) - #print(f" Step {self.step_count} Reward: {str(reward)}") + # print(f" Step {self.step_count} Reward: {str(reward)}") self.total_reward += reward if self.step_count == self.episode_steps: self.average_reward = self.total_reward / self.step_count @@ -407,12 +410,11 @@ class Primaite(Env): return self.env_obs, reward, done, self.step_info def close(self): + """Calls the __close__ method.""" self.__close__() def __close__(self): - """ - Override close function - """ + """Override close function.""" self.csv_file.close() def init_acl(self): @@ -1039,7 +1041,6 @@ class Primaite(Env): """ self.observation_type = ObservationType[observation_info["type"]] - def get_action_info(self, action_info): """ Extracts action_info. diff --git a/src/primaite/main.py b/src/primaite/main.py index fc549590..8483f383 100644 --- a/src/primaite/main.py +++ b/src/primaite/main.py @@ -22,8 +22,7 @@ from stable_baselines3.ppo import MlpPolicy as PPOMlp from primaite import SESSIONS_DIR, getLogger from primaite.config.training_config import TrainingConfig from primaite.environment.primaite_env import Primaite -from primaite.transactions.transactions_to_file import \ - write_transaction_to_file +from primaite.transactions.transactions_to_file import write_transaction_to_file _LOGGER = getLogger(__name__) @@ -87,7 +86,13 @@ def run_stable_baselines3_ppo( _LOGGER.error("Could not load agent") _LOGGER.error("Exception occured", exc_info=True) else: - agent = PPO(PPOMlp, env, verbose=0, n_steps=config_values.num_steps, seed=env.training_config.seed) + agent = PPO( + PPOMlp, + env, + verbose=0, + n_steps=config_values.num_steps, + seed=env.training_config.seed, + ) if config_values.session_type == "TRAINING": # We're in a training session @@ -106,8 +111,7 @@ def run_stable_baselines3_ppo( for step in range(0, config_values.num_steps): action, _states = agent.predict( - obs, - deterministic=env.training_config.deterministic + obs, deterministic=env.training_config.deterministic ) # convert to int if action is a numpy array if isinstance(action, np.ndarray): @@ -146,7 +150,13 @@ def run_stable_baselines3_a2c( _LOGGER.error("Could not load agent") _LOGGER.error("Exception occured", exc_info=True) else: - agent = A2C("MlpPolicy", env, verbose=0, n_steps=config_values.num_steps, seed=env.training_config.seed) + agent = A2C( + "MlpPolicy", + env, + verbose=0, + n_steps=config_values.num_steps, + seed=env.training_config.seed, + ) if config_values.session_type == "TRAINING": # We're in a training session @@ -164,8 +174,7 @@ def run_stable_baselines3_a2c( for step in range(0, config_values.num_steps): action, _states = agent.predict( - obs, - deterministic=env.training_config.deterministic + obs, deterministic=env.training_config.deterministic ) # convert to int if action is a numpy array if isinstance(action, np.ndarray): @@ -368,5 +377,3 @@ if __name__ == "__main__": "Please provide a lay down config file using the --ldc " "argument" ) run(training_config_path=args.tc, lay_down_config_path=args.ldc) - - diff --git a/src/primaite/nodes/node.py b/src/primaite/nodes/node.py index 00cd01c2..bac1792d 100644 --- a/src/primaite/nodes/node.py +++ b/src/primaite/nodes/node.py @@ -46,6 +46,7 @@ class Node: """Sets the node state to ON.""" self.hardware_state = HardwareState.BOOTING self.booting_count = self.config_values.node_booting_duration + def turn_off(self): """Sets the node state to OFF.""" self.hardware_state = HardwareState.OFF @@ -64,14 +65,14 @@ class Node: self.hardware_state = HardwareState.ON def update_booting_status(self): - """Updates the booting count""" + """Updates the booting count.""" self.booting_count -= 1 if self.booting_count <= 0: self.booting_count = 0 self.hardware_state = HardwareState.ON def update_shutdown_status(self): - """Updates the shutdown count""" + """Updates the shutdown count.""" self.shutting_down_count -= 1 if self.shutting_down_count <= 0: self.shutting_down_count = 0 diff --git a/src/primaite/nodes/service_node.py b/src/primaite/nodes/service_node.py index 84a7c587..d4a5c8c8 100644 --- a/src/primaite/nodes/service_node.py +++ b/src/primaite/nodes/service_node.py @@ -190,13 +190,15 @@ class ServiceNode(ActiveNode): service_value.reduce_patching_count() def update_resetting_status(self): + """Updates the resetting counter for any service that are resetting.""" super().update_resetting_status() if self.resetting_count <= 0: for service in self.services.values(): service.software_state = SoftwareState.GOOD def update_booting_status(self): + """Updates the booting counter for any service that are booting up.""" super().update_booting_status() if self.booting_count <= 0: for service in self.services.values(): - service.software_state =SoftwareState.GOOD + service.software_state = SoftwareState.GOOD diff --git a/src/primaite/notebooks/__init__.py b/src/primaite/notebooks/__init__.py index 6d822961..71ed343e 100644 --- a/src/primaite/notebooks/__init__.py +++ b/src/primaite/notebooks/__init__.py @@ -17,7 +17,6 @@ def start_jupyter_session(): .. todo:: Figure out how to get this working for Linux and MacOS too. """ - if importlib.util.find_spec("jupyter") is not None: jupyter_cmd = "python3 -m jupyter lab" if sys.platform == "win32": diff --git a/tests/conftest.py b/tests/conftest.py index 7d552d7c..20ad8b23 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -3,7 +3,7 @@ import tempfile import time from datetime import datetime from pathlib import Path -from typing import Union, Final +from typing import Final, Union import pandas as pd @@ -30,7 +30,7 @@ def _get_temp_session_path(session_timestamp: datetime) -> Path: def _get_primaite_env_from_config( - training_config_path: Union[str, Path], lay_down_config_path: Union[str, Path] + training_config_path: Union[str, Path], lay_down_config_path: Union[str, Path] ): """Takes a config path and returns the created instance of Primaite.""" session_timestamp: datetime = datetime.now() @@ -84,7 +84,7 @@ def run_generic(env, config_values): def compare_file_content(output_a_file_path: str, output_b_file_path: str): - """Function used to check if output of both given files are the same""" + """Function used to check if output of both given files are the same.""" with open(output_a_file_path) as f1: with open(output_b_file_path) as f2: f1_content = f1.read() @@ -95,13 +95,15 @@ def compare_file_content(output_a_file_path: str, output_b_file_path: str): # both files have the same content return True # both files have different content - print(f"{output_a_file_path} and {output_b_file_path} has different contents") + print( + f"{output_a_file_path} and {output_b_file_path} has different contents" + ) return False def compare_transaction_file(output_a_file_path: str, output_b_file_path: str): - """Function used to check if contents of transaction files are the same""" + """Function used to check if contents of transaction files are the same.""" # load output a file data_a = pd.read_csv(output_a_file_path) @@ -109,19 +111,17 @@ def compare_transaction_file(output_a_file_path: str, output_b_file_path: str): data_b = pd.read_csv(output_b_file_path) # remove the time stamp column - data_a.drop('Timestamp', inplace=True, axis=1) - data_b.drop('Timestamp', inplace=True, axis=1) + data_a.drop("Timestamp", inplace=True, axis=1) + data_b.drop("Timestamp", inplace=True, axis=1) # if the comparison is empty, both files are the same i.e. True return data_a.compare(data_b).empty class TestSession: - def __init__( - self, - training_config_path, - laydown_config_path - ): + """Class that contains session values.""" + + def __init__(self, training_config_path, laydown_config_path): self.session_timestamp: Final[datetime] = datetime.now() self.session_dir = _get_session_path(self.session_timestamp) self.timestamp_str = self.session_timestamp.strftime("%Y-%m-%d_%H-%M-%S") @@ -140,5 +140,8 @@ class TestSession: print("Writing Session Metadata file...") _write_session_metadata_file( - session_dir=self.session_dir, uuid="test", session_timestamp=self.session_timestamp, env=self.env + session_dir=self.session_dir, + uuid="test", + session_timestamp=self.session_timestamp, + env=self.env, ) diff --git a/tests/e2e_integration_tests/test_session_repeatability.py b/tests/e2e_integration_tests/test_session_repeatability.py index 587b8501..a1a8f16a 100644 --- a/tests/e2e_integration_tests/test_session_repeatability.py +++ b/tests/e2e_integration_tests/test_session_repeatability.py @@ -2,8 +2,13 @@ import time from primaite import getLogger from primaite.config.lay_down_config import data_manipulation_config_path -from primaite.main import run_stable_baselines3_a2c, \ - run_stable_baselines3_ppo, run_generic, _update_session_metadata_file, _get_session_path +from primaite.main import ( + _get_session_path, + _update_session_metadata_file, + run_generic, + run_stable_baselines3_a2c, + run_stable_baselines3_ppo, +) from primaite.transactions.transactions_to_file import write_transaction_to_file from tests import TEST_CONFIG_ROOT from tests.conftest import TestSession, compare_file_content, compare_transaction_file @@ -12,18 +17,17 @@ _LOGGER = getLogger(__name__) def test_generic_same_results(): - """Runs seeded and deterministic Generic Primaite sessions and checks that the results are the same""" + """Runs seeded and deterministic Generic Primaite sessions and checks that the results are the same.""" print("") print("=======================") print("Generic test run") print("=======================") print("") - # run session 1 session1 = TestSession( TEST_CONFIG_ROOT / "e2e/generic_deterministic_seeded_training_config.yaml", - data_manipulation_config_path() + data_manipulation_config_path(), ) config_values = session1.env.training_config @@ -31,17 +35,14 @@ def test_generic_same_results(): # Get the number of steps (which is stored in the child config file) config_values.num_steps = session1.env.episode_steps - run_generic( - env=session1.env, - config_values=session1.env.training_config - ) + run_generic(env=session1.env, config_values=session1.env.training_config) _update_session_metadata_file(session_dir=session1.session_dir, env=session1.env) # run session 2 session2 = TestSession( TEST_CONFIG_ROOT / "e2e/generic_deterministic_seeded_training_config.yaml", - data_manipulation_config_path() + data_manipulation_config_path(), ) config_values = session2.env.training_config @@ -49,10 +50,7 @@ def test_generic_same_results(): # Get the number of steps (which is stored in the child config file) config_values.num_steps = session2.env.episode_steps - run_generic( - env=session2.env, - config_values=session2.env.training_config - ) + run_generic(env=session2.env, config_values=session2.env.training_config) _update_session_metadata_file(session_dir=session2.session_dir, env=session2.env) @@ -61,36 +59,41 @@ def test_generic_same_results(): time.sleep(1) # check if both outputs are the same - assert compare_file_content( - session1.env.csv_file.name, - session2.env.csv_file.name, - ) is True + assert ( + compare_file_content( + session1.env.csv_file.name, + session2.env.csv_file.name, + ) + is True + ) # deterministic run deterministic = TestSession( TEST_CONFIG_ROOT / "e2e/generic_deterministic_seeded_training_config.yaml", - data_manipulation_config_path() + data_manipulation_config_path(), ) deterministic.env.training_config.deterministic = True - run_generic( - env=deterministic.env, - config_values=deterministic.env.training_config + run_generic(env=deterministic.env, config_values=deterministic.env.training_config) + + _update_session_metadata_file( + session_dir=deterministic.session_dir, env=deterministic.env ) - _update_session_metadata_file(session_dir=deterministic.session_dir, env=deterministic.env) - # check if both outputs are the same - assert compare_file_content( - deterministic.env.csv_file.name, - TEST_CONFIG_ROOT / "e2e/deterministic_test_outputs/deterministic_generic.csv", - ) is True + assert ( + compare_file_content( + deterministic.env.csv_file.name, + TEST_CONFIG_ROOT + / "e2e/deterministic_test_outputs/deterministic_generic.csv", + ) + is True + ) def test_ppo_same_results(): - """Runs seeded and deterministic PPO Primaite sessions and checks that the results are the same""" - + """Runs seeded and deterministic PPO Primaite sessions and checks that the results are the same.""" print("") print("=======================") print("PPO test run") @@ -99,7 +102,7 @@ def test_ppo_same_results(): training_session = TestSession( TEST_CONFIG_ROOT / "e2e/ppo_deterministic_seeded_training_config.yaml", - data_manipulation_config_path() + data_manipulation_config_path(), ) # Train agent @@ -123,12 +126,14 @@ def test_ppo_same_results(): timestamp_str=training_session.timestamp_str, ) - _update_session_metadata_file(session_dir=training_session.session_dir, env=training_session.env) + _update_session_metadata_file( + session_dir=training_session.session_dir, env=training_session.env + ) # Evaluate Agent again eval_session1 = TestSession( TEST_CONFIG_ROOT / "e2e/ppo_deterministic_seeded_training_config.yaml", - data_manipulation_config_path() + data_manipulation_config_path(), ) # Get the number of steps (which is stored in the child config file) @@ -137,7 +142,10 @@ def test_ppo_same_results(): # load the agent that was trained previously eval_session1.env.training_config.load_agent = True - eval_session1.env.training_config.agent_load_file = _get_session_path(training_session.session_timestamp) / f"agent_saved_{training_session.timestamp_str}.zip" + eval_session1.env.training_config.agent_load_file = ( + _get_session_path(training_session.session_timestamp) + / f"agent_saved_{training_session.timestamp_str}.zip" + ) config_values = eval_session1.env.training_config @@ -154,11 +162,13 @@ def test_ppo_same_results(): timestamp_str=eval_session1.timestamp_str, ) - _update_session_metadata_file(session_dir=eval_session1.session_dir, env=eval_session1.env) + _update_session_metadata_file( + session_dir=eval_session1.session_dir, env=eval_session1.env + ) eval_session2 = TestSession( TEST_CONFIG_ROOT / "e2e/ppo_deterministic_seeded_training_config.yaml", - data_manipulation_config_path() + data_manipulation_config_path(), ) # Get the number of steps (which is stored in the child config file) @@ -167,8 +177,10 @@ def test_ppo_same_results(): # load the agent that was trained previously eval_session2.env.training_config.load_agent = True - eval_session2.env.training_config.agent_load_file = _get_session_path( - training_session.session_timestamp) / f"agent_saved_{training_session.timestamp_str}.zip" + eval_session2.env.training_config.agent_load_file = ( + _get_session_path(training_session.session_timestamp) + / f"agent_saved_{training_session.timestamp_str}.zip" + ) config_values = eval_session2.env.training_config @@ -185,18 +197,25 @@ def test_ppo_same_results(): timestamp_str=eval_session2.timestamp_str, ) - _update_session_metadata_file(session_dir=eval_session2.session_dir, env=eval_session2.env) + _update_session_metadata_file( + session_dir=eval_session2.session_dir, env=eval_session2.env + ) # check if both eval outputs are the same - assert compare_transaction_file( - eval_session1.session_dir / f"all_transactions_{eval_session1.timestamp_str}.csv", - eval_session2.session_dir / f"all_transactions_{eval_session2.timestamp_str}.csv", - ) is True + assert ( + compare_transaction_file( + eval_session1.session_dir + / f"all_transactions_{eval_session1.timestamp_str}.csv", + eval_session2.session_dir + / f"all_transactions_{eval_session2.timestamp_str}.csv", + ) + is True + ) # deterministic run deterministic = TestSession( TEST_CONFIG_ROOT / "e2e/ppo_deterministic_seeded_training_config.yaml", - data_manipulation_config_path() + data_manipulation_config_path(), ) deterministic.env.training_config.deterministic = True @@ -214,18 +233,23 @@ def test_ppo_same_results(): timestamp_str=deterministic.timestamp_str, ) - _update_session_metadata_file(session_dir=deterministic.session_dir, env=deterministic.env) + _update_session_metadata_file( + session_dir=deterministic.session_dir, env=deterministic.env + ) # check if both outputs are the same - assert compare_transaction_file( - deterministic.session_dir / f"all_transactions_{deterministic.timestamp_str}.csv", - TEST_CONFIG_ROOT / "e2e/deterministic_test_outputs/deterministic_ppo.csv", - ) is True + assert ( + compare_transaction_file( + deterministic.session_dir + / f"all_transactions_{deterministic.timestamp_str}.csv", + TEST_CONFIG_ROOT / "e2e/deterministic_test_outputs/deterministic_ppo.csv", + ) + is True + ) def test_a2c_same_results(): - """Runs seeded and deterministic A2C Primaite sessions and checks that the results are the same""" - + """Runs seeded and deterministic A2C Primaite sessions and checks that the results are the same.""" print("") print("=======================") print("A2C test run") @@ -234,7 +258,7 @@ def test_a2c_same_results(): training_session = TestSession( TEST_CONFIG_ROOT / "e2e/a2c_deterministic_seeded_training_config.yaml", - data_manipulation_config_path() + data_manipulation_config_path(), ) # Train agent @@ -258,12 +282,14 @@ def test_a2c_same_results(): timestamp_str=training_session.timestamp_str, ) - _update_session_metadata_file(session_dir=training_session.session_dir, env=training_session.env) + _update_session_metadata_file( + session_dir=training_session.session_dir, env=training_session.env + ) # Evaluate Agent again eval_session1 = TestSession( TEST_CONFIG_ROOT / "e2e/a2c_deterministic_seeded_training_config.yaml", - data_manipulation_config_path() + data_manipulation_config_path(), ) # Get the number of steps (which is stored in the child config file) @@ -272,8 +298,10 @@ def test_a2c_same_results(): # load the agent that was trained previously eval_session1.env.training_config.load_agent = True - eval_session1.env.training_config.agent_load_file = _get_session_path( - training_session.session_timestamp) / f"agent_saved_{training_session.timestamp_str}.zip" + eval_session1.env.training_config.agent_load_file = ( + _get_session_path(training_session.session_timestamp) + / f"agent_saved_{training_session.timestamp_str}.zip" + ) config_values = eval_session1.env.training_config @@ -290,11 +318,13 @@ def test_a2c_same_results(): timestamp_str=eval_session1.timestamp_str, ) - _update_session_metadata_file(session_dir=eval_session1.session_dir, env=eval_session1.env) + _update_session_metadata_file( + session_dir=eval_session1.session_dir, env=eval_session1.env + ) eval_session2 = TestSession( TEST_CONFIG_ROOT / "e2e/a2c_deterministic_seeded_training_config.yaml", - data_manipulation_config_path() + data_manipulation_config_path(), ) # Get the number of steps (which is stored in the child config file) @@ -303,8 +333,10 @@ def test_a2c_same_results(): # load the agent that was trained previously eval_session2.env.training_config.load_agent = True - eval_session2.env.training_config.agent_load_file = _get_session_path( - training_session.session_timestamp) / f"agent_saved_{training_session.timestamp_str}.zip" + eval_session2.env.training_config.agent_load_file = ( + _get_session_path(training_session.session_timestamp) + / f"agent_saved_{training_session.timestamp_str}.zip" + ) config_values = eval_session2.env.training_config @@ -321,18 +353,25 @@ def test_a2c_same_results(): timestamp_str=eval_session2.timestamp_str, ) - _update_session_metadata_file(session_dir=eval_session2.session_dir, env=eval_session2.env) + _update_session_metadata_file( + session_dir=eval_session2.session_dir, env=eval_session2.env + ) # check if both eval outputs are the same - assert compare_transaction_file( - eval_session1.session_dir / f"all_transactions_{eval_session1.timestamp_str}.csv", - eval_session2.session_dir / f"all_transactions_{eval_session2.timestamp_str}.csv", - ) is True + assert ( + compare_transaction_file( + eval_session1.session_dir + / f"all_transactions_{eval_session1.timestamp_str}.csv", + eval_session2.session_dir + / f"all_transactions_{eval_session2.timestamp_str}.csv", + ) + is True + ) # deterministic run deterministic = TestSession( TEST_CONFIG_ROOT / "e2e/a2c_deterministic_seeded_training_config.yaml", - data_manipulation_config_path() + data_manipulation_config_path(), ) deterministic.env.training_config.deterministic = True @@ -350,10 +389,16 @@ def test_a2c_same_results(): timestamp_str=deterministic.timestamp_str, ) - _update_session_metadata_file(session_dir=deterministic.session_dir, env=deterministic.env) + _update_session_metadata_file( + session_dir=deterministic.session_dir, env=deterministic.env + ) # check if both outputs are the same - assert compare_transaction_file( - deterministic.session_dir / f"all_transactions_{deterministic.timestamp_str}.csv", - TEST_CONFIG_ROOT / "e2e/deterministic_test_outputs/deterministic_a2c.csv", - ) is True + assert ( + compare_transaction_file( + deterministic.session_dir + / f"all_transactions_{deterministic.timestamp_str}.csv", + TEST_CONFIG_ROOT / "e2e/deterministic_test_outputs/deterministic_a2c.csv", + ) + is True + ) diff --git a/tests/test_observation_space.py b/tests/test_observation_space.py index dbcdf2d6..efca7b0b 100644 --- a/tests/test_observation_space.py +++ b/tests/test_observation_space.py @@ -27,7 +27,8 @@ def env(request): @pytest.mark.env_config_paths( dict( - training_config_path=TEST_CONFIG_ROOT / "obs_tests/main_config_without_obs.yaml", + training_config_path=TEST_CONFIG_ROOT + / "obs_tests/main_config_without_obs.yaml", lay_down_config_path=TEST_CONFIG_ROOT / "obs_tests/laydown.yaml", ) ) @@ -43,7 +44,8 @@ def test_default_obs_space(env: Primaite): @pytest.mark.env_config_paths( dict( - training_config_path=TEST_CONFIG_ROOT / "obs_tests/main_config_without_obs.yaml", + training_config_path=TEST_CONFIG_ROOT + / "obs_tests/main_config_without_obs.yaml", lay_down_config_path=TEST_CONFIG_ROOT / "obs_tests/laydown.yaml", ) ) @@ -140,7 +142,8 @@ class TestNodeLinkTable: @pytest.mark.env_config_paths( dict( - training_config_path=TEST_CONFIG_ROOT / "obs_tests/main_config_NODE_STATUSES.yaml", + training_config_path=TEST_CONFIG_ROOT + / "obs_tests/main_config_NODE_STATUSES.yaml", lay_down_config_path=TEST_CONFIG_ROOT / "obs_tests/laydown.yaml", ) ) diff --git a/tests/test_resetting_node.py b/tests/test_resetting_node.py index b2843f7f..abe8115c 100644 --- a/tests/test_resetting_node.py +++ b/tests/test_resetting_node.py @@ -1,7 +1,13 @@ """Used to test Active Node functions.""" import pytest -from primaite.common.enums import FileSystemState, HardwareState, SoftwareState, NodeType, Priority +from primaite.common.enums import ( + FileSystemState, + HardwareState, + NodeType, + Priority, + SoftwareState, +) from primaite.common.service import Service from primaite.config.training_config import TrainingConfig from primaite.nodes.active_node import ActiveNode @@ -10,24 +16,20 @@ from primaite.nodes.service_node import ServiceNode @pytest.mark.parametrize( "starting_operating_state, expected_operating_state", - [ - (HardwareState.RESETTING, HardwareState.ON) - ], + [(HardwareState.RESETTING, HardwareState.ON)], ) def test_node_resets_correctly(starting_operating_state, expected_operating_state): - """ - Tests that a node resets correctly. - """ + """Tests that a node resets correctly.""" active_node = ActiveNode( - node_id = "0", - name = "node", - node_type = NodeType.COMPUTER, - priority = Priority.P1, - hardware_state = starting_operating_state, - ip_address = "192.168.0.1", - software_state = SoftwareState.COMPROMISED, - file_system_state = FileSystemState.CORRUPT, - config_values=TrainingConfig() + node_id="0", + name="node", + node_type=NodeType.COMPUTER, + priority=Priority.P1, + hardware_state=starting_operating_state, + ip_address="192.168.0.1", + software_state=SoftwareState.COMPROMISED, + file_system_state=FileSystemState.CORRUPT, + config_values=TrainingConfig(), ) for x in range(5): @@ -37,35 +39,28 @@ def test_node_resets_correctly(starting_operating_state, expected_operating_stat assert active_node.file_system_state_actual == FileSystemState.GOOD assert active_node.hardware_state == expected_operating_state + @pytest.mark.parametrize( "operating_state, expected_operating_state", - [ - (HardwareState.BOOTING, HardwareState.ON) - ], + [(HardwareState.BOOTING, HardwareState.ON)], ) def test_node_boots_correctly(operating_state, expected_operating_state): - """ - Tests that a node boots correctly. - """ + """Tests that a node boots correctly.""" service_node = ServiceNode( - node_id = 0, - name = "node", - node_type = "COMPUTER", - priority = "1", - hardware_state = operating_state, - ip_address = "192.168.0.1", - software_state = SoftwareState.GOOD, - file_system_state = "GOOD", - config_values = 1, + node_id=0, + name="node", + node_type="COMPUTER", + priority="1", + hardware_state=operating_state, + ip_address="192.168.0.1", + software_state=SoftwareState.GOOD, + file_system_state="GOOD", + config_values=1, ) service_attributes = Service( - name = "node", - port = "80", - software_state = SoftwareState.COMPROMISED - ) - service_node.add_service( - service_attributes + name="node", port="80", software_state=SoftwareState.COMPROMISED ) + service_node.add_service(service_attributes) for x in range(5): service_node.update_booting_status() @@ -73,31 +68,26 @@ def test_node_boots_correctly(operating_state, expected_operating_state): assert service_attributes.software_state == SoftwareState.GOOD assert service_node.hardware_state == expected_operating_state + @pytest.mark.parametrize( "operating_state, expected_operating_state", - [ - (HardwareState.SHUTTING_DOWN, HardwareState.OFF) - ], + [(HardwareState.SHUTTING_DOWN, HardwareState.OFF)], ) def test_node_shutdown_correctly(operating_state, expected_operating_state): - """ - Tests that a node shutdown correctly. - """ + """Tests that a node shutdown correctly.""" active_node = ActiveNode( - node_id = 0, - name = "node", - node_type = "COMPUTER", - priority = "1", - hardware_state = operating_state, - ip_address = "192.168.0.1", - software_state = SoftwareState.GOOD, - file_system_state = "GOOD", - config_values = 1, + node_id=0, + name="node", + node_type="COMPUTER", + priority="1", + hardware_state=operating_state, + ip_address="192.168.0.1", + software_state=SoftwareState.GOOD, + file_system_state="GOOD", + config_values=1, ) for x in range(5): active_node.update_shutdown_status() assert active_node.hardware_state == expected_operating_state - - diff --git a/tests/test_single_action_space.py b/tests/test_single_action_space.py index 16b9d03e..8ff43fe6 100644 --- a/tests/test_single_action_space.py +++ b/tests/test_single_action_space.py @@ -48,7 +48,8 @@ def test_single_action_space_is_valid(): """Test to ensure the blue agent is using the ACL action space and is carrying out both kinds of operations.""" env = _get_primaite_env_from_config( training_config_path=TEST_CONFIG_ROOT / "single_action_space_main_config.yaml", - lay_down_config_path=TEST_CONFIG_ROOT / "single_action_space_lay_down_config.yaml", + lay_down_config_path=TEST_CONFIG_ROOT + / "single_action_space_lay_down_config.yaml", ) run_generic_set_actions(env) @@ -77,8 +78,10 @@ def test_single_action_space_is_valid(): def test_agent_is_executing_actions_from_both_spaces(): """Test to ensure the blue agent is carrying out both kinds of operations (NODE & ACL).""" env = _get_primaite_env_from_config( - training_config_path=TEST_CONFIG_ROOT / "single_action_space_fixed_blue_actions_main_config.yaml", - lay_down_config_path=TEST_CONFIG_ROOT / "single_action_space_lay_down_config.yaml", + training_config_path=TEST_CONFIG_ROOT + / "single_action_space_fixed_blue_actions_main_config.yaml", + lay_down_config_path=TEST_CONFIG_ROOT + / "single_action_space_lay_down_config.yaml", ) # Run environment with specified fixed blue agent actions only run_generic_set_actions(env) From 1a5bd3af4838213d2dd3f293cf5f1f84a17f03b5 Mon Sep 17 00:00:00 2001 From: Czar Echavez Date: Tue, 20 Jun 2023 11:22:29 +0100 Subject: [PATCH 03/17] #1386: fix README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 7782e8a9..f7c6efd7 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,7 @@ To install the development dependencies, postfix the command in step 3 above wit ```bash python3 -m pip install -e .[dev] +``` ## Building documentation The PrimAITE documentation can be built with the following commands: From fb50b8becfbda77a78af5ac230f65a1cfa967a9f Mon Sep 17 00:00:00 2001 From: Czar Echavez Date: Fri, 23 Jun 2023 07:57:31 +0000 Subject: [PATCH 04/17] #1386: Apply suggestions from code review - make seed an optional variable --- src/primaite/config/training_config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/primaite/config/training_config.py b/src/primaite/config/training_config.py index 50970d56..3f9d3eb1 100644 --- a/src/primaite/config/training_config.py +++ b/src/primaite/config/training_config.py @@ -140,7 +140,7 @@ class TrainingConfig: deterministic: bool = False "If true, the training will be deterministic" - seed: int = None + seed: Optional[int] = None "The random number generator seed to be used while training the agent" def to_dict(self, json_serializable: bool = True): From 9001510fe7436aecd6897f52fe9408139965099f Mon Sep 17 00:00:00 2001 From: Czar Echavez Date: Tue, 4 Jul 2023 16:30:31 +0100 Subject: [PATCH 05/17] #1386: fix bug with agent zip file not being saved after run --- src/primaite/agents/agent.py | 13 ++++++++++--- src/primaite/agents/rllib.py | 5 +---- src/primaite/agents/sb3.py | 6 ++---- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/primaite/agents/agent.py b/src/primaite/agents/agent.py index 685fe776..37735812 100644 --- a/src/primaite/agents/agent.py +++ b/src/primaite/agents/agent.py @@ -257,10 +257,17 @@ class AgentSessionABC(ABC): raise FileNotFoundError(msg) pass - @abstractmethod - def save(self): + def save(self, path_str: str | Path): """Save the agent.""" - self._agent.save(self.session_path) + if path_str: + self._agent.save(path_str) + return + + # if no path, save to root but with a random UUID + self._agent.save( + self.session_path + / f"{self._training_config.agent_framework}_{self._training_config.agent_identifier}_{uuid4()}" + ) @abstractmethod def export(self): diff --git a/src/primaite/agents/rllib.py b/src/primaite/agents/rllib.py index d851ba9c..b058ffc7 100644 --- a/src/primaite/agents/rllib.py +++ b/src/primaite/agents/rllib.py @@ -142,6 +142,7 @@ class RLlibAgent(AgentSessionABC): self._save_checkpoint() self._agent.stop() super().learn() + self.save(self.learning_path / f"rllib_{self._training_config.agent_identifier}_{self.timestamp_str}.zip") def evaluate( self, @@ -162,10 +163,6 @@ class RLlibAgent(AgentSessionABC): """Load an agent from file.""" raise NotImplementedError - def save(self): - """Save the agent.""" - raise NotImplementedError - def export(self): """Export the agent to transportable file format.""" raise NotImplementedError diff --git a/src/primaite/agents/sb3.py b/src/primaite/agents/sb3.py index f5ac44cb..e0c1ee79 100644 --- a/src/primaite/agents/sb3.py +++ b/src/primaite/agents/sb3.py @@ -89,6 +89,7 @@ class SB3Agent(AgentSessionABC): for i in range(episodes): self._agent.learn(total_timesteps=time_steps) self._save_checkpoint() + self.save(self.learning_path / f"sb3_{self._training_config.agent_identifier}_{self.timestamp_str}.zip") self._env.reset() self._env.close() super().learn() @@ -123,6 +124,7 @@ class SB3Agent(AgentSessionABC): if isinstance(action, np.ndarray): action = np.int64(action) obs, rewards, done, info = self._env.step(action) + self.save(self.evaluation_path / f"sb3_{self._training_config.agent_identifier}_{self.timestamp_str}.zip") self._env.reset() self._env.close() super().evaluate() @@ -132,10 +134,6 @@ class SB3Agent(AgentSessionABC): """Load an agent from file.""" raise NotImplementedError - def save(self): - """Save the agent.""" - raise NotImplementedError - def export(self): """Export the agent to transportable file format.""" raise NotImplementedError From 075b11aeca6e7f8330433a6bccb854766db1f098 Mon Sep 17 00:00:00 2001 From: Czar Echavez Date: Wed, 5 Jul 2023 11:41:18 +0100 Subject: [PATCH 06/17] #1386: fix saving of agent --- src/primaite/agents/agent.py | 13 +++++-------- src/primaite/agents/rllib.py | 5 ++++- src/primaite/agents/sb3.py | 5 +++-- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/primaite/agents/agent.py b/src/primaite/agents/agent.py index 37735812..4b39839a 100644 --- a/src/primaite/agents/agent.py +++ b/src/primaite/agents/agent.py @@ -257,17 +257,14 @@ class AgentSessionABC(ABC): raise FileNotFoundError(msg) pass - def save(self, path_str: str | Path): + def save(self): """Save the agent.""" - if path_str: - self._agent.save(path_str) - return - - # if no path, save to root but with a random UUID - self._agent.save( + agent_path = ( self.session_path - / f"{self._training_config.agent_framework}_{self._training_config.agent_identifier}_{uuid4()}" + / f"{self._training_config.agent_framework}_{self._training_config.agent_identifier}_{self.timestamp_str}" ) + _LOGGER.debug(f"Saving agent: {agent_path}") + self._agent.save(agent_path) @abstractmethod def export(self): diff --git a/src/primaite/agents/rllib.py b/src/primaite/agents/rllib.py index b058ffc7..30edd93c 100644 --- a/src/primaite/agents/rllib.py +++ b/src/primaite/agents/rllib.py @@ -141,8 +141,11 @@ class RLlibAgent(AgentSessionABC): self._current_result = self._agent.train() self._save_checkpoint() self._agent.stop() + super().learn() - self.save(self.learning_path / f"rllib_{self._training_config.agent_identifier}_{self.timestamp_str}.zip") + + # save agent + self.save() def evaluate( self, diff --git a/src/primaite/agents/sb3.py b/src/primaite/agents/sb3.py index e0c1ee79..17fbe0a6 100644 --- a/src/primaite/agents/sb3.py +++ b/src/primaite/agents/sb3.py @@ -89,11 +89,13 @@ class SB3Agent(AgentSessionABC): for i in range(episodes): self._agent.learn(total_timesteps=time_steps) self._save_checkpoint() - self.save(self.learning_path / f"sb3_{self._training_config.agent_identifier}_{self.timestamp_str}.zip") self._env.reset() self._env.close() super().learn() + # save agent + self.save() + def evaluate( self, deterministic: bool = True, @@ -124,7 +126,6 @@ class SB3Agent(AgentSessionABC): if isinstance(action, np.ndarray): action = np.int64(action) obs, rewards, done, info = self._env.step(action) - self.save(self.evaluation_path / f"sb3_{self._training_config.agent_identifier}_{self.timestamp_str}.zip") self._env.reset() self._env.close() super().evaluate() From 713225b4321cda1cf9448af4144e62664a941ae4 Mon Sep 17 00:00:00 2001 From: Czar Echavez Date: Wed, 5 Jul 2023 15:02:41 +0100 Subject: [PATCH 07/17] #1386: remove unneeded configs + setting the seed globally + temp test --- .../training/training_config_main.yaml | 10 ++ src/primaite/config/training_config.py | 12 +- src/primaite/environment/primaite_env.py | 12 +- ..._deterministic_seeded_training_config.yaml | 98 ----------- .../e2e/a2c_seeded_training_config.yaml | 86 ++++++++-- .../deterministic_a2c.csv | 61 ------- .../deterministic_generic.csv | 4 - .../deterministic_ppo.csv | 61 ------- ..._deterministic_seeded_training_config.yaml | 98 ----------- ..._deterministic_seeded_training_config.yaml | 98 ----------- .../e2e/ppo_seeded_training_config.yaml | 155 ++++++++++++++++++ tests/conftest.py | 34 ---- tests/e2e_integration_tests/__init__.py | 0 tests/e2e_integration_tests/conftest.py | 21 +++ .../test_session_repeatability.py | 60 ++++++- 15 files changed, 328 insertions(+), 482 deletions(-) delete mode 100644 tests/config/e2e/a2c_deterministic_seeded_training_config.yaml rename src/primaite/config/_package_data/training/training_config_random_red_agent.yaml => tests/config/e2e/a2c_seeded_training_config.yaml (52%) delete mode 100644 tests/config/e2e/deterministic_test_outputs/deterministic_a2c.csv delete mode 100644 tests/config/e2e/deterministic_test_outputs/deterministic_generic.csv delete mode 100644 tests/config/e2e/deterministic_test_outputs/deterministic_ppo.csv delete mode 100644 tests/config/e2e/generic_deterministic_seeded_training_config.yaml delete mode 100644 tests/config/e2e/ppo_deterministic_seeded_training_config.yaml create mode 100644 tests/config/e2e/ppo_seeded_training_config.yaml create mode 100644 tests/e2e_integration_tests/__init__.py create mode 100644 tests/e2e_integration_tests/conftest.py diff --git a/src/primaite/config/_package_data/training/training_config_main.yaml b/src/primaite/config/_package_data/training/training_config_main.yaml index a638fe14..113457ff 100644 --- a/src/primaite/config/_package_data/training/training_config_main.yaml +++ b/src/primaite/config/_package_data/training/training_config_main.yaml @@ -31,6 +31,16 @@ agent_identifier: PPO # False random_red_agent: False +# The (integer) seed to be used in random number generation +# Default is None (null) +seed: null + +# Set whether the agent will be deterministic instead of stochastic +# Options are: +# True +# False +deterministic: False + # Sets what view of the environment the deterministic hardcoded agent has. The default is BASIC. # Options are: # "BASIC" (The current observation space only) diff --git a/src/primaite/config/training_config.py b/src/primaite/config/training_config.py index 99664f02..db8927a1 100644 --- a/src/primaite/config/training_config.py +++ b/src/primaite/config/training_config.py @@ -178,6 +178,12 @@ class TrainingConfig: file_system_scanning_limit: int = 5 "The time taken to scan the file system" + deterministic: bool = False + "If true, the training will be deterministic" + + seed: Optional[int] = None + "The random number generator seed to be used while training the agent" + @classmethod def from_dict(cls, config_dict: Dict[str, Union[str, int, bool]]) -> TrainingConfig: """ @@ -201,12 +207,6 @@ class TrainingConfig: config_dict[key] = value[config_dict[key]] return TrainingConfig(**config_dict) - deterministic: bool = False - "If true, the training will be deterministic" - - seed: Optional[int] = None - "The random number generator seed to be used while training the agent" - def to_dict(self, json_serializable: bool = True): """ Serialise the ``TrainingConfig`` as dict. diff --git a/src/primaite/environment/primaite_env.py b/src/primaite/environment/primaite_env.py index dee80717..cd2ff9e5 100644 --- a/src/primaite/environment/primaite_env.py +++ b/src/primaite/environment/primaite_env.py @@ -2,6 +2,7 @@ """Main environment module containing the PRIMmary AI Training Evironment (Primaite) class.""" import copy import logging +import random import uuid as uuid from pathlib import Path from random import choice, randint, sample, uniform @@ -218,7 +219,7 @@ class Primaite(Env): # [0, 3] - action on property (0 = nothing, On / Scan, Off / Repair, Reset / Patch / Restore) # noqa # [0, num services] - resolves to service ID (0 = nothing, resolves to service) # noqa self.action_dict = self.create_node_action_dict() - self.action_space = spaces.Discrete(len(self.action_dict), seed=self.training_config.seed) + self.action_space = spaces.Discrete(len(self.action_dict)) elif self.training_config.action_type == ActionType.ACL: _LOGGER.debug("Action space type ACL selected") # Terms (for ACL action space): @@ -229,17 +230,22 @@ class Primaite(Env): # [0, num services] - Protocol (0 = any, then 1 -> x resolving to protocol) # [0, num ports] - Port (0 = any, then 1 -> x resolving to port) self.action_dict = self.create_acl_action_dict() - self.action_space = spaces.Discrete(len(self.action_dict), seed=self.training_config.seed) + self.action_space = spaces.Discrete(len(self.action_dict)) elif self.training_config.action_type == ActionType.ANY: _LOGGER.debug("Action space type ANY selected - Node + ACL") self.action_dict = self.create_node_and_acl_action_dict() - self.action_space = spaces.Discrete(len(self.action_dict), seed=self.training_config.seed) + self.action_space = spaces.Discrete(len(self.action_dict)) else: _LOGGER.error(f"Invalid action type selected: {self.training_config.action_type}") self.episode_av_reward_writer = SessionOutputWriter(self, transaction_writer=False, learning_session=True) self.transaction_writer = SessionOutputWriter(self, transaction_writer=True, learning_session=True) + # set the seed globally if there is one + if self.training_config.seed: + random.seed(self.training_config.seed) + np.random.seed(self.training_config.seed) + @property def actual_episode_count(self) -> int: """Shifts the episode_count by -1 for RLlib.""" diff --git a/tests/config/e2e/a2c_deterministic_seeded_training_config.yaml b/tests/config/e2e/a2c_deterministic_seeded_training_config.yaml deleted file mode 100644 index 7dad0d4d..00000000 --- a/tests/config/e2e/a2c_deterministic_seeded_training_config.yaml +++ /dev/null @@ -1,98 +0,0 @@ -# Main Config File - -# Generic config values -# Choose one of these (dependent on Agent being trained) -# "STABLE_BASELINES3_PPO" -# "STABLE_BASELINES3_A2C" -# "GENERIC" -agent_identifier: STABLE_BASELINES3_A2C -# Sets How the Action Space is defined: -# "NODE" -# "ACL" -# "ANY" node and acl actions -action_type: ANY -# Number of episodes to run per session -num_episodes: 3 -# Number of time_steps per episode -num_steps: 20 -# Time delay between steps (for generic agents) -time_delay: 1 -# Type of session to be run (TRAINING or EVALUATION) -session_type: TRAINING -# Determine whether to load an agent from file -load_agent: False -# File path and file name of agent if you're loading one in -agent_load_file: C:\[Path]\[agent_saved_filename.zip] - -# Environment config values -# The high value for the observation space -observation_space_high_value: 1000000000 - -# Reward values -# Generic -all_ok: 0 -# Node Operating State -off_should_be_on: -10 -off_should_be_resetting: -5 -on_should_be_off: -2 -on_should_be_resetting: -5 -resetting_should_be_on: -5 -resetting_should_be_off: -2 -resetting: -3 -# Node O/S or Service State -good_should_be_patching: 2 -good_should_be_compromised: 5 -good_should_be_overwhelmed: 5 -patching_should_be_good: -5 -patching_should_be_compromised: 2 -patching_should_be_overwhelmed: 2 -patching: -3 -compromised_should_be_good: -20 -compromised_should_be_patching: -20 -compromised_should_be_overwhelmed: -20 -compromised: -20 -overwhelmed_should_be_good: -20 -overwhelmed_should_be_patching: -20 -overwhelmed_should_be_compromised: -20 -overwhelmed: -20 -# Node File System State -good_should_be_repairing: 2 -good_should_be_restoring: 2 -good_should_be_corrupt: 5 -good_should_be_destroyed: 10 -repairing_should_be_good: -5 -repairing_should_be_restoring: 2 -repairing_should_be_corrupt: 2 -repairing_should_be_destroyed: 0 -repairing: -3 -restoring_should_be_good: -10 -restoring_should_be_repairing: -2 -restoring_should_be_corrupt: 1 -restoring_should_be_destroyed: 2 -restoring: -6 -corrupt_should_be_good: -10 -corrupt_should_be_repairing: -10 -corrupt_should_be_restoring: -10 -corrupt_should_be_destroyed: 2 -corrupt: -10 -destroyed_should_be_good: -20 -destroyed_should_be_repairing: -20 -destroyed_should_be_restoring: -20 -destroyed_should_be_corrupt: -20 -destroyed: -20 -scanning: -2 -# IER status -red_ier_running: -5 -green_ier_blocked: -10 - -# Patching / Reset durations -os_patching_duration: 5 # The time taken to patch the OS -node_reset_duration: 5 # The time taken to reset a node (hardware) -service_patching_duration: 5 # The time taken to patch a service -file_system_repairing_limit: 5 # The time take to repair the file system -file_system_restoring_limit: 5 # The time take to restore the file system -file_system_scanning_limit: 5 # The time taken to scan the file system - -# deterministic -deterministic: False -seed: 1 diff --git a/src/primaite/config/_package_data/training/training_config_random_red_agent.yaml b/tests/config/e2e/a2c_seeded_training_config.yaml similarity index 52% rename from src/primaite/config/_package_data/training/training_config_random_red_agent.yaml rename to tests/config/e2e/a2c_seeded_training_config.yaml index 96243daf..90947726 100644 --- a/src/primaite/config/_package_data/training/training_config_random_red_agent.yaml +++ b/tests/config/e2e/a2c_seeded_training_config.yaml @@ -1,40 +1,94 @@ -# Main Config File +# Training Config File -# Generic config values -# Choose one of these (dependent on Agent being trained) -# "STABLE_BASELINES3_PPO" -# "STABLE_BASELINES3_A2C" -# "GENERIC" -agent_identifier: STABLE_BASELINES3_A2C +# Sets which agent algorithm framework will be used. +# Options are: +# "SB3" (Stable Baselines3) +# "RLLIB" (Ray RLlib) +# "CUSTOM" (Custom Agent) +agent_framework: SB3 + +# Sets which deep learning framework will be used (by RLlib ONLY). +# Default is TF (Tensorflow). +# Options are: +# "TF" (Tensorflow) +# TF2 (Tensorflow 2.X) +# TORCH (PyTorch) +deep_learning_framework: TF2 + +# Sets which Agent class will be used. +# Options are: +# "A2C" (Advantage Actor Critic coupled with either SB3 or RLLIB agent_framework) +# "PPO" (Proximal Policy Optimization coupled with either SB3 or RLLIB agent_framework) +# "HARDCODED" (The HardCoded agents coupled with an ACL or NODE action_type) +# "DO_NOTHING" (The DoNothing agents coupled with an ACL or NODE action_type) +# "RANDOM" (primaite.agents.simple.RandomAgent) +# "DUMMY" (primaite.agents.simple.DummyAgent) +agent_identifier: A2C # Sets whether Red Agent POL and IER is randomised. # Options are: # True # False -random_red_agent: True +random_red_agent: False + +# The (integer) seed to be used in random number generation +# Default is None (null) +seed: 12345 + +# Set whether the agent will be deterministic instead of stochastic +# Options are: +# True +# False +deterministic: True + +# Sets what view of the environment the deterministic hardcoded agent has. The default is BASIC. +# Options are: +# "BASIC" (The current observation space only) +# "FULL" (Full environment view with actions taken and reward feedback) +hard_coded_agent_view: FULL # Sets How the Action Space is defined: # "NODE" # "ACL" # "ANY" node and acl actions action_type: NODE +# observation space +observation_space: + # flatten: true + components: + - name: NODE_LINK_TABLE + # - name: NODE_STATUSES + # - name: LINK_TRAFFIC_LEVELS # Number of episodes to run per session num_episodes: 10 + # Number of time_steps per episode num_steps: 256 -# Time delay between steps (for generic agents) -time_delay: 10 -# Type of session to be run (TRAINING or EVALUATION) -session_type: TRAINING -# Determine whether to load an agent from file -load_agent: False -# File path and file name of agent if you're loading one in -agent_load_file: C:\[Path]\[agent_saved_filename.zip] + +# Sets how often the agent will save a checkpoint (every n time episodes). +# Set to 0 if no checkpoints are required. Default is 10 +checkpoint_every_n_episodes: 0 + +# Time delay (milliseconds) between steps for CUSTOM agents. +time_delay: 5 + +# Type of session to be run. Options are: +# "TRAIN" (Trains an agent) +# "EVAL" (Evaluates an agent) +# "TRAIN_EVAL" (Trains then evaluates an agent) +session_type: TRAIN_EVAL # Environment config values # The high value for the observation space observation_space_high_value: 1000000000 +# The Stable Baselines3 learn/eval output verbosity level: +# Options are: +# "NONE" (No Output) +# "INFO" (Info Messages (such as devices and wrappers used)) +# "DEBUG" (All Messages) +sb3_output_verbose_level: NONE + # Reward values # Generic all_ok: 0 diff --git a/tests/config/e2e/deterministic_test_outputs/deterministic_a2c.csv b/tests/config/e2e/deterministic_test_outputs/deterministic_a2c.csv deleted file mode 100644 index 8f1a8912..00000000 --- a/tests/config/e2e/deterministic_test_outputs/deterministic_a2c.csv +++ /dev/null @@ -1,61 +0,0 @@ -Timestamp,Episode,Step,Reward,AS_0,OSI_0_0,OSI_0_1,OSI_0_2,OSI_0_3,OSI_0_4,OSI_0_5,OSI_0_6,OSI_1_0,OSI_1_1,OSI_1_2,OSI_1_3,OSI_1_4,OSI_1_5,OSI_1_6,OSI_2_0,OSI_2_1,OSI_2_2,OSI_2_3,OSI_2_4,OSI_2_5,OSI_2_6,OSI_3_0,OSI_3_1,OSI_3_2,OSI_3_3,OSI_3_4,OSI_3_5,OSI_3_6,OSI_4_0,OSI_4_1,OSI_4_2,OSI_4_3,OSI_4_4,OSI_4_5,OSI_4_6,OSI_5_0,OSI_5_1,OSI_5_2,OSI_5_3,OSI_5_4,OSI_5_5,OSI_5_6,OSI_6_0,OSI_6_1,OSI_6_2,OSI_6_3,OSI_6_4,OSI_6_5,OSI_6_6,OSI_7_0,OSI_7_1,OSI_7_2,OSI_7_3,OSI_7_4,OSI_7_5,OSI_7_6,OSI_8_0,OSI_8_1,OSI_8_2,OSI_8_3,OSI_8_4,OSI_8_5,OSI_8_6,OSI_9_0,OSI_9_1,OSI_9_2,OSI_9_3,OSI_9_4,OSI_9_5,OSI_9_6,OSI_10_0,OSI_10_1,OSI_10_2,OSI_10_3,OSI_10_4,OSI_10_5,OSI_10_6,OSI_11_0,OSI_11_1,OSI_11_2,OSI_11_3,OSI_11_4,OSI_11_5,OSI_11_6,OSI_12_0,OSI_12_1,OSI_12_2,OSI_12_3,OSI_12_4,OSI_12_5,OSI_12_6,OSI_13_0,OSI_13_1,OSI_13_2,OSI_13_3,OSI_13_4,OSI_13_5,OSI_13_6,OSI_14_0,OSI_14_1,OSI_14_2,OSI_14_3,OSI_14_4,OSI_14_5,OSI_14_6,OSI_15_0,OSI_15_1,OSI_15_2,OSI_15_3,OSI_15_4,OSI_15_5,OSI_15_6,OSI_16_0,OSI_16_1,OSI_16_2,OSI_16_3,OSI_16_4,OSI_16_5,OSI_16_6,OSI_17_0,OSI_17_1,OSI_17_2,OSI_17_3,OSI_17_4,OSI_17_5,OSI_17_6,OSN_0_0,OSN_0_1,OSN_0_2,OSN_0_3,OSN_0_4,OSN_0_5,OSN_0_6,OSN_1_0,OSN_1_1,OSN_1_2,OSN_1_3,OSN_1_4,OSN_1_5,OSN_1_6,OSN_2_0,OSN_2_1,OSN_2_2,OSN_2_3,OSN_2_4,OSN_2_5,OSN_2_6,OSN_3_0,OSN_3_1,OSN_3_2,OSN_3_3,OSN_3_4,OSN_3_5,OSN_3_6,OSN_4_0,OSN_4_1,OSN_4_2,OSN_4_3,OSN_4_4,OSN_4_5,OSN_4_6,OSN_5_0,OSN_5_1,OSN_5_2,OSN_5_3,OSN_5_4,OSN_5_5,OSN_5_6,OSN_6_0,OSN_6_1,OSN_6_2,OSN_6_3,OSN_6_4,OSN_6_5,OSN_6_6,OSN_7_0,OSN_7_1,OSN_7_2,OSN_7_3,OSN_7_4,OSN_7_5,OSN_7_6,OSN_8_0,OSN_8_1,OSN_8_2,OSN_8_3,OSN_8_4,OSN_8_5,OSN_8_6,OSN_9_0,OSN_9_1,OSN_9_2,OSN_9_3,OSN_9_4,OSN_9_5,OSN_9_6,OSN_10_0,OSN_10_1,OSN_10_2,OSN_10_3,OSN_10_4,OSN_10_5,OSN_10_6,OSN_11_0,OSN_11_1,OSN_11_2,OSN_11_3,OSN_11_4,OSN_11_5,OSN_11_6,OSN_12_0,OSN_12_1,OSN_12_2,OSN_12_3,OSN_12_4,OSN_12_5,OSN_12_6,OSN_13_0,OSN_13_1,OSN_13_2,OSN_13_3,OSN_13_4,OSN_13_5,OSN_13_6,OSN_14_0,OSN_14_1,OSN_14_2,OSN_14_3,OSN_14_4,OSN_14_5,OSN_14_6,OSN_15_0,OSN_15_1,OSN_15_2,OSN_15_3,OSN_15_4,OSN_15_5,OSN_15_6,OSN_16_0,OSN_16_1,OSN_16_2,OSN_16_3,OSN_16_4,OSN_16_5,OSN_16_6,OSN_17_0,OSN_17_1,OSN_17_2,OSN_17_3,OSN_17_4,OSN_17_5,OSN_17_6 -2023-06-20 10:34:31.092446,1,1,0,204,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,0,0,0,11,0,0,0,0,0,0,12,0,0,0,0,0,0,13,0,0,0,0,0,0,14,0,0,0,0,0,0,15,0,0,0,0,0,0,16,0,0,0,0,0,0,17,0,0,0,0,0,0,18,0,0,0,0,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.113447,1,2,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.144446,1,3,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.173448,1,4,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.201447,1,5,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.219447,1,6,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.247447,1,7,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.264447,1,8,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.284447,1,9,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.304447,1,10,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.320447,1,11,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.345450,1,12,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.362448,1,13,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.378449,1,14,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.397451,1,15,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.414448,1,16,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.430452,1,17,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.453449,1,18,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.470451,1,19,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.488450,1,20,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.504450,2,1,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.521451,2,2,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.545452,2,3,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.568453,2,4,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.587451,2,5,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.603453,2,6,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.619454,2,7,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.638454,2,8,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.658452,2,9,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.681452,2,10,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.698454,2,11,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.726452,2,12,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.741451,2,13,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.769455,2,14,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.787452,2,15,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.817452,2,16,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.841454,2,17,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.862454,2,18,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.880454,2,19,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.898459,2,20,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.918455,3,1,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.941453,3,2,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.964454,3,3,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:31.982456,3,4,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:32.005454,3,5,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:32.036456,3,6,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:32.061459,3,7,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:32.078456,3,8,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:32.096459,3,9,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:32.122458,3,10,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:32.146459,3,11,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:32.175456,3,12,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:32.198466,3,13,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:32.217456,3,14,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:32.235457,3,15,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:32.258458,3,16,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:32.280457,3,17,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:32.297457,3,18,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:32.318459,3,19,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:34:32.345468,3,20,0,4,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 diff --git a/tests/config/e2e/deterministic_test_outputs/deterministic_generic.csv b/tests/config/e2e/deterministic_test_outputs/deterministic_generic.csv deleted file mode 100644 index 4498ecdf..00000000 --- a/tests/config/e2e/deterministic_test_outputs/deterministic_generic.csv +++ /dev/null @@ -1,4 +0,0 @@ -Episode,Average Reward -0,0 -1,-10.5 -2,-1.0 diff --git a/tests/config/e2e/deterministic_test_outputs/deterministic_ppo.csv b/tests/config/e2e/deterministic_test_outputs/deterministic_ppo.csv deleted file mode 100644 index 61d7d35a..00000000 --- a/tests/config/e2e/deterministic_test_outputs/deterministic_ppo.csv +++ /dev/null @@ -1,61 +0,0 @@ -Timestamp,Episode,Step,Reward,AS_0,OSI_0_0,OSI_0_1,OSI_0_2,OSI_0_3,OSI_0_4,OSI_0_5,OSI_0_6,OSI_1_0,OSI_1_1,OSI_1_2,OSI_1_3,OSI_1_4,OSI_1_5,OSI_1_6,OSI_2_0,OSI_2_1,OSI_2_2,OSI_2_3,OSI_2_4,OSI_2_5,OSI_2_6,OSI_3_0,OSI_3_1,OSI_3_2,OSI_3_3,OSI_3_4,OSI_3_5,OSI_3_6,OSI_4_0,OSI_4_1,OSI_4_2,OSI_4_3,OSI_4_4,OSI_4_5,OSI_4_6,OSI_5_0,OSI_5_1,OSI_5_2,OSI_5_3,OSI_5_4,OSI_5_5,OSI_5_6,OSI_6_0,OSI_6_1,OSI_6_2,OSI_6_3,OSI_6_4,OSI_6_5,OSI_6_6,OSI_7_0,OSI_7_1,OSI_7_2,OSI_7_3,OSI_7_4,OSI_7_5,OSI_7_6,OSI_8_0,OSI_8_1,OSI_8_2,OSI_8_3,OSI_8_4,OSI_8_5,OSI_8_6,OSI_9_0,OSI_9_1,OSI_9_2,OSI_9_3,OSI_9_4,OSI_9_5,OSI_9_6,OSI_10_0,OSI_10_1,OSI_10_2,OSI_10_3,OSI_10_4,OSI_10_5,OSI_10_6,OSI_11_0,OSI_11_1,OSI_11_2,OSI_11_3,OSI_11_4,OSI_11_5,OSI_11_6,OSI_12_0,OSI_12_1,OSI_12_2,OSI_12_3,OSI_12_4,OSI_12_5,OSI_12_6,OSI_13_0,OSI_13_1,OSI_13_2,OSI_13_3,OSI_13_4,OSI_13_5,OSI_13_6,OSI_14_0,OSI_14_1,OSI_14_2,OSI_14_3,OSI_14_4,OSI_14_5,OSI_14_6,OSI_15_0,OSI_15_1,OSI_15_2,OSI_15_3,OSI_15_4,OSI_15_5,OSI_15_6,OSI_16_0,OSI_16_1,OSI_16_2,OSI_16_3,OSI_16_4,OSI_16_5,OSI_16_6,OSI_17_0,OSI_17_1,OSI_17_2,OSI_17_3,OSI_17_4,OSI_17_5,OSI_17_6,OSN_0_0,OSN_0_1,OSN_0_2,OSN_0_3,OSN_0_4,OSN_0_5,OSN_0_6,OSN_1_0,OSN_1_1,OSN_1_2,OSN_1_3,OSN_1_4,OSN_1_5,OSN_1_6,OSN_2_0,OSN_2_1,OSN_2_2,OSN_2_3,OSN_2_4,OSN_2_5,OSN_2_6,OSN_3_0,OSN_3_1,OSN_3_2,OSN_3_3,OSN_3_4,OSN_3_5,OSN_3_6,OSN_4_0,OSN_4_1,OSN_4_2,OSN_4_3,OSN_4_4,OSN_4_5,OSN_4_6,OSN_5_0,OSN_5_1,OSN_5_2,OSN_5_3,OSN_5_4,OSN_5_5,OSN_5_6,OSN_6_0,OSN_6_1,OSN_6_2,OSN_6_3,OSN_6_4,OSN_6_5,OSN_6_6,OSN_7_0,OSN_7_1,OSN_7_2,OSN_7_3,OSN_7_4,OSN_7_5,OSN_7_6,OSN_8_0,OSN_8_1,OSN_8_2,OSN_8_3,OSN_8_4,OSN_8_5,OSN_8_6,OSN_9_0,OSN_9_1,OSN_9_2,OSN_9_3,OSN_9_4,OSN_9_5,OSN_9_6,OSN_10_0,OSN_10_1,OSN_10_2,OSN_10_3,OSN_10_4,OSN_10_5,OSN_10_6,OSN_11_0,OSN_11_1,OSN_11_2,OSN_11_3,OSN_11_4,OSN_11_5,OSN_11_6,OSN_12_0,OSN_12_1,OSN_12_2,OSN_12_3,OSN_12_4,OSN_12_5,OSN_12_6,OSN_13_0,OSN_13_1,OSN_13_2,OSN_13_3,OSN_13_4,OSN_13_5,OSN_13_6,OSN_14_0,OSN_14_1,OSN_14_2,OSN_14_3,OSN_14_4,OSN_14_5,OSN_14_6,OSN_15_0,OSN_15_1,OSN_15_2,OSN_15_3,OSN_15_4,OSN_15_5,OSN_15_6,OSN_16_0,OSN_16_1,OSN_16_2,OSN_16_3,OSN_16_4,OSN_16_5,OSN_16_6,OSN_17_0,OSN_17_1,OSN_17_2,OSN_17_3,OSN_17_4,OSN_17_5,OSN_17_6 -2023-06-20 10:31:20.769116,1,1,0,1084,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,0,0,0,11,0,0,0,0,0,0,12,0,0,0,0,0,0,13,0,0,0,0,0,0,14,0,0,0,0,0,0,15,0,0,0,0,0,0,16,0,0,0,0,0,0,17,0,0,0,0,0,0,18,0,0,0,0,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.772116,1,2,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.775116,1,3,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.778116,1,4,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.781116,1,5,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.785116,1,6,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.788116,1,7,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.791116,1,8,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.794116,1,9,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.797116,1,10,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.803115,1,11,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.809116,1,12,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.814117,1,13,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.817117,1,14,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.820117,1,15,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.823117,1,16,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.827117,1,17,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.830117,1,18,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.833119,1,19,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.837117,1,20,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.840117,2,1,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.843117,2,2,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.847116,2,3,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.850116,2,4,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.854116,2,5,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.857117,2,6,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.860116,2,7,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.863117,2,8,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.866117,2,9,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.870118,2,10,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.874117,2,11,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.877119,2,12,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.881117,2,13,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.884121,2,14,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.887119,2,15,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.891119,2,16,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.894117,2,17,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.898118,2,18,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.901118,2,19,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.904117,2,20,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.908117,3,1,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.911117,3,2,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.915117,3,3,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.918117,3,4,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.921117,3,5,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.927117,3,6,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.933118,3,7,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.938118,3,8,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.942118,3,9,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.947120,3,10,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.952118,3,11,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.956118,3,12,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.960118,3,13,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.964118,3,14,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.967118,3,15,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.971118,3,16,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.975118,3,17,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.978118,3,18,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.981118,3,19,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 -2023-06-20 10:31:20.987118,3,20,0,1487,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0,1,1,1,1,1,0,1,2,1,1,1,1,0,0,3,1,1,1,0,0,0,4,1,1,1,1,0,1,5,1,1,1,1,0,1,6,1,1,1,0,0,0,7,1,1,1,1,1,0,8,1,1,1,1,1,1,9,1,1,1,1,0,0,10,0,0,0,70000,0,0,11,0,0,0,70000,0,0,12,0,0,0,140000,0,0,13,0,0,0,0,0,0,14,0,0,0,140000,0,0,15,0,0,0,30000,0,0,16,0,0,0,50000,105000,0,17,0,0,0,10000,105000,0,18,0,0,0,110000,0,0 diff --git a/tests/config/e2e/generic_deterministic_seeded_training_config.yaml b/tests/config/e2e/generic_deterministic_seeded_training_config.yaml deleted file mode 100644 index 5c5426d3..00000000 --- a/tests/config/e2e/generic_deterministic_seeded_training_config.yaml +++ /dev/null @@ -1,98 +0,0 @@ -# Main Config File - -# Generic config values -# Choose one of these (dependent on Agent being trained) -# "STABLE_BASELINES3_PPO" -# "STABLE_BASELINES3_A2C" -# "GENERIC" -agent_identifier: GENERIC -# Sets How the Action Space is defined: -# "NODE" -# "ACL" -# "ANY" node and acl actions -action_type: ANY -# Number of episodes to run per session -num_episodes: 3 -# Number of time_steps per episode -num_steps: 20 -# Time delay between steps (for generic agents) -time_delay: 1 -# Type of session to be run (TRAINING or EVALUATION) -session_type: TRAINING -# Determine whether to load an agent from file -load_agent: False -# File path and file name of agent if you're loading one in -agent_load_file: C:\[Path]\[agent_saved_filename.zip] - -# Environment config values -# The high value for the observation space -observation_space_high_value: 1000000000 - -# Reward values -# Generic -all_ok: 0 -# Node Operating State -off_should_be_on: -10 -off_should_be_resetting: -5 -on_should_be_off: -2 -on_should_be_resetting: -5 -resetting_should_be_on: -5 -resetting_should_be_off: -2 -resetting: -3 -# Node O/S or Service State -good_should_be_patching: 2 -good_should_be_compromised: 5 -good_should_be_overwhelmed: 5 -patching_should_be_good: -5 -patching_should_be_compromised: 2 -patching_should_be_overwhelmed: 2 -patching: -3 -compromised_should_be_good: -20 -compromised_should_be_patching: -20 -compromised_should_be_overwhelmed: -20 -compromised: -20 -overwhelmed_should_be_good: -20 -overwhelmed_should_be_patching: -20 -overwhelmed_should_be_compromised: -20 -overwhelmed: -20 -# Node File System State -good_should_be_repairing: 2 -good_should_be_restoring: 2 -good_should_be_corrupt: 5 -good_should_be_destroyed: 10 -repairing_should_be_good: -5 -repairing_should_be_restoring: 2 -repairing_should_be_corrupt: 2 -repairing_should_be_destroyed: 0 -repairing: -3 -restoring_should_be_good: -10 -restoring_should_be_repairing: -2 -restoring_should_be_corrupt: 1 -restoring_should_be_destroyed: 2 -restoring: -6 -corrupt_should_be_good: -10 -corrupt_should_be_repairing: -10 -corrupt_should_be_restoring: -10 -corrupt_should_be_destroyed: 2 -corrupt: -10 -destroyed_should_be_good: -20 -destroyed_should_be_repairing: -20 -destroyed_should_be_restoring: -20 -destroyed_should_be_corrupt: -20 -destroyed: -20 -scanning: -2 -# IER status -red_ier_running: -5 -green_ier_blocked: -10 - -# Patching / Reset durations -os_patching_duration: 5 # The time taken to patch the OS -node_reset_duration: 5 # The time taken to reset a node (hardware) -service_patching_duration: 5 # The time taken to patch a service -file_system_repairing_limit: 5 # The time take to repair the file system -file_system_restoring_limit: 5 # The time take to restore the file system -file_system_scanning_limit: 5 # The time taken to scan the file system - -# deterministic -deterministic: False -seed: 1 diff --git a/tests/config/e2e/ppo_deterministic_seeded_training_config.yaml b/tests/config/e2e/ppo_deterministic_seeded_training_config.yaml deleted file mode 100644 index 4dbf7cef..00000000 --- a/tests/config/e2e/ppo_deterministic_seeded_training_config.yaml +++ /dev/null @@ -1,98 +0,0 @@ -# Main Config File - -# Generic config values -# Choose one of these (dependent on Agent being trained) -# "STABLE_BASELINES3_PPO" -# "STABLE_BASELINES3_A2C" -# "GENERIC" -agent_identifier: STABLE_BASELINES3_PPO -# Sets How the Action Space is defined: -# "NODE" -# "ACL" -# "ANY" node and acl actions -action_type: ANY -# Number of episodes to run per session -num_episodes: 3 -# Number of time_steps per episode -num_steps: 20 -# Time delay between steps (for generic agents) -time_delay: 1 -# Type of session to be run (TRAINING or EVALUATION) -session_type: TRAINING -# Determine whether to load an agent from file -load_agent: False -# File path and file name of agent if you're loading one in -agent_load_file: C:\[Path]\[agent_saved_filename.zip] - -# Environment config values -# The high value for the observation space -observation_space_high_value: 1000000000 - -# Reward values -# Generic -all_ok: 0 -# Node Operating State -off_should_be_on: -10 -off_should_be_resetting: -5 -on_should_be_off: -2 -on_should_be_resetting: -5 -resetting_should_be_on: -5 -resetting_should_be_off: -2 -resetting: -3 -# Node O/S or Service State -good_should_be_patching: 2 -good_should_be_compromised: 5 -good_should_be_overwhelmed: 5 -patching_should_be_good: -5 -patching_should_be_compromised: 2 -patching_should_be_overwhelmed: 2 -patching: -3 -compromised_should_be_good: -20 -compromised_should_be_patching: -20 -compromised_should_be_overwhelmed: -20 -compromised: -20 -overwhelmed_should_be_good: -20 -overwhelmed_should_be_patching: -20 -overwhelmed_should_be_compromised: -20 -overwhelmed: -20 -# Node File System State -good_should_be_repairing: 2 -good_should_be_restoring: 2 -good_should_be_corrupt: 5 -good_should_be_destroyed: 10 -repairing_should_be_good: -5 -repairing_should_be_restoring: 2 -repairing_should_be_corrupt: 2 -repairing_should_be_destroyed: 0 -repairing: -3 -restoring_should_be_good: -10 -restoring_should_be_repairing: -2 -restoring_should_be_corrupt: 1 -restoring_should_be_destroyed: 2 -restoring: -6 -corrupt_should_be_good: -10 -corrupt_should_be_repairing: -10 -corrupt_should_be_restoring: -10 -corrupt_should_be_destroyed: 2 -corrupt: -10 -destroyed_should_be_good: -20 -destroyed_should_be_repairing: -20 -destroyed_should_be_restoring: -20 -destroyed_should_be_corrupt: -20 -destroyed: -20 -scanning: -2 -# IER status -red_ier_running: -5 -green_ier_blocked: -10 - -# Patching / Reset durations -os_patching_duration: 5 # The time taken to patch the OS -node_reset_duration: 5 # The time taken to reset a node (hardware) -service_patching_duration: 5 # The time taken to patch a service -file_system_repairing_limit: 5 # The time take to repair the file system -file_system_restoring_limit: 5 # The time take to restore the file system -file_system_scanning_limit: 5 # The time taken to scan the file system - -# deterministic -deterministic: False -seed: 1 diff --git a/tests/config/e2e/ppo_seeded_training_config.yaml b/tests/config/e2e/ppo_seeded_training_config.yaml new file mode 100644 index 00000000..181331d9 --- /dev/null +++ b/tests/config/e2e/ppo_seeded_training_config.yaml @@ -0,0 +1,155 @@ +# Training Config File + +# Sets which agent algorithm framework will be used. +# Options are: +# "SB3" (Stable Baselines3) +# "RLLIB" (Ray RLlib) +# "CUSTOM" (Custom Agent) +agent_framework: SB3 + +# Sets which deep learning framework will be used (by RLlib ONLY). +# Default is TF (Tensorflow). +# Options are: +# "TF" (Tensorflow) +# TF2 (Tensorflow 2.X) +# TORCH (PyTorch) +deep_learning_framework: TF2 + +# Sets which Agent class will be used. +# Options are: +# "A2C" (Advantage Actor Critic coupled with either SB3 or RLLIB agent_framework) +# "PPO" (Proximal Policy Optimization coupled with either SB3 or RLLIB agent_framework) +# "HARDCODED" (The HardCoded agents coupled with an ACL or NODE action_type) +# "DO_NOTHING" (The DoNothing agents coupled with an ACL or NODE action_type) +# "RANDOM" (primaite.agents.simple.RandomAgent) +# "DUMMY" (primaite.agents.simple.DummyAgent) +agent_identifier: PPO + +# Sets whether Red Agent POL and IER is randomised. +# Options are: +# True +# False +random_red_agent: False + +# The (integer) seed to be used in random number generation +# Default is None (null) +seed: 67890 + +# Set whether the agent will be deterministic instead of stochastic +# Options are: +# True +# False +deterministic: True + +# Sets what view of the environment the deterministic hardcoded agent has. The default is BASIC. +# Options are: +# "BASIC" (The current observation space only) +# "FULL" (Full environment view with actions taken and reward feedback) +hard_coded_agent_view: FULL + +# Sets How the Action Space is defined: +# "NODE" +# "ACL" +# "ANY" node and acl actions +action_type: NODE +# observation space +observation_space: + # flatten: true + components: + - name: NODE_LINK_TABLE + # - name: NODE_STATUSES + # - name: LINK_TRAFFIC_LEVELS +# Number of episodes to run per session +num_episodes: 10 + +# Number of time_steps per episode +num_steps: 256 + +# Sets how often the agent will save a checkpoint (every n time episodes). +# Set to 0 if no checkpoints are required. Default is 10 +checkpoint_every_n_episodes: 0 + +# Time delay (milliseconds) between steps for CUSTOM agents. +time_delay: 5 + +# Type of session to be run. Options are: +# "TRAIN" (Trains an agent) +# "EVAL" (Evaluates an agent) +# "TRAIN_EVAL" (Trains then evaluates an agent) +session_type: TRAIN_EVAL + +# Environment config values +# The high value for the observation space +observation_space_high_value: 1000000000 + +# The Stable Baselines3 learn/eval output verbosity level: +# Options are: +# "NONE" (No Output) +# "INFO" (Info Messages (such as devices and wrappers used)) +# "DEBUG" (All Messages) +sb3_output_verbose_level: NONE + +# Reward values +# Generic +all_ok: 0 +# Node Hardware State +off_should_be_on: -10 +off_should_be_resetting: -5 +on_should_be_off: -2 +on_should_be_resetting: -5 +resetting_should_be_on: -5 +resetting_should_be_off: -2 +resetting: -3 +# Node Software or Service State +good_should_be_patching: 2 +good_should_be_compromised: 5 +good_should_be_overwhelmed: 5 +patching_should_be_good: -5 +patching_should_be_compromised: 2 +patching_should_be_overwhelmed: 2 +patching: -3 +compromised_should_be_good: -20 +compromised_should_be_patching: -20 +compromised_should_be_overwhelmed: -20 +compromised: -20 +overwhelmed_should_be_good: -20 +overwhelmed_should_be_patching: -20 +overwhelmed_should_be_compromised: -20 +overwhelmed: -20 +# Node File System State +good_should_be_repairing: 2 +good_should_be_restoring: 2 +good_should_be_corrupt: 5 +good_should_be_destroyed: 10 +repairing_should_be_good: -5 +repairing_should_be_restoring: 2 +repairing_should_be_corrupt: 2 +repairing_should_be_destroyed: 0 +repairing: -3 +restoring_should_be_good: -10 +restoring_should_be_repairing: -2 +restoring_should_be_corrupt: 1 +restoring_should_be_destroyed: 2 +restoring: -6 +corrupt_should_be_good: -10 +corrupt_should_be_repairing: -10 +corrupt_should_be_restoring: -10 +corrupt_should_be_destroyed: 2 +corrupt: -10 +destroyed_should_be_good: -20 +destroyed_should_be_repairing: -20 +destroyed_should_be_restoring: -20 +destroyed_should_be_corrupt: -20 +destroyed: -20 +scanning: -2 +# IER status +red_ier_running: -5 +green_ier_blocked: -10 + +# Patching / Reset durations +os_patching_duration: 5 # The time taken to patch the OS +node_reset_duration: 5 # The time taken to reset a node (hardware) +service_patching_duration: 5 # The time taken to patch a service +file_system_repairing_limit: 5 # The time take to repair the file system +file_system_restoring_limit: 5 # The time take to restore the file system +file_system_scanning_limit: 5 # The time taken to scan the file system diff --git a/tests/conftest.py b/tests/conftest.py index 8365c8ae..af76b314 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -8,7 +8,6 @@ from pathlib import Path from typing import Dict, Union from unittest.mock import patch -import pandas as pd import pytest from primaite import getLogger @@ -186,36 +185,3 @@ def run_generic(env, config_values): # env.reset() # env.close() - - -def compare_file_content(output_a_file_path: str, output_b_file_path: str): - """Function used to check if output of both given files are the same.""" - with open(output_a_file_path) as f1: - with open(output_b_file_path) as f2: - f1_content = f1.read() - f2_content = f2.read() - - # check that both files are not empty and are matching - if len(f1_content) > 0 and len(f2_content) > 0 and f1_content == f2_content: - # both files have the same content - return True - # both files have different content - print(f"{output_a_file_path} and {output_b_file_path} has different contents") - - return False - - -def compare_transaction_file(output_a_file_path: str, output_b_file_path: str): - """Function used to check if contents of transaction files are the same.""" - # load output a file - data_a = pd.read_csv(output_a_file_path) - - # load output b file - data_b = pd.read_csv(output_b_file_path) - - # remove the time stamp column - data_a.drop("Timestamp", inplace=True, axis=1) - data_b.drop("Timestamp", inplace=True, axis=1) - - # if the comparison is empty, both files are the same i.e. True - return data_a.compare(data_b).empty diff --git a/tests/e2e_integration_tests/__init__.py b/tests/e2e_integration_tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/e2e_integration_tests/conftest.py b/tests/e2e_integration_tests/conftest.py new file mode 100644 index 00000000..2f569c9b --- /dev/null +++ b/tests/e2e_integration_tests/conftest.py @@ -0,0 +1,21 @@ +from __future__ import annotations + +from pathlib import Path + +import polars as pl + + +def compare_transaction_file(output_a_file_path: str | Path, output_b_file_path: str | Path): + """Function used to check if contents of transaction files are the same.""" + # load output a file + data_a = pl.read_csv(output_a_file_path) + + # load output b file + data_b = pl.read_csv(output_b_file_path) + + # remove the time stamp column + data_a = data_a.drop("Timestamp") + data_b = data_b.drop("Timestamp") + + # if the comparison is empty, both files are the same i.e. True + return data_a.frame_equal(data_b) diff --git a/tests/e2e_integration_tests/test_session_repeatability.py b/tests/e2e_integration_tests/test_session_repeatability.py index 91be68b2..99cb158d 100644 --- a/tests/e2e_integration_tests/test_session_repeatability.py +++ b/tests/e2e_integration_tests/test_session_repeatability.py @@ -1,3 +1,57 @@ -def temp(): - """TODO rewrite tests.""" - pass +""" +Seed tests. + +These tests will train an agent. +This agent is then loaded and evaluated twice, +the 2 evaluation wuns should be the same. + +This proves that the seed works. +""" +import time + +from primaite.config.lay_down_config import dos_very_basic_config_path +from primaite.primaite_session import PrimaiteSession +from tests import TEST_CONFIG_ROOT + + +def test_seeded_sessions(): + """Test to see if seed works in multiple sessions.""" + # ppo training session + ppo_train = PrimaiteSession(TEST_CONFIG_ROOT / "e2e/ppo_seeded_training_config.yaml", dos_very_basic_config_path()) + # train agent + ppo_train.setup() + ppo_train.learn() + ppo_train.close() + + # agent path to use for evaluation + path_prefix = f"{ppo_train._training_config.agent_framework}_{ppo_train._training_config.agent_identifier}" + agent_path = ppo_train.session_path / f"{path_prefix}_{ppo_train.timestamp_str}.zip" + + ppo_session_1 = PrimaiteSession( + TEST_CONFIG_ROOT / "e2e/ppo_seeded_training_config.yaml", dos_very_basic_config_path() + ) + + # load trained agent + ppo_session_1._training_config.agent_load_file = agent_path + ppo_session_1.setup() + time.sleep(1) + + ppo_session_2 = PrimaiteSession( + TEST_CONFIG_ROOT / "e2e/ppo_seeded_training_config.yaml", dos_very_basic_config_path() + ) + + # load trained agent + ppo_session_2._training_config.agent_load_file = agent_path + ppo_session_2.setup() + + # run evaluation + ppo_session_1.evaluate() + ppo_session_1.close() + ppo_session_2.evaluate() + ppo_session_2.close() + + # compare output + # assert compare_transaction_file( + # ppo_session_1.evaluation_path / f"all_transactions_{ppo_session_1.timestamp_str}.csv", + # ppo_session_2.evaluation_path / f"all_transactions_{ppo_session_2.timestamp_str}.csv" + # ) is True From 8faf9d70a00edc7259709b365fa0667727d4b1f0 Mon Sep 17 00:00:00 2001 From: Chris McCarthy Date: Thu, 6 Jul 2023 10:07:54 +0100 Subject: [PATCH 08/17] temp --- src/primaite/agents/agent.py | 8 ++++- src/primaite/agents/rllib.py | 58 +++++++++++++++++++++++++++--------- src/primaite/agents/sb3.py | 15 ++++++---- 3 files changed, 60 insertions(+), 21 deletions(-) diff --git a/src/primaite/agents/agent.py b/src/primaite/agents/agent.py index 685fe776..fecf84d0 100644 --- a/src/primaite/agents/agent.py +++ b/src/primaite/agents/agent.py @@ -257,10 +257,16 @@ class AgentSessionABC(ABC): raise FileNotFoundError(msg) pass + @property + def _saved_agent_path(self) -> Path: + file_name = (f"{self._training_config.agent_framework}_" + f"{self._training_config.agent_identifier}_" + f"{self.timestamp_str}.zip") + return self.learning_path / file_name @abstractmethod def save(self): """Save the agent.""" - self._agent.save(self.session_path) + pass @abstractmethod def export(self): diff --git a/src/primaite/agents/rllib.py b/src/primaite/agents/rllib.py index d851ba9c..32dc3dc0 100644 --- a/src/primaite/agents/rllib.py +++ b/src/primaite/agents/rllib.py @@ -1,9 +1,11 @@ from __future__ import annotations import json +import shutil from datetime import datetime from pathlib import Path from typing import Union +from uuid import uuid4 from ray.rllib.algorithms import Algorithm from ray.rllib.algorithms.a2c import A2CConfig @@ -83,8 +85,10 @@ class RLlibAgent(AgentSessionABC): metadata_dict = json.load(file) metadata_dict["end_datetime"] = datetime.now().isoformat() - metadata_dict["total_episodes"] = self._current_result["episodes_total"] - metadata_dict["total_time_steps"] = self._current_result["timesteps_total"] + metadata_dict["total_episodes"] = self._current_result[ + "episodes_total"] + metadata_dict["total_time_steps"] = self._current_result[ + "timesteps_total"] filepath = self.session_path / "session_metadata.json" _LOGGER.debug(f"Updating Session Metadata file: {filepath}") @@ -107,7 +111,8 @@ class RLlibAgent(AgentSessionABC): ), ) - self._agent_config.training(train_batch_size=self._training_config.num_steps) + self._agent_config.training( + train_batch_size=self._training_config.num_steps) self._agent_config.framework(framework="tf") self._agent_config.rollouts( @@ -115,18 +120,21 @@ class RLlibAgent(AgentSessionABC): num_envs_per_worker=1, horizon=self._training_config.num_steps, ) - self._agent: Algorithm = self._agent_config.build(logger_creator=_custom_log_creator(self.learning_path)) + self._agent: Algorithm = self._agent_config.build( + logger_creator=_custom_log_creator(self.learning_path)) def _save_checkpoint(self): checkpoint_n = self._training_config.checkpoint_every_n_episodes episode_count = self._current_result["episodes_total"] - if checkpoint_n > 0 and episode_count > 0: - if (episode_count % checkpoint_n == 0) or (episode_count == self._training_config.num_episodes): - self._agent.save(str(self.checkpoints_path)) + save_checkpoint = False + if checkpoint_n: + save_checkpoint = episode_count % checkpoint_n == 0 + if episode_count and save_checkpoint: + self._agent.save(str(self.checkpoints_path)) def learn( - self, - **kwargs, + self, + **kwargs, ): """ Evaluate the agent. @@ -136,16 +144,18 @@ class RLlibAgent(AgentSessionABC): time_steps = self._training_config.num_steps episodes = self._training_config.num_episodes - _LOGGER.info(f"Beginning learning for {episodes} episodes @" f" {time_steps} time steps...") + _LOGGER.info( + f"Beginning learning for {episodes} episodes @" f" {time_steps} time steps...") for i in range(episodes): self._current_result = self._agent.train() self._save_checkpoint() + self.save() self._agent.stop() super().learn() def evaluate( - self, - **kwargs, + self, + **kwargs, ): """ Evaluate the agent. @@ -162,9 +172,29 @@ class RLlibAgent(AgentSessionABC): """Load an agent from file.""" raise NotImplementedError - def save(self): + def save(self, overwrite_existing: bool = True): """Save the agent.""" - raise NotImplementedError + # Make temp dir to save in isolation + temp_dir = self.learning_path / str(uuid4()) + temp_dir.mkdir() + + # Save the agent to the temp dir + self._agent.save(str(temp_dir)) + + # Capture the saved Rllib checkpoint inside the temp directory + for file in temp_dir.iterdir(): + checkpoint_dir = file + break + + shutil.make_archive( + str(self._saved_agent_path).replace(".zip", ""), + "zip", + checkpoint_dir # noqa + ) + + # Drop the temp directory + shutil.rmtree(temp_dir) + def export(self): """Export the agent to transportable file format.""" diff --git a/src/primaite/agents/sb3.py b/src/primaite/agents/sb3.py index f5ac44cb..18e208e4 100644 --- a/src/primaite/agents/sb3.py +++ b/src/primaite/agents/sb3.py @@ -64,11 +64,13 @@ class SB3Agent(AgentSessionABC): def _save_checkpoint(self): checkpoint_n = self._training_config.checkpoint_every_n_episodes episode_count = self._env.episode_count - if checkpoint_n > 0 and episode_count > 0: - if (episode_count % checkpoint_n == 0) or (episode_count == self._training_config.num_episodes): - checkpoint_path = self.checkpoints_path / f"sb3ppo_{episode_count}.zip" - self._agent.save(checkpoint_path) - _LOGGER.debug(f"Saved agent checkpoint: {checkpoint_path}") + save_checkpoint = False + if checkpoint_n: + save_checkpoint = episode_count % checkpoint_n == 0 + if episode_count and save_checkpoint: + checkpoint_path = self.checkpoints_path / f"sb3ppo_{episode_count}.zip" + self._agent.save(checkpoint_path) + _LOGGER.debug(f"Saved agent checkpoint: {checkpoint_path}") def _get_latest_checkpoint(self): pass @@ -90,6 +92,7 @@ class SB3Agent(AgentSessionABC): self._agent.learn(total_timesteps=time_steps) self._save_checkpoint() self._env.reset() + self.save() self._env.close() super().learn() @@ -134,7 +137,7 @@ class SB3Agent(AgentSessionABC): def save(self): """Save the agent.""" - raise NotImplementedError + self._agent.save(self._saved_agent_path) def export(self): """Export the agent to transportable file format.""" From e174db5d9eac280ca472231aa11822362c5db2a8 Mon Sep 17 00:00:00 2001 From: Marek Wolan Date: Thu, 6 Jul 2023 10:51:34 +0100 Subject: [PATCH 09/17] Rescaled default rewards by a factor of 1/10000 --- .../training/training_config_main.yaml | 98 ++++++++--------- .../training_config_random_red_agent.yaml | 100 +++++++++--------- 2 files changed, 99 insertions(+), 99 deletions(-) diff --git a/src/primaite/config/_package_data/training/training_config_main.yaml b/src/primaite/config/_package_data/training/training_config_main.yaml index a638fe14..7e7f239d 100644 --- a/src/primaite/config/_package_data/training/training_config_main.yaml +++ b/src/primaite/config/_package_data/training/training_config_main.yaml @@ -83,58 +83,58 @@ sb3_output_verbose_level: NONE # Generic all_ok: 0 # Node Hardware State -off_should_be_on: -10 -off_should_be_resetting: -5 -on_should_be_off: -2 -on_should_be_resetting: -5 -resetting_should_be_on: -5 -resetting_should_be_off: -2 -resetting: -3 +off_should_be_on: -0.001 +off_should_be_resetting: -0.0005 +on_should_be_off: -0.0002 +on_should_be_resetting: -0.0005 +resetting_should_be_on: -0.0005 +resetting_should_be_off: -0.0002 +resetting: -0.0003 # Node Software or Service State -good_should_be_patching: 2 -good_should_be_compromised: 5 -good_should_be_overwhelmed: 5 -patching_should_be_good: -5 -patching_should_be_compromised: 2 -patching_should_be_overwhelmed: 2 -patching: -3 -compromised_should_be_good: -20 -compromised_should_be_patching: -20 -compromised_should_be_overwhelmed: -20 -compromised: -20 -overwhelmed_should_be_good: -20 -overwhelmed_should_be_patching: -20 -overwhelmed_should_be_compromised: -20 -overwhelmed: -20 +good_should_be_patching: 0.0002 +good_should_be_compromised: 0.0005 +good_should_be_overwhelmed: 0.0005 +patching_should_be_good: -0.0005 +patching_should_be_compromised: 0.0002 +patching_should_be_overwhelmed: 0.0002 +patching: -0.0003 +compromised_should_be_good: -0.002 +compromised_should_be_patching: -0.002 +compromised_should_be_overwhelmed: -0.002 +compromised: -0.002 +overwhelmed_should_be_good: -0.002 +overwhelmed_should_be_patching: -0.002 +overwhelmed_should_be_compromised: -0.002 +overwhelmed: -0.002 # Node File System State -good_should_be_repairing: 2 -good_should_be_restoring: 2 -good_should_be_corrupt: 5 -good_should_be_destroyed: 10 -repairing_should_be_good: -5 -repairing_should_be_restoring: 2 -repairing_should_be_corrupt: 2 -repairing_should_be_destroyed: 0 -repairing: -3 -restoring_should_be_good: -10 -restoring_should_be_repairing: -2 -restoring_should_be_corrupt: 1 -restoring_should_be_destroyed: 2 -restoring: -6 -corrupt_should_be_good: -10 -corrupt_should_be_repairing: -10 -corrupt_should_be_restoring: -10 -corrupt_should_be_destroyed: 2 -corrupt: -10 -destroyed_should_be_good: -20 -destroyed_should_be_repairing: -20 -destroyed_should_be_restoring: -20 -destroyed_should_be_corrupt: -20 -destroyed: -20 -scanning: -2 +good_should_be_repairing: 0.0002 +good_should_be_restoring: 0.0002 +good_should_be_corrupt: 0.0005 +good_should_be_destroyed: 0.001 +repairing_should_be_good: -0.0005 +repairing_should_be_restoring: 0.0002 +repairing_should_be_corrupt: 0.0002 +repairing_should_be_destroyed: 0.0000 +repairing: -0.0003 +restoring_should_be_good: -0.001 +restoring_should_be_repairing: -0.0002 +restoring_should_be_corrupt: 0.0001 +restoring_should_be_destroyed: 0.0002 +restoring: -0.0006 +corrupt_should_be_good: -0.001 +corrupt_should_be_repairing: -0.001 +corrupt_should_be_restoring: -0.001 +corrupt_should_be_destroyed: 0.0002 +corrupt: -0.001 +destroyed_should_be_good: -0.002 +destroyed_should_be_repairing: -0.002 +destroyed_should_be_restoring: -0.002 +destroyed_should_be_corrupt: -0.002 +destroyed: -0.002 +scanning: -0.0002 # IER status -red_ier_running: -5 -green_ier_blocked: -10 +red_ier_running: -0.0005 +green_ier_blocked: -0.001 # Patching / Reset durations os_patching_duration: 5 # The time taken to patch the OS diff --git a/src/primaite/config/_package_data/training/training_config_random_red_agent.yaml b/src/primaite/config/_package_data/training/training_config_random_red_agent.yaml index 96243daf..1ccc7c38 100644 --- a/src/primaite/config/_package_data/training/training_config_random_red_agent.yaml +++ b/src/primaite/config/_package_data/training/training_config_random_red_agent.yaml @@ -37,60 +37,60 @@ observation_space_high_value: 1000000000 # Reward values # Generic -all_ok: 0 +all_ok: 0.0000 # Node Hardware State -off_should_be_on: -10 -off_should_be_resetting: -5 -on_should_be_off: -2 -on_should_be_resetting: -5 -resetting_should_be_on: -5 -resetting_should_be_off: -2 -resetting: -3 +off_should_be_on: -0.001 +off_should_be_resetting: -0.0005 +on_should_be_off: -0.0002 +on_should_be_resetting: -0.0005 +resetting_should_be_on: -0.0005 +resetting_should_be_off: -0.0002 +resetting: -0.0003 # Node Software or Service State -good_should_be_patching: 2 -good_should_be_compromised: 5 -good_should_be_overwhelmed: 5 -patching_should_be_good: -5 -patching_should_be_compromised: 2 -patching_should_be_overwhelmed: 2 -patching: -3 -compromised_should_be_good: -20 -compromised_should_be_patching: -20 -compromised_should_be_overwhelmed: -20 -compromised: -20 -overwhelmed_should_be_good: -20 -overwhelmed_should_be_patching: -20 -overwhelmed_should_be_compromised: -20 -overwhelmed: -20 +good_should_be_patching: 0.0002 +good_should_be_compromised: 0.0005 +good_should_be_overwhelmed: 0.0005 +patching_should_be_good: -0.0005 +patching_should_be_compromised: 0.0002 +patching_should_be_overwhelmed: 0.0002 +patching: -0.0003 +compromised_should_be_good: -0.002 +compromised_should_be_patching: -0.002 +compromised_should_be_overwhelmed: -0.002 +compromised: -0.002 +overwhelmed_should_be_good: -0.002 +overwhelmed_should_be_patching: -0.002 +overwhelmed_should_be_compromised: -0.002 +overwhelmed: -0.002 # Node File System State -good_should_be_repairing: 2 -good_should_be_restoring: 2 -good_should_be_corrupt: 5 -good_should_be_destroyed: 10 -repairing_should_be_good: -5 -repairing_should_be_restoring: 2 -repairing_should_be_corrupt: 2 -repairing_should_be_destroyed: 0 -repairing: -3 -restoring_should_be_good: -10 -restoring_should_be_repairing: -2 -restoring_should_be_corrupt: 1 -restoring_should_be_destroyed: 2 -restoring: -6 -corrupt_should_be_good: -10 -corrupt_should_be_repairing: -10 -corrupt_should_be_restoring: -10 -corrupt_should_be_destroyed: 2 -corrupt: -10 -destroyed_should_be_good: -20 -destroyed_should_be_repairing: -20 -destroyed_should_be_restoring: -20 -destroyed_should_be_corrupt: -20 -destroyed: -20 -scanning: -2 +good_should_be_repairing: 0.0002 +good_should_be_restoring: 0.0002 +good_should_be_corrupt: 0.0005 +good_should_be_destroyed: 0.001 +repairing_should_be_good: -0.0005 +repairing_should_be_restoring: 0.0002 +repairing_should_be_corrupt: 0.0002 +repairing_should_be_destroyed: 0.0000 +repairing: -0.0003 +restoring_should_be_good: -0.001 +restoring_should_be_repairing: -0.0002 +restoring_should_be_corrupt: 0.0001 +restoring_should_be_destroyed: 0.0002 +restoring: -0.0006 +corrupt_should_be_good: -0.001 +corrupt_should_be_repairing: -0.001 +corrupt_should_be_restoring: -0.001 +corrupt_should_be_destroyed: 0.0002 +corrupt: -0.001 +destroyed_should_be_good: -0.002 +destroyed_should_be_repairing: -0.002 +destroyed_should_be_restoring: -0.002 +destroyed_should_be_corrupt: -0.002 +destroyed: -0.002 +scanning: -0.0002 # IER status -red_ier_running: -5 -green_ier_blocked: -10 +red_ier_running: -0.0005 +green_ier_blocked: -0.001 # Patching / Reset durations os_patching_duration: 5 # The time taken to patch the OS From 3438ce7e09502cfa212dad97e22594ac62b17ff2 Mon Sep 17 00:00:00 2001 From: Chris McCarthy Date: Thu, 6 Jul 2023 11:35:44 +0100 Subject: [PATCH 10/17] #1386 - Updated tests in test_seeding_and_deterministic_session.py to use TempPrimaiteSession. - Added test_seeded_learning test and test_deterministic_evaluation test. - Passed config values seed and deterministic to ppo agent - Dropped deterministic override in evaluate functions - TempPrimaiteSession now writes files to a UUID folder rather than datetime - Added seed to Ray RLlib agent setup in rllib.py - Added seed to SB3 agent setup in sb3.py --- src/primaite/agents/agent.py | 1 + src/primaite/agents/rllib.py | 1 + src/primaite/agents/sb3.py | 10 +- .../ppo_not_seeded_training_config.yaml | 155 ++++++++++++++++++ .../{e2e => }/ppo_seeded_training_config.yaml | 0 tests/conftest.py | 1 - .../test_session_repeatability.py | 57 ------- tests/mock_and_patch/get_session_path_mock.py | 5 +- .../test_seeding_and_deterministic_session.py | 57 +++++++ 9 files changed, 222 insertions(+), 65 deletions(-) create mode 100644 tests/config/ppo_not_seeded_training_config.yaml rename tests/config/{e2e => }/ppo_seeded_training_config.yaml (100%) delete mode 100644 tests/e2e_integration_tests/test_session_repeatability.py create mode 100644 tests/test_seeding_and_deterministic_session.py diff --git a/src/primaite/agents/agent.py b/src/primaite/agents/agent.py index 4b39839a..5b76c36b 100644 --- a/src/primaite/agents/agent.py +++ b/src/primaite/agents/agent.py @@ -248,6 +248,7 @@ class AgentSessionABC(ABC): agent.session_path = path + return agent else: diff --git a/src/primaite/agents/rllib.py b/src/primaite/agents/rllib.py index 30edd93c..dcb1f5c5 100644 --- a/src/primaite/agents/rllib.py +++ b/src/primaite/agents/rllib.py @@ -106,6 +106,7 @@ class RLlibAgent(AgentSessionABC): timestamp_str=self.timestamp_str, ), ) + self._agent_config.seed = self._training_config.seed self._agent_config.training(train_batch_size=self._training_config.num_steps) self._agent_config.framework(framework="tf") diff --git a/src/primaite/agents/sb3.py b/src/primaite/agents/sb3.py index 17fbe0a6..0d031c10 100644 --- a/src/primaite/agents/sb3.py +++ b/src/primaite/agents/sb3.py @@ -59,6 +59,7 @@ class SB3Agent(AgentSessionABC): verbose=self.sb3_output_verbose_level, n_steps=self._training_config.num_steps, tensorboard_log=str(self._tensorboard_log_path), + seed=self._training_config.seed ) def _save_checkpoint(self): @@ -98,20 +99,18 @@ class SB3Agent(AgentSessionABC): def evaluate( self, - deterministic: bool = True, **kwargs, ): """ Evaluate the agent. - :param deterministic: Whether the evaluation is deterministic. :param kwargs: Any agent-specific key-word args to be passed. """ time_steps = self._training_config.num_steps episodes = self._training_config.num_episodes self._env.set_as_eval() self.is_eval = True - if deterministic: + if self._training_config.deterministic: deterministic_str = "deterministic" else: deterministic_str = "non-deterministic" @@ -122,7 +121,10 @@ class SB3Agent(AgentSessionABC): obs = self._env.reset() for step in range(time_steps): - action, _states = self._agent.predict(obs, deterministic=deterministic) + action, _states = self._agent.predict( + obs, + deterministic=self._training_config.deterministic + ) if isinstance(action, np.ndarray): action = np.int64(action) obs, rewards, done, info = self._env.step(action) diff --git a/tests/config/ppo_not_seeded_training_config.yaml b/tests/config/ppo_not_seeded_training_config.yaml new file mode 100644 index 00000000..f43c151c --- /dev/null +++ b/tests/config/ppo_not_seeded_training_config.yaml @@ -0,0 +1,155 @@ +# Training Config File + +# Sets which agent algorithm framework will be used. +# Options are: +# "SB3" (Stable Baselines3) +# "RLLIB" (Ray RLlib) +# "CUSTOM" (Custom Agent) +agent_framework: SB3 + +# Sets which deep learning framework will be used (by RLlib ONLY). +# Default is TF (Tensorflow). +# Options are: +# "TF" (Tensorflow) +# TF2 (Tensorflow 2.X) +# TORCH (PyTorch) +deep_learning_framework: TF2 + +# Sets which Agent class will be used. +# Options are: +# "A2C" (Advantage Actor Critic coupled with either SB3 or RLLIB agent_framework) +# "PPO" (Proximal Policy Optimization coupled with either SB3 or RLLIB agent_framework) +# "HARDCODED" (The HardCoded agents coupled with an ACL or NODE action_type) +# "DO_NOTHING" (The DoNothing agents coupled with an ACL or NODE action_type) +# "RANDOM" (primaite.agents.simple.RandomAgent) +# "DUMMY" (primaite.agents.simple.DummyAgent) +agent_identifier: PPO + +# Sets whether Red Agent POL and IER is randomised. +# Options are: +# True +# False +random_red_agent: False + +# The (integer) seed to be used in random number generation +# Default is None (null) +seed: None + +# Set whether the agent will be deterministic instead of stochastic +# Options are: +# True +# False +deterministic: False + +# Sets what view of the environment the deterministic hardcoded agent has. The default is BASIC. +# Options are: +# "BASIC" (The current observation space only) +# "FULL" (Full environment view with actions taken and reward feedback) +hard_coded_agent_view: FULL + +# Sets How the Action Space is defined: +# "NODE" +# "ACL" +# "ANY" node and acl actions +action_type: NODE +# observation space +observation_space: + # flatten: true + components: + - name: NODE_LINK_TABLE + # - name: NODE_STATUSES + # - name: LINK_TRAFFIC_LEVELS +# Number of episodes to run per session +num_episodes: 10 + +# Number of time_steps per episode +num_steps: 256 + +# Sets how often the agent will save a checkpoint (every n time episodes). +# Set to 0 if no checkpoints are required. Default is 10 +checkpoint_every_n_episodes: 0 + +# Time delay (milliseconds) between steps for CUSTOM agents. +time_delay: 5 + +# Type of session to be run. Options are: +# "TRAIN" (Trains an agent) +# "EVAL" (Evaluates an agent) +# "TRAIN_EVAL" (Trains then evaluates an agent) +session_type: TRAIN_EVAL + +# Environment config values +# The high value for the observation space +observation_space_high_value: 1000000000 + +# The Stable Baselines3 learn/eval output verbosity level: +# Options are: +# "NONE" (No Output) +# "INFO" (Info Messages (such as devices and wrappers used)) +# "DEBUG" (All Messages) +sb3_output_verbose_level: NONE + +# Reward values +# Generic +all_ok: 0 +# Node Hardware State +off_should_be_on: -10 +off_should_be_resetting: -5 +on_should_be_off: -2 +on_should_be_resetting: -5 +resetting_should_be_on: -5 +resetting_should_be_off: -2 +resetting: -3 +# Node Software or Service State +good_should_be_patching: 2 +good_should_be_compromised: 5 +good_should_be_overwhelmed: 5 +patching_should_be_good: -5 +patching_should_be_compromised: 2 +patching_should_be_overwhelmed: 2 +patching: -3 +compromised_should_be_good: -20 +compromised_should_be_patching: -20 +compromised_should_be_overwhelmed: -20 +compromised: -20 +overwhelmed_should_be_good: -20 +overwhelmed_should_be_patching: -20 +overwhelmed_should_be_compromised: -20 +overwhelmed: -20 +# Node File System State +good_should_be_repairing: 2 +good_should_be_restoring: 2 +good_should_be_corrupt: 5 +good_should_be_destroyed: 10 +repairing_should_be_good: -5 +repairing_should_be_restoring: 2 +repairing_should_be_corrupt: 2 +repairing_should_be_destroyed: 0 +repairing: -3 +restoring_should_be_good: -10 +restoring_should_be_repairing: -2 +restoring_should_be_corrupt: 1 +restoring_should_be_destroyed: 2 +restoring: -6 +corrupt_should_be_good: -10 +corrupt_should_be_repairing: -10 +corrupt_should_be_restoring: -10 +corrupt_should_be_destroyed: 2 +corrupt: -10 +destroyed_should_be_good: -20 +destroyed_should_be_repairing: -20 +destroyed_should_be_restoring: -20 +destroyed_should_be_corrupt: -20 +destroyed: -20 +scanning: -2 +# IER status +red_ier_running: -5 +green_ier_blocked: -10 + +# Patching / Reset durations +os_patching_duration: 5 # The time taken to patch the OS +node_reset_duration: 5 # The time taken to reset a node (hardware) +service_patching_duration: 5 # The time taken to patch a service +file_system_repairing_limit: 5 # The time take to repair the file system +file_system_restoring_limit: 5 # The time take to restore the file system +file_system_scanning_limit: 5 # The time taken to scan the file system diff --git a/tests/config/e2e/ppo_seeded_training_config.yaml b/tests/config/ppo_seeded_training_config.yaml similarity index 100% rename from tests/config/e2e/ppo_seeded_training_config.yaml rename to tests/config/ppo_seeded_training_config.yaml diff --git a/tests/conftest.py b/tests/conftest.py index af76b314..388bc034 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -58,7 +58,6 @@ class TempPrimaiteSession(PrimaiteSession): def __exit__(self, type, value, tb): shutil.rmtree(self.session_path) - shutil.rmtree(self.session_path.parent) _LOGGER.debug(f"Deleted temp session directory: {self.session_path}") diff --git a/tests/e2e_integration_tests/test_session_repeatability.py b/tests/e2e_integration_tests/test_session_repeatability.py deleted file mode 100644 index 99cb158d..00000000 --- a/tests/e2e_integration_tests/test_session_repeatability.py +++ /dev/null @@ -1,57 +0,0 @@ -""" -Seed tests. - -These tests will train an agent. -This agent is then loaded and evaluated twice, -the 2 evaluation wuns should be the same. - -This proves that the seed works. -""" -import time - -from primaite.config.lay_down_config import dos_very_basic_config_path -from primaite.primaite_session import PrimaiteSession -from tests import TEST_CONFIG_ROOT - - -def test_seeded_sessions(): - """Test to see if seed works in multiple sessions.""" - # ppo training session - ppo_train = PrimaiteSession(TEST_CONFIG_ROOT / "e2e/ppo_seeded_training_config.yaml", dos_very_basic_config_path()) - # train agent - ppo_train.setup() - ppo_train.learn() - ppo_train.close() - - # agent path to use for evaluation - path_prefix = f"{ppo_train._training_config.agent_framework}_{ppo_train._training_config.agent_identifier}" - agent_path = ppo_train.session_path / f"{path_prefix}_{ppo_train.timestamp_str}.zip" - - ppo_session_1 = PrimaiteSession( - TEST_CONFIG_ROOT / "e2e/ppo_seeded_training_config.yaml", dos_very_basic_config_path() - ) - - # load trained agent - ppo_session_1._training_config.agent_load_file = agent_path - ppo_session_1.setup() - time.sleep(1) - - ppo_session_2 = PrimaiteSession( - TEST_CONFIG_ROOT / "e2e/ppo_seeded_training_config.yaml", dos_very_basic_config_path() - ) - - # load trained agent - ppo_session_2._training_config.agent_load_file = agent_path - ppo_session_2.setup() - - # run evaluation - ppo_session_1.evaluate() - ppo_session_1.close() - ppo_session_2.evaluate() - ppo_session_2.close() - - # compare output - # assert compare_transaction_file( - # ppo_session_1.evaluation_path / f"all_transactions_{ppo_session_1.timestamp_str}.csv", - # ppo_session_2.evaluation_path / f"all_transactions_{ppo_session_2.timestamp_str}.csv" - # ) is True diff --git a/tests/mock_and_patch/get_session_path_mock.py b/tests/mock_and_patch/get_session_path_mock.py index feff52f6..90c0cb5d 100644 --- a/tests/mock_and_patch/get_session_path_mock.py +++ b/tests/mock_and_patch/get_session_path_mock.py @@ -1,6 +1,7 @@ import tempfile from datetime import datetime from pathlib import Path +from uuid import uuid4 from primaite import getLogger @@ -14,9 +15,7 @@ def get_temp_session_path(session_timestamp: datetime) -> Path: :param session_timestamp: This is the datetime that the session started. :return: The session directory path. """ - date_dir = session_timestamp.strftime("%Y-%m-%d") - session_path = session_timestamp.strftime("%Y-%m-%d_%H-%M-%S") - session_path = Path(tempfile.gettempdir()) / "primaite" / date_dir / session_path + session_path = Path(tempfile.gettempdir()) / "primaite" / str(uuid4()) session_path.mkdir(exist_ok=True, parents=True) _LOGGER.debug(f"Created temp session directory: {session_path}") return session_path diff --git a/tests/test_seeding_and_deterministic_session.py b/tests/test_seeding_and_deterministic_session.py new file mode 100644 index 00000000..0e420459 --- /dev/null +++ b/tests/test_seeding_and_deterministic_session.py @@ -0,0 +1,57 @@ +import pytest as pytest + +from primaite.config.lay_down_config import dos_very_basic_config_path +from tests import TEST_CONFIG_ROOT + + +@pytest.mark.parametrize( + "temp_primaite_session", + [[ + TEST_CONFIG_ROOT / "ppo_seeded_training_config.yaml", + dos_very_basic_config_path() + ]], + indirect=True, +) +def test_seeded_learning(temp_primaite_session): + """Test running seeded learning produces the same output when ran twice.""" + + expected_mean_reward_per_episode = { + 1: -90.703125, + 2: -91.15234375, + 3: -87.5, + 4: -92.2265625, + 5: -94.6875, + 6: -91.19140625, + 7: -88.984375, + 8: -88.3203125, + 9: -112.79296875, + 10: -100.01953125 + } + with temp_primaite_session as session: + assert session._training_config.seed == 67890, \ + "Expected output is based upon a agent that was trained with " \ + "seed 67890" + session.learn() + actual_mean_reward_per_episode = session.learn_av_reward_per_episode() + + assert actual_mean_reward_per_episode == expected_mean_reward_per_episode + + +@pytest.mark.skip(reason="Inconsistent results. Needs someone with RL " + "knowledge to investigate further.") +@pytest.mark.parametrize( + "temp_primaite_session", + [[ + TEST_CONFIG_ROOT / "ppo_seeded_training_config.yaml", + dos_very_basic_config_path() + ]], + indirect=True, +) +def test_deterministic_evaluation(temp_primaite_session): + """Test running deterministic evaluation gives same av eward per episode.""" + with temp_primaite_session as session: + # do stuff + session.learn() + session.evaluate() + eval_mean_reward = session.eval_av_reward_per_episode_csv() + assert len(set(eval_mean_reward.values())) == 1 From 99f1f7cfc149b5e5d8a59796b5f1ada27fd0ae64 Mon Sep 17 00:00:00 2001 From: Czar Echavez Date: Thu, 6 Jul 2023 12:10:26 +0100 Subject: [PATCH 11/17] #1386: remove setting of global seed + running pre-commit checks --- src/primaite/agents/agent.py | 1 - src/primaite/agents/sb3.py | 7 ++---- src/primaite/environment/primaite_env.py | 6 ----- .../test_seeding_and_deterministic_session.py | 22 ++++++------------- 4 files changed, 9 insertions(+), 27 deletions(-) diff --git a/src/primaite/agents/agent.py b/src/primaite/agents/agent.py index 5b76c36b..4b39839a 100644 --- a/src/primaite/agents/agent.py +++ b/src/primaite/agents/agent.py @@ -248,7 +248,6 @@ class AgentSessionABC(ABC): agent.session_path = path - return agent else: diff --git a/src/primaite/agents/sb3.py b/src/primaite/agents/sb3.py index 0d031c10..9d295c6f 100644 --- a/src/primaite/agents/sb3.py +++ b/src/primaite/agents/sb3.py @@ -59,7 +59,7 @@ class SB3Agent(AgentSessionABC): verbose=self.sb3_output_verbose_level, n_steps=self._training_config.num_steps, tensorboard_log=str(self._tensorboard_log_path), - seed=self._training_config.seed + seed=self._training_config.seed, ) def _save_checkpoint(self): @@ -121,10 +121,7 @@ class SB3Agent(AgentSessionABC): obs = self._env.reset() for step in range(time_steps): - action, _states = self._agent.predict( - obs, - deterministic=self._training_config.deterministic - ) + action, _states = self._agent.predict(obs, deterministic=self._training_config.deterministic) if isinstance(action, np.ndarray): action = np.int64(action) obs, rewards, done, info = self._env.step(action) diff --git a/src/primaite/environment/primaite_env.py b/src/primaite/environment/primaite_env.py index cd2ff9e5..03c23f93 100644 --- a/src/primaite/environment/primaite_env.py +++ b/src/primaite/environment/primaite_env.py @@ -2,7 +2,6 @@ """Main environment module containing the PRIMmary AI Training Evironment (Primaite) class.""" import copy import logging -import random import uuid as uuid from pathlib import Path from random import choice, randint, sample, uniform @@ -241,11 +240,6 @@ class Primaite(Env): self.episode_av_reward_writer = SessionOutputWriter(self, transaction_writer=False, learning_session=True) self.transaction_writer = SessionOutputWriter(self, transaction_writer=True, learning_session=True) - # set the seed globally if there is one - if self.training_config.seed: - random.seed(self.training_config.seed) - np.random.seed(self.training_config.seed) - @property def actual_episode_count(self) -> int: """Shifts the episode_count by -1 for RLlib.""" diff --git a/tests/test_seeding_and_deterministic_session.py b/tests/test_seeding_and_deterministic_session.py index 0e420459..34cb43fb 100644 --- a/tests/test_seeding_and_deterministic_session.py +++ b/tests/test_seeding_and_deterministic_session.py @@ -6,15 +6,11 @@ from tests import TEST_CONFIG_ROOT @pytest.mark.parametrize( "temp_primaite_session", - [[ - TEST_CONFIG_ROOT / "ppo_seeded_training_config.yaml", - dos_very_basic_config_path() - ]], + [[TEST_CONFIG_ROOT / "ppo_seeded_training_config.yaml", dos_very_basic_config_path()]], indirect=True, ) def test_seeded_learning(temp_primaite_session): """Test running seeded learning produces the same output when ran twice.""" - expected_mean_reward_per_episode = { 1: -90.703125, 2: -91.15234375, @@ -25,26 +21,22 @@ def test_seeded_learning(temp_primaite_session): 7: -88.984375, 8: -88.3203125, 9: -112.79296875, - 10: -100.01953125 + 10: -100.01953125, } with temp_primaite_session as session: - assert session._training_config.seed == 67890, \ - "Expected output is based upon a agent that was trained with " \ - "seed 67890" + assert session._training_config.seed == 67890, ( + "Expected output is based upon a agent that was trained with " "seed 67890" + ) session.learn() actual_mean_reward_per_episode = session.learn_av_reward_per_episode() assert actual_mean_reward_per_episode == expected_mean_reward_per_episode -@pytest.mark.skip(reason="Inconsistent results. Needs someone with RL " - "knowledge to investigate further.") +@pytest.mark.skip(reason="Inconsistent results. Needs someone with RL " "knowledge to investigate further.") @pytest.mark.parametrize( "temp_primaite_session", - [[ - TEST_CONFIG_ROOT / "ppo_seeded_training_config.yaml", - dos_very_basic_config_path() - ]], + [[TEST_CONFIG_ROOT / "ppo_seeded_training_config.yaml", dos_very_basic_config_path()]], indirect=True, ) def test_deterministic_evaluation(temp_primaite_session): From c5d7d5574773fe927e0d5386289a455f6b54a08d Mon Sep 17 00:00:00 2001 From: Marek Wolan Date: Thu, 6 Jul 2023 12:52:14 +0100 Subject: [PATCH 12/17] Change reward to float and divide by 10000 --- src/primaite/config/training_config.py | 100 +++++++++++------------ src/primaite/environment/primaite_env.py | 8 +- src/primaite/environment/reward.py | 20 ++--- src/primaite/transactions/transaction.py | 2 +- 4 files changed, 65 insertions(+), 65 deletions(-) diff --git a/src/primaite/config/training_config.py b/src/primaite/config/training_config.py index bd73f65b..a89d8c4b 100644 --- a/src/primaite/config/training_config.py +++ b/src/primaite/config/training_config.py @@ -94,64 +94,64 @@ class TrainingConfig: # Reward values # Generic - all_ok: int = 0 + all_ok: float = 0 # Node Hardware State - off_should_be_on: int = -10 - off_should_be_resetting: int = -5 - on_should_be_off: int = -2 - on_should_be_resetting: int = -5 - resetting_should_be_on: int = -5 - resetting_should_be_off: int = -2 - resetting: int = -3 + off_should_be_on: float = -0.001 + off_should_be_resetting: float = -0.0005 + on_should_be_off: float = -0.0002 + on_should_be_resetting: float = -0.0005 + resetting_should_be_on: float = -0.0005 + resetting_should_be_off: float = -0.0002 + resetting: float = -0.0003 # Node Software or Service State - good_should_be_patching: int = 2 - good_should_be_compromised: int = 5 - good_should_be_overwhelmed: int = 5 - patching_should_be_good: int = -5 - patching_should_be_compromised: int = 2 - patching_should_be_overwhelmed: int = 2 - patching: int = -3 - compromised_should_be_good: int = -20 - compromised_should_be_patching: int = -20 - compromised_should_be_overwhelmed: int = -20 - compromised: int = -20 - overwhelmed_should_be_good: int = -20 - overwhelmed_should_be_patching: int = -20 - overwhelmed_should_be_compromised: int = -20 - overwhelmed: int = -20 + good_should_be_patching: float = 0.0002 + good_should_be_compromised: float = 0.0005 + good_should_be_overwhelmed: float = 0.0005 + patching_should_be_good: float = -0.0005 + patching_should_be_compromised: float = 0.0002 + patching_should_be_overwhelmed: float = 0.0002 + patching: float = -0.0003 + compromised_should_be_good: float = -0.002 + compromised_should_be_patching: float = -0.002 + compromised_should_be_overwhelmed: float = -0.002 + compromised: float = -0.002 + overwhelmed_should_be_good: float = -0.002 + overwhelmed_should_be_patching: float = -0.002 + overwhelmed_should_be_compromised: float = -0.002 + overwhelmed: float = -0.002 # Node File System State - good_should_be_repairing: int = 2 - good_should_be_restoring: int = 2 - good_should_be_corrupt: int = 5 - good_should_be_destroyed: int = 10 - repairing_should_be_good: int = -5 - repairing_should_be_restoring: int = 2 - repairing_should_be_corrupt: int = 2 - repairing_should_be_destroyed: int = 0 - repairing: int = -3 - restoring_should_be_good: int = -10 - restoring_should_be_repairing: int = -2 - restoring_should_be_corrupt: int = 1 - restoring_should_be_destroyed: int = 2 - restoring: int = -6 - corrupt_should_be_good: int = -10 - corrupt_should_be_repairing: int = -10 - corrupt_should_be_restoring: int = -10 - corrupt_should_be_destroyed: int = 2 - corrupt: int = -10 - destroyed_should_be_good: int = -20 - destroyed_should_be_repairing: int = -20 - destroyed_should_be_restoring: int = -20 - destroyed_should_be_corrupt: int = -20 - destroyed: int = -20 - scanning: int = -2 + good_should_be_repairing: float = 0.0002 + good_should_be_restoring: float = 0.0002 + good_should_be_corrupt: float = 0.0005 + good_should_be_destroyed: float = 0.001 + repairing_should_be_good: float = -0.0005 + repairing_should_be_restoring: float = 0.0002 + repairing_should_be_corrupt: float = 0.0002 + repairing_should_be_destroyed: float = 0.0000 + repairing: float = -0.0003 + restoring_should_be_good: float = -0.001 + restoring_should_be_repairing: float = -0.0002 + restoring_should_be_corrupt: float = 0.0001 + restoring_should_be_destroyed: float = 0.0002 + restoring: float = -0.0006 + corrupt_should_be_good: float = -0.001 + corrupt_should_be_repairing: float = -0.001 + corrupt_should_be_restoring: float = -0.001 + corrupt_should_be_destroyed: float = 0.0002 + corrupt: float = -0.001 + destroyed_should_be_good: float = -0.002 + destroyed_should_be_repairing: float = -0.002 + destroyed_should_be_restoring: float = -0.002 + destroyed_should_be_corrupt: float = -0.002 + destroyed: float = -0.002 + scanning: float = -0.0002 # IER status - red_ier_running: int = -5 - green_ier_blocked: int = -10 + red_ier_running: float = -0.0005 + green_ier_blocked: float = -0.001 # Patching / Reset durations os_patching_duration: int = 5 diff --git a/src/primaite/environment/primaite_env.py b/src/primaite/environment/primaite_env.py index 03c23f93..3a40066a 100644 --- a/src/primaite/environment/primaite_env.py +++ b/src/primaite/environment/primaite_env.py @@ -142,10 +142,10 @@ class Primaite(Env): self.step_info = {} # Total reward - self.total_reward = 0 + self.total_reward: float = 0 # Average reward - self.average_reward = 0 + self.average_reward: float = 0 # Episode count self.episode_count = 0 @@ -283,9 +283,9 @@ class Primaite(Env): self._create_random_red_agent() # Reset counters and totals - self.total_reward = 0 + self.total_reward = 0.0 self.step_count = 0 - self.average_reward = 0 + self.average_reward = 0.0 # Update observations space and return self.update_environent_obs() diff --git a/src/primaite/environment/reward.py b/src/primaite/environment/reward.py index 19094a18..e4353cb9 100644 --- a/src/primaite/environment/reward.py +++ b/src/primaite/environment/reward.py @@ -20,7 +20,7 @@ def calculate_reward_function( red_iers, step_count, config_values, -): +) -> float: """ Compares the states of the initial and final nodes/links to get a reward. @@ -33,7 +33,7 @@ def calculate_reward_function( step_count: current step config_values: Config values """ - reward_value = 0 + reward_value: float = 0.0 # For each node, compare hardware state, SoftwareState, service states for node_key, final_node in final_nodes.items(): @@ -94,7 +94,7 @@ def calculate_reward_function( return reward_value -def score_node_operating_state(final_node, initial_node, reference_node, config_values): +def score_node_operating_state(final_node, initial_node, reference_node, config_values) -> float: """ Calculates score relating to the hardware state of a node. @@ -104,7 +104,7 @@ def score_node_operating_state(final_node, initial_node, reference_node, config_ reference_node: The node if there had been no red or blue effect config_values: Config values """ - score = 0 + score: float = 0.0 final_node_operating_state = final_node.hardware_state reference_node_operating_state = reference_node.hardware_state @@ -143,7 +143,7 @@ def score_node_operating_state(final_node, initial_node, reference_node, config_ return score -def score_node_os_state(final_node, initial_node, reference_node, config_values): +def score_node_os_state(final_node, initial_node, reference_node, config_values) -> float: """ Calculates score relating to the Software State of a node. @@ -153,7 +153,7 @@ def score_node_os_state(final_node, initial_node, reference_node, config_values) reference_node: The node if there had been no red or blue effect config_values: Config values """ - score = 0 + score: float = 0.0 final_node_os_state = final_node.software_state reference_node_os_state = reference_node.software_state @@ -194,7 +194,7 @@ def score_node_os_state(final_node, initial_node, reference_node, config_values) return score -def score_node_service_state(final_node, initial_node, reference_node, config_values): +def score_node_service_state(final_node, initial_node, reference_node, config_values) -> float: """ Calculates score relating to the service state(s) of a node. @@ -204,7 +204,7 @@ def score_node_service_state(final_node, initial_node, reference_node, config_va reference_node: The node if there had been no red or blue effect config_values: Config values """ - score = 0 + score: float = 0.0 final_node_services: Dict[str, Service] = final_node.services reference_node_services: Dict[str, Service] = reference_node.services @@ -266,7 +266,7 @@ def score_node_service_state(final_node, initial_node, reference_node, config_va return score -def score_node_file_system(final_node, initial_node, reference_node, config_values): +def score_node_file_system(final_node, initial_node, reference_node, config_values) -> float: """ Calculates score relating to the file system state of a node. @@ -275,7 +275,7 @@ def score_node_file_system(final_node, initial_node, reference_node, config_valu initial_node: The node before red and blue agents take effect reference_node: The node if there had been no red or blue effect """ - score = 0 + score: float = 0.0 final_node_file_system_state = final_node.file_system_state_actual reference_node_file_system_state = reference_node.file_system_state_actual diff --git a/src/primaite/transactions/transaction.py b/src/primaite/transactions/transaction.py index 7db2444a..95be8115 100644 --- a/src/primaite/transactions/transaction.py +++ b/src/primaite/transactions/transaction.py @@ -31,7 +31,7 @@ class Transaction(object): "The observation space before any actions are taken" self.obs_space_post = None "The observation space after any actions are taken" - self.reward = None + self.reward: float = None "The reward value" self.action_space = None "The action space invoked by the agent" From 3b91a990708abe17cd596c3c79ba12516c387032 Mon Sep 17 00:00:00 2001 From: Marek Wolan Date: Thu, 6 Jul 2023 12:56:24 +0100 Subject: [PATCH 13/17] Updated rewards type description in docs --- docs/source/config.rst | 100 ++++++++++++++++++++--------------------- 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/docs/source/config.rst b/docs/source/config.rst index 71ade6c5..164a75e1 100644 --- a/docs/source/config.rst +++ b/docs/source/config.rst @@ -82,203 +82,203 @@ The environment config file consists of the following attributes: Rewards are calculated based on the difference between the current state and reference state (the 'should be' state) of the environment. -* **Generic [all_ok]** [int] +* **Generic [all_ok]** [float] The score to give when the current situation (for a given component) is no different from that expected in the baseline (i.e. as though no blue or red agent actions had been undertaken) -* **Node Hardware State [off_should_be_on]** [int] +* **Node Hardware State [off_should_be_on]** [float] The score to give when the node should be on, but is off -* **Node Hardware State [off_should_be_resetting]** [int] +* **Node Hardware State [off_should_be_resetting]** [float] The score to give when the node should be resetting, but is off -* **Node Hardware State [on_should_be_off]** [int] +* **Node Hardware State [on_should_be_off]** [float] The score to give when the node should be off, but is on -* **Node Hardware State [on_should_be_resetting]** [int] +* **Node Hardware State [on_should_be_resetting]** [float] The score to give when the node should be resetting, but is on -* **Node Hardware State [resetting_should_be_on]** [int] +* **Node Hardware State [resetting_should_be_on]** [float] The score to give when the node should be on, but is resetting -* **Node Hardware State [resetting_should_be_off]** [int] +* **Node Hardware State [resetting_should_be_off]** [float] The score to give when the node should be off, but is resetting -* **Node Hardware State [resetting]** [int] +* **Node Hardware State [resetting]** [float] The score to give when the node is resetting -* **Node Operating System or Service State [good_should_be_patching]** [int] +* **Node Operating System or Service State [good_should_be_patching]** [float] The score to give when the state should be patching, but is good -* **Node Operating System or Service State [good_should_be_compromised]** [int] +* **Node Operating System or Service State [good_should_be_compromised]** [float] The score to give when the state should be compromised, but is good -* **Node Operating System or Service State [good_should_be_overwhelmed]** [int] +* **Node Operating System or Service State [good_should_be_overwhelmed]** [float] The score to give when the state should be overwhelmed, but is good -* **Node Operating System or Service State [patching_should_be_good]** [int] +* **Node Operating System or Service State [patching_should_be_good]** [float] The score to give when the state should be good, but is patching -* **Node Operating System or Service State [patching_should_be_compromised]** [int] +* **Node Operating System or Service State [patching_should_be_compromised]** [float] The score to give when the state should be compromised, but is patching -* **Node Operating System or Service State [patching_should_be_overwhelmed]** [int] +* **Node Operating System or Service State [patching_should_be_overwhelmed]** [float] The score to give when the state should be overwhelmed, but is patching -* **Node Operating System or Service State [patching]** [int] +* **Node Operating System or Service State [patching]** [float] The score to give when the state is patching -* **Node Operating System or Service State [compromised_should_be_good]** [int] +* **Node Operating System or Service State [compromised_should_be_good]** [float] The score to give when the state should be good, but is compromised -* **Node Operating System or Service State [compromised_should_be_patching]** [int] +* **Node Operating System or Service State [compromised_should_be_patching]** [float] The score to give when the state should be patching, but is compromised -* **Node Operating System or Service State [compromised_should_be_overwhelmed]** [int] +* **Node Operating System or Service State [compromised_should_be_overwhelmed]** [float] The score to give when the state should be overwhelmed, but is compromised -* **Node Operating System or Service State [compromised]** [int] +* **Node Operating System or Service State [compromised]** [float] The score to give when the state is compromised -* **Node Operating System or Service State [overwhelmed_should_be_good]** [int] +* **Node Operating System or Service State [overwhelmed_should_be_good]** [float] The score to give when the state should be good, but is overwhelmed -* **Node Operating System or Service State [overwhelmed_should_be_patching]** [int] +* **Node Operating System or Service State [overwhelmed_should_be_patching]** [float] The score to give when the state should be patching, but is overwhelmed -* **Node Operating System or Service State [overwhelmed_should_be_compromised]** [int] +* **Node Operating System or Service State [overwhelmed_should_be_compromised]** [float] The score to give when the state should be compromised, but is overwhelmed -* **Node Operating System or Service State [overwhelmed]** [int] +* **Node Operating System or Service State [overwhelmed]** [float] The score to give when the state is overwhelmed -* **Node File System State [good_should_be_repairing]** [int] +* **Node File System State [good_should_be_repairing]** [float] The score to give when the state should be repairing, but is good -* **Node File System State [good_should_be_restoring]** [int] +* **Node File System State [good_should_be_restoring]** [float] The score to give when the state should be restoring, but is good -* **Node File System State [good_should_be_corrupt]** [int] +* **Node File System State [good_should_be_corrupt]** [float] The score to give when the state should be corrupt, but is good -* **Node File System State [good_should_be_destroyed]** [int] +* **Node File System State [good_should_be_destroyed]** [float] The score to give when the state should be destroyed, but is good -* **Node File System State [repairing_should_be_good]** [int] +* **Node File System State [repairing_should_be_good]** [float] The score to give when the state should be good, but is repairing -* **Node File System State [repairing_should_be_restoring]** [int] +* **Node File System State [repairing_should_be_restoring]** [float] The score to give when the state should be restoring, but is repairing -* **Node File System State [repairing_should_be_corrupt]** [int] +* **Node File System State [repairing_should_be_corrupt]** [float] The score to give when the state should be corrupt, but is repairing -* **Node File System State [repairing_should_be_destroyed]** [int] +* **Node File System State [repairing_should_be_destroyed]** [float] The score to give when the state should be destroyed, but is repairing -* **Node File System State [repairing]** [int] +* **Node File System State [repairing]** [float] The score to give when the state is repairing -* **Node File System State [restoring_should_be_good]** [int] +* **Node File System State [restoring_should_be_good]** [float] The score to give when the state should be good, but is restoring -* **Node File System State [restoring_should_be_repairing]** [int] +* **Node File System State [restoring_should_be_repairing]** [float] The score to give when the state should be repairing, but is restoring -* **Node File System State [restoring_should_be_corrupt]** [int] +* **Node File System State [restoring_should_be_corrupt]** [float] The score to give when the state should be corrupt, but is restoring -* **Node File System State [restoring_should_be_destroyed]** [int] +* **Node File System State [restoring_should_be_destroyed]** [float] The score to give when the state should be destroyed, but is restoring -* **Node File System State [restoring]** [int] +* **Node File System State [restoring]** [float] The score to give when the state is restoring -* **Node File System State [corrupt_should_be_good]** [int] +* **Node File System State [corrupt_should_be_good]** [float] The score to give when the state should be good, but is corrupt -* **Node File System State [corrupt_should_be_repairing]** [int] +* **Node File System State [corrupt_should_be_repairing]** [float] The score to give when the state should be repairing, but is corrupt -* **Node File System State [corrupt_should_be_restoring]** [int] +* **Node File System State [corrupt_should_be_restoring]** [float] The score to give when the state should be restoring, but is corrupt -* **Node File System State [corrupt_should_be_destroyed]** [int] +* **Node File System State [corrupt_should_be_destroyed]** [float] The score to give when the state should be destroyed, but is corrupt -* **Node File System State [corrupt]** [int] +* **Node File System State [corrupt]** [float] The score to give when the state is corrupt -* **Node File System State [destroyed_should_be_good]** [int] +* **Node File System State [destroyed_should_be_good]** [float] The score to give when the state should be good, but is destroyed -* **Node File System State [destroyed_should_be_repairing]** [int] +* **Node File System State [destroyed_should_be_repairing]** [float] The score to give when the state should be repairing, but is destroyed -* **Node File System State [destroyed_should_be_restoring]** [int] +* **Node File System State [destroyed_should_be_restoring]** [float] The score to give when the state should be restoring, but is destroyed -* **Node File System State [destroyed_should_be_corrupt]** [int] +* **Node File System State [destroyed_should_be_corrupt]** [float] The score to give when the state should be corrupt, but is destroyed -* **Node File System State [destroyed]** [int] +* **Node File System State [destroyed]** [float] The score to give when the state is destroyed -* **Node File System State [scanning]** [int] +* **Node File System State [scanning]** [float] The score to give when the state is scanning -* **IER Status [red_ier_running]** [int] +* **IER Status [red_ier_running]** [float] The score to give when a red agent IER is permitted to run -* **IER Status [green_ier_blocked]** [int] +* **IER Status [green_ier_blocked]** [float] The score to give when a green agent IER is prevented from running From 46b44f9e239ac45be669df600c84e42338fa2549 Mon Sep 17 00:00:00 2001 From: Czar Echavez Date: Thu, 6 Jul 2023 13:27:44 +0100 Subject: [PATCH 14/17] #1386: remove redundant config files + test fixtures + fixing deterministic and seed config description in documentation to avoid misunderstandings --- docs/source/config.rst | 4 +- .../e2e/a2c_seeded_training_config.yaml | 155 ------------------ tests/e2e_integration_tests/__init__.py | 0 tests/e2e_integration_tests/conftest.py | 21 --- 4 files changed, 2 insertions(+), 178 deletions(-) delete mode 100644 tests/config/e2e/a2c_seeded_training_config.yaml delete mode 100644 tests/e2e_integration_tests/__init__.py delete mode 100644 tests/e2e_integration_tests/conftest.py diff --git a/docs/source/config.rst b/docs/source/config.rst index 50594549..afd012cc 100644 --- a/docs/source/config.rst +++ b/docs/source/config.rst @@ -310,11 +310,11 @@ Rewards are calculated based on the difference between the current state and ref * **deterministic** [bool] - Set to true if the agent should use deterministic actions. Default is ``False`` + Set to true if the agent evaluation should be deterministic. Default is ``False`` * **seed** [int] - Seed used in the randomisation in training / evaluation. Default is ``None`` + Seed used in the randomisation in agent training. Default is ``None`` The Lay Down Config ******************* diff --git a/tests/config/e2e/a2c_seeded_training_config.yaml b/tests/config/e2e/a2c_seeded_training_config.yaml deleted file mode 100644 index 90947726..00000000 --- a/tests/config/e2e/a2c_seeded_training_config.yaml +++ /dev/null @@ -1,155 +0,0 @@ -# Training Config File - -# Sets which agent algorithm framework will be used. -# Options are: -# "SB3" (Stable Baselines3) -# "RLLIB" (Ray RLlib) -# "CUSTOM" (Custom Agent) -agent_framework: SB3 - -# Sets which deep learning framework will be used (by RLlib ONLY). -# Default is TF (Tensorflow). -# Options are: -# "TF" (Tensorflow) -# TF2 (Tensorflow 2.X) -# TORCH (PyTorch) -deep_learning_framework: TF2 - -# Sets which Agent class will be used. -# Options are: -# "A2C" (Advantage Actor Critic coupled with either SB3 or RLLIB agent_framework) -# "PPO" (Proximal Policy Optimization coupled with either SB3 or RLLIB agent_framework) -# "HARDCODED" (The HardCoded agents coupled with an ACL or NODE action_type) -# "DO_NOTHING" (The DoNothing agents coupled with an ACL or NODE action_type) -# "RANDOM" (primaite.agents.simple.RandomAgent) -# "DUMMY" (primaite.agents.simple.DummyAgent) -agent_identifier: A2C - -# Sets whether Red Agent POL and IER is randomised. -# Options are: -# True -# False -random_red_agent: False - -# The (integer) seed to be used in random number generation -# Default is None (null) -seed: 12345 - -# Set whether the agent will be deterministic instead of stochastic -# Options are: -# True -# False -deterministic: True - -# Sets what view of the environment the deterministic hardcoded agent has. The default is BASIC. -# Options are: -# "BASIC" (The current observation space only) -# "FULL" (Full environment view with actions taken and reward feedback) -hard_coded_agent_view: FULL - -# Sets How the Action Space is defined: -# "NODE" -# "ACL" -# "ANY" node and acl actions -action_type: NODE -# observation space -observation_space: - # flatten: true - components: - - name: NODE_LINK_TABLE - # - name: NODE_STATUSES - # - name: LINK_TRAFFIC_LEVELS -# Number of episodes to run per session -num_episodes: 10 - -# Number of time_steps per episode -num_steps: 256 - -# Sets how often the agent will save a checkpoint (every n time episodes). -# Set to 0 if no checkpoints are required. Default is 10 -checkpoint_every_n_episodes: 0 - -# Time delay (milliseconds) between steps for CUSTOM agents. -time_delay: 5 - -# Type of session to be run. Options are: -# "TRAIN" (Trains an agent) -# "EVAL" (Evaluates an agent) -# "TRAIN_EVAL" (Trains then evaluates an agent) -session_type: TRAIN_EVAL - -# Environment config values -# The high value for the observation space -observation_space_high_value: 1000000000 - -# The Stable Baselines3 learn/eval output verbosity level: -# Options are: -# "NONE" (No Output) -# "INFO" (Info Messages (such as devices and wrappers used)) -# "DEBUG" (All Messages) -sb3_output_verbose_level: NONE - -# Reward values -# Generic -all_ok: 0 -# Node Hardware State -off_should_be_on: -10 -off_should_be_resetting: -5 -on_should_be_off: -2 -on_should_be_resetting: -5 -resetting_should_be_on: -5 -resetting_should_be_off: -2 -resetting: -3 -# Node Software or Service State -good_should_be_patching: 2 -good_should_be_compromised: 5 -good_should_be_overwhelmed: 5 -patching_should_be_good: -5 -patching_should_be_compromised: 2 -patching_should_be_overwhelmed: 2 -patching: -3 -compromised_should_be_good: -20 -compromised_should_be_patching: -20 -compromised_should_be_overwhelmed: -20 -compromised: -20 -overwhelmed_should_be_good: -20 -overwhelmed_should_be_patching: -20 -overwhelmed_should_be_compromised: -20 -overwhelmed: -20 -# Node File System State -good_should_be_repairing: 2 -good_should_be_restoring: 2 -good_should_be_corrupt: 5 -good_should_be_destroyed: 10 -repairing_should_be_good: -5 -repairing_should_be_restoring: 2 -repairing_should_be_corrupt: 2 -repairing_should_be_destroyed: 0 -repairing: -3 -restoring_should_be_good: -10 -restoring_should_be_repairing: -2 -restoring_should_be_corrupt: 1 -restoring_should_be_destroyed: 2 -restoring: -6 -corrupt_should_be_good: -10 -corrupt_should_be_repairing: -10 -corrupt_should_be_restoring: -10 -corrupt_should_be_destroyed: 2 -corrupt: -10 -destroyed_should_be_good: -20 -destroyed_should_be_repairing: -20 -destroyed_should_be_restoring: -20 -destroyed_should_be_corrupt: -20 -destroyed: -20 -scanning: -2 -# IER status -red_ier_running: -5 -green_ier_blocked: -10 - -# Patching / Reset durations -os_patching_duration: 5 # The time taken to patch the OS -node_reset_duration: 5 # The time taken to reset a node (hardware) -service_patching_duration: 5 # The time taken to patch a service -file_system_repairing_limit: 5 # The time take to repair the file system -file_system_restoring_limit: 5 # The time take to restore the file system -file_system_scanning_limit: 5 # The time taken to scan the file system diff --git a/tests/e2e_integration_tests/__init__.py b/tests/e2e_integration_tests/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/e2e_integration_tests/conftest.py b/tests/e2e_integration_tests/conftest.py deleted file mode 100644 index 2f569c9b..00000000 --- a/tests/e2e_integration_tests/conftest.py +++ /dev/null @@ -1,21 +0,0 @@ -from __future__ import annotations - -from pathlib import Path - -import polars as pl - - -def compare_transaction_file(output_a_file_path: str | Path, output_b_file_path: str | Path): - """Function used to check if contents of transaction files are the same.""" - # load output a file - data_a = pl.read_csv(output_a_file_path) - - # load output b file - data_b = pl.read_csv(output_b_file_path) - - # remove the time stamp column - data_a = data_a.drop("Timestamp") - data_b = data_b.drop("Timestamp") - - # if the comparison is empty, both files are the same i.e. True - return data_a.frame_equal(data_b) From 159d47fd6c4d7000176b1b49cc3860c323022bf4 Mon Sep 17 00:00:00 2001 From: Chris McCarthy Date: Thu, 6 Jul 2023 13:56:12 +0100 Subject: [PATCH 15/17] #1963 - Made RLlib and SB3 agents save at the end of each learning session by default using a common file naming format. Also now agents only checkpoint every n and not on the final episode --- src/primaite/agents/rllib.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/primaite/agents/rllib.py b/src/primaite/agents/rllib.py index 32dc3dc0..ce072a03 100644 --- a/src/primaite/agents/rllib.py +++ b/src/primaite/agents/rllib.py @@ -186,6 +186,7 @@ class RLlibAgent(AgentSessionABC): checkpoint_dir = file break + # Zip the folder shutil.make_archive( str(self._saved_agent_path).replace(".zip", ""), "zip", From 82d7c168fe40f0e085ba9b9e737b3547cc882673 Mon Sep 17 00:00:00 2001 From: Chris McCarthy Date: Thu, 6 Jul 2023 14:13:02 +0100 Subject: [PATCH 16/17] #1593 - Check that agent saved file exists --- tests/test_primaite_session.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/test_primaite_session.py b/tests/test_primaite_session.py index ae0b0870..75ea5882 100644 --- a/tests/test_primaite_session.py +++ b/tests/test_primaite_session.py @@ -33,6 +33,9 @@ def test_primaite_session(temp_primaite_session): # Check that the network png file exists assert (session_path / f"network_{session.timestamp_str}.png").exists() + # Check that the saved agent exists + assert session._agent_session._saved_agent_path.exists() + # Check that both the transactions and av reward csv files exist for file in session.learning_path.iterdir(): if file.suffix == ".csv": From c9f474165507ad5c2665e200d31d4a169a244cdc Mon Sep 17 00:00:00 2001 From: Chris McCarthy Date: Thu, 6 Jul 2023 14:18:49 +0100 Subject: [PATCH 17/17] #1593 - Ran pre-commit hook --- src/primaite/agents/agent.py | 9 ++++++--- src/primaite/agents/rllib.py | 30 ++++++++++-------------------- 2 files changed, 16 insertions(+), 23 deletions(-) diff --git a/src/primaite/agents/agent.py b/src/primaite/agents/agent.py index fecf84d0..32118597 100644 --- a/src/primaite/agents/agent.py +++ b/src/primaite/agents/agent.py @@ -259,10 +259,13 @@ class AgentSessionABC(ABC): @property def _saved_agent_path(self) -> Path: - file_name = (f"{self._training_config.agent_framework}_" - f"{self._training_config.agent_identifier}_" - f"{self.timestamp_str}.zip") + file_name = ( + f"{self._training_config.agent_framework}_" + f"{self._training_config.agent_identifier}_" + f"{self.timestamp_str}.zip" + ) return self.learning_path / file_name + @abstractmethod def save(self): """Save the agent.""" diff --git a/src/primaite/agents/rllib.py b/src/primaite/agents/rllib.py index ce072a03..427072c4 100644 --- a/src/primaite/agents/rllib.py +++ b/src/primaite/agents/rllib.py @@ -85,10 +85,8 @@ class RLlibAgent(AgentSessionABC): metadata_dict = json.load(file) metadata_dict["end_datetime"] = datetime.now().isoformat() - metadata_dict["total_episodes"] = self._current_result[ - "episodes_total"] - metadata_dict["total_time_steps"] = self._current_result[ - "timesteps_total"] + metadata_dict["total_episodes"] = self._current_result["episodes_total"] + metadata_dict["total_time_steps"] = self._current_result["timesteps_total"] filepath = self.session_path / "session_metadata.json" _LOGGER.debug(f"Updating Session Metadata file: {filepath}") @@ -111,8 +109,7 @@ class RLlibAgent(AgentSessionABC): ), ) - self._agent_config.training( - train_batch_size=self._training_config.num_steps) + self._agent_config.training(train_batch_size=self._training_config.num_steps) self._agent_config.framework(framework="tf") self._agent_config.rollouts( @@ -120,8 +117,7 @@ class RLlibAgent(AgentSessionABC): num_envs_per_worker=1, horizon=self._training_config.num_steps, ) - self._agent: Algorithm = self._agent_config.build( - logger_creator=_custom_log_creator(self.learning_path)) + self._agent: Algorithm = self._agent_config.build(logger_creator=_custom_log_creator(self.learning_path)) def _save_checkpoint(self): checkpoint_n = self._training_config.checkpoint_every_n_episodes @@ -133,8 +129,8 @@ class RLlibAgent(AgentSessionABC): self._agent.save(str(self.checkpoints_path)) def learn( - self, - **kwargs, + self, + **kwargs, ): """ Evaluate the agent. @@ -144,8 +140,7 @@ class RLlibAgent(AgentSessionABC): time_steps = self._training_config.num_steps episodes = self._training_config.num_episodes - _LOGGER.info( - f"Beginning learning for {episodes} episodes @" f" {time_steps} time steps...") + _LOGGER.info(f"Beginning learning for {episodes} episodes @" f" {time_steps} time steps...") for i in range(episodes): self._current_result = self._agent.train() self._save_checkpoint() @@ -154,8 +149,8 @@ class RLlibAgent(AgentSessionABC): super().learn() def evaluate( - self, - **kwargs, + self, + **kwargs, ): """ Evaluate the agent. @@ -187,16 +182,11 @@ class RLlibAgent(AgentSessionABC): break # Zip the folder - shutil.make_archive( - str(self._saved_agent_path).replace(".zip", ""), - "zip", - checkpoint_dir # noqa - ) + shutil.make_archive(str(self._saved_agent_path).replace(".zip", ""), "zip", checkpoint_dir) # noqa # Drop the temp directory shutil.rmtree(temp_dir) - def export(self): """Export the agent to transportable file format.""" raise NotImplementedError