prompt: from_json does not correctly convert BulkDataURI's in SQ data elements
  **Describe the bug**
  When a DICOM object contains large data elements in SQ elements and is converted to JSON, those elements are correctly turned into BulkDataURI's. However, when the JSON is converted back to DICOM using from_json, the BulkDataURI's in SQ data elements are not converted back and warnings are thrown.
  
  **Expected behavior**
  The BulkDataURI's in SQ data elements get converted back correctly.
  
  **Steps To Reproduce**
  Take the `waveform_ecg.dcm` in the test data, convert it to JSON, and then convert the JSON to DICOM
  
  **Your environment**
  module       | version
  ------       | -------
  platform     | macOS-10.15.7-x86_64-i386-64bit
  Python       | 3.8.2 (v3.8.2:7b3ab5921f, Feb 24 2020, 17:52:18)  [Clang 6.0 (clang-600.0.57)]
  pydicom      | 2.1.0
  gdcm         | _module not found_
  jpeg_ls      | _module not found_
  numpy        | _module not found_
  PIL          | _module not found_
  
  The problem is in `jsonrep.py` at line 227. I plan on submitting a pull-request today for this.
  
instance: {"FAIL_TO_PASS": "[\"pydicom/tests/test_json.py::TestBinary::test_bulk_data_reader_is_called_within_SQ\"]", "PASS_TO_PASS": "[\"pydicom/tests/test_json.py::TestPersonName::test_json_pn_from_file\", \"pydicom/tests/test_json.py::TestPersonName::test_pn_components_to_json\", \"pydicom/tests/test_json.py::TestPersonName::test_pn_components_from_json\", \"pydicom/tests/test_json.py::TestPersonName::test_empty_value\", \"pydicom/tests/test_json.py::TestPersonName::test_multi_value_to_json\", \"pydicom/tests/test_json.py::TestPersonName::test_dataelem_from_json\", \"pydicom/tests/test_json.py::TestAT::test_to_json\", \"pydicom/tests/test_json.py::TestAT::test_from_json\", \"pydicom/tests/test_json.py::TestAT::test_invalid_value_in_json\", \"pydicom/tests/test_json.py::TestAT::test_invalid_tag_in_json\", \"pydicom/tests/test_json.py::TestDataSetToJson::test_json_from_dicom_file\", \"pydicom/tests/test_json.py::TestDataSetToJson::test_roundtrip\", \"pydicom/tests/test_json.py::TestDataSetToJson::test_dataset_dumphandler\", \"pydicom/tests/test_json.py::TestDataSetToJson::test_dataelement_dumphandler\", \"pydicom/tests/test_json.py::TestDataSetToJson::test_sort_order\", \"pydicom/tests/test_json.py::TestSequence::test_nested_sequences\", \"pydicom/tests/test_json.py::TestBinary::test_inline_binary\", \"pydicom/tests/test_json.py::TestBinary::test_invalid_inline_binary\", \"pydicom/tests/test_json.py::TestBinary::test_valid_bulkdata_uri\", \"pydicom/tests/test_json.py::TestBinary::test_invalid_bulkdata_uri\", \"pydicom/tests/test_json.py::TestBinary::test_bulk_data_reader_is_called\", \"pydicom/tests/test_json.py::TestBinary::test_bulk_data_reader_is_called_2\"]", "base_commit": "49a3da4a3d9c24d7e8427a25048a1c7d5c4f7724", "created_at": "2020-11-04T21:13:33Z", "environment_setup_commit": "506ecea8f378dc687d5c504788fc78810a190b7a", "hints_text": "", "instance_id": "pydicom__pydicom-1256", "patch": "diff --git a/pydicom/jsonrep.py b/pydicom/jsonrep.py\n--- a/pydicom/jsonrep.py\n+++ b/pydicom/jsonrep.py\n@@ -226,7 +226,8 @@ def get_sequence_item(self, value):\n                     value_key = unique_value_keys[0]\n                     elem = DataElement.from_json(\n                         self.dataset_class, key, vr,\n-                        val[value_key], value_key\n+                        val[value_key], value_key,\n+                        self.bulk_data_element_handler\n                     )\n                 ds.add(elem)\n         return ds\n", "problem_statement": "from_json does not correctly convert BulkDataURI's in SQ data elements\n**Describe the bug**\r\nWhen a DICOM object contains large data elements in SQ elements and is converted to JSON, those elements are correctly turned into BulkDataURI's. However, when the JSON is converted back to DICOM using from_json, the BulkDataURI's in SQ data elements are not converted back and warnings are thrown.\r\n\r\n**Expected behavior**\r\nThe BulkDataURI's in SQ data elements get converted back correctly.\r\n\r\n**Steps To Reproduce**\r\nTake the `waveform_ecg.dcm` in the test data, convert it to JSON, and then convert the JSON to DICOM\r\n\r\n**Your environment**\r\nmodule       | version\r\n------       | -------\r\nplatform     | macOS-10.15.7-x86_64-i386-64bit\r\nPython       | 3.8.2 (v3.8.2:7b3ab5921f, Feb 24 2020, 17:52:18)  [Clang 6.0 (clang-600.0.57)]\r\npydicom      | 2.1.0\r\ngdcm         | _module not found_\r\njpeg_ls      | _module not found_\r\nnumpy        | _module not found_\r\nPIL          | _module not found_\r\n\r\nThe problem is in `jsonrep.py` at line 227. I plan on submitting a pull-request today for this.\n", "repo": "pydicom/pydicom", "test_patch": "diff --git a/pydicom/tests/test_json.py b/pydicom/tests/test_json.py\n--- a/pydicom/tests/test_json.py\n+++ b/pydicom/tests/test_json.py\n@@ -354,3 +354,25 @@ def bulk_data_reader(tag, vr, value):\n         ds = Dataset().from_json(json.dumps(json_data), bulk_data_reader)\n \n         assert b'xyzzy' == ds[0x00091002].value\n+\n+    def test_bulk_data_reader_is_called_within_SQ(self):\n+        def bulk_data_reader(_):\n+            return b'xyzzy'\n+\n+        json_data = {\n+            \"003a0200\": {\n+                \"vr\": \"SQ\", \n+                \"Value\": [\n+                    {\n+                        \"54001010\": {\n+                            \"vr\": \"OW\",\n+                            \"BulkDataURI\": \"https://a.dummy.url\"\n+                        }\n+                    }\n+                ]\n+            }\n+        }\n+\n+        ds = Dataset().from_json(json.dumps(json_data), bulk_data_reader)\n+\n+        assert b'xyzzy' == ds[0x003a0200].value[0][0x54001010].value\n", "version": "2.1"}
parsed_commit_content: {"file_diffs":[{"old_file_content":"# Copyright 2008-2019 pydicom authors. See LICENSE file for details.\n\"\"\"Methods for converting Datasets and DataElements to/from json\"\"\"\n\nimport base64\nfrom inspect import signature\nimport inspect\nfrom typing import Callable, Optional, Union\nimport warnings\n\nfrom pydicom.tag import BaseTag\n\n# Order of keys is significant!\nJSON_VALUE_KEYS = ('Value', 'BulkDataURI', 'InlineBinary',)\n\nBINARY_VR_VALUES = ['OW', 'OB', 'OD', 'OF', 'OL', 'UN',\n                    'OB or OW', 'US or OW', 'US or SS or OW']\nVRs_TO_BE_FLOATS = ['DS', 'FL', 'FD', ]\nVRs_TO_BE_INTS = ['IS', 'SL', 'SS', 'UL', 'US', 'US or SS']\n\n\ndef convert_to_python_number(value, vr):\n    \"\"\"Makes sure that values are either ints or floats\n    based on their value representation.\n\n    .. versionadded:: 1.4\n\n    Parameters\n    ----------\n    value: Union[Union[str, int, float], List[Union[str, int, float]]]\n        value of data element\n    vr: str\n        value representation of data element\n\n    Returns\n    -------\n    Union[Union[str, int, float], List[Union[str, int, float]]]\n\n    \"\"\"\n    if value is None:\n        return None\n    number_type = None\n    if vr in VRs_TO_BE_INTS:\n        number_type = int\n    if vr in VRs_TO_BE_FLOATS:\n        number_type = float\n    if number_type is not None:\n        if isinstance(value, (list, tuple,)):\n            value = [number_type(e) for e in value]\n        else:\n            value = number_type(value)\n    return value\n\n\nclass JsonDataElementConverter:\n    \"\"\"Handles conversion between JSON struct and :class:`DataElement`.\n\n    .. versionadded:: 1.4\n    \"\"\"\n\n    def __init__(\n        self,\n        dataset_class,\n        tag,\n        vr,\n        value,\n        value_key,\n        bulk_data_uri_handler: Optional[\n            Union[\n                Callable[[BaseTag, str, str], object],\n                Callable[[str], object]\n            ]\n        ] = None\n    ):\n        \"\"\"Create a new converter instance.\n\n        Parameters\n        ----------\n        dataset_class : dataset.Dataset derived class\n            Class used to create sequence items.\n        tag : BaseTag\n            The data element tag or int.\n        vr : str\n            The data element value representation.\n        value : list\n            The data element's value(s).\n        value_key : str or None\n            Key of the data element that contains the value\n            (options: ``{\"Value\", \"InlineBinary\", \"BulkDataURI\"}``)\n        bulk_data_uri_handler: callable or None\n            Callable function that accepts either the tag, vr and \"BulkDataURI\"\n            or just the \"BulkDataURI\" of the JSON\n            representation of a data element and returns the actual value of\n            that data element (retrieved via DICOMweb WADO-RS)\n        \"\"\"\n        self.dataset_class = dataset_class\n        self.tag = tag\n        self.vr = vr\n        self.value = value\n        self.value_key = value_key\n        if (\n            bulk_data_uri_handler and\n            len(signature(bulk_data_uri_handler).parameters) == 1\n        ):\n            def wrapped_bulk_data_handler(tag, vr, value):\n                return bulk_data_uri_handler(value)\n            self.bulk_data_element_handler = wrapped_bulk_data_handler\n        else:\n            self.bulk_data_element_handler = bulk_data_uri_handler\n\n    def get_element_values(self):\n        \"\"\"Return a the data element value or list of values.\n\n        Returns\n        -------\n        str or bytes or int or float or dataset_class\n        or PersonName or list of any of these types\n            The value or value list of the newly created data element.\n        \"\"\"\n        from pydicom.dataelem import empty_value_for_VR\n        if self.value_key == 'Value':\n            if not isinstance(self.value, list):\n                fmt = '\"{}\" of data element \"{}\" must be a list.'\n                raise TypeError(fmt.format(self.value_key, self.tag))\n            if not self.value:\n                return empty_value_for_VR(self.vr)\n            element_value = [self.get_regular_element_value(v)\n                             for v in self.value]\n            if len(element_value) == 1 and self.vr != 'SQ':\n                element_value = element_value[0]\n            return convert_to_python_number(element_value, self.vr)\n\n        # The value for \"InlineBinary\" shall be encoded as a base64 encoded\n        # string, as shown in PS3.18, Table F.3.1-1, but the example in\n        # PS3.18, Annex F.4 shows the string enclosed in a list.\n        # We support both variants, as the standard is ambiguous here,\n        # and do the same for \"BulkDataURI\".\n        value = self.value\n        if isinstance(value, list):\n            value = value[0]\n\n        if self.value_key == 'InlineBinary':\n            if not isinstance(value, (str, bytes)):\n                fmt = '\"{}\" of data element \"{}\" must be a bytes-like object.'\n                raise TypeError(fmt.format(self.value_key, self.tag))\n            return base64.b64decode(value)\n\n        if self.value_key == 'BulkDataURI':\n            if not isinstance(value, str):\n                fmt = '\"{}\" of data element \"{}\" must be a string.'\n                raise TypeError(fmt.format(self.value_key, self.tag))\n            if self.bulk_data_element_handler is None:\n                warnings.warn(\n                    'no bulk data URI handler provided for retrieval '\n                    'of value of data element \"{}\"'.format(self.tag)\n                )\n                return empty_value_for_VR(self.vr, raw=True)\n            return self.bulk_data_element_handler(self.tag, self.vr, value)\n        return empty_value_for_VR(self.vr)\n\n    def get_regular_element_value(self, value):\n        \"\"\"Return a the data element value created from a json \"Value\" entry.\n\n        Parameters\n        ----------\n        value : str or int or float or dict\n            The data element's value from the json entry.\n\n        Returns\n        -------\n        dataset_class or PersonName\n        or str or int or float\n            A single value of the corresponding :class:`DataElement`.\n        \"\"\"\n        if self.vr == 'SQ':\n            return self.get_sequence_item(value)\n\n        if self.vr == 'PN':\n            return self.get_pn_element_value(value)\n\n        if self.vr == 'AT':\n            try:\n                return int(value, 16)\n            except ValueError:\n                warnings.warn('Invalid value \"{}\" for AT element - '\n                              'ignoring it'.format(value))\n            return\n        return value\n\n    def get_sequence_item(self, value):\n        \"\"\"Return a sequence item for the JSON dict `value`.\n\n        Parameters\n        ----------\n        value : dict or None\n            The sequence item from the JSON entry.\n\n        Returns\n        -------\n        dataset_class\n            The decoded dataset item.\n\n        Raises\n        ------\n        KeyError\n            If the \"vr\" key is missing for a contained element\n        \"\"\"\n        ds = self.dataset_class()\n        if value:\n            for key, val in value.items():\n                if 'vr' not in val:\n                    fmt = 'Data element \"{}\" must have key \"vr\".'\n                    raise KeyError(fmt.format(self.tag))\n                vr = val['vr']\n                unique_value_keys = tuple(\n                    set(val.keys()) & set(JSON_VALUE_KEYS)\n                )\n                from pydicom import DataElement\n                from pydicom.dataelem import empty_value_for_VR\n                if not unique_value_keys:\n                    # data element with no value\n                    elem = DataElement(\n                        tag=int(key, 16),\n                        value=empty_value_for_VR(vr),\n                        VR=vr)\n                else:\n                    value_key = unique_value_keys[0]\n                    elem = DataElement.from_json(\n                        self.dataset_class, key, vr,\n                        val[value_key], value_key\n                    )\n                ds.add(elem)\n        return ds\n\n    def get_pn_element_value(self, value):\n        \"\"\"Return PersonName value from JSON value.\n\n        Values with VR PN have a special JSON encoding, see the DICOM Standard,\n        Part 18, :dcm:`Annex F.2.2<part18/sect_F.2.2.html>`.\n\n        Parameters\n        ----------\n        value : dict\n            The person name components in the JSON entry.\n\n        Returns\n        -------\n        PersonName or str\n            The decoded PersonName object or an empty string.\n        \"\"\"\n        if not isinstance(value, dict):\n            # Some DICOMweb services get this wrong, so we\n            # workaround the issue and warn the user\n            # rather than raising an error.\n            warnings.warn(\n                'value of data element \"{}\" with VR Person Name (PN) '\n                'is not formatted correctly'.format(self.tag)\n            )\n            return value\n        else:\n            if 'Phonetic' in value:\n                comps = ['', '', '']\n            elif 'Ideographic' in value:\n                comps = ['', '']\n            else:\n                comps = ['']\n            if 'Alphabetic' in value:\n                comps[0] = value['Alphabetic']\n            if 'Ideographic' in value:\n                comps[1] = value['Ideographic']\n            if 'Phonetic' in value:\n                comps[2] = value['Phonetic']\n            elem_value = '='.join(comps)\n            return elem_value\n","new_file_content":"# Copyright 2008-2019 pydicom authors. See LICENSE file for details.\n\"\"\"Methods for converting Datasets and DataElements to/from json\"\"\"\n\nimport base64\nimport warnings\n\nfrom pydicom.valuerep import PersonName\n\n# Order of keys is significant!\nJSON_VALUE_KEYS = ('Value', 'BulkDataURI', 'InlineBinary',)\n\nBINARY_VR_VALUES = ['OW', 'OB', 'OD', 'OF', 'OL', 'UN',\n                    'OB or OW', 'US or OW', 'US or SS or OW']\nVRs_TO_BE_FLOATS = ['DS', 'FL', 'FD', ]\nVRs_TO_BE_INTS = ['IS', 'SL', 'SS', 'UL', 'US', 'US or SS']\n\n\ndef convert_to_python_number(value, vr):\n    \"\"\"Makes sure that values are either ints or floats\n    based on their value representation.\n\n    .. versionadded:: 1.4\n\n    Parameters\n    ----------\n    value: Union[Union[str, int, float], List[Union[str, int, float]]]\n        value of data element\n    vr: str\n        value representation of data element\n\n    Returns\n    -------\n    Union[Union[str, int, float], List[Union[str, int, float]]]\n\n    \"\"\"\n    if value is None:\n        return None\n    number_type = None\n    if vr in VRs_TO_BE_INTS:\n        number_type = int\n    if vr in VRs_TO_BE_FLOATS:\n        number_type = float\n    if number_type is not None:\n        if isinstance(value, (list, tuple,)):\n            value = [number_type(e) for e in value]\n        else:\n            value = number_type(value)\n    return value\n\n\nclass JsonDataElementConverter:\n    \"\"\"Handles conversion between JSON struct and :class:`DataElement`.\n\n    .. versionadded:: 1.4\n    \"\"\"\n\n    def __init__(self, dataset_class, tag, vr, value, value_key,\n                 bulk_data_uri_handler):\n        \"\"\"Create a new converter instance.\n\n        Parameters\n        ----------\n        dataset_class : dataset.Dataset derived class\n            Class used to create sequence items.\n        tag : BaseTag\n            The data element tag.\n        vr : str\n            The data element value representation.\n        value : list\n            The data element's value(s).\n        value_key : str or None\n            Key of the data element that contains the value\n            (options: ``{\"Value\", \"InlineBinary\", \"BulkDataURI\"}``)\n        bulk_data_uri_handler: callable or None\n            Callable function that accepts the \"BulkDataURI\" of the JSON\n            representation of a data element and returns the actual value of\n            that data element (retrieved via DICOMweb WADO-RS)\n        \"\"\"\n        self.dataset_class = dataset_class\n        self.tag = tag\n        self.vr = vr\n        self.value = value\n        self.value_key = value_key\n        self.bulk_data_uri_handler = bulk_data_uri_handler\n\n    def get_element_values(self):\n        \"\"\"Return a the data element value or list of values.\n\n        Returns\n        -------\n        str or bytes or int or float or dataset_class\n        or PersonName or list of any of these types\n            The value or value list of the newly created data element.\n        \"\"\"\n        from pydicom.dataelem import empty_value_for_VR\n        if self.value_key == 'Value':\n            if not isinstance(self.value, list):\n                fmt = '\"{}\" of data element \"{}\" must be a list.'\n                raise TypeError(fmt.format(self.value_key, self.tag))\n            if not self.value:\n                return empty_value_for_VR(self.vr)\n            element_value = [self.get_regular_element_value(v)\n                             for v in self.value]\n            if len(element_value) == 1 and self.vr != 'SQ':\n                element_value = element_value[0]\n            return convert_to_python_number(element_value, self.vr)\n\n        # The value for \"InlineBinary\" shall be encoded as a base64 encoded\n        # string, as shown in PS3.18, Table F.3.1-1, but the example in\n        # PS3.18, Annex F.4 shows the string enclosed in a list.\n        # We support both variants, as the standard is ambiguous here,\n        # and do the same for \"BulkDataURI\".\n        value = self.value\n        if isinstance(value, list):\n            value = value[0]\n\n        if self.value_key == 'InlineBinary':\n            if not isinstance(value, (str, bytes)):\n                fmt = '\"{}\" of data element \"{}\" must be a bytes-like object.'\n                raise TypeError(fmt.format(self.value_key, self.tag))\n            return base64.b64decode(value)\n\n        if self.value_key == 'BulkDataURI':\n            if not isinstance(value, str):\n                fmt = '\"{}\" of data element \"{}\" must be a string.'\n                raise TypeError(fmt.format(self.value_key, self.tag))\n            if self.bulk_data_uri_handler is None:\n                warnings.warn(\n                    'no bulk data URI handler provided for retrieval '\n                    'of value of data element \"{}\"'.format(self.tag)\n                )\n                return empty_value_for_VR(self.vr, raw=True)\n            return self.bulk_data_uri_handler(value)\n        return empty_value_for_VR(self.vr)\n\n    def get_regular_element_value(self, value):\n        \"\"\"Return a the data element value created from a json \"Value\" entry.\n\n        Parameters\n        ----------\n        value : str or int or float or dict\n            The data element's value from the json entry.\n\n        Returns\n        -------\n        dataset_class or PersonName\n        or str or int or float\n            A single value of the corresponding :class:`DataElement`.\n        \"\"\"\n        if self.vr == 'SQ':\n            return self.get_sequence_item(value)\n\n        if self.vr == 'PN':\n            return self.get_pn_element_value(value)\n\n        if self.vr == 'AT':\n            try:\n                return int(value, 16)\n            except ValueError:\n                warnings.warn('Invalid value \"{}\" for AT element - '\n                              'ignoring it'.format(value))\n            return\n        return value\n\n    def get_sequence_item(self, value):\n        \"\"\"Return a sequence item for the JSON dict `value`.\n\n        Parameters\n        ----------\n        value : dict or None\n            The sequence item from the JSON entry.\n\n        Returns\n        -------\n        dataset_class\n            The decoded dataset item.\n\n        Raises\n        ------\n        KeyError\n            If the \"vr\" key is missing for a contained element\n        \"\"\"\n        ds = self.dataset_class()\n        if value:\n            for key, val in value.items():\n                if 'vr' not in val:\n                    fmt = 'Data element \"{}\" must have key \"vr\".'\n                    raise KeyError(fmt.format(self.tag))\n                vr = val['vr']\n                unique_value_keys = tuple(\n                    set(val.keys()) & set(JSON_VALUE_KEYS)\n                )\n                from pydicom import DataElement\n                from pydicom.dataelem import empty_value_for_VR\n                if not unique_value_keys:\n                    # data element with no value\n                    elem = DataElement(\n                        tag=int(key, 16),\n                        value=empty_value_for_VR(vr),\n                        VR=vr)\n                else:\n                    value_key = unique_value_keys[0]\n                    elem = DataElement.from_json(\n                        self.dataset_class, key, vr,\n                        val[value_key], value_key\n                    )\n                ds.add(elem)\n        return ds\n\n    def get_pn_element_value(self, value):\n        \"\"\"Return PersonName value from JSON value.\n\n        Values with VR PN have a special JSON encoding, see the DICOM Standard,\n        Part 18, :dcm:`Annex F.2.2<part18/sect_F.2.2.html>`.\n\n        Parameters\n        ----------\n        value : dict\n            The person name components in the JSON entry.\n\n        Returns\n        -------\n        PersonName or str\n            The decoded PersonName object or an empty string.\n        \"\"\"\n        if not isinstance(value, dict):\n            # Some DICOMweb services get this wrong, so we\n            # workaround the issue and warn the user\n            # rather than raising an error.\n            warnings.warn(\n                'value of data element \"{}\" with VR Person Name (PN) '\n                'is not formatted correctly'.format(self.tag)\n            )\n            return value\n        else:\n            if 'Phonetic' in value:\n                comps = ['', '', '']\n            elif 'Ideographic' in value:\n                comps = ['', '']\n            else:\n                comps = ['']\n            if 'Alphabetic' in value:\n                comps[0] = value['Alphabetic']\n            if 'Ideographic' in value:\n                comps[1] = value['Ideographic']\n            if 'Phonetic' in value:\n                comps[2] = value['Phonetic']\n            elem_value = '='.join(comps)\n            return elem_value\n","header":{"file":{"path":"pydicom/jsonrep.py"},"misc_line":null},"index_line":null,"is_binary_file":false,"binary_line":null,"minus_file":{"path":"a/pydicom/jsonrep.py"},"plus_file":{"path":"b/pydicom/jsonrep.py"},"hunks":[{"descriptor":{"old_range":{"start":226,"length":7},"new_range":{"start":226,"length":8},"section":"def get_sequence_item(self, value):"},"line_group":{"all_lines":[{"content":"                    value_key = unique_value_keys[0]","type":"context"},{"content":"                    elem = DataElement.from_json(","type":"context"},{"content":"                        self.dataset_class, key, vr,","type":"context"},{"content":"                        val[value_key], value_key","type":"deleted"},{"content":"                        val[value_key], value_key,","type":"added"},{"content":"                        self.bulk_data_element_handler","type":"added"},{"content":"                    )","type":"context"},{"content":"                ds.add(elem)","type":"context"},{"content":"        return ds","type":"context"},{"content":"","type":"context"}]},"modified_entities":[],"added_entities":[],"deleted_entities":[]}]}],"old_commit_hash":"49a3da4a3d9c24d7e8427a25048a1c7d5c4f7724","new_commit_hash":"2e9301e8801e6e30c71ccf6833ec2562420bfbbd","commit_message":"next() no longer starts iterator","commit_date":"2020-06-29T10:45:31+02:00","metadata":{}}