)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"f16842b6faa66e3ea082d730ab39d59ff5fc613c","unresolved":false,"context_lines":[{"line_number":11,"context_line":"In addition, a response of API validation error can be consistency for"},{"line_number":12,"context_line":"whole of Nova APIs."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Partially implements blueprint nova-v3-api"},{"line_number":15,"context_line":"Partially implements blueprint nova-api-validation-fw"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: I484fc2807721b5bfe0f1a11c3811b99a13d920aa"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"AAAATn%2F%2BJbc%3D","line":14,"updated":"2013-12-01 22:21:54.000000000","message":"btw I have added nova-api-validation-fw to nova-v3-api\u0027s bp dependencies so you won\u0027t need to add this to every commit message.","commit_id":"67077629841b4b36f155974812fce5bf6cd9189b"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"792285fc6f736bc62f8d867894ad3abfc5dbb81e","unresolved":false,"context_lines":[{"line_number":11,"context_line":"In addition, a response of API validation error can be consistency for"},{"line_number":12,"context_line":"whole of Nova APIs."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Partially implements blueprint nova-v3-api"},{"line_number":15,"context_line":"Partially implements blueprint nova-api-validation-fw"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: I484fc2807721b5bfe0f1a11c3811b99a13d920aa"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"AAAATn%2F%2BJRc%3D","line":14,"in_reply_to":"AAAATn%2F%2BJbc%3D","updated":"2013-12-02 00:15:14.000000000","message":"Thanks for the advice.\nI see that the bp depends on nova-v3-api now.\n\nI will remove this line in the next patch.","commit_id":"67077629841b4b36f155974812fce5bf6cd9189b"}],"nova/api/openstack/compute/plugins/v3/keypairs.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"bc616165afc53a3617fba0d4b3944d26b5b3d1d7","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        self.api \u003d compute_api.KeypairAPI()"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    @wsgi.serializers(xml\u003dKeypairTemplate)"},{"line_number":60,"context_line":"    @extensions.expected_errors((400, 409, 413))"},{"line_number":61,"context_line":"    @api_validator.validator(request_body_schema\u003dkeypairs_schema.create)"},{"line_number":62,"context_line":"    def create(self, req, body):"},{"line_number":63,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAP3%2F%2FltM%3D","line":60,"updated":"2013-07-16 06:28:26.000000000","message":"Should we remove 400 from here? I saw your patch expected_errors will skip ValidationError exception.","commit_id":"03635418bf534e5a9316e3792b158c9c387678d0"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"b2fcca1654c7c84dffb4cb8df65ad20ac9828ef3","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        self.api \u003d compute_api.KeypairAPI()"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    @wsgi.serializers(xml\u003dKeypairTemplate)"},{"line_number":60,"context_line":"    @extensions.expected_errors((400, 409, 413))"},{"line_number":61,"context_line":"    @api_validator.validator(request_body_schema\u003dkeypairs_schema.create)"},{"line_number":62,"context_line":"    def create(self, req, body):"},{"line_number":63,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAQn%2F%2F2eo%3D","line":60,"in_reply_to":"AAAAP3%2F%2FloU%3D","updated":"2013-07-22 04:13:53.000000000","message":"I will change API schema to check unsafe characters for fail-fast, and remove the above 400 and line 99.\n\nwhen we remove this API, it is all right to remove the API schema.\nI feel we need time to remove this API, and it is good to make the API schema better today.","commit_id":"03635418bf534e5a9316e3792b158c9c387678d0"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"747a188c5fc59e763f5bc4976fe35d59bc287906","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        self.api \u003d compute_api.KeypairAPI()"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    @wsgi.serializers(xml\u003dKeypairTemplate)"},{"line_number":60,"context_line":"    @extensions.expected_errors((400, 409, 413))"},{"line_number":61,"context_line":"    @api_validator.validator(request_body_schema\u003dkeypairs_schema.create)"},{"line_number":62,"context_line":"    def create(self, req, body):"},{"line_number":63,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAP3%2F%2FloU%3D","line":60,"in_reply_to":"AAAAP3%2F%2Flqk%3D","updated":"2013-07-16 07:24:57.000000000","message":"Thanks for the reply. I missed the line 99. If we will remove this API, I think we needn\u0027t modify API schema to support validate \"unsafe characters\".","commit_id":"03635418bf534e5a9316e3792b158c9c387678d0"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"0327f77a047c463c48018db799fc5a75b910804f","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        self.api \u003d compute_api.KeypairAPI()"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    @wsgi.serializers(xml\u003dKeypairTemplate)"},{"line_number":60,"context_line":"    @extensions.expected_errors((400, 409, 413))"},{"line_number":61,"context_line":"    @api_validator.validator(request_body_schema\u003dkeypairs_schema.create)"},{"line_number":62,"context_line":"    def create(self, req, body):"},{"line_number":63,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAP3%2F%2Flqk%3D","line":60,"in_reply_to":"AAAAP3%2F%2FltM%3D","updated":"2013-07-16 06:54:37.000000000","message":"Good point. thanks.\nOn API schema of this patch, we need 400 in expected_errors because of line 99.\n\nIIUC, line 99 is for the following exception and the API schema cannot validate it before.\n\nnova/compute/api.py\n 2824     def _validate_new_key_pair(self, context, user_id, key_name):\n 2825         safe_chars \u003d \"_- \" + string.digits + string.ascii_letters\n 2826         clean_value \u003d \"\".join(x for x in key_name if x in safe_chars)\n 2827         if clean_value !\u003d key_name:\n 2828             raise exception.InvalidKeypair(\n 2829                 _(\"Keypair name contains unsafe characters\"))\n\nIf we change API schema to validate the above \"unsafe characters\" in keypair name, we can remove\nline 98-99 and 400 from expected_errors as you said.\n\nBTW, keypair management seems to be moved to Keystone according to the following thread.\nhttp://lists.openstack.org/pipermail/openstack-dev/2013-July/011141.html\n\nso I guess we need to remove this API after moving it to Keystone, right?","commit_id":"03635418bf534e5a9316e3792b158c9c387678d0"},{"author":{"_account_id":7882,"name":"Yuiko Takada Mori","email":"yuiko-mori@nec.com","username":"YuikoTakada"},"change_message_id":"edfb133612bf416a22dab557a70debac0e2e89e6","unresolved":false,"context_lines":[{"line_number":108,"context_line":"            msg \u003d _(\"Quota exceeded, too many key pairs.\")"},{"line_number":109,"context_line":"            raise webob.exc.HTTPRequestEntityTooLarge("},{"line_number":110,"context_line":"                        explanation\u003dmsg,"},{"line_number":111,"context_line":"                        headers\u003d{\u0027Retry-After\u0027: 0})"},{"line_number":112,"context_line":"        except exception.InvalidKeypair as exc:"},{"line_number":113,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dexc.format_message())"},{"line_number":114,"context_line":"        except exception.KeyPairExists as exc:"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAT3%2F%2F7LE%3D","line":111,"updated":"2013-12-27 02:08:01.000000000","message":"should we remove this line? because it won\u0027t happend.","commit_id":"e0b9b4a6bf04665edcedae1802dda6dc8dcd2874"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"1e3d1c690aef80673306b36ec54d67127bc62bee","unresolved":false,"context_lines":[{"line_number":108,"context_line":"            msg \u003d _(\"Quota exceeded, too many key pairs.\")"},{"line_number":109,"context_line":"            raise webob.exc.HTTPRequestEntityTooLarge("},{"line_number":110,"context_line":"                        explanation\u003dmsg,"},{"line_number":111,"context_line":"                        headers\u003d{\u0027Retry-After\u0027: 0})"},{"line_number":112,"context_line":"        except exception.InvalidKeypair as exc:"},{"line_number":113,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dexc.format_message())"},{"line_number":114,"context_line":"        except exception.KeyPairExists as exc:"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAT3%2F%2F7J4%3D","line":111,"in_reply_to":"AAAAT3%2F%2F7LE%3D","updated":"2013-12-27 02:12:56.000000000","message":"You are right, nice catch!\n\nI will remove here in the next patch.","commit_id":"e0b9b4a6bf04665edcedae1802dda6dc8dcd2874"}],"nova/api/schema/keypairs_schema.py":[{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"49248fe3491f6a115d1d9443a79ac34df11429c6","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Copyright 2013 NEC Corporation.  All rights reserved."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAQn%2F%2FZ4g%3D","line":1,"updated":"2013-07-31 17:37:39.000000000","message":"Its not clear from this file that this is for the v3 nova api only.  (or even if that is accurate)","commit_id":"9cd6fe2568862123c3da5eb04246ce5a2805cdd1"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"f5f55d2629e58a0eae6306c96e8da8500861d847","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Copyright 2013 NEC Corporation.  All rights reserved."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Byvc%3D","line":1,"in_reply_to":"AAAAQn%2F%2B%2Bbs%3D","updated":"2013-11-20 05:06:22.000000000","message":"Done","commit_id":"9cd6fe2568862123c3da5eb04246ce5a2805cdd1"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"af533e131ca41f0e7840f3453d7e15d2dcdd174c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Copyright 2013 NEC Corporation.  All rights reserved."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAQn%2F%2B%2Bbs%3D","line":1,"in_reply_to":"AAAAQn%2F%2FRXw%3D","updated":"2013-08-09 10:21:02.000000000","message":"OK, I will change like that. thanks.","commit_id":"9cd6fe2568862123c3da5eb04246ce5a2805cdd1"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"8c136fcc17d8f67144e61210413763b7960bc380","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Copyright 2013 NEC Corporation.  All rights reserved."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAQn%2F%2FRXw%3D","line":1,"in_reply_to":"AAAAQn%2F%2FY%2FI%3D","updated":"2013-08-02 19:46:53.000000000","message":"works for me","commit_id":"9cd6fe2568862123c3da5eb04246ce5a2805cdd1"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"48c3320041a097f3cea9fa15afceb2240ea0f712","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Copyright 2013 NEC Corporation.  All rights reserved."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAQn%2F%2FY%2FI%3D","line":1,"in_reply_to":"AAAAQn%2F%2FZ4g%3D","updated":"2013-07-31 22:38:33.000000000","message":"Good point, now there is the directory \"./nova/api/openstack/compute/schemas/v3/\" for .rng files.\nHow about moving this schema file also to the directory?","commit_id":"9cd6fe2568862123c3da5eb04246ce5a2805cdd1"}],"nova/tests/api/openstack/compute/plugins/v3/test_keypairs.py":[{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"49248fe3491f6a115d1d9443a79ac34df11429c6","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        self.assertEqual(res.status_int, 400)"},{"line_number":106,"context_line":"        res_dict \u003d jsonutils.loads(res.body)"},{"line_number":107,"context_line":"        bad_message \u003d res_dict[\u0027badRequest\u0027][\u0027message\u0027]"},{"line_number":108,"context_line":"        self.assertEqual(bad_message.find(\u0027Request validation failure:\u0027), 0)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def test_keypair_create_with_name_too_long(self):"},{"line_number":111,"context_line":"        body \u003d {"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAQn%2F%2FZ4M%3D","line":108,"updated":"2013-07-31 17:37:39.000000000","message":"Does this mean we are loosing error message detail with this patch?   That seems like a step in the wrong direction","commit_id":"9cd6fe2568862123c3da5eb04246ce5a2805cdd1"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"f5f55d2629e58a0eae6306c96e8da8500861d847","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        self.assertEqual(res.status_int, 400)"},{"line_number":106,"context_line":"        res_dict \u003d jsonutils.loads(res.body)"},{"line_number":107,"context_line":"        bad_message \u003d res_dict[\u0027badRequest\u0027][\u0027message\u0027]"},{"line_number":108,"context_line":"        self.assertEqual(bad_message.find(\u0027Request validation failure:\u0027), 0)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def test_keypair_create_with_name_too_long(self):"},{"line_number":111,"context_line":"        body \u003d {"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2ByvY%3D","line":108,"in_reply_to":"AAAAQn%2F%2B9Tk%3D","updated":"2013-11-20 05:06:22.000000000","message":"Done\n\nThe error message format has become the same as WSME.","commit_id":"9cd6fe2568862123c3da5eb04246ce5a2805cdd1"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"af533e131ca41f0e7840f3453d7e15d2dcdd174c","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        self.assertEqual(res.status_int, 400)"},{"line_number":106,"context_line":"        res_dict \u003d jsonutils.loads(res.body)"},{"line_number":107,"context_line":"        bad_message \u003d res_dict[\u0027badRequest\u0027][\u0027message\u0027]"},{"line_number":108,"context_line":"        self.assertEqual(bad_message.find(\u0027Request validation failure:\u0027), 0)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def test_keypair_create_with_name_too_long(self):"},{"line_number":111,"context_line":"        body \u003d {"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAQn%2F%2B9Tk%3D","line":108,"in_reply_to":"AAAAQn%2F%2FRXo%3D","updated":"2013-08-09 10:21:02.000000000","message":"The one of this framework purpose is to unify error message format, and error messages will be changed.\nThat would be nice to discuss what is better error message.\n\nIs \"Request validation failure: \u0027\u0027 is too short\" not good?\n\nIs error messages including invalid key name better?\ne.g. \"Request validation failure: keypair(\u0027\u0027) is too short\"","commit_id":"9cd6fe2568862123c3da5eb04246ce5a2805cdd1"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"8c136fcc17d8f67144e61210413763b7960bc380","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        self.assertEqual(res.status_int, 400)"},{"line_number":106,"context_line":"        res_dict \u003d jsonutils.loads(res.body)"},{"line_number":107,"context_line":"        bad_message \u003d res_dict[\u0027badRequest\u0027][\u0027message\u0027]"},{"line_number":108,"context_line":"        self.assertEqual(bad_message.find(\u0027Request validation failure:\u0027), 0)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def test_keypair_create_with_name_too_long(self):"},{"line_number":111,"context_line":"        body \u003d {"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAQn%2F%2FRXo%3D","line":108,"in_reply_to":"AAAAQn%2F%2FY5Q%3D","updated":"2013-08-02 19:46:53.000000000","message":"why not the same error message as before?","commit_id":"9cd6fe2568862123c3da5eb04246ce5a2805cdd1"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"48c3320041a097f3cea9fa15afceb2240ea0f712","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        self.assertEqual(res.status_int, 400)"},{"line_number":106,"context_line":"        res_dict \u003d jsonutils.loads(res.body)"},{"line_number":107,"context_line":"        bad_message \u003d res_dict[\u0027badRequest\u0027][\u0027message\u0027]"},{"line_number":108,"context_line":"        self.assertEqual(bad_message.find(\u0027Request validation failure:\u0027), 0)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def test_keypair_create_with_name_too_long(self):"},{"line_number":111,"context_line":"        body \u003d {"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAQn%2F%2FY5Q%3D","line":108,"in_reply_to":"AAAAQn%2F%2FZ4M%3D","updated":"2013-07-31 22:38:33.000000000","message":"The error message will be changed to \"Request validation failure: \u0027\u0027 is too short\".\nI will change the above testcase and the following ones for checking detail messages.","commit_id":"9cd6fe2568862123c3da5eb04246ce5a2805cdd1"},{"author":{"_account_id":9533,"name":"Eiichi Aikawa","email":"aikawa@mxk.nes.nec.co.jp","username":"EiichiAikawa"},"change_message_id":"37c19162cc9ca94cbb01b07426f2fff5040da318","unresolved":false,"context_lines":[{"line_number":382,"context_line":"        req.headers[\u0027Content-Type\u0027] \u003d \u0027application/json\u0027"},{"line_number":383,"context_line":"        res \u003d req.get_response(self.app)"},{"line_number":384,"context_line":"        res_dict \u003d jsonutils.loads(res.body)"},{"line_number":385,"context_line":"        bad_message \u003d res_dict[\u0027badRequest\u0027][\u0027message\u0027]"},{"line_number":386,"context_line":"        self.assertEqual(res.status_int, 400)"},{"line_number":387,"context_line":"        self.assertEqual(\"\u0027keypair\u0027 is a required property\","},{"line_number":388,"context_line":"                         res_dict[\u0027badRequest\u0027][\u0027message\u0027])"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F8znE%3D","line":385,"updated":"2013-12-20 05:38:19.000000000","message":"It seems the parameter bad_message will not be used. Is this line needed?","commit_id":"a3caff2aa377c9df71457c293107ece3e7acfe37"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"10bcfdb7c1e5e03e39431b86fe2b929f16d4040e","unresolved":false,"context_lines":[{"line_number":382,"context_line":"        req.headers[\u0027Content-Type\u0027] \u003d \u0027application/json\u0027"},{"line_number":383,"context_line":"        res \u003d req.get_response(self.app)"},{"line_number":384,"context_line":"        res_dict \u003d jsonutils.loads(res.body)"},{"line_number":385,"context_line":"        bad_message \u003d res_dict[\u0027badRequest\u0027][\u0027message\u0027]"},{"line_number":386,"context_line":"        self.assertEqual(res.status_int, 400)"},{"line_number":387,"context_line":"        self.assertEqual(\"\u0027keypair\u0027 is a required property\","},{"line_number":388,"context_line":"                         res_dict[\u0027badRequest\u0027][\u0027message\u0027])"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F8zk4%3D","line":385,"in_reply_to":"AAAATn%2F8znE%3D","updated":"2013-12-20 05:48:14.000000000","message":"Nice catch, thanks!\n\nI will remove this in the next patch.","commit_id":"a3caff2aa377c9df71457c293107ece3e7acfe37"}]}
