capricorn 2.0.8 → 2.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. data/erlang/lib/capricorn/ebin/capricorn.app +2 -1
  2. data/erlang/lib/capricorn/include/capricorn.hrl +1 -0
  3. data/erlang/lib/capricorn/src/cap_cluster_gems.erl +6 -1
  4. data/erlang/lib/capricorn/src/cap_console_dispatcher.erl +214 -0
  5. data/erlang/lib/capricorn/src/cap_machine_apps.erl +25 -1
  6. data/erlang/lib/capricorn/src/cap_sup.erl +14 -0
  7. data/erlang/lib/ejson/Makefile +24 -0
  8. data/erlang/lib/ejson/ebin/ejson.app +9 -0
  9. data/erlang/lib/ejson/include/ejson.hrl +40 -0
  10. data/erlang/lib/ejson/rebar.config +3 -0
  11. data/erlang/lib/ejson/src/ejson.erl +22 -0
  12. data/erlang/lib/ejson/src/ejson_decode.erl +337 -0
  13. data/erlang/lib/ejson/src/ejson_encode.erl +124 -0
  14. data/erlang/lib/ejson/test/arrays.escript +47 -0
  15. data/erlang/lib/ejson/test/compound.escript +56 -0
  16. data/erlang/lib/ejson/test/literals.escript +30 -0
  17. data/erlang/lib/ejson/test/numbers.escript +70 -0
  18. data/erlang/lib/ejson/test/objects.escript +51 -0
  19. data/erlang/lib/ejson/test/strings.escript +49 -0
  20. data/erlang/lib/ejson/test/timing.escript +43 -0
  21. data/erlang/lib/ejson/test/timing.json +382 -0
  22. data/erlang/lib/ejson/vendor/mochijson2.erl +621 -0
  23. data/erlang/lib/ejson/vendor/rfc4627.erl +625 -0
  24. data/erlang/lib/misultin/LICENSE.txt +41 -0
  25. data/erlang/lib/misultin/Makefile +26 -0
  26. data/erlang/lib/misultin/README.txt +120 -0
  27. data/erlang/lib/misultin/ebin/misultin.app +9 -0
  28. data/erlang/lib/misultin/examples/misultin_compress.erl +43 -0
  29. data/erlang/lib/misultin/examples/misultin_echo.erl +58 -0
  30. data/erlang/lib/misultin/examples/misultin_file.erl +43 -0
  31. data/erlang/lib/misultin/examples/misultin_gen_server.erl +158 -0
  32. data/erlang/lib/misultin/examples/misultin_get_variable.erl +55 -0
  33. data/erlang/lib/misultin/examples/misultin_hello_world.erl +43 -0
  34. data/erlang/lib/misultin/examples/misultin_rest.erl +68 -0
  35. data/erlang/lib/misultin/examples/misultin_ssl.erl +51 -0
  36. data/erlang/lib/misultin/examples/misultin_stream.erl +55 -0
  37. data/erlang/lib/misultin/examples/misultin_websocket_event_example.erl +103 -0
  38. data/erlang/lib/misultin/examples/misultin_websocket_example.erl +95 -0
  39. data/erlang/lib/misultin/include/misultin.hrl +95 -0
  40. data/erlang/lib/misultin/make.bat +55 -0
  41. data/erlang/lib/misultin/priv/README.txt +12 -0
  42. data/erlang/lib/misultin/priv/test_certificate.pem +21 -0
  43. data/erlang/lib/misultin/priv/test_privkey.pem +18 -0
  44. data/erlang/lib/misultin/rebar.config +3 -0
  45. data/erlang/lib/misultin/src/misultin.app.src +9 -0
  46. data/erlang/lib/misultin/src/misultin.erl +338 -0
  47. data/erlang/lib/misultin/src/misultin_http.erl +488 -0
  48. data/erlang/lib/misultin/src/misultin_req.erl +280 -0
  49. data/erlang/lib/misultin/src/misultin_socket.erl +193 -0
  50. data/erlang/lib/misultin/src/misultin_utility.erl +357 -0
  51. data/erlang/lib/misultin/src/misultin_websocket.erl +252 -0
  52. data/erlang/lib/misultin/src/misultin_ws.erl +78 -0
  53. data/erlang/rebar.config +2 -0
  54. data/erlang/rel/overlay/etc/capricorn/app.config +4 -0
  55. data/erlang/rel/reltool.config +5 -0
  56. data/lib/capricorn/recipes/apache-debian.rb +1 -1
  57. data/lib/capricorn/recipes/centos-plesk.rb +1 -1
  58. data/lib/capricorn/recipes/debian-plesk95.rb +1 -2
  59. data/lib/capricorn/recipes/macports.rb +1 -1
  60. data/lib/capricorn/version.rb +1 -1
  61. metadata +51 -4
@@ -0,0 +1,47 @@
1
+ #! /usr/bin/env escript
2
+
3
+ main([]) ->
4
+ code:add_pathz("ebin/"),
5
+ check_good(),
6
+ check_errors().
7
+
8
+ check_good() ->
9
+ lists:map(fun
10
+ ({J, E}) ->
11
+ E = ejson:decode(J),
12
+ J = ejson:encode(E);
13
+ ({J, E, J2}) ->
14
+ E = ejson:decode(J),
15
+ J2 = ejson:encode(E)
16
+ end,
17
+ good()).
18
+
19
+ check_errors() ->
20
+ lists:map(fun(E) ->
21
+ ok = case (catch ejson:decode(E)) of
22
+ {invalid_json, _} -> ok;
23
+ Error ->
24
+ io:format("Error: ~p~n", [E]),
25
+ Error
26
+ end
27
+ end, errors()).
28
+
29
+ good() ->
30
+ [
31
+ {<<"[]">>, []},
32
+ {<<"[\t[\n]\r]">>, [[]], <<"[[]]">>},
33
+ {<<"[\t123, \r true\n]">>, [123, true], <<"[123,true]">>},
34
+ {<<"[1,\"foo\"]">>, [1, <<"foo">>]},
35
+ {<<"[1199344435545.0,1]">>, [1199344435545.0,1]},
36
+ {<<"[\"\\u00A1\",\"\\u00FC\"]">>, [<<194, 161>>, <<195, 188>>]}
37
+ ].
38
+
39
+ errors() ->
40
+ [
41
+ <<"[">>,
42
+ <<"]">>,
43
+ <<"[,]">>,
44
+ <<"[123">>,
45
+ <<"[123,]">>,
46
+ <<"[32 true]">>
47
+ ].
@@ -0,0 +1,56 @@
1
+ #! /usr/bin/env escript
2
+
3
+ main([]) ->
4
+ code:add_pathz("ebin/"),
5
+ check_good(),
6
+ check_errors().
7
+
8
+ check_good() ->
9
+ lists:map(fun
10
+ ({J, E}) ->
11
+ E = ejson:decode(J),
12
+ J = ejson:encode(E);
13
+ ({J, E, J2}) ->
14
+ E = ejson:decode(J),
15
+ J2 = ejson:encode(E)
16
+ end,
17
+ good()).
18
+
19
+ check_errors() ->
20
+ lists:map(fun(E) ->
21
+ ok = case (catch ejson:decode(E)) of
22
+ {invalid_json, _} -> ok;
23
+ Error ->
24
+ io:format("Error: ~p~n", [E]),
25
+ Error
26
+ end
27
+ end, errors()).
28
+
29
+ good() ->
30
+ [
31
+ {<<"[{}]">>, [{[]}]},
32
+ {<<"{\"foo\":[123]}">>, {[{<<"foo">>, [123]}]}},
33
+ {<<"{\"foo\":{\"bar\":true}}">>,
34
+ {[{<<"foo">>, {[{<<"bar">>, true}]} }]} },
35
+ {<<"{\"foo\":[],\"bar\":{\"baz\":true},\"alice\":\"bob\"}">>,
36
+ {[
37
+ {<<"foo">>, []},
38
+ {<<"bar">>, {[{<<"baz">>, true}]}},
39
+ {<<"alice">>, <<"bob">>}
40
+ ]}
41
+ },
42
+ {<<"[-123,\"foo\",{\"bar\":[]},null]">>,
43
+ [
44
+ -123,
45
+ <<"foo">>,
46
+ {[{<<"bar">>, []}]},
47
+ null
48
+ ]
49
+ }
50
+ ].
51
+
52
+ errors() ->
53
+ [
54
+ <<"[{}">>,
55
+ <<"}]">>
56
+ ].
@@ -0,0 +1,30 @@
1
+ #! /usr/bin/env escript
2
+
3
+ main([]) ->
4
+ code:add_pathz("ebin/"),
5
+ ok = true(),
6
+ ok = false(),
7
+ ok = null().
8
+
9
+ true() ->
10
+ true = ejson:decode(<<"true">>),
11
+ case ejson:encode(true) of
12
+ <<"true">> -> ok;
13
+ Error -> throw({invalid_result, Error})
14
+ end.
15
+
16
+ false() ->
17
+ false = ejson:decode(<<"false">>),
18
+ case ejson:encode(false) of
19
+ <<"false">> -> ok;
20
+ Error -> throw({invalid_result, Error})
21
+ end.
22
+
23
+ null() ->
24
+ null = ejson:decode(<<"null">>),
25
+ case ejson:encode(null) of
26
+ <<"null">> -> ok;
27
+ Error -> throw({invalid_result, Error})
28
+ end.
29
+
30
+
@@ -0,0 +1,70 @@
1
+ #! /usr/bin/env escript
2
+
3
+ main([]) ->
4
+ code:add_pathz("ebin/"),
5
+ check_good(),
6
+ check_errors().
7
+
8
+ check_good() ->
9
+ lists:map(fun
10
+ ({J, E}) ->
11
+ E = ejson:decode(J),
12
+ J = ejson:encode(E);
13
+ ({J, E, J2}) ->
14
+ E = ejson:decode(J),
15
+ J2 = ejson:encode(E)
16
+ end,
17
+ good()).
18
+
19
+ check_errors() ->
20
+ lists:map(fun({Json, Reason}) ->
21
+ ok = case (catch ejson:decode(Json)) of
22
+ {invalid_json, {invalid_number, Reason}} -> ok;
23
+ {invalid_json, Reason} -> ok;
24
+ Error ->
25
+ Fmt = "Wrong error for ~p: ~p (exp: {invalid_number, ~p})~n",
26
+ io:format(standard_error, Fmt, [Json, Error, Reason]),
27
+ Error
28
+ end
29
+ end, errors()).
30
+
31
+ good() ->
32
+ [
33
+ {<<"0">>, 0},
34
+ {<<"1">>, 1},
35
+ {<<"12">>, 12},
36
+ {<<"-3">>, -3},
37
+ {<<"309230948234098">>, 309230948234098},
38
+ {<<"1.0">>, 1.0},
39
+ {<<"0.3">>, 0.3},
40
+ {<<"2.4234324">>, 2.4234324},
41
+ {<<"-3.1416">>, -3.1416},
42
+ {<<"1E4">>, 10000.0, <<"1.0e4">>},
43
+ {<<"1.0E+01">>, 10.0, <<"10.0">>},
44
+ {<<"1e1">>, 10.0, <<"10.0">>},
45
+ {<<"3.0E2">>, 300.0, <<"300.0">>},
46
+ {<<"0E3">>, 0.0, <<"0.0">>},
47
+ {<<"1.5E3">>, 1500.0, <<"1.5e3">>},
48
+ {<<"1.5E-1">>, 0.15, <<"0.15">>},
49
+ {<<"-0.323E+2">>, -32.3, <<"-32.3">>}
50
+ ].
51
+
52
+ errors() ->
53
+ [
54
+ {<<"02">>, leading_zero},
55
+ {<<"-0">>, no_more_data},
56
+ {<<"-01">>, "-01"},
57
+ {<<"+12">>, plus_prefix_is_invalid},
58
+ {<<"0A">>, leading_zero},
59
+ {<<".1">>, decimals_require_a_zero},
60
+ {<<"0.A">>, not_digit_after_decimal},
61
+ {<<"1A">>, invalid_digit},
62
+ {<<"1.A">>, not_digit_after_decimal},
63
+ {<<"-">>, lonely_hyphen},
64
+ {<<"1.">>, missing_fraction},
65
+ {<<"1.-1">>, not_digit_after_decimal},
66
+ {<<"1E">>, invalid_exponent},
67
+ {<<"1-E2">>, invalid_digit},
68
+ {<<"2E +3">>, no_exponent_after_e},
69
+ {<<"1EA">>, invalid_digit_in_exponent}
70
+ ].
@@ -0,0 +1,51 @@
1
+ #! /usr/bin/env escript
2
+
3
+ main([]) ->
4
+ code:add_pathz("ebin/"),
5
+ check_good(),
6
+ check_errors().
7
+
8
+ check_good() ->
9
+ lists:map(fun
10
+ ({J, E}) ->
11
+ E = ejson:decode(J),
12
+ J = ejson:encode(E);
13
+ ({J, E, J2}) ->
14
+ E = ejson:decode(J),
15
+ J2 = ejson:encode(E)
16
+ end,
17
+ good()).
18
+
19
+ check_errors() ->
20
+ lists:map(fun(E) ->
21
+ ok = case (catch ejson:decode(E)) of
22
+ {invalid_json, _} -> ok;
23
+ Error ->
24
+ io:format("Error: ~p~n", [E]),
25
+ Error
26
+ end
27
+ end, errors()).
28
+
29
+ good() ->
30
+ [
31
+ {<<"{}">>, {[]}},
32
+ {<<"{\"foo\": \"bar\"}">>,
33
+ {[{<<"foo">>, <<"bar">>}]},
34
+ <<"{\"foo\":\"bar\"}">>},
35
+ {<<"\n\n{\"foo\":\r \"bar\",\n \"baz\"\t: 123 }">>,
36
+ {[{<<"foo">>, <<"bar">>}, {<<"baz">>, 123}]},
37
+ <<"{\"foo\":\"bar\",\"baz\":123}">>}
38
+ ].
39
+
40
+ errors() ->
41
+ [
42
+ <<"{">>,
43
+ <<"{,}">>,
44
+ <<"{123:true}">>,
45
+ <<"{false:123}">>,
46
+ <<"{:\"stuff\"}">>,
47
+ <<"{\"key\":}">>,
48
+ <<"{\"key\": 123">>,
49
+ <<"{\"key\": 123 true">>,
50
+ <<"{\"key\": 123,}">>
51
+ ].
@@ -0,0 +1,49 @@
1
+ #! /usr/bin/env escript
2
+
3
+ main([]) ->
4
+ code:add_pathz("ebin/"),
5
+ check_good(),
6
+ check_errors().
7
+
8
+ check_good() ->
9
+ lists:map(fun
10
+ ({J, E}) ->
11
+ E = ejson:decode(J),
12
+ J = ejson:encode(E);
13
+ ({J, E, J2}) ->
14
+ E = ejson:decode(J),
15
+ J2 = ejson:encode(E)
16
+ end,
17
+ good()).
18
+
19
+ check_errors() ->
20
+ lists:map(fun(E) ->
21
+ ok = case (catch ejson:decode(E)) of
22
+ {invalid_json, _} -> ok;
23
+ Error ->
24
+ io:format("Error: ~p~n", [E]),
25
+ Error
26
+ end
27
+ end, errors()).
28
+
29
+ good() ->
30
+ [
31
+ {<<"\"\"">>, <<"">>},
32
+ {<<"\"0\"">>, <<"0">>},
33
+ {<<"\"foo\"">>, <<"foo">>},
34
+ {<<"\"\\\"foobar\\\"\"">>, <<"\"foobar\"">>},
35
+ {<<"\"\\n\\n\\n\"">>, <<"\n\n\n">>},
36
+ {<<"\"\\\" \\b\\f\\r\\n\\t\\\"\"">>, <<"\" \b\f\r\n\t\"">>},
37
+ {<<"\"foo\\u0005bar\"">>, <<"foo", 5, "bar">>},
38
+ {<<"\"\\uFFFF\"">>, <<239, 191, 191>>},
39
+ {<<"\"\\uD834\\uDD1E\"">>, <<240, 157, 132, 158>>},
40
+ {<<"\"\\uD834foo\\uDD1E\"">>, <<237, 160, 180, "foo", 237, 180, 158>>}
41
+ ].
42
+
43
+ errors() ->
44
+ [
45
+ <<"\"", 0, "\"">>,
46
+ <<"\"\\g\"">>,
47
+ % CouchDB-345
48
+ <<"\"",78,69,73,77,69,78,32,70,216,82,82,32,70,65,69,78,33,"\"">>
49
+ ].
@@ -0,0 +1,43 @@
1
+ #! /usr/bin/env escript
2
+
3
+ main([]) ->
4
+ code:add_pathz("ebin/"),
5
+ Cases = read_cases("test/timing.json"),
6
+ io:format("Timing runs...~n", []),
7
+ run(ejson, Cases),
8
+ run(mochijson2, Cases),
9
+ run(rfc4627, Cases).
10
+
11
+ run(Module, Cases) ->
12
+ F = fun() ->
13
+ lists:foreach(fun(_) ->
14
+ lists:map(fun(C) -> Module:decode(C) end, Cases)
15
+ end, lists:seq(1, 2000))
16
+ end,
17
+ io:format("~p => ~p~n", [Module, timed(F)]).
18
+
19
+ timed(Func) ->
20
+ Start = micro(),
21
+ Func(),
22
+ End = micro(),
23
+ (End-Start)/1000000.
24
+
25
+ micro() ->
26
+ {Mega, Secs, Micro} = erlang:now(),
27
+ (Mega * 1000000 + Secs) * 1000000 + Micro.
28
+
29
+ read_cases(FName) ->
30
+ {ok, Data} = file:read_file(FName),
31
+ read_cases(Data, [], []).
32
+
33
+ read_cases(Data, Curr, Acc) ->
34
+ case Data of
35
+ <<>> ->
36
+ Case = list_to_binary(lists:reverse(Curr)),
37
+ lists:reverse([Case | Acc]);
38
+ <<"---", Rest/binary>> ->
39
+ Case = list_to_binary(lists:reverse(Curr)),
40
+ read_cases(Rest, [], [Case | Acc]);
41
+ <<First:8/integer, Rest/binary>> ->
42
+ read_cases(Rest, [First | Curr], Acc)
43
+ end.
@@ -0,0 +1,382 @@
1
+ []
2
+ ---
3
+ [123, true]
4
+ ---
5
+ [1,"foo"]
6
+ ---
7
+ [1199344435545.0,1]
8
+ ---
9
+ ["\u00A1","\u00FC"]
10
+ ---
11
+ [{}]
12
+ ---
13
+ {"foo":[123]}
14
+ ---
15
+ {"foo":{"bar":true}}
16
+ ---
17
+ {"foo":[], "bar": {"baz": true}, "alice": "bob"}
18
+ ---
19
+ [-123,"foo",{"bar":[]},null]
20
+ ---
21
+ 0
22
+ ---
23
+ 309230948234098
24
+ ---
25
+ -0.323E+2
26
+ ---
27
+ {"foo": "bar"}
28
+ ---
29
+ {"foo": "bar", "baz": 123}
30
+ ---
31
+ [{"animals": {
32
+ "dog": [
33
+ {"name": "Rufus", "breed": "labrador"},
34
+ {"name": "Marty", "breed": "whippet"}
35
+ ],
36
+ "cat": {"name": "Matilda"}
37
+ }}]
38
+ ---
39
+ [{"animals": {
40
+ "dog": [
41
+ {"name": "Rufus", "breed": "labrador"},
42
+ {"name": "Marty", "breed": "whippet"}
43
+ ],
44
+ "cat": {"name": "Matilda"}
45
+ }},
46
+ {"animals": {
47
+ "dog": [
48
+ {"name": "Rufus", "breed": "labrador"},
49
+ {"name": "Marty", "breed": "whippet"}
50
+ ],
51
+ "cat": {"name": "Matilda"}
52
+ }},
53
+ {"animals": {
54
+ "dog": [
55
+ {"name": "Rufus", "breed": "labrador"},
56
+ {"name": "Marty", "breed": "whippet"}
57
+ ],
58
+ "cat": {"name": "Matilda"}
59
+ }},
60
+ {"animals": {
61
+ "dog": [
62
+ {"name": "Rufus", "breed": "labrador"},
63
+ {"name": "Marty", "breed": "whippet"}
64
+ ],
65
+ "cat": {"name": "Matilda"}
66
+ }},
67
+ {"animals": {
68
+ "dog": [
69
+ {"name": "Rufus", "breed": "labrador"},
70
+ {"name": "Marty", "breed": "whippet"}
71
+ ],
72
+ "cat": {"name": "Matilda"}
73
+ }},
74
+ {"animals": {
75
+ "dog": [
76
+ {"name": "Rufus", "breed": "labrador"},
77
+ {"name": "Marty", "breed": "whippet"}
78
+ ],
79
+ "cat": {"name": "Matilda"}
80
+ }},
81
+ {"animals": {
82
+ "dog": [
83
+ {"name": "Rufus", "breed": "labrador"},
84
+ {"name": "Marty", "breed": "whippet"}
85
+ ],
86
+ "cat": {"name": "Matilda"}
87
+ }},
88
+ {"animals": {
89
+ "dog": [
90
+ {"name": "Rufus", "breed": "labrador"},
91
+ {"name": "Marty", "breed": "whippet"}
92
+ ],
93
+ "cat": {"name": "Matilda"}
94
+ }},
95
+ {"animals": {
96
+ "dog": [
97
+ {"name": "Rufus", "breed": "labrador"},
98
+ {"name": "Marty", "breed": "whippet"}
99
+ ],
100
+ "cat": {"name": "Matilda"}
101
+ }},
102
+ {"animals": {
103
+ "dog": [
104
+ {"name": "Rufus", "breed": "labrador"},
105
+ {"name": "Marty", "breed": "whippet"}
106
+ ],
107
+ "cat": {"name": "Matilda"}
108
+ }},
109
+ {"animals": {
110
+ "dog": [
111
+ {"name": "Rufus", "breed": "labrador"},
112
+ {"name": "Marty", "breed": "whippet"}
113
+ ],
114
+ "cat": {"name": "Matilda"}
115
+ }},
116
+ {"animals": {
117
+ "dog": [
118
+ {"name": "Rufus", "breed": "labrador"},
119
+ {"name": "Marty", "breed": "whippet"}
120
+ ],
121
+ "cat": {"name": "Matilda"}
122
+ }},
123
+ {"animals": {
124
+ "dog": [
125
+ {"name": "Rufus", "breed": "labrador"},
126
+ {"name": "Marty", "breed": "whippet"}
127
+ ],
128
+ "cat": {"name": "Matilda"}
129
+ }},
130
+ {"animals": {
131
+ "dog": [
132
+ {"name": "Rufus", "breed": "labrador"},
133
+ {"name": "Marty", "breed": "whippet"}
134
+ ],
135
+ "cat": {"name": "Matilda"}
136
+ }},
137
+ {"animals": {
138
+ "dog": [
139
+ {"name": "Rufus", "breed": "labrador"},
140
+ {"name": "Marty", "breed": "whippet"}
141
+ ],
142
+ "cat": {"name": "Matilda"}
143
+ }},
144
+ {"animals": {
145
+ "dog": [
146
+ {"name": "Rufus", "breed": "labrador"},
147
+ {"name": "Marty", "breed": "whippet"}
148
+ ],
149
+ "cat": {"name": "Matilda"}
150
+ }},
151
+ {"animals": {
152
+ "dog": [
153
+ {"name": "Rufus", "breed": "labrador"},
154
+ {"name": "Marty", "breed": "whippet"}
155
+ ],
156
+ "cat": {"name": "Matilda"}
157
+ }},
158
+ {"animals": {
159
+ "dog": [
160
+ {"name": "Rufus", "breed": "labrador"},
161
+ {"name": "Marty", "breed": "whippet"}
162
+ ],
163
+ "cat": {"name": "Matilda"}
164
+ }},
165
+ {"animals": {
166
+ "dog": [
167
+ {"name": "Rufus", "breed": "labrador"},
168
+ {"name": "Marty", "breed": "whippet"}
169
+ ],
170
+ "cat": {"name": "Matilda"}
171
+ }},
172
+ {"animals": {
173
+ "dog": [
174
+ {"name": "Rufus", "breed": "labrador"},
175
+ {"name": "Marty", "breed": "whippet"}
176
+ ],
177
+ "cat": {"name": "Matilda"}
178
+ }},
179
+ {"animals": {
180
+ "dog": [
181
+ {"name": "Rufus", "breed": "labrador"},
182
+ {"name": "Marty", "breed": "whippet"}
183
+ ],
184
+ "cat": {"name": "Matilda"}
185
+ }},
186
+ {"animals": {
187
+ "dog": [
188
+ {"name": "Rufus", "breed": "labrador"},
189
+ {"name": "Marty", "breed": "whippet"}
190
+ ],
191
+ "cat": {"name": "Matilda"}
192
+ }},
193
+ {"animals": {
194
+ "dog": [
195
+ {"name": "Rufus", "breed": "labrador"},
196
+ {"name": "Marty", "breed": "whippet"}
197
+ ],
198
+ "cat": {"name": "Matilda"}
199
+ }},
200
+ {"animals": {
201
+ "dog": [
202
+ {"name": "Rufus", "breed": "labrador"},
203
+ {"name": "Marty", "breed": "whippet"}
204
+ ],
205
+ "cat": {"name": "Matilda"}
206
+ }},
207
+ {"animals": {
208
+ "dog": [
209
+ {"name": "Rufus", "breed": "labrador"},
210
+ {"name": "Marty", "breed": "whippet"}
211
+ ],
212
+ "cat": {"name": "Matilda"}
213
+ }},
214
+ {"animals": {
215
+ "dog": [
216
+ {"name": "Rufus", "breed": "labrador"},
217
+ {"name": "Marty", "breed": "whippet"}
218
+ ],
219
+ "cat": {"name": "Matilda"}
220
+ }},
221
+ {"animals": {
222
+ "dog": [
223
+ {"name": "Rufus", "breed": "labrador"},
224
+ {"name": "Marty", "breed": "whippet"}
225
+ ],
226
+ "cat": {"name": "Matilda"}
227
+ }},
228
+ {"animals": {
229
+ "dog": [
230
+ {"name": "Rufus", "breed": "labrador"},
231
+ {"name": "Marty", "breed": "whippet"}
232
+ ],
233
+ "cat": {"name": "Matilda"}
234
+ }},
235
+ {"animals": {
236
+ "dog": [
237
+ {"name": "Rufus", "breed": "labrador"},
238
+ {"name": "Marty", "breed": "whippet"}
239
+ ],
240
+ "cat": {"name": "Matilda"}
241
+ }},
242
+ {"animals": {
243
+ "dog": [
244
+ {"name": "Rufus", "breed": "labrador"},
245
+ {"name": "Marty", "breed": "whippet"}
246
+ ],
247
+ "cat": {"name": "Matilda"}
248
+ }},
249
+ {"animals": {
250
+ "dog": [
251
+ {"name": "Rufus", "breed": "labrador"},
252
+ {"name": "Marty", "breed": "whippet"}
253
+ ],
254
+ "cat": {"name": "Matilda"}
255
+ }},
256
+ {"animals": {
257
+ "dog": [
258
+ {"name": "Rufus", "breed": "labrador"},
259
+ {"name": "Marty", "breed": "whippet"}
260
+ ],
261
+ "cat": {"name": "Matilda"}
262
+ }},
263
+ {"animals": {
264
+ "dog": [
265
+ {"name": "Rufus", "breed": "labrador"},
266
+ {"name": "Marty", "breed": "whippet"}
267
+ ],
268
+ "cat": {"name": "Matilda"}
269
+ }},
270
+ {"animals": {
271
+ "dog": [
272
+ {"name": "Rufus", "breed": "labrador"},
273
+ {"name": "Marty", "breed": "whippet"}
274
+ ],
275
+ "cat": {"name": "Matilda"}
276
+ }},
277
+ {"animals": {
278
+ "dog": [
279
+ {"name": "Rufus", "breed": "labrador"},
280
+ {"name": "Marty", "breed": "whippet"}
281
+ ],
282
+ "cat": {"name": "Matilda"}
283
+ }},
284
+ {"animals": {
285
+ "dog": [
286
+ {"name": "Rufus", "breed": "labrador"},
287
+ {"name": "Marty", "breed": "whippet"}
288
+ ],
289
+ "cat": {"name": "Matilda"}
290
+ }},
291
+ {"animals": {
292
+ "dog": [
293
+ {"name": "Rufus", "breed": "labrador"},
294
+ {"name": "Marty", "breed": "whippet"}
295
+ ],
296
+ "cat": {"name": "Matilda"}
297
+ }},
298
+ {"animals": {
299
+ "dog": [
300
+ {"name": "Rufus", "breed": "labrador"},
301
+ {"name": "Marty", "breed": "whippet"}
302
+ ],
303
+ "cat": {"name": "Matilda"}
304
+ }},
305
+ {"animals": {
306
+ "dog": [
307
+ {"name": "Rufus", "breed": "labrador"},
308
+ {"name": "Marty", "breed": "whippet"}
309
+ ],
310
+ "cat": {"name": "Matilda"}
311
+ }},
312
+ {"animals": {
313
+ "dog": [
314
+ {"name": "Rufus", "breed": "labrador"},
315
+ {"name": "Marty", "breed": "whippet"}
316
+ ],
317
+ "cat": {"name": "Matilda"}
318
+ }},
319
+ {"animals": {
320
+ "dog": [
321
+ {"name": "Rufus", "breed": "labrador"},
322
+ {"name": "Marty", "breed": "whippet"}
323
+ ],
324
+ "cat": {"name": "Matilda"}
325
+ }},
326
+ {"animals": {
327
+ "dog": [
328
+ {"name": "Rufus", "breed": "labrador"},
329
+ {"name": "Marty", "breed": "whippet"}
330
+ ],
331
+ "cat": {"name": "Matilda"}
332
+ }},
333
+ {"animals": {
334
+ "dog": [
335
+ {"name": "Rufus", "breed": "labrador"},
336
+ {"name": "Marty", "breed": "whippet"}
337
+ ],
338
+ "cat": {"name": "Matilda"}
339
+ }},
340
+ {"animals": {
341
+ "dog": [
342
+ {"name": "Rufus", "breed": "labrador"},
343
+ {"name": "Marty", "breed": "whippet"}
344
+ ],
345
+ "cat": {"name": "Matilda"}
346
+ }},
347
+ {"animals": {
348
+ "dog": [
349
+ {"name": "Rufus", "breed": "labrador"},
350
+ {"name": "Marty", "breed": "whippet"}
351
+ ],
352
+ "cat": {"name": "Matilda"}
353
+ }},
354
+ {"animals": {
355
+ "dog": [
356
+ {"name": "Rufus", "breed": "labrador"},
357
+ {"name": "Marty", "breed": "whippet"}
358
+ ],
359
+ "cat": {"name": "Matilda"}
360
+ }},
361
+ {"animals": {
362
+ "dog": [
363
+ {"name": "Rufus", "breed": "labrador"},
364
+ {"name": "Marty", "breed": "whippet"}
365
+ ],
366
+ "cat": {"name": "Matilda"}
367
+ }},
368
+ {"animals": {
369
+ "dog": [
370
+ {"name": "Rufus", "breed": "labrador"},
371
+ {"name": "Marty", "breed": "whippet"}
372
+ ],
373
+ "cat": {"name": "Matilda"}
374
+ }},
375
+ {"animals": {
376
+ "dog": [
377
+ {"name": "Rufus", "breed": "labrador"},
378
+ {"name": "Marty", "breed": "whippet"}
379
+ ],
380
+ "cat": {"name": "Matilda"}
381
+ }}
382
+ ]