Node-restify: request.getQuery() no longer returns a parsed query

Created on 27 Mar 2015  Â·  11Comments  Â·  Source: restify/node-restify

In https://github.com/mcavage/node-restify/commit/557e6aaf994da6dd573be0ef55c9530a5cd5c091 getQuery was changed from returning a parsed query object, to now just returning the string.

Either behaviour is tolerable, just this changed without any mention in the changelog, and the docs aren't clear either.

Most helpful comment

@Stuk I do not think this behavior is tolerable at all. It is causing all the data in the query string to remain as strings.

Consider a GET request to the following endpoint:
/api/products?isSpecial=false

The req.query object will look like the following:
{"isSpecial":"false"}

If I do a check, such as if (req.query.isSpecial), the result is truthy because the string "false" evaluates to true. Also, I cannot use underscore functions such as _.isBoolean() because it will always evaluate to false.

It is not a correct behavior to send Content-Type: 'application/json' on GET requests. Although I do send Accept: 'application/json' with the request. restify.queryParser() does not parse the string before serializing it into JSON in this case either.

My only recourse would be to create middleware that performs this parsing. I don't think that is the best solution or behavior.

@pfmooney Would you entertain the idea that you might have introduced a bug in #557e6aa or at minimum changed the intended behavior, causing a breaking change?

All 11 comments

Maybe this is related to what I am seeing: #739

@Stuk I do not think this behavior is tolerable at all. It is causing all the data in the query string to remain as strings.

Consider a GET request to the following endpoint:
/api/products?isSpecial=false

The req.query object will look like the following:
{"isSpecial":"false"}

If I do a check, such as if (req.query.isSpecial), the result is truthy because the string "false" evaluates to true. Also, I cannot use underscore functions such as _.isBoolean() because it will always evaluate to false.

It is not a correct behavior to send Content-Type: 'application/json' on GET requests. Although I do send Accept: 'application/json' with the request. restify.queryParser() does not parse the string before serializing it into JSON in this case either.

My only recourse would be to create middleware that performs this parsing. I don't think that is the best solution or behavior.

@pfmooney Would you entertain the idea that you might have introduced a bug in #557e6aa or at minimum changed the intended behavior, causing a breaking change?

@aaronroberson By definition query parameters are just 'strings'. I'm not quite sure what the issue here is? It looks like from the code that restify will either return a string or an empty json object '{}'. There's no magic in the query parser to parse "false" into a boolean -- I dare say that's probably not the behavior most would want anyway -- since again, query parameters are just strings.

Feel free to reopen if you still think this is an issue.

Personally my resolution would be seeing a note regarding this breaking change added to the changelog now, and going forward breaking changes such as this being put behind a major version bump, as per semver.

(Note: I don't have the power to reopen the issue)

Also @yunong I think you misunderstand the issue.

Before 557e6aa .getQuery used to return this._query, which if you're using the query middleware would always be the parsed query, (i.e. "a=one&b=two" => {a: "one", b: "two"}), however afterwards this returns this.getUrl().query, which is always a string (i.e. "a=one&b=two").

This is the breaking change to which this refers, not parsing "false" to false.

@yunong I was mistaken in thinking that the value types were respected but
I've reverted back to older versions and get the same result.

On Fri, May 29, 2015 at 6:47 AM Stuart Knightley [email protected]
wrote:

Also @yunong https://github.com/yunong I think you misunderstand the
issue.

Before 557e6aa
https://github.com/mcavage/node-restify/commit/557e6aaf994da6dd573be0ef55c9530a5cd5c091
.getQuery used to return this._query, which if you're using the query
middleware would always be the parsed query, (i.e. "a=one&b=two" => {a:
"one", b: "two"}), however afterwards this returns this.getUrl().query,
which is always a string (i.e. "a=one&b=two").

This is the breaking change to which this refers, not parsing "false" to
false.

—
Reply to this email directly or view it on GitHub
https://github.com/mcavage/node-restify/issues/782#issuecomment-106806507
.

Are you using the queryparser plugin?

I'm using the query middleware.

req.query should give you what you are looking for if you are using the plugin.

The confusion come from the v1.4 to v2 migration guide:
https://github.com/restify/node-restify/wiki/1.4-to-2.0-Migration-Tips#reqquery---reqgetquery-or-reqquery

req.query -> req.getQuery() or req.query()

So req.getQuery() used to return a parsed queryString object up until v2.8.5, when it started to return a string.
See https://github.com/restify/node-restify/issues/739

Accept Your Gift! ( https://sgemail.handy.com/wf/click?upn=q-2FQsSf2tmXyd2vkF8VEcsaB-2B1-2FyHdArrPm5zn4zScy0TUtyNyaIDNPkhXHx-2BAIi7uGAi8ZBF7ql4OJrQaY77LT9f-2F-2FdK3iUdJdFDlEr-2BycC2g1o3bZlfORxb-2F7rlQZhDnVvMHUJHb6W8lYHA6LL7Ng5kTJLKImG9kRQ93YfsgG0lv0Z4Op67nxWqKu-2Fi1oFCKCa8l9vYyFM02KE3L5LpA-2Be9WrCXFKAYD7OLSsoYry4YrDdxr5503YvOlCTz8HQfcCwwSfJX2cN8gbsSR08owChBujyWE6RfMLBEKwdhcctjz4c-2BeBr7cuDDZlKZzKge7SEis9kv4FxXNJQaKW9fOw-3D-3D_s5UH8bhnBaopYjthcNSRcU5O-2BCkAC7DChglJQfInpbg-2BTPAaHGnhnOR1978HNXqN4bIzVXW49QJVSD2LC3g4wpY2uefMIJH3GWU8pbv2Ug6JfSVxqX5PmCyOCqgbVsx-2FU-2Bu6Vj7Qug7FfXaArvl9S75QO8wPXJWpGkEYCtDln-2FiaHXfCWxLNdSgSAui3fjlGmDeJIu7tRP90xRfoARNtrjls9RU4Ub7LQ-2FcWpFGrj8lL9t4yWgisE37TT6-2BoZKhZqQXv-2BCjqM5twCXeaSv1ZW5gx-2BVIYA2B4-2FI4xJ0beNPMshEpxEKU5sX3zLxxppXTZXMkEnnStnYIY5f6QO06RycbzKFwfwTMl-2FJO7xuNjE-2FuAyp-2BumIpAeVPnQhrOPnP-2F9rwaamh2jIGQ8eOiwctPBQ-3D-3D )

Aaron sent you a $55 gift for Handy

With Handy, a spotless home is only a few clicks away. Just pick a service and choose a time—an experienced, background checked professional will take care of the rest. Click below to claim your $55 credit or use code AARON9231 at checkout.

Accept Your Gift! ( https://sgemail.handy.com/wf/click?upn=q-2FQsSf2tmXyd2vkF8VEcsaB-2B1-2FyHdArrPm5zn4zScy0TUtyNyaIDNPkhXHx-2BAIi7uGAi8ZBF7ql4OJrQaY77LT9f-2F-2FdK3iUdJdFDlEr-2BycC2g1o3bZlfORxb-2F7rlQZhDnVvMHUJHb6W8lYHA6LL7Ng5kTJLKImG9kRQ93YfsgG0lv0Z4Op67nxWqKu-2Fi1oFCKCa8l9vYyFM02KE3L5LpA-2Be9WrCXFKAYD7OLSsoYry4YrDdxr5503YvOlCTz8HQfcCwwSfJX2cN8gbsSR08owChBujyWE6RfMLBEKwdhcctjz4c-2BeBr7cuDDZlKZzKge7SEis9kv4FxXNJQaKW9fOw-3D-3D_s5UH8bhnBaopYjthcNSRcU5O-2BCkAC7DChglJQfInpbg-2BTPAaHGnhnOR1978HNXqN4bIzVXW49QJVSD2LC3g4wpY2uefMIJH3GWU8pbv2Ug6JfSVxqX5PmCyOCqgbVsx-2FU-2Bu6Vj7Qug7FfXaArvl9S75QO8wPXJWpGkEYCtDln-2FiaHXfCWxLNdSgSAui3fjlGmDeJIu7tRP90xRfoARNtrjls9RU4Ub7LQ-2FcWpFGrj8lL9t4yWgisE37TT6-2BoZKhZwc4CNRwps06svFCIrIBbVuzK6HLvMgRDGzYfsbwidarV9MYuNz1VWwF18U7D7tL4xnokZcTaUOxP2qKKENy5apjzkgO0-2Fbb1salZWzg-2B8mjUwgvXLYrr8lSVc7kQ4oayAeIWCGZZG8ktHZ6hjTUMzQ-3D-3D )
Use your $55 gift on any of Handy's services
(use code AARON9231 at checkout):

View all of Handy's Services ( https://sgemail.handy.com/wf/click?upn=q-2FQsSf2tmXyd2vkF8VEcsbv8X8Oszigzr5NNtGKza3MWDFialnox81TfwNCxNUNxhHKA-2BdMfFIp0irzQtrT5-2FC7EBZRmlTEE9RzPGGsa0-2BNerKUsc6-2FzrAdWKAQw-2BXzyldlAEwTjpfQF339Id5VSeQ2WO-2FQ9tSpKWE-2F-2BDilm3RY-3D_s5UH8bhnBaopYjthcNSRcU5O-2BCkAC7DChglJQfInpbg-2BTPAaHGnhnOR1978HNXqN4bIzVXW49QJVSD2LC3g4wpY2uefMIJH3GWU8pbv2Ug6JfSVxqX5PmCyOCqgbVsx-2FU-2Bu6Vj7Qug7FfXaArvl9S75QO8wPXJWpGkEYCtDln-2FiaHXfCWxLNdSgSAui3fjlGmDeJIu7tRP90xRfoARNtrjls9RU4Ub7LQ-2FcWpFGrj8lL9t4yWgisE37TT6-2BoZKhZfLcHrqO7A5-2FKZXppT0fP-2Ft89e7gFEx0ID1gvQNXFtSoNogTtLj5zEBpKnkifTD-2BQDT-2BGWvnUb7HofPLY-2F2CbFXsZT50CWoPz6jtt-2FRn3mBNajT64k6J-2FEO3S3jPOq0kCD2WY-2BCn5ISD7BIY86epCsQ-3D-3D )

Handy Twitter ( https://sgemail.handy.com/wf/click?upn=sYdxVqk-2BvNrBtKw-2BNVzWKaX-2FU2oXhnvLnp3gZfkeb2AF7vRpkoN40hgM4hNyDSth_s5UH8bhnBaopYjthcNSRcU5O-2BCkAC7DChglJQfInpbg-2BTPAaHGnhnOR1978HNXqN4bIzVXW49QJVSD2LC3g4wpY2uefMIJH3GWU8pbv2Ug6JfSVxqX5PmCyOCqgbVsx-2FU-2Bu6Vj7Qug7FfXaArvl9S75QO8wPXJWpGkEYCtDln-2FiaHXfCWxLNdSgSAui3fjlGmDeJIu7tRP90xRfoARNtrjls9RU4Ub7LQ-2FcWpFGrj8lL9t4yWgisE37TT6-2BoZKhZJeWfbcupHRkv3GEWoHDlM1WCqf8JAgmV-2FtZLWFUd3E6m-2FMrtfVr-2FGHrgaCFg5JNwlZUSL9osWOkELKA9T8ekUAdVMUPz-2FBx1a-2FYQSkoK8qCTTBi89yN9-2BOSg5dCFSq1TNV3DA13VAndH4-2FfvqBYmCg-3D-3D )
Handy Facebook ( https://sgemail.handy.com/wf/click?upn=sYdxVqk-2BvNrBtKw-2BNVzWKfa9DXUWP0mdASikrPI0DmDoKViAyBoQIsV4x7PT02KC_s5UH8bhnBaopYjthcNSRcU5O-2BCkAC7DChglJQfInpbg-2BTPAaHGnhnOR1978HNXqN4bIzVXW49QJVSD2LC3g4wpY2uefMIJH3GWU8pbv2Ug6JfSVxqX5PmCyOCqgbVsx-2FU-2Bu6Vj7Qug7FfXaArvl9S75QO8wPXJWpGkEYCtDln-2FiaHXfCWxLNdSgSAui3fjlGmDeJIu7tRP90xRfoARNtrjls9RU4Ub7LQ-2FcWpFGrj8lL9t4yWgisE37TT6-2BoZKhZbOmdAX7onUmVvRvbcvTFICRpsRvwFMjuSWjjXo5R7SfrQ2mqP3wbKN9nO3m-2BLGedIqJbwDPdaK7Lf6ubPST0dyxcpEUOGHamVcNp9jKG52Lo8-2BlEsXb6M-2FXWoTLEnMxOmNIMSvkD-2Fzye1ZB8Brp2bw-3D-3D )
Handy Instagram ( https://sgemail.handy.com/wf/click?upn=sYdxVqk-2BvNrBtKw-2BNVzWKfeBoaKL8Ev6spOpwM7gM6S-2F8a-2BuAMyY5qXEGPy9TRAc_s5UH8bhnBaopYjthcNSRcU5O-2BCkAC7DChglJQfInpbg-2BTPAaHGnhnOR1978HNXqN4bIzVXW49QJVSD2LC3g4wpY2uefMIJH3GWU8pbv2Ug6JfSVxqX5PmCyOCqgbVsx-2FU-2Bu6Vj7Qug7FfXaArvl9S75QO8wPXJWpGkEYCtDln-2FiaHXfCWxLNdSgSAui3fjlGmDeJIu7tRP90xRfoARNtrjls9RU4Ub7LQ-2FcWpFGrj8lL9t4yWgisE37TT6-2BoZKhZqehotVWQADoRDZIw4dCFhyG1zh7XjUgHD9aFI8pcIACW8fKHyU86-2BoJnAxEvngxUOZTKXnmCk-2B5oNX1L1tTYbNupwwoAv0Pzb7521FmcwpjuIbgt9CSpqb-2FyRUlKzjbcZ5ZP2UJGpOaa1Kui8H3U5Q-3D-3D )

Our Services ( https://sgemail.handy.com/wf/click?upn=q-2FQsSf2tmXyd2vkF8VEcsbv8X8Oszigzr5NNtGKza3MQJ44OHPcJikSh-2BVUrFwzQO4xaArAScjwh7B1X-2Bws5DZzdjanMyViAICvTlcFLTkw-3D_s5UH8bhnBaopYjthcNSRcU5O-2BCkAC7DChglJQfInpbg-2BTPAaHGnhnOR1978HNXqN4bIzVXW49QJVSD2LC3g4wpY2uefMIJH3GWU8pbv2Ug6JfSVxqX5PmCyOCqgbVsx-2FU-2Bu6Vj7Qug7FfXaArvl9S75QO8wPXJWpGkEYCtDln-2FiaHXfCWxLNdSgSAui3fjlGmDeJIu7tRP90xRfoARNtrjls9RU4Ub7LQ-2FcWpFGrj8lL9t4yWgisE37TT6-2BoZKhZo35ORQNn4bPt0iL95OeYKIkAgCmfjyVmixHA4DsVV9lGyVsZ-2F9-2BjKXdctZ-2FOruHxaYcV6lUPIccXOAu9YWbEuSQhPL16TZsD-2Bx6LjU929ct6nnqvXL6DO-2B-2FLMmvfY-2FUIGykvtzjmZRdozoL-2BOfRFKw-3D-3D )
helpcenter ( https://sgemail.handy.com/wf/click?upn=q-2FQsSf2tmXyd2vkF8VEcse4Lp6fgbkd2iUk5hd2lBMUpBCYqNi1V7ydYheQ49Mw4W-2FJwIs-2FOCxm2wmUesDoFsLAcQPHKGpgX9GOqDdMK5RE-3D_s5UH8bhnBaopYjthcNSRcU5O-2BCkAC7DChglJQfInpbg-2BTPAaHGnhnOR1978HNXqN4bIzVXW49QJVSD2LC3g4wpY2uefMIJH3GWU8pbv2Ug6JfSVxqX5PmCyOCqgbVsx-2FU-2Bu6Vj7Qug7FfXaArvl9S75QO8wPXJWpGkEYCtDln-2FiaHXfCWxLNdSgSAui3fjlGmDeJIu7tRP90xRfoARNtrjls9RU4Ub7LQ-2FcWpFGrj8lL9t4yWgisE37TT6-2BoZKhZkHEejnHwS-2BydRF2XnbCm8iOD571IiIWMKUEpkBdBmzHXOSk8jP7IHnd86LepRV0y2DSwim-2FPb5he2ltB55j5cdVbsYJpbvN7Y5FYmgebFEdpR7gVkI9llPEfUg-2BhcYPPckVhdxpdwmvBK0OjXI21Kg-3D-3D )
Download Handy iOS app ( https://sgemail.handy.com/wf/click?upn=sYdxVqk-2BvNrBtKw-2BNVzWKe-2B4bz-2FAZDzUh1KL03FtyJ2uqoInuMQFjnKVNRO5FQSo-2FpakL1Y4hX85UGZ2zp5KD-2BI8hjWgTPijyltMY2jEortmwgrC-2F2r8jq6s0-2Bya9iXK_s5UH8bhnBaopYjthcNSRcU5O-2BCkAC7DChglJQfInpbg-2BTPAaHGnhnOR1978HNXqN4bIzVXW49QJVSD2LC3g4wpY2uefMIJH3GWU8pbv2Ug6JfSVxqX5PmCyOCqgbVsx-2FU-2Bu6Vj7Qug7FfXaArvl9S75QO8wPXJWpGkEYCtDln-2FiaHXfCWxLNdSgSAui3fjlGmDeJIu7tRP90xRfoARNtrjls9RU4Ub7LQ-2FcWpFGrj8lL9t4yWgisE37TT6-2BoZKhZEmE123aCMRs2cqlUWy5BvaczmnKYbqTYxkzkhIRnvt0pLYDCWTIr2PP7Pb3iTsDdjD7MlvEUq-2Bf8NHKXTDeJMCqPxSfgwT9OIANQkhuSmEtrBDFn6TVoyEwv-2B3FSATw5yPIrXEM0QYL9NaJI8CK3ng-3D-3D )
Download Handy Android app ( https://sgemail.handy.com/wf/click?upn=sYdxVqk-2BvNrBtKw-2BNVzWKeJcuYvtamgIYRZeccCPxkcFs2tKreRwShvBbhgLgpeznxEEVKVOltp8oC6Ig4DUHnf-2ByPOZsMz-2F8ivVr-2FUyO-2Fo-3D_s5UH8bhnBaopYjthcNSRcU5O-2BCkAC7DChglJQfInpbg-2BTPAaHGnhnOR1978HNXqN4bIzVXW49QJVSD2LC3g4wpY2uefMIJH3GWU8pbv2Ug6JfSVxqX5PmCyOCqgbVsx-2FU-2Bu6Vj7Qug7FfXaArvl9S75QO8wPXJWpGkEYCtDln-2FiaHXfCWxLNdSgSAui3fjlGmDeJIu7tRP90xRfoARNtrjls9RU4Ub7LQ-2FcWpFGrj8lL9t4yWgisE37TT6-2BoZKhZrjGfRmWaVOFj-2Bfn9RM6j-2BBZg1eQEAT-2FPvNX8xw8qw5vKSWmfNIwBiLNHjxsFWRhNQbq3vLjt5LKOPp1ZY5-2FVPzGlBbNmvrVobk19BzvmgEjDpTw3868q5epSGOlx05K3uyVaEIdckVxALQPzVORJmw-3D-3D )

Refer a Friend, Earn $50! ( xhttps://sgemail.handy.com/wf/click?upn=YsKWC7yTmiePOc2Pn-2Fa7R9V1Z-2FmspGRWKf5-2BNbJAcZuLZGz8MM1bTALYgBeeFogRy7AGwMT0R9RgzqFAR0taDV2mxNZC183vLo10oJ4jrl62VC5ZEK8f9-2FimJ4ErLRJFtBaPdxxGW4y5Kg4isuxRoVO-2BwMhi5auKgqzPwOAwtaY-3D_s5UH8bhnBaopYjthcNSRcU5O-2BCkAC7DChglJQfInpbg-2BTPAaHGnhnOR1978HNXqN4bIzVXW49QJVSD2LC3g4wpY2uefMIJH3GWU8pbv2Ug6JfSVxqX5PmCyOCqgbVsx-2FU-2Bu6Vj7Qug7FfXaArvl9S75QO8wPXJWpGkEYCtDln-2FiaHXfCWxLNdSgSAui3fjlGmDeJIu7tRP90xRfoARNtrjls9RU4Ub7LQ-2FcWpFGrj8lL9t4yWgisE37TT6-2BoZKhZH1r7F6pMBA1DnFAHUt69C6G-2BPQZjrwwE8cm7buWbuQPs6e-2FCd0Ud-2FKFbxWoNiYLPGk6etohKij-2BnHsQJ9PJkjQ1D5YU-2B4-2BE-2BDu5JPoSpA0pw1UHHSOAhIh4HPhl9i8jIHitCRXhpNtk-2FZmDHsj0Wjw-3D-3D )|Privacy Policy ( https://sgemail.handy.com/wf/click?upn=sYdxVqk-2BvNrBtKw-2BNVzWKXE0Lx8wVhm5qiHGXjJOgd7oLwhjwvzCLbE0HeWhRyGB_s5UH8bhnBaopYjthcNSRcU5O-2BCkAC7DChglJQfInpbg-2BTPAaHGnhnOR1978HNXqN4bIzVXW49QJVSD2LC3g4wpY2uefMIJH3GWU8pbv2Ug6JfSVxqX5PmCyOCqgbVsx-2FU-2Bu6Vj7Qug7FfXaArvl9S75QO8wPXJWpGkEYCtDln-2FiaHXfCWxLNdSgSAui3fjlGmDeJIu7tRP90xRfoARNtrjls9RU4Ub7LQ-2FcWpFGrj8lL9t4yWgisE37TT6-2BoZKhZYNCpWRuwaHBw4efiTWB4jXBe8s22GzItSl4U0HlAlr9ky6bXTVCtaF-2F2SuDiULU5Lg55I5jrePOtX4SsvTuGJag13hs6lLnoSQZGo0c2ait055yVXZGbgdalUcMycseL49TNw6qml5L1jUoU7og9cg-3D-3D )|Unsubscribe ( https://sgemail.handy.com/wf/click?upn=wz-2FQ7Wmj26-2Boily69xWn-2FdB3gxvuT-2Fcn2o1CsCXSMqzTVlu8lrEjD2X6MEa5PfWy1MOcVP5Zpt7fzj5Hj3tA20clXThMr58Q1to669FEfOo-3D_s5UH8bhnBaopYjthcNSRcU5O-2BCkAC7DChglJQfInpbg-2BTPAaHGnhnOR1978HNXqN4bIzVXW49QJVSD2LC3g4wpY2uefMIJH3GWU8pbv2Ug6JfSVxqX5PmCyOCqgbVsx-2FU-2Bu6Vj7Qug7FfXaArvl9S75QO8wPXJWpGkEYCtDln-2FiaHXfCWxLNdSgSAui3fjlGmDeJIu7tRP90xRfoARNtrjls9RU4Ub7LQ-2FcWpFGrj8lL9t4yWgisE37TT6-2BoZKhZL0R6FZbkn4P-2F8vLo3MpN4zZcOa2eosrAGPmiIWOx1VSF6mnE4CnY-2Fk7XAVWEjRuhrvkQxqDGNIXrV7KBDA4PKkIObFpqBGLbFiBkBpziV44IiYpUTqBrOLrkmopwXjnDYRKgxIr5TjpF8bl0Z0wOZQ-3D-3D )

By clicking this email, this allows us to send you the occasional marketing email, with goodies like special offers and limited-time services.
*
Valid for new customers only. New customers receive $55 off their first booking. Must click through the 'Claim' url or use provided referral code, AARON9231, at checkout. Not combinable with other offers. Handy reserves the right to alter or end this promotion at any time, including but not limited to any noted discount amounts.

Handy, through the Handy platform, offers information & a method to obtain the above services, but does not itself provide these services. The provision of these services is up to the independent professionals, scheduled through the Handy Platform.
handy.com ( https://sgemail.handy.com/wf/click?upn=q-2FQsSf2tmXyd2vkF8VEcseJZkXaGdRcWLa8SGTMwMTwgoOqsD8c4LW4PJHfa5XvNhV91IOu7BoVwnt-2FvzqlT3hviWxTDZJDtK9iqkY6Hnhk-3D_s5UH8bhnBaopYjthcNSRcU5O-2BCkAC7DChglJQfInpbg-2BTPAaHGnhnOR1978HNXqN4bIzVXW49QJVSD2LC3g4wpY2uefMIJH3GWU8pbv2Ug6JfSVxqX5PmCyOCqgbVsx-2FU-2Bu6Vj7Qug7FfXaArvl9S75QO8wPXJWpGkEYCtDln-2FiaHXfCWxLNdSgSAui3fjlGmDeJIu7tRP90xRfoARNtrjls9RU4Ub7LQ-2FcWpFGrj8lL9t4yWgisE37TT6-2BoZKhZV7b15pJaurj-2Beqyan3KOLcAhikmm62lX-2Fqf8ikDqYAk-2FkNYiFEcBXrUTmVVrqq0C1h0NBQFD5f2J6qRxPW4lS-2Bn7FkNM33TtD-2BoobM1ICjPZV7cEoqeWRBIAgVq-2FoTvZjsJmNqH-2F5Qe3B8ddfzwhqA-3D-3D )

Was this page helpful?
0 / 5 - 0 ratings