{ "info": { "author": "Matt Gruskin", "author_email": "matthew.gruskin@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "# grilops\n\na GRId LOgic Puzzle Solver library, using Python 3 and\n[z3](https://github.com/Z3Prover/z3).\n\nThis package contains a collection of libraries and helper functions that are\nuseful for solving and checking\n[Nikoli](https://en.wikipedia.org/wiki/Nikoli_(publisher))-style logic puzzles\nusing z3.\n\nTo get a feel for how to use this package to model and solve puzzles, try\nworking through the [tutorial IPython\nnotebook](https://github.com/obijywk/grilops/blob/master/examples/tutorial.ipynb),\nand refer to the\n[examples](https://github.com/obijywk/grilops/tree/master/examples) and the\n[API Documentation](https://obijywk.github.io/grilops/).\n\n## Installation\n\ngrilops requires Python 3.6 or later.\n\nTo install grilops for use in your own programs:\n\n```\n$ pip3 install grilops\n```\n\nTo install the source code (to run the examples and/or work with the code):\n\n```\n$ git clone https://github.com/obijywk/grilops.git\n$ cd grilops\n$ pip3 install -e .\n```\n\n## Basic Concepts and Usage\n\nThe `symbols` and `grids` modules contain the core functionality needed for\nmodeling most puzzles. For convenience, their attributes can be accessed\ndirectly from the top-level `grilops` module.\n\nSymbols represent the marks that are determined and written into a grid by a\nsolver while solving a puzzle. For example, the symbol set of a\n[Sudoku](https://en.wikipedia.org/wiki/Sudoku) puzzle would be the digits 1\nthrough 9. The symbol set of a binary determination puzzle such as\n[Nurikabe](https://en.wikipedia.org/wiki/Nurikabe_(puzzle)) could contain two\nsymbols, one representing a black cell and the other representing a white cell.\n\nA symbol grid is used to keep track of the assignment of symbols to grid\ncells. Generally, setting up a program to solve a puzzle using grilops involves:\n\n* Constructing a symbol set\n* Constructing a symbol grid limited to contain symbols from that symbol set\n* Adding puzzle-specific constraints to cells in the symbol grid\n* Checking for satisfying assignments of symbols to symbol grid cells\n\nGrid cells are exposed as z3 constants, so built-in z3 operators can and should\nbe used when adding puzzle-specific constraints. In addition, grilops provides\nseveral modules to help automate and abstract away the introduction of common\nkinds of constraints.\n\n### Loops\n\nThe `grilops.loops` module is helpful for adding constraints that ensure symbols\nconnect to form closed loops. Some examples of puzzle types for which this is\nuseful are [Masyu](https://en.wikipedia.org/wiki/Masyu) and\n[Slitherlink](https://en.wikipedia.org/wiki/Slitherlink).\n\n~~~~\n$ python3 examples/masyu.py $ python3 examples/slitherlink.py \n \u250c\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2510 \u250c\u2500\u2500\u2510 \n\u250c\u2518 \u250c\u2500\u2518\u2514\u2500\u2510\u2502 \u2502\u250c\u2510\u2502 \u250c\u2510 \n\u2514\u2500\u2510\u2502\u250c\u2500\u2500\u2510\u2502\u2502 \u2514\u2518\u2502\u2514\u2510\u2502\u2502 \n \u2502\u2502\u2502\u250c\u2500\u2518\u2502\u2502 \u2502 \u2514\u2518\u2502 \n\u250c\u2500\u2518\u2514\u2518\u2502 \u250c\u2518\u2502 \u2514\u2510 \u2502 \n\u2502\u250c\u2500\u2500\u2510\u2502 \u2502\u250c\u2518 \u250c\u2500\u2500\u2518\u250c\u2510\u2502 \n\u2502\u2502\u250c\u2500\u2518\u2514\u2500\u2518\u2514\u2510 \u2514\u2500\u2500\u2500\u2518\u2514\u2518 \n\u2502\u2502\u2502 \u250c\u2500\u2500\u2500\u2510\u2502 \n\u2514\u2518\u2502 \u2502\u250c\u2500\u2500\u2518\u2502 Unique solution\n \u2514\u2500\u2518\u2514\u2500\u2500\u2500\u2518\n\nUnique solution\n~~~~\n\n### Regions\n\nThe `grilops.regions` module is helpful for adding constraints that ensure\ncells are grouped into orthogonally contiguous regions (polyominos) of variable\nshapes and sizes. Some examples of puzzle types for which this is useful are\n[Nurikabe](https://en.wikipedia.org/wiki/Nurikabe_(puzzle)) and\n[Fillomino](https://en.wikipedia.org/wiki/Fillomino).\n\n~~~~\n$ python3 examples/nurikabe.py $ python3 examples/fillomino.py \n2 \u2588 \u2588\u2588 2 8 8 3 3 101010105 \n\u2588\u2588\u2588 \u25882\u2588\u2588\u2588 8 8 8 3 1010105 5 \n\u25882\u2588 7\u2588 \u2588 \u2588 3 3 8 10104 4 4 5 \n\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 1 3 8 3 102 2 4 5 \n\u2588\u2588 \u2588 3\u25883\u2588 2 2 8 3 3 1 3 2 2 \n \u25882\u2588\u2588\u2588\u25883\u2588\u2588 6 6 2 2 1 3 3 1 3 \n2\u2588\u25884 \u2588 \u2588 6 4 4 4 2 2 1 3 3 \n\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 6 4 2 2 4 3 3 4 4 \n\u25881\u2588\u2588\u2588 2\u25884 6 6 4 4 4 1 3 4 4 \n\nUnique solution Unique solution\n~~~~\n\n### Shapes\n\nThe `grilops.shapes` module is helpful for adding constraints that ensure\ncells are grouped into orthogonally contiguous regions (polyominos) of fixed\nshapes and sizes. Some examples of puzzle types for which this is useful are\n[Battleship](https://en.wikipedia.org/wiki/Battleship_(puzzle)) and\n[LITS](https://en.wikipedia.org/wiki/LITS).\n\n~~~~\n$ python3 examples/battleship.py $ python3 examples/lits.py\n \u25b4 IIII\n\u25c2\u25aa\u25b8 \u25aa \u2022 SS L \n \u25be LSS L I\n\u25c2\u25aa\u25aa\u25b8 \u2022 L IIIILLI\n LL L I\n \u25b4 \u25c2\u25b8 TTT L I\n \u25be \u25b4 SS T LL T\n \u25be \u2022 SSLL TT\n L T T\nUnique solution IIIILTTT\n\n Unique solution\n~~~~\n\n### Sightlines\n\nThe `grilops.sightlines` module is helpful for adding constraints that ensure\nproperties hold along straight lines through the grid. These \"sightlines\" may\nterminate before reaching the edge of the grid if certain conditions are met\n(e.g. if a certain symbol, such as one representing a wall, is\nencountered). Some examples of puzzle types for which this is useful are\n[Akari](https://en.wikipedia.org/wiki/Light_Up_(puzzle)) and\n[Skyscraper](https://www.puzzlemix.com/Skyscraper).\n\n~~~~\n$ python3 examples/akari.py $ python3 examples/skyscraper.py \n\u2588* \u2588* \u2588 23541 \n * \u2588 15432 \n*\u2588* \u2588 * 34215 \n *\u2588 \u2588 \u2588 42153 \n \u2588\u2588\u2588* 51324 \n *\u2588\u2588\u2588* \n\u2588 * \u2588* \u2588* Unique solution\n* \u2588* \u2588*\n \u2588 * \n\u2588 * \u2588* \u2588\n\nUnique solution\n~~~~\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/obijywk/grilops", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "grilops", "package_url": "https://pypi.org/project/grilops/", "platform": "", "project_url": "https://pypi.org/project/grilops/", "project_urls": { "Homepage": "https://github.com/obijywk/grilops" }, "release_url": "https://pypi.org/project/grilops/0.4.0/", "requires_dist": [ "z3-solver" ], "requires_python": ">=3.6", "summary": "GRId LOgic Puzzle Solver", "version": "0.4.0" }, "last_serial": 5764302, "releases": { "0.1.1": [ { "comment_text": "", "digests": { "md5": "b71a17629130198a6bf183f355888556", "sha256": "724d2ddfa7d238f83121d24020257106b761ef15c0b6b6285c7deee1e63e135f" }, "downloads": -1, "filename": "grilops-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "b71a17629130198a6bf183f355888556", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6502, "upload_time": "2019-03-09T15:28:12", "url": "https://files.pythonhosted.org/packages/9b/4c/fdc20fb4fd6f21e161f1541702f18bccad3a3ea2083250b69a379e22842a/grilops-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0ba711f8a21a5608ea5253f8d513493b", "sha256": "b8032558c603e614ef485daac1745dbbfef4addc1d74ef2ffaab82ad62da5cc4" }, "downloads": -1, "filename": "grilops-0.1.1.tar.gz", "has_sig": false, "md5_digest": "0ba711f8a21a5608ea5253f8d513493b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4491, "upload_time": "2019-03-09T15:28:51", "url": "https://files.pythonhosted.org/packages/3d/d6/22dabcd903f3693bcd932a10e720458e12a96c5efe96a7356a8ebb6b536b/grilops-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "f74845d524eaeb585390f4324f06a9c9", "sha256": "48801ef48b57784f18660e0ee1898e84b3b06eadd043bb7130598bc493174b89" }, "downloads": -1, "filename": "grilops-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "f74845d524eaeb585390f4324f06a9c9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8202, "upload_time": "2019-03-10T22:36:06", "url": "https://files.pythonhosted.org/packages/90/a8/ed441906f324867db6cc2b873687f0788dd608dc448d17bb68611f9e4539/grilops-0.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a35c8ddef6c491665f7d09a7e612abd5", "sha256": "6beeab97b2e00db315bc7f0cddd69009b0b7020080d9d78177f681715f573011" }, "downloads": -1, "filename": "grilops-0.1.2.tar.gz", "has_sig": false, "md5_digest": "a35c8ddef6c491665f7d09a7e612abd5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5566, "upload_time": "2019-03-10T22:36:08", "url": "https://files.pythonhosted.org/packages/64/09/e37e26788018fa7e0258be1b549aaec92e4f65ef5ec32921298dcb364a42/grilops-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "a569e85fd796bd2996ca956698973aac", "sha256": "1524a993ae3f2cc07adc628b3082752602940eec63c068b7c5da0d5a2de29191" }, "downloads": -1, "filename": "grilops-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "a569e85fd796bd2996ca956698973aac", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8360, "upload_time": "2019-04-05T17:58:27", "url": "https://files.pythonhosted.org/packages/d6/ad/e39b22c0db2200d04b923d1ff949602cd59eeaa71ad3440a6df2400b68db/grilops-0.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "506cbab360d91f5b007311dd034f852b", "sha256": "aa31df887217af1c968450df685cbffc3fa66c54129328cbdfc71c581b2bad98" }, "downloads": -1, "filename": "grilops-0.1.3.tar.gz", "has_sig": false, "md5_digest": "506cbab360d91f5b007311dd034f852b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5851, "upload_time": "2019-04-05T17:58:28", "url": "https://files.pythonhosted.org/packages/03/a9/b606f4503e821e4c8814705d68fa47e275342f4127cfde993869388de327/grilops-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "c01b912b10fe7075bf2d14c93400e1c7", "sha256": "c62397373912498d39000621a06682ff816d9c53b6833ff0e1fd6ffa13073f2b" }, "downloads": -1, "filename": "grilops-0.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "c01b912b10fe7075bf2d14c93400e1c7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11078, "upload_time": "2019-05-08T00:12:47", "url": "https://files.pythonhosted.org/packages/c9/63/1cd9631155bd7afa31377aa5821c39cfe13045e168218acece3c7d5c1640/grilops-0.1.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "249b1eb7666c2decb93b2d72346f749b", "sha256": "179b8048cfce9ccdc5ed9928e206cf58e4a547519806591ddb4ee982edd5d90c" }, "downloads": -1, "filename": "grilops-0.1.4.tar.gz", "has_sig": false, "md5_digest": "249b1eb7666c2decb93b2d72346f749b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7553, "upload_time": "2019-05-08T00:12:48", "url": "https://files.pythonhosted.org/packages/82/b0/db3fb547955d9cd92f9dda0ac5d5e1a56bd370c6277f646abbad7ed9eafb/grilops-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "e44f8d914d92aa8650ca22701ad0e9fa", "sha256": "25ed4a338c5199d7735e70e69b1be3c174025e26e7a3cf383b87da56ea29706d" }, "downloads": -1, "filename": "grilops-0.1.5-py3-none-any.whl", "has_sig": false, "md5_digest": "e44f8d914d92aa8650ca22701ad0e9fa", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11096, "upload_time": "2019-05-08T00:38:00", "url": "https://files.pythonhosted.org/packages/3f/4c/9471a1d6a8588785d83ca357fc78eec8e87d3bc1a20e86037549e21520e0/grilops-0.1.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "94b0c04dd1416cd21bc8b520bf769f50", "sha256": "a95f872d4ff878100ce868d88f53bd088bdb3c2375f815532f1cfeb6cccf359d" }, "downloads": -1, "filename": "grilops-0.1.5.tar.gz", "has_sig": false, "md5_digest": "94b0c04dd1416cd21bc8b520bf769f50", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7604, "upload_time": "2019-05-08T00:38:02", "url": "https://files.pythonhosted.org/packages/79/d0/e6b1cfe856b40739794f972d817e1ede98dff5d40eb51aa820e98acd396e/grilops-0.1.5.tar.gz" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "ed1fcf9c7c0c8f944d6abb75f4714eea", "sha256": "28e4b8bf6b24abeaff5d3dbb5e5f69e6e1503840ece631fd9657aeab2abe4d09" }, "downloads": -1, "filename": "grilops-0.1.6-py3-none-any.whl", "has_sig": false, "md5_digest": "ed1fcf9c7c0c8f944d6abb75f4714eea", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12940, "upload_time": "2019-05-20T01:56:51", "url": "https://files.pythonhosted.org/packages/36/27/35f6cf1a3aa9a236157c32c8dfd7b2e4630706f9a75ff04f0f892eb65c01/grilops-0.1.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b6340a6bca3c90e9668aa6a7562e381d", "sha256": "f79c5e092af57010a058ee7105ff84ec84e4fd639b98071c3ec9a250e981bc8a" }, "downloads": -1, "filename": "grilops-0.1.6.tar.gz", "has_sig": false, "md5_digest": "b6340a6bca3c90e9668aa6a7562e381d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9550, "upload_time": "2019-05-20T01:56:53", "url": "https://files.pythonhosted.org/packages/07/44/74c31905c368efed5e93c09bdd43970a1d6c8d1e86d22b31063a726eb255/grilops-0.1.6.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "aa129f4cdd7871fb8d59c519fc6e8694", "sha256": "4e9515552c60c9873652d0e30309eb5946f1915e9fa4ca0221c99ce2cefb83fb" }, "downloads": -1, "filename": "grilops-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "aa129f4cdd7871fb8d59c519fc6e8694", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15319, "upload_time": "2019-05-28T01:58:15", "url": "https://files.pythonhosted.org/packages/f3/24/fca6e2d0e5bca667a58cf6632e2b75c8b8c7b28b2b7c1c0d8d2a84dea638/grilops-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "93b37b96b940f31ea7ab3b7e2ff1be76", "sha256": "a91949b1f9fa329bd1056396a9bef384b57a2549132eef1a4501ad7ab1d97490" }, "downloads": -1, "filename": "grilops-0.2.0.tar.gz", "has_sig": false, "md5_digest": "93b37b96b940f31ea7ab3b7e2ff1be76", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11967, "upload_time": "2019-05-28T01:58:17", "url": "https://files.pythonhosted.org/packages/f0/03/86a437c58113f3162fb11e506dec7447125d5d7cd98bc387ec14cf315e10/grilops-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "69521506543811f7f3941594dd8c279d", "sha256": "abcdf4658e01718015ccd0594fba6e8172d3b095b7ada76feaa64abfe2c47e13" }, "downloads": -1, "filename": "grilops-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "69521506543811f7f3941594dd8c279d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 15444, "upload_time": "2019-06-05T14:29:51", "url": "https://files.pythonhosted.org/packages/75/e6/8788bde53142ff6aa2e6871d2c32b955c01db7259abdfaa6f815a10c4263/grilops-0.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8e884e9e1b100142c34ea3619a27f102", "sha256": "37f16de35a21153eb148e799b6da19710645088679c419de1ceb4500f380d701" }, "downloads": -1, "filename": "grilops-0.2.1.tar.gz", "has_sig": false, "md5_digest": "8e884e9e1b100142c34ea3619a27f102", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 11974, "upload_time": "2019-06-05T14:29:53", "url": "https://files.pythonhosted.org/packages/c9/75/0e4c2ac3c5973e8c176035e8f9c4de6eac46f0a28fd6b6c97b44869b5b57/grilops-0.2.1.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "40a1bd4d7c9b9bab88b6f2e7bed0af18", "sha256": "9b04993387b7f06783f6338b828aacf638411f694855552b320d7946096575ad" }, "downloads": -1, "filename": "grilops-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "40a1bd4d7c9b9bab88b6f2e7bed0af18", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 16110, "upload_time": "2019-06-07T03:54:21", "url": "https://files.pythonhosted.org/packages/31/db/66ef2a40928cccd2e61ce9c39f7dabb762c0ed01f623013161371dc98ed1/grilops-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6a5b984a737f6423a19ef5ac2aa5168f", "sha256": "4104bb9910634379687adc903c07a93cc902948eb1f4b967841bf29501581fd9" }, "downloads": -1, "filename": "grilops-0.3.0.tar.gz", "has_sig": false, "md5_digest": "6a5b984a737f6423a19ef5ac2aa5168f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 14090, "upload_time": "2019-06-07T03:54:22", "url": "https://files.pythonhosted.org/packages/6d/f3/5f022b25e364c9fcf8f8206c05b256b7c32891d4073536834ff3ccf6b2aa/grilops-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "c635ec97e70905ed523c06d200e94e55", "sha256": "128724378a236aaa4f6f6a1f7b84ed2c86fba27e14dd1aa8acfb4ba6f74361c4" }, "downloads": -1, "filename": "grilops-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "c635ec97e70905ed523c06d200e94e55", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 16319, "upload_time": "2019-08-31T13:08:27", "url": "https://files.pythonhosted.org/packages/ae/9e/be19fb91dfcf5f2ae40cd0d00e87af2e4df40bb67f5a002f9654073cb9f3/grilops-0.4.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "66babce4211a65a9e5a3c7eff8f21a5a", "sha256": "05d9b12fca624a6e76c82d8d653e30c849f3662d4be7074ea7fa55decad92363" }, "downloads": -1, "filename": "grilops-0.4.0.tar.gz", "has_sig": false, "md5_digest": "66babce4211a65a9e5a3c7eff8f21a5a", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 12665, "upload_time": "2019-08-31T13:08:29", "url": "https://files.pythonhosted.org/packages/83/ff/037fe1d0e30718243de8381310b450fc5518af70c70b5709c1cdf459117b/grilops-0.4.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "c635ec97e70905ed523c06d200e94e55", "sha256": "128724378a236aaa4f6f6a1f7b84ed2c86fba27e14dd1aa8acfb4ba6f74361c4" }, "downloads": -1, "filename": "grilops-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "c635ec97e70905ed523c06d200e94e55", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 16319, "upload_time": "2019-08-31T13:08:27", "url": "https://files.pythonhosted.org/packages/ae/9e/be19fb91dfcf5f2ae40cd0d00e87af2e4df40bb67f5a002f9654073cb9f3/grilops-0.4.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "66babce4211a65a9e5a3c7eff8f21a5a", "sha256": "05d9b12fca624a6e76c82d8d653e30c849f3662d4be7074ea7fa55decad92363" }, "downloads": -1, "filename": "grilops-0.4.0.tar.gz", "has_sig": false, "md5_digest": "66babce4211a65a9e5a3c7eff8f21a5a", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 12665, "upload_time": "2019-08-31T13:08:29", "url": "https://files.pythonhosted.org/packages/83/ff/037fe1d0e30718243de8381310b450fc5518af70c70b5709c1cdf459117b/grilops-0.4.0.tar.gz" } ] }