)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"aa7c6e825b34f6f5c0f5f9c97d2cbba6e668c611","unresolved":true,"context_lines":[{"line_number":13,"context_line":"fault the PF was allocated hence the VFs was marked unavailable)."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"In this state this PF is still schedulable but during the"},{"line_number":16,"context_line":"PCI claim the handling of dependent devices in the PCI tracker fill fail"},{"line_number":17,"context_line":"with the error: \"Attempt to consume PCI device XXX from empty pool\"."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"The reason of the failure is that when the PF is claimed, all the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"0aa6391e_b9f64f0f","line":16,"range":{"start_line":16,"start_character":63,"end_line":16,"end_character":67},"updated":"2022-04-26 10:52:21.000000000","message":"will","commit_id":"dc8d259ce6ec2399efb1621a30832385390c2671"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0e23ffd8fdd00035f22d60522ca7efaf272bb3cb","unresolved":true,"context_lines":[{"line_number":33,"context_line":"From cleanup perspective this is an analogous state. So it is also"},{"line_number":34,"context_line":"added to the cleanup logic."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"Related-Bug: #1969496"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"Change-Id: If9ab424cc7375a1f0d41b03f01c4a823216b3eb8"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"6cc3c53f_047742f7","line":36,"range":{"start_line":36,"start_character":0,"end_line":36,"end_character":7},"updated":"2022-04-26 16:46:16.000000000","message":"ack i was going to say that we might want a release not but this is only a partial fix.\n\nyou coudl use \n\nPartial-Bug: here instead by the way i think that would be equally correct.","commit_id":"dc8d259ce6ec2399efb1621a30832385390c2671"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"46fb5aefb646607c7f4bbd20636204b01fb7f59c","unresolved":true,"context_lines":[{"line_number":33,"context_line":"From cleanup perspective this is an analogous state. So it is also"},{"line_number":34,"context_line":"added to the cleanup logic."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"Related-Bug: #1969496"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"Change-Id: If9ab424cc7375a1f0d41b03f01c4a823216b3eb8"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"b31f71d1_08936689","line":36,"range":{"start_line":36,"start_character":0,"end_line":36,"end_character":7},"in_reply_to":"6cc3c53f_047742f7","updated":"2022-04-29 14:22:59.000000000","message":"Not, for a non-fixed bug, we need to use Related-Bug IIRC.","commit_id":"dc8d259ce6ec2399efb1621a30832385390c2671"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0e23ffd8fdd00035f22d60522ca7efaf272bb3cb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"50102107_4bc6c11e","updated":"2022-04-26 16:46:16.000000000","message":"i need to finish reviewing the unit test but ill push what i have now.\nsofar so good.","commit_id":"dc8d259ce6ec2399efb1621a30832385390c2671"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"4d8fe82ff7e1bd2218d5174582e0df526bb05b15","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"8f435546_2063853d","updated":"2022-04-28 12:38:09.000000000","message":"we chatted about this on irc there is some global state sharign and it look like ther emay be exsiting test that also have the same issue.\n\ngibi is going to fix there tese and then file a followup to adress the general issue","commit_id":"3444c5c95f07fe3827d98b25fb117ba438118f60"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"46fb5aefb646607c7f4bbd20636204b01fb7f59c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"19c3f5e2_035bb531","updated":"2022-04-29 14:22:59.000000000","message":"I had some nits but eventually all of them were not issues.","commit_id":"284ea72e96604bdf16d1c5c4db47247334841b2f"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f427b93119778cb4a28ecf485e8f1db88e1f54b7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"4818c627_c08a5a6b","updated":"2022-04-29 10:07:04.000000000","message":"recheck oslo.policy is now released https://review.opendev.org/c/openstack/releases/+/839775\n\nnits aside this appears to do what was intended and has a good level of test coverage so this looks good too me. thanks gibi 😊","commit_id":"284ea72e96604bdf16d1c5c4db47247334841b2f"}],"nova/objects/pci_device.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0e23ffd8fdd00035f22d60522ca7efaf272bb3cb","unresolved":true,"context_lines":[{"line_number":453,"context_line":"        expected_states \u003d ["},{"line_number":454,"context_line":"            fields.PciDeviceStatus.AVAILABLE,"},{"line_number":455,"context_line":"            fields.PciDeviceStatus.UNAVAILABLE,"},{"line_number":456,"context_line":"            fields.PciDeviceStatus.UNCLAIMABLE,"},{"line_number":457,"context_line":"        ]"},{"line_number":458,"context_line":"        if self.status not in expected_states:"},{"line_number":459,"context_line":"            raise exception.PciDeviceInvalidStatus("}],"source_content_type":"text/x-python","patch_set":2,"id":"690ba07b_6e3415d0","line":456,"range":{"start_line":456,"start_character":10,"end_line":456,"end_character":47},"updated":"2022-04-26 16:46:16.000000000","message":"ack i forgot about this state.\nthis is the state vfs are in when the parrent is claimed but not allocated to the vm.\n\nclaimed means reserved for the vm allocated means in use by the vm (e.g. the vm has been booted with this at some point)","commit_id":"dc8d259ce6ec2399efb1621a30832385390c2671"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"4d8fe82ff7e1bd2218d5174582e0df526bb05b15","unresolved":false,"context_lines":[{"line_number":453,"context_line":"        expected_states \u003d ["},{"line_number":454,"context_line":"            fields.PciDeviceStatus.AVAILABLE,"},{"line_number":455,"context_line":"            fields.PciDeviceStatus.UNAVAILABLE,"},{"line_number":456,"context_line":"            fields.PciDeviceStatus.UNCLAIMABLE,"},{"line_number":457,"context_line":"        ]"},{"line_number":458,"context_line":"        if self.status not in expected_states:"},{"line_number":459,"context_line":"            raise exception.PciDeviceInvalidStatus("}],"source_content_type":"text/x-python","patch_set":2,"id":"ef2bed80_796ce8ea","line":456,"range":{"start_line":456,"start_character":10,"end_line":456,"end_character":47},"in_reply_to":"690ba07b_6e3415d0","updated":"2022-04-28 12:38:09.000000000","message":"Done","commit_id":"dc8d259ce6ec2399efb1621a30832385390c2671"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0e23ffd8fdd00035f22d60522ca7efaf272bb3cb","unresolved":true,"context_lines":[{"line_number":469,"context_line":"                address\u003dself.address,"},{"line_number":470,"context_line":"                owner\u003dself.instance_uuid,"},{"line_number":471,"context_line":"                hopeowner\u003dNone,"},{"line_number":472,"context_line":"            )"},{"line_number":473,"context_line":""},{"line_number":474,"context_line":"        self.status \u003d fields.PciDeviceStatus.REMOVED"},{"line_number":475,"context_line":"        self.instance_uuid \u003d None"}],"source_content_type":"text/x-python","patch_set":2,"id":"da99fe78_92498cb9","line":472,"updated":"2022-04-26 16:46:16.000000000","message":"ack","commit_id":"dc8d259ce6ec2399efb1621a30832385390c2671"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"4d8fe82ff7e1bd2218d5174582e0df526bb05b15","unresolved":false,"context_lines":[{"line_number":469,"context_line":"                address\u003dself.address,"},{"line_number":470,"context_line":"                owner\u003dself.instance_uuid,"},{"line_number":471,"context_line":"                hopeowner\u003dNone,"},{"line_number":472,"context_line":"            )"},{"line_number":473,"context_line":""},{"line_number":474,"context_line":"        self.status \u003d fields.PciDeviceStatus.REMOVED"},{"line_number":475,"context_line":"        self.instance_uuid \u003d None"}],"source_content_type":"text/x-python","patch_set":2,"id":"2681f703_0a2383ee","line":472,"in_reply_to":"da99fe78_92498cb9","updated":"2022-04-28 12:38:09.000000000","message":"Done","commit_id":"dc8d259ce6ec2399efb1621a30832385390c2671"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"46fb5aefb646607c7f4bbd20636204b01fb7f59c","unresolved":true,"context_lines":[{"line_number":446,"context_line":"        else:"},{"line_number":447,"context_line":"            instance.pci_devices.objects.append(copy.copy(self))"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"    def remove(self):"},{"line_number":450,"context_line":"        # We allow removal of a device is if it is unused. It can be unused"},{"line_number":451,"context_line":"        # either by being in available state or being in a state that shows"},{"line_number":452,"context_line":"        # that the parent or child device blocks the consumption of this device"}],"source_content_type":"text/x-python","patch_set":4,"id":"51da639c_42a4a5fe","line":449,"updated":"2022-04-29 14:22:59.000000000","message":"fortunately, this is not a remotable method so we can change the behaviour below without adding a new object version.","commit_id":"284ea72e96604bdf16d1c5c4db47247334841b2f"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"46fb5aefb646607c7f4bbd20636204b01fb7f59c","unresolved":true,"context_lines":[{"line_number":453,"context_line":"        expected_states \u003d ["},{"line_number":454,"context_line":"            fields.PciDeviceStatus.AVAILABLE,"},{"line_number":455,"context_line":"            fields.PciDeviceStatus.UNAVAILABLE,"},{"line_number":456,"context_line":"            fields.PciDeviceStatus.UNCLAIMABLE,"},{"line_number":457,"context_line":"        ]"},{"line_number":458,"context_line":"        if self.status not in expected_states:"},{"line_number":459,"context_line":"            raise exception.PciDeviceInvalidStatus("}],"source_content_type":"text/x-python","patch_set":4,"id":"c0541674_ca5103b4","line":456,"updated":"2022-04-29 14:22:59.000000000","message":"we could test the new behaviour, which is that now if the status is UNAVAILABLE or UNCLAIMABLE, this no longer provides an exception.","commit_id":"284ea72e96604bdf16d1c5c4db47247334841b2f"}],"nova/tests/unit/objects/test_pci_device.py":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"46fb5aefb646607c7f4bbd20636204b01fb7f59c","unresolved":true,"context_lines":[{"line_number":476,"context_line":"        devobj.claim(self.inst.uuid)"},{"line_number":477,"context_line":"        devobj.status \u003d fields.PciDeviceStatus.UNAVAILABLE"},{"line_number":478,"context_line":"        self.assertRaises(exception.PciDeviceInvalidOwner, devobj.remove)"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":""},{"line_number":481,"context_line":"class TestPciDeviceObject(test_objects._LocalTest,"},{"line_number":482,"context_line":"                          _TestPciDeviceObject):"}],"source_content_type":"text/x-python","patch_set":4,"id":"d1796315_07daa486","line":479,"updated":"2022-04-29 14:22:59.000000000","message":"OK, this test works because .claim() adds an instance_uuid field.","commit_id":"284ea72e96604bdf16d1c5c4db47247334841b2f"}],"nova/tests/unit/pci/test_manager.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0e23ffd8fdd00035f22d60522ca7efaf272bb3cb","unresolved":true,"context_lines":[{"line_number":404,"context_line":"        if len(devs) \u003d\u003d 1:"},{"line_number":405,"context_line":"            return devs[0]"},{"line_number":406,"context_line":"        if devs:"},{"line_number":407,"context_line":"            raise ValueError(\u0027ambiguous address\u0027, devs)"},{"line_number":408,"context_line":"        else:"},{"line_number":409,"context_line":"            raise ValueError(\u0027device not found\u0027, address)"},{"line_number":410,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"a46e499c_abd3467b","line":407,"range":{"start_line":407,"start_character":12,"end_line":407,"end_character":55},"updated":"2022-04-26 16:46:16.000000000","message":"while this technically can happen with a speciric sku of connetx.3 this should not happen in general but it does not hurt to have this case.","commit_id":"dc8d259ce6ec2399efb1621a30832385390c2671"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ef99f7f3175cfb7fd685f1c9c1ba7d0135a58c95","unresolved":true,"context_lines":[{"line_number":469,"context_line":"        self.assertEqual(\u0027allocated\u0027, dev4_vf.status)"},{"line_number":470,"context_line":"        self.assertEqual(uuidsentinel.instance1, dev4_vf.instance_uuid)"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"        # now simulate that the parent PF is removed from the hypervisor and"},{"line_number":473,"context_line":"        # the compute is restarted. As the PF is not claimed or allocated we"},{"line_number":474,"context_line":"        # are free to remove it from the tracker."},{"line_number":475,"context_line":"        self.tracker._set_hvdevs([fake_db_dev_4])"},{"line_number":476,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"c51413a6_514eaed7","line":473,"range":{"start_line":472,"start_character":8,"end_line":473,"end_character":35},"updated":"2022-04-28 08:49:22.000000000","message":"this could also happen if the pic whitelist was updated to not allow the pf.\ni.e. initially the pf and vf were allowed by setting the pf address in the whitelist and then later the VF vendor id and product id was added in addition the PF adress. that should result in the PF being removed but the VFs remaining in the same state which you are asserting below.\n\nrealistically you can\u0027t physically remove a PF without the VFs being removed but you can update the whitelist to filter out the PF and allow only the VFs","commit_id":"dc8d259ce6ec2399efb1621a30832385390c2671"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9b0dfcb5094aea6b1848fc52263e3cbc8d623a44","unresolved":true,"context_lines":[{"line_number":469,"context_line":"        self.assertEqual(\u0027allocated\u0027, dev4_vf.status)"},{"line_number":470,"context_line":"        self.assertEqual(uuidsentinel.instance1, dev4_vf.instance_uuid)"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"        # now simulate that the parent PF is removed from the hypervisor and"},{"line_number":473,"context_line":"        # the compute is restarted. As the PF is not claimed or allocated we"},{"line_number":474,"context_line":"        # are free to remove it from the tracker."},{"line_number":475,"context_line":"        self.tracker._set_hvdevs([fake_db_dev_4])"},{"line_number":476,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ec428c95_b4fb8b52","line":473,"range":{"start_line":472,"start_character":8,"end_line":473,"end_character":35},"in_reply_to":"c51413a6_514eaed7","updated":"2022-04-28 14:34:33.000000000","message":"\u003e this could also happen if the pic whitelist was updated to not allow the pf.\n\u003e i.e. initially the pf and vf were allowed by setting the pf address in the whitelist and then later the VF vendor id and product id was added in addition the PF adress. that should result in the PF being removed but the VFs remaining in the same state which you are asserting below.\n\nGood idea. I can try to check this in the functional env...\n\n// later\n\nI\u0027v tried to\n* boot a VM to allocate the PF\n* stop the compute\n* evac the VM\n* change the pci whitelist to not match the PF\n* start the compute\n\nInterestingly after the compute restart both the PF (which is not matching the whitelist) and the VF is in available state.\n\nAlso tried without the evac step. Still no luck.\n\nI start to believe that I reached the limit of the functional env, especially that compute restart can only be simulated by killing the service and creating a _new_ service. \n\nI don\u0027t have real SRIOV env to play with so I have to accept that I don\u0027t know how to reproduce the original inconsistency.\n\n\u003e \n\u003e realistically you can\u0027t physically remove a PF without the VFs being removed but you can update the whitelist to filter out the PF and allow only the VFs","commit_id":"dc8d259ce6ec2399efb1621a30832385390c2671"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f427b93119778cb4a28ecf485e8f1db88e1f54b7","unresolved":false,"context_lines":[{"line_number":469,"context_line":"        self.assertEqual(\u0027allocated\u0027, dev4_vf.status)"},{"line_number":470,"context_line":"        self.assertEqual(uuidsentinel.instance1, dev4_vf.instance_uuid)"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"        # now simulate that the parent PF is removed from the hypervisor and"},{"line_number":473,"context_line":"        # the compute is restarted. As the PF is not claimed or allocated we"},{"line_number":474,"context_line":"        # are free to remove it from the tracker."},{"line_number":475,"context_line":"        self.tracker._set_hvdevs([fake_db_dev_4])"},{"line_number":476,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"64e75f7d_e17ef47e","line":473,"range":{"start_line":472,"start_character":8,"end_line":473,"end_character":35},"in_reply_to":"ec428c95_b4fb8b52","updated":"2022-04-29 10:07:04.000000000","message":"Ack","commit_id":"dc8d259ce6ec2399efb1621a30832385390c2671"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"4d8fe82ff7e1bd2218d5174582e0df526bb05b15","unresolved":true,"context_lines":[{"line_number":393,"context_line":"        self.tracker.claim_instance(mock.sentinel.context,"},{"line_number":394,"context_line":"                                    pci_requests_obj, None)"},{"line_number":395,"context_line":"        fake_pci_3 \u003d dict(fake_pci, address\u003d\u00270000:00:00.2\u0027, vendor_id\u003d\u0027v2\u0027)"},{"line_number":396,"context_line":"        fake_pci_devs \u003d [copy.deepcopy(fake_pci), copy.deepcopy(fake_pci_2),"},{"line_number":397,"context_line":"                         copy.deepcopy(fake_pci_3)]"},{"line_number":398,"context_line":"        self.tracker._set_hvdevs(fake_pci_devs)"},{"line_number":399,"context_line":"        self.assertEqual(len(self.tracker.stale), 1)"},{"line_number":400,"context_line":"        self.assertEqual(self.tracker.stale[\u00270000:00:00.2\u0027][\u0027vendor_id\u0027], \u0027v2\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"4444003f_6fe14e09","line":397,"range":{"start_line":396,"start_character":8,"end_line":397,"end_character":51},"updated":"2022-04-28 12:38:09.000000000","message":"you need to do this i think below as it looks liek you are shareing/leaking gloabl state.\n\ni am getting intermitent failures locally for\ntest_set_hvdevs_unavailable_pf_removed\nand i  think also test_set_hvdevs_unavailable_vf_removed","commit_id":"3444c5c95f07fe3827d98b25fb117ba438118f60"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"44cd36b7a071ed33334a6b2c3a3af8372693ff6e","unresolved":false,"context_lines":[{"line_number":393,"context_line":"        self.tracker.claim_instance(mock.sentinel.context,"},{"line_number":394,"context_line":"                                    pci_requests_obj, None)"},{"line_number":395,"context_line":"        fake_pci_3 \u003d dict(fake_pci, address\u003d\u00270000:00:00.2\u0027, vendor_id\u003d\u0027v2\u0027)"},{"line_number":396,"context_line":"        fake_pci_devs \u003d [copy.deepcopy(fake_pci), copy.deepcopy(fake_pci_2),"},{"line_number":397,"context_line":"                         copy.deepcopy(fake_pci_3)]"},{"line_number":398,"context_line":"        self.tracker._set_hvdevs(fake_pci_devs)"},{"line_number":399,"context_line":"        self.assertEqual(len(self.tracker.stale), 1)"},{"line_number":400,"context_line":"        self.assertEqual(self.tracker.stale[\u00270000:00:00.2\u0027][\u0027vendor_id\u0027], \u0027v2\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3621923e_623f37c2","line":397,"range":{"start_line":396,"start_character":8,"end_line":397,"end_character":51},"in_reply_to":"4444003f_6fe14e09","updated":"2022-04-28 14:35:08.000000000","message":"Fixed in https://review.opendev.org/c/openstack/nova/+/839766/2","commit_id":"3444c5c95f07fe3827d98b25fb117ba438118f60"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"46fb5aefb646607c7f4bbd20636204b01fb7f59c","unresolved":true,"context_lines":[{"line_number":442,"context_line":"        dev4_vf \u003d self._get_device_by_address(fake_db_dev_4[\u0027address\u0027])"},{"line_number":443,"context_line":"        self.assertEqual(\u0027unavailable\u0027, dev4_vf.status)"},{"line_number":444,"context_line":"        dev5_vf \u003d self._get_device_by_address(fake_db_dev_5[\u0027address\u0027])"},{"line_number":445,"context_line":"        self.assertEqual(\u0027removed\u0027, dev5_vf.status)"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"    def test_set_hvdevs_unavailable_pf_removed(self):"},{"line_number":448,"context_line":"        # We start with one PF parent and one child VF"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f849a42_a191f1fa","line":445,"updated":"2022-04-29 14:22:59.000000000","message":"actually, you\u0027re testing the unavailable status here.","commit_id":"284ea72e96604bdf16d1c5c4db47247334841b2f"}]}
