mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-03 14:33:32 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			3640 lines
		
	
	
		
			180 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			3640 lines
		
	
	
		
			180 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
SELECT JSON_COMPACT(0.0e0) = -0.0e0;
 | 
						||
JSON_COMPACT(0.0e0) = -0.0e0
 | 
						||
1
 | 
						||
SELECT JSON_COMPACT(CAST(0 AS DECIMAL)) = CAST(-0.0e0 AS DECIMAL);
 | 
						||
JSON_COMPACT(CAST(0 AS DECIMAL)) = CAST(-0.0e0 AS DECIMAL)
 | 
						||
1
 | 
						||
SELECT JSON_COMPACT(0.0e0) = CAST(-0.0e0 AS DECIMAL);
 | 
						||
JSON_COMPACT(0.0e0) = CAST(-0.0e0 AS DECIMAL)
 | 
						||
1
 | 
						||
SELECT JSON_COMPACT(CAST(0 AS DECIMAL)) = -0.0e0;
 | 
						||
JSON_COMPACT(CAST(0 AS DECIMAL)) = -0.0e0
 | 
						||
1
 | 
						||
SELECT JSON_COMPACT(CAST(0 AS SIGNED)) = -0.0e0;
 | 
						||
JSON_COMPACT(CAST(0 AS SIGNED)) = -0.0e0
 | 
						||
1
 | 
						||
SELECT JSON_COMPACT(CAST(0 AS SIGNED)) = CAST(-0.0e0 AS DECIMAL);
 | 
						||
JSON_COMPACT(CAST(0 AS SIGNED)) = CAST(-0.0e0 AS DECIMAL)
 | 
						||
1
 | 
						||
SELECT JSON_COMPACT(CAST(0 AS UNSIGNED)) = -0.0e0;
 | 
						||
JSON_COMPACT(CAST(0 AS UNSIGNED)) = -0.0e0
 | 
						||
1
 | 
						||
SELECT JSON_COMPACT(CAST(0 AS UNSIGNED)) = CAST(-0.0e0 AS DECIMAL);
 | 
						||
JSON_COMPACT(CAST(0 AS UNSIGNED)) = CAST(-0.0e0 AS DECIMAL)
 | 
						||
1
 | 
						||
select json_compact('"abc"');
 | 
						||
json_compact('"abc"')
 | 
						||
"abc"
 | 
						||
error ER_INVALID_JSON_TEXT_IN_PARAM
 | 
						||
select json_compact('abc');
 | 
						||
json_compact('abc')
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4038	Syntax error in JSON text in argument 1 to function 'json_compact' at position 1
 | 
						||
 | 
						||
# String literal - valid JSON
 | 
						||
select JSON_VALID('123');
 | 
						||
JSON_VALID('123')
 | 
						||
1
 | 
						||
select JSON_VALID('-123');
 | 
						||
JSON_VALID('-123')
 | 
						||
1
 | 
						||
select JSON_VALID('5000000000');
 | 
						||
JSON_VALID('5000000000')
 | 
						||
1
 | 
						||
select JSON_VALID('-5000000000');
 | 
						||
JSON_VALID('-5000000000')
 | 
						||
1
 | 
						||
select JSON_VALID('1.23');
 | 
						||
JSON_VALID('1.23')
 | 
						||
1
 | 
						||
select JSON_VALID('"123"');
 | 
						||
JSON_VALID('"123"')
 | 
						||
1
 | 
						||
select JSON_VALID('true');
 | 
						||
JSON_VALID('true')
 | 
						||
1
 | 
						||
select JSON_VALID('false');
 | 
						||
JSON_VALID('false')
 | 
						||
1
 | 
						||
select JSON_VALID('null');
 | 
						||
JSON_VALID('null')
 | 
						||
1
 | 
						||
select JSON_VALID('{"address": "Trondheim"}');
 | 
						||
JSON_VALID('{"address": "Trondheim"}')
 | 
						||
1
 | 
						||
 | 
						||
# String literal - not valid JSON
 | 
						||
select JSON_VALID('12 3');
 | 
						||
JSON_VALID('12 3')
 | 
						||
0
 | 
						||
 | 
						||
# String literal not in UTF-8
 | 
						||
set names 'ascii';
 | 
						||
select JSON_VALID('123');
 | 
						||
JSON_VALID('123')
 | 
						||
1
 | 
						||
set names 'utf8';
 | 
						||
 | 
						||
# Json expression
 | 
						||
select JSON_VALID(json_compact('[123]'));
 | 
						||
JSON_VALID(json_compact('[123]'))
 | 
						||
1
 | 
						||
 | 
						||
# Json expression NULL
 | 
						||
select JSON_VALID(json_compact(NULL));
 | 
						||
JSON_VALID(json_compact(NULL))
 | 
						||
NULL
 | 
						||
 | 
						||
# Bare NULL
 | 
						||
select JSON_VALID( NULL );
 | 
						||
JSON_VALID( NULL )
 | 
						||
NULL
 | 
						||
 | 
						||
# Function result - string
 | 
						||
select JSON_VALID( UPPER('"abc"') );
 | 
						||
JSON_VALID( UPPER('"abc"') )
 | 
						||
1
 | 
						||
set names 'latin1';
 | 
						||
 | 
						||
# Function result - string
 | 
						||
select JSON_VALID( UPPER('"abc"') );
 | 
						||
JSON_VALID( UPPER('"abc"') )
 | 
						||
1
 | 
						||
set names 'utf8';
 | 
						||
 | 
						||
# Function result - date, not valid as JSON without CAST
 | 
						||
select JSON_VALID( CAST('2015-01-15' AS DATE) );
 | 
						||
JSON_VALID( CAST('2015-01-15' AS DATE) )
 | 
						||
0
 | 
						||
 | 
						||
# The date string doesn't parse as JSON text, so wrong:
 | 
						||
select JSON_VALID( CAST(CAST('2015-01-15' AS DATE) as CHAR CHARACTER SET 'utf8') );
 | 
						||
JSON_VALID( CAST(CAST('2015-01-15' AS DATE) as CHAR CHARACTER SET 'utf8') )
 | 
						||
0
 | 
						||
# OK, though:
 | 
						||
select JSON_VALID( json_compact(CURDATE()) );
 | 
						||
JSON_VALID( json_compact(CURDATE()) )
 | 
						||
0
 | 
						||
 | 
						||
# Function result - NULL
 | 
						||
select JSON_VALID( UPPER(NULL) );
 | 
						||
JSON_VALID( UPPER(NULL) )
 | 
						||
NULL
 | 
						||
select JSON_VALID( UPPER(CAST(NULL as CHAR)) );
 | 
						||
JSON_VALID( UPPER(CAST(NULL as CHAR)) )
 | 
						||
NULL
 | 
						||
SELECT JSON_VALID( '{ "firstName" : "Fred", "lastName" : "Flintstone" }' );
 | 
						||
JSON_VALID( '{ "firstName" : "Fred", "lastName" : "Flintstone" }' )
 | 
						||
1
 | 
						||
SELECT JSON_VALID( '3' );
 | 
						||
JSON_VALID( '3' )
 | 
						||
1
 | 
						||
SELECT JSON_VALID( null );
 | 
						||
JSON_VALID( null )
 | 
						||
NULL
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
# Test of JSON_CONTAINS_PATH function.
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
select json_contains_path();
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_contains_path'
 | 
						||
select json_contains_path('{ "a": true }' );
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_contains_path'
 | 
						||
select json_contains_path('{ "a": true }', 'all' );
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_contains_path'
 | 
						||
error ER_INVALID_JSON_TEXT_IN_PARAM
 | 
						||
select json_contains_path('{ "a": tru }', 'all', '$' );
 | 
						||
json_contains_path('{ "a": tru }', 'all', '$' )
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4038	Syntax error in JSON text in argument 1 to function 'json_contains_path' at position 10
 | 
						||
error ER_INVALID_JSON_PATH
 | 
						||
select json_contains_path('{ "a": true }', 'all', '$[' );
 | 
						||
json_contains_path('{ "a": true }', 'all', '$[' )
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4041	Unexpected end of JSON path in argument 3 to function 'json_contains_path'
 | 
						||
error ER_INVALID_JSON_PATH
 | 
						||
select json_contains_path('{ "a": true }', 'all', '$a.***[3]' );
 | 
						||
json_contains_path('{ "a": true }', 'all', '$a.***[3]' )
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4042	Syntax error in JSON path in argument 3 to function 'json_contains_path' at position 2
 | 
						||
error ER_JSON_BAD_ONE_OR_ALL_ARG
 | 
						||
select json_contains_path('{ "a": true }', 'foo', '$.a' );
 | 
						||
json_contains_path('{ "a": true }', 'foo', '$.a' )
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4046	Argument 2 to function 'json_contains_path' must be "one" or "all".
 | 
						||
error ER_INVALID_JSON_CHARSET
 | 
						||
select json_contains_path('{}', 'all', cast('$' as binary));
 | 
						||
json_contains_path('{}', 'all', cast('$' as binary))
 | 
						||
1
 | 
						||
select json_contains_path(null, 'all', '$.a' );
 | 
						||
json_contains_path(null, 'all', '$.a' )
 | 
						||
NULL
 | 
						||
select json_contains_path('{ "a": true }', null, '$.a' );
 | 
						||
json_contains_path('{ "a": true }', null, '$.a' )
 | 
						||
NULL
 | 
						||
select json_contains_path('{ "a": true }', 'all', null );
 | 
						||
json_contains_path('{ "a": true }', 'all', null )
 | 
						||
NULL
 | 
						||
select json_contains_path('{ "a": true }', 'all', '$' );
 | 
						||
json_contains_path('{ "a": true }', 'all', '$' )
 | 
						||
1
 | 
						||
select json_contains_path('{ "a": true }', 'all', '$.a' );
 | 
						||
json_contains_path('{ "a": true }', 'all', '$.a' )
 | 
						||
1
 | 
						||
select json_contains_path('{ "a": true }', 'one', '$.a' );
 | 
						||
json_contains_path('{ "a": true }', 'one', '$.a' )
 | 
						||
1
 | 
						||
select json_contains_path('{ "a": true }', 'all', '$.b' );
 | 
						||
json_contains_path('{ "a": true }', 'all', '$.b' )
 | 
						||
0
 | 
						||
select json_contains_path('{ "a": true }', 'one', '$.b' );
 | 
						||
json_contains_path('{ "a": true }', 'one', '$.b' )
 | 
						||
0
 | 
						||
select json_contains_path('{ "a": true }', 'all', '$.a', '$.b' );
 | 
						||
json_contains_path('{ "a": true }', 'all', '$.a', '$.b' )
 | 
						||
0
 | 
						||
select json_contains_path('{ "a": true }', 'all', '$.b', '$.a' );
 | 
						||
json_contains_path('{ "a": true }', 'all', '$.b', '$.a' )
 | 
						||
0
 | 
						||
select json_contains_path('{ "a": true }', 'ALL', '$.a', '$.b' );
 | 
						||
json_contains_path('{ "a": true }', 'ALL', '$.a', '$.b' )
 | 
						||
0
 | 
						||
select json_contains_path('{ "a": true }', 'aLl', '$.a', '$.b' );
 | 
						||
json_contains_path('{ "a": true }', 'aLl', '$.a', '$.b' )
 | 
						||
0
 | 
						||
select json_contains_path('{ "a": true }', 'one', '$.a', '$.b' );
 | 
						||
json_contains_path('{ "a": true }', 'one', '$.a', '$.b' )
 | 
						||
1
 | 
						||
select json_contains_path('{ "a": true }', 'one', '$.b', '$.a' );
 | 
						||
json_contains_path('{ "a": true }', 'one', '$.b', '$.a' )
 | 
						||
1
 | 
						||
select json_contains_path('{ "a": true }', 'ONE', '$.a', '$.b' );
 | 
						||
json_contains_path('{ "a": true }', 'ONE', '$.a', '$.b' )
 | 
						||
1
 | 
						||
select json_contains_path('{ "a": true }', 'oNe', '$.a', '$.b' );
 | 
						||
json_contains_path('{ "a": true }', 'oNe', '$.a', '$.b' )
 | 
						||
1
 | 
						||
select json_contains_path('{ "a": true, "b": [ 1, 2, { "c": [ 4, 5, { "d": [ 6, 7, 8, 9, 10 ]} ] } ] }', 'all', '$**[4]' );
 | 
						||
json_contains_path('{ "a": true, "b": [ 1, 2, { "c": [ 4, 5, { "d": [ 6, 7, 8, 9, 10 ]} ] } ] }', 'all', '$**[4]' )
 | 
						||
1
 | 
						||
select json_contains_path('{ "a": true, "b": [ 1, 2, { "c": [ 4, 5, { "d": [ 6, 7, 8, 9, 10 ]} ] } ] }', 'all', '$**[4]', '$**[5]' );
 | 
						||
json_contains_path('{ "a": true, "b": [ 1, 2, { "c": [ 4, 5, { "d": [ 6, 7, 8, 9, 10 ]} ] } ] }', 'all', '$**[4]', '$**[5]' )
 | 
						||
0
 | 
						||
select json_contains_path('{ "a": true, "b": [ 1, 2, { "c": [ 4, 5, { "d": [ 6, 7, 8, 9, 10 ]} ] } ] }', 'all', '$**.c[2]' );
 | 
						||
json_contains_path('{ "a": true, "b": [ 1, 2, { "c": [ 4, 5, { "d": [ 6, 7, 8, 9, 10 ]} ] } ] }', 'all', '$**.c[2]' )
 | 
						||
1
 | 
						||
select json_contains_path('{ "a": true, "b": [ 1, 2, { "c": [ 4, 5, { "d": [ 6, 7, 8, 9, 10 ]} ] } ] }', 'all', '$**.c[3]' );
 | 
						||
json_contains_path('{ "a": true, "b": [ 1, 2, { "c": [ 4, 5, { "d": [ 6, 7, 8, 9, 10 ]} ] } ] }', 'all', '$**.c[3]' )
 | 
						||
0
 | 
						||
select json_contains_path('{"a":1, "b":2}', 'one', '$.*');
 | 
						||
json_contains_path('{"a":1, "b":2}', 'one', '$.*')
 | 
						||
1
 | 
						||
select json_contains_path('[1,2,3]', 'one', '$.*');
 | 
						||
json_contains_path('[1,2,3]', 'one', '$.*')
 | 
						||
0
 | 
						||
select json_contains_path('{}', 'one', '$[*]');
 | 
						||
json_contains_path('{}', 'one', '$[*]')
 | 
						||
0
 | 
						||
SELECT JSON_CONTAINS_PATH('[1, [[{"x": [{"a":{"b":{"c":42}}}]}]]]',
 | 
						||
'one', '$**.a.*');
 | 
						||
JSON_CONTAINS_PATH('[1, [[{"x": [{"a":{"b":{"c":42}}}]}]]]',
 | 
						||
'one', '$**.a.*')
 | 
						||
1
 | 
						||
SELECT JSON_CONTAINS_PATH('[1, [[{"x": [{"a":{"b":{"c":42}}}]}]]]',
 | 
						||
'all', '$**.a.*');
 | 
						||
JSON_CONTAINS_PATH('[1, [[{"x": [{"a":{"b":{"c":42}}}]}]]]',
 | 
						||
'all', '$**.a.*')
 | 
						||
1
 | 
						||
SELECT JSON_CONTAINS_PATH('[1,2,3]', 'one', '$**[*]');
 | 
						||
JSON_CONTAINS_PATH('[1,2,3]', 'one', '$**[*]')
 | 
						||
1
 | 
						||
SELECT JSON_CONTAINS_PATH('[1,2,3]', 'all', '$**[*]');
 | 
						||
JSON_CONTAINS_PATH('[1,2,3]', 'all', '$**[*]')
 | 
						||
1
 | 
						||
select json_contains_path('{ "a": true, "b": [ 1, 2 ] }', 'all', '$**[1]', '$.b[0]', '$.c' );
 | 
						||
json_contains_path('{ "a": true, "b": [ 1, 2 ] }', 'all', '$**[1]', '$.b[0]', '$.c' )
 | 
						||
0
 | 
						||
select json_contains_path('{ "a": true, "b": [ 1, 2 ] }', 'all', '$.c', '$**[1]', '$.b[0]' );
 | 
						||
json_contains_path('{ "a": true, "b": [ 1, 2 ] }', 'all', '$.c', '$**[1]', '$.b[0]' )
 | 
						||
0
 | 
						||
select json_contains_path('{ "a": true, "b": [ 1, 2 ] }', 'all', '$.b[0]', '$.c', '$**[1]' );
 | 
						||
json_contains_path('{ "a": true, "b": [ 1, 2 ] }', 'all', '$.b[0]', '$.c', '$**[1]' )
 | 
						||
0
 | 
						||
select json_contains_path('{ "a": true, "b": [ 1, 2 ] }', 'one', '$**[1]', '$.b[0]', '$.c' );
 | 
						||
json_contains_path('{ "a": true, "b": [ 1, 2 ] }', 'one', '$**[1]', '$.b[0]', '$.c' )
 | 
						||
1
 | 
						||
select json_contains_path('{ "a": true, "b": [ 1, 2 ] }', 'one', '$.c', '$**[1]', '$.b[0]' );
 | 
						||
json_contains_path('{ "a": true, "b": [ 1, 2 ] }', 'one', '$.c', '$**[1]', '$.b[0]' )
 | 
						||
1
 | 
						||
select json_contains_path('{ "a": true, "b": [ 1, 2 ] }', 'one', '$.b[0]', '$.c', '$**[1]' );
 | 
						||
json_contains_path('{ "a": true, "b": [ 1, 2 ] }', 'one', '$.b[0]', '$.c', '$**[1]' )
 | 
						||
1
 | 
						||
SELECT JSON_CONTAINS_PATH
 | 
						||
(
 | 
						||
'{ "a" : 123, "b" : [ 123, 456 ] }',
 | 
						||
'all',
 | 
						||
'$.a.c',
 | 
						||
'$.b[1]'
 | 
						||
);
 | 
						||
JSON_CONTAINS_PATH
 | 
						||
(
 | 
						||
'{ "a" : 123, "b" : [ 123, 456 ] }',
 | 
						||
'all',
 | 
						||
'$.a.c',
 | 
						||
'$.b[1]'
 | 
						||
)
 | 
						||
0
 | 
						||
SELECT JSON_CONTAINS_PATH
 | 
						||
(
 | 
						||
'{ "a" : 123, "b" : [ 123, 456 ] }',
 | 
						||
'one',
 | 
						||
'$.a.c',
 | 
						||
'$.b[1]'
 | 
						||
);
 | 
						||
JSON_CONTAINS_PATH
 | 
						||
(
 | 
						||
'{ "a" : 123, "b" : [ 123, 456 ] }',
 | 
						||
'one',
 | 
						||
'$.a.c',
 | 
						||
'$.b[1]'
 | 
						||
)
 | 
						||
1
 | 
						||
SELECT JSON_CONTAINS_PATH
 | 
						||
(
 | 
						||
'{ "a" : 123, "b" : [ 123, 456 ] }',
 | 
						||
'all',
 | 
						||
'$.c'
 | 
						||
);
 | 
						||
JSON_CONTAINS_PATH
 | 
						||
(
 | 
						||
'{ "a" : 123, "b" : [ 123, 456 ] }',
 | 
						||
'all',
 | 
						||
'$.c'
 | 
						||
)
 | 
						||
0
 | 
						||
SELECT JSON_CONTAINS_PATH
 | 
						||
(
 | 
						||
'{ "a" : 123, "b" : [ 123, { "c" : { "d" : true } } ] }',
 | 
						||
'all',
 | 
						||
'$.b[1].c.d'
 | 
						||
);
 | 
						||
JSON_CONTAINS_PATH
 | 
						||
(
 | 
						||
'{ "a" : 123, "b" : [ 123, { "c" : { "d" : true } } ] }',
 | 
						||
'all',
 | 
						||
'$.b[1].c.d'
 | 
						||
)
 | 
						||
1
 | 
						||
select json_length( null );
 | 
						||
json_length( null )
 | 
						||
NULL
 | 
						||
select json_length( '1' );
 | 
						||
json_length( '1' )
 | 
						||
1
 | 
						||
 | 
						||
# invalid json text
 | 
						||
error ER_INVALID_JSON_TEXT_IN_PARAM
 | 
						||
select json_length( 'abc' );
 | 
						||
json_length( 'abc' )
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4038	Syntax error in JSON text in argument 1 to function 'json_length' at position 1
 | 
						||
select json_length( '"abc"' );
 | 
						||
json_length( '"abc"' )
 | 
						||
1
 | 
						||
select json_length( 'true' );
 | 
						||
json_length( 'true' )
 | 
						||
1
 | 
						||
select json_length( 'false' );
 | 
						||
json_length( 'false' )
 | 
						||
1
 | 
						||
select json_length( 'null' );
 | 
						||
json_length( 'null' )
 | 
						||
1
 | 
						||
select json_length( '{}' );
 | 
						||
json_length( '{}' )
 | 
						||
0
 | 
						||
select json_length( '{ "a" : 100, "b" : 200 }' );
 | 
						||
json_length( '{ "a" : 100, "b" : 200 }' )
 | 
						||
2
 | 
						||
select json_length( '{ "a" : 100, "b" : [ 300, 400, 500 ] }' );
 | 
						||
json_length( '{ "a" : 100, "b" : [ 300, 400, 500 ] }' )
 | 
						||
2
 | 
						||
select json_length( '[]' );
 | 
						||
json_length( '[]' )
 | 
						||
0
 | 
						||
select json_length( '[ null, "foo", true, 1.1 ]' );
 | 
						||
json_length( '[ null, "foo", true, 1.1 ]' )
 | 
						||
4
 | 
						||
select json_length( '[ null, "foo", true, { "a" : "b", "c" : "d" } ]' );
 | 
						||
json_length( '[ null, "foo", true, { "a" : "b", "c" : "d" } ]' )
 | 
						||
4
 | 
						||
select json_length( '"foo"' );
 | 
						||
json_length( '"foo"' )
 | 
						||
1
 | 
						||
select json_length( '1.2' );
 | 
						||
json_length( '1.2' )
 | 
						||
1
 | 
						||
 | 
						||
# invalid json path
 | 
						||
error ER_INVALID_JSON_PATH
 | 
						||
select json_length( 'true', 'c$' );
 | 
						||
json_length( 'true', 'c$' )
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4042	Syntax error in JSON path in argument 2 to function 'json_length' at position 1
 | 
						||
 | 
						||
# invalid json path
 | 
						||
error ER_INVALID_JSON_PATH
 | 
						||
select json_length( '{ "foo" : [ true, false ] }', '$.foo[bar]' );
 | 
						||
json_length( '{ "foo" : [ true, false ] }', '$.foo[bar]' )
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4042	Syntax error in JSON path in argument 2 to function 'json_length' at position 7
 | 
						||
 | 
						||
# wildcards not allowed in path expressions for this function
 | 
						||
error ER_INVALID_JSON_PATH_WILDCARD
 | 
						||
select json_length( 'true', '$.*' );
 | 
						||
json_length( 'true', '$.*' )
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4044	Wildcards or range in JSON path not allowed in argument 2 to function 'json_length'
 | 
						||
 | 
						||
# wildcards not allowed in path expressions for this function
 | 
						||
error ER_INVALID_JSON_PATH_WILDCARD
 | 
						||
select json_length( 'true', '$.foo**.bar' );
 | 
						||
json_length( 'true', '$.foo**.bar' )
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4044	Wildcards or range in JSON path not allowed in argument 2 to function 'json_length'
 | 
						||
select json_length( '[ 1, [ 2, 3, 4 ], 5 ]', '$[0]' );
 | 
						||
json_length( '[ 1, [ 2, 3, 4 ], 5 ]', '$[0]' )
 | 
						||
1
 | 
						||
select json_length( '[ 1, [ 2, 3, 4 ], 5 ]', '$[1]' );
 | 
						||
json_length( '[ 1, [ 2, 3, 4 ], 5 ]', '$[1]' )
 | 
						||
3
 | 
						||
select json_length( '[ 1, [ 2, 3, 4 ], 5 ]', '$[2]' );
 | 
						||
json_length( '[ 1, [ 2, 3, 4 ], 5 ]', '$[2]' )
 | 
						||
1
 | 
						||
select json_length( '[ 1, [ 2, 3, 4 ], 5 ]', '$[2][0]' );
 | 
						||
json_length( '[ 1, [ 2, 3, 4 ], 5 ]', '$[2][0]' )
 | 
						||
1
 | 
						||
select json_length( '[ 1, [ 2, 3, 4 ], {"a": 1} ]', '$[2][0]' );
 | 
						||
json_length( '[ 1, [ 2, 3, 4 ], {"a": 1} ]', '$[2][0]' )
 | 
						||
1
 | 
						||
select json_length( '[ 1, [ 2, 3, 4 ], 5 ]', '$[2][1]' );
 | 
						||
json_length( '[ 1, [ 2, 3, 4 ], 5 ]', '$[2][1]' )
 | 
						||
NULL
 | 
						||
select json_length( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$[1]' );
 | 
						||
json_length( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$[1]' )
 | 
						||
3
 | 
						||
SELECT JSON_LENGTH
 | 
						||
(
 | 
						||
'{}'
 | 
						||
);
 | 
						||
JSON_LENGTH
 | 
						||
(
 | 
						||
'{}'
 | 
						||
)
 | 
						||
0
 | 
						||
SELECT JSON_LENGTH
 | 
						||
(
 | 
						||
'3'
 | 
						||
);
 | 
						||
JSON_LENGTH
 | 
						||
(
 | 
						||
'3'
 | 
						||
)
 | 
						||
1
 | 
						||
SELECT JSON_LENGTH
 | 
						||
(
 | 
						||
'{ "a" : 123, "b" : [ 123, 456, 789 ] }'
 | 
						||
);
 | 
						||
JSON_LENGTH
 | 
						||
(
 | 
						||
'{ "a" : 123, "b" : [ 123, 456, 789 ] }'
 | 
						||
)
 | 
						||
2
 | 
						||
SELECT JSON_LENGTH
 | 
						||
(
 | 
						||
'{ "a" : 123, "b" : [ 123, 456, 789 ] }',
 | 
						||
'$.b'
 | 
						||
);
 | 
						||
JSON_LENGTH
 | 
						||
(
 | 
						||
'{ "a" : 123, "b" : [ 123, 456, 789 ] }',
 | 
						||
'$.b'
 | 
						||
)
 | 
						||
3
 | 
						||
SELECT JSON_LENGTH
 | 
						||
(
 | 
						||
'{ "a" : 123, "b" : [ 123, 456, 789 ] }',
 | 
						||
'$.c'
 | 
						||
);
 | 
						||
JSON_LENGTH
 | 
						||
(
 | 
						||
'{ "a" : 123, "b" : [ 123, 456, 789 ] }',
 | 
						||
'$.c'
 | 
						||
)
 | 
						||
NULL
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
# Test of JSON_DEPTH function.
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
select json_depth(null);
 | 
						||
json_depth(null)
 | 
						||
NULL
 | 
						||
select json_depth(json_compact(null));
 | 
						||
json_depth(json_compact(null))
 | 
						||
NULL
 | 
						||
select json_depth(json_compact('[]')),
 | 
						||
json_depth(json_compact('{}')),
 | 
						||
json_depth(json_compact('null')),
 | 
						||
json_depth(json_quote('foo'));
 | 
						||
json_depth(json_compact('[]'))	json_depth(json_compact('{}'))	json_depth(json_compact('null'))	json_depth(json_quote('foo'))
 | 
						||
1	1	1	1
 | 
						||
select json_depth(json_compact('[[2], 3, [[[4]]]]'));
 | 
						||
json_depth(json_compact('[[2], 3, [[[4]]]]'))
 | 
						||
5
 | 
						||
select json_depth(json_compact('{"a": {"a1": [3]}, "b": {"b1": {"c": {"d": [5]}}}}'));
 | 
						||
json_depth(json_compact('{"a": {"a1": [3]}, "b": {"b1": {"c": {"d": [5]}}}}'))
 | 
						||
6
 | 
						||
SELECT JSON_DEPTH
 | 
						||
(
 | 
						||
'{}'
 | 
						||
);
 | 
						||
JSON_DEPTH
 | 
						||
(
 | 
						||
'{}'
 | 
						||
)
 | 
						||
1
 | 
						||
SELECT JSON_DEPTH
 | 
						||
(
 | 
						||
'[]'
 | 
						||
);
 | 
						||
JSON_DEPTH
 | 
						||
(
 | 
						||
'[]'
 | 
						||
)
 | 
						||
1
 | 
						||
SELECT JSON_DEPTH( '"abc"' );
 | 
						||
JSON_DEPTH( '"abc"' )
 | 
						||
1
 | 
						||
SELECT JSON_DEPTH( json_compact( '"abc"') );
 | 
						||
JSON_DEPTH( json_compact( '"abc"') )
 | 
						||
1
 | 
						||
error ER_INVALID_TYPE_FOR_JSON
 | 
						||
SELECT JSON_DEPTH( 1 );
 | 
						||
JSON_DEPTH( 1 )
 | 
						||
1
 | 
						||
error ER_INVALID_JSON_TEXT_IN_PARAM
 | 
						||
SELECT JSON_DEPTH( 'abc' );
 | 
						||
JSON_DEPTH( 'abc' )
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4038	Syntax error in JSON text in argument 1 to function 'json_depth' at position 1
 | 
						||
SELECT JSON_DEPTH( json_compact( 1) );
 | 
						||
JSON_DEPTH( json_compact( 1) )
 | 
						||
1
 | 
						||
SELECT JSON_DEPTH
 | 
						||
(
 | 
						||
'{ "a" : true, "b" : false, "c" : null }'
 | 
						||
);
 | 
						||
JSON_DEPTH
 | 
						||
(
 | 
						||
'{ "a" : true, "b" : false, "c" : null }'
 | 
						||
)
 | 
						||
2
 | 
						||
SELECT JSON_DEPTH
 | 
						||
(
 | 
						||
'[ "a", true, "b" , false, "c" , null ]'
 | 
						||
);
 | 
						||
JSON_DEPTH
 | 
						||
(
 | 
						||
'[ "a", true, "b" , false, "c" , null ]'
 | 
						||
)
 | 
						||
2
 | 
						||
SELECT JSON_DEPTH
 | 
						||
(
 | 
						||
'{ "a" : true, "b" : {}, "c" : null }'
 | 
						||
);
 | 
						||
JSON_DEPTH
 | 
						||
(
 | 
						||
'{ "a" : true, "b" : {}, "c" : null }'
 | 
						||
)
 | 
						||
2
 | 
						||
SELECT JSON_DEPTH
 | 
						||
(
 | 
						||
'[ "a", true, "b" , {}, "c" , null ]'
 | 
						||
);
 | 
						||
JSON_DEPTH
 | 
						||
(
 | 
						||
'[ "a", true, "b" , {}, "c" , null ]'
 | 
						||
)
 | 
						||
2
 | 
						||
SELECT JSON_DEPTH
 | 
						||
(
 | 
						||
'{ "a" : true, "b" : { "e" : false }, "c" : null }'
 | 
						||
);
 | 
						||
JSON_DEPTH
 | 
						||
(
 | 
						||
'{ "a" : true, "b" : { "e" : false }, "c" : null }'
 | 
						||
)
 | 
						||
3
 | 
						||
SELECT JSON_DEPTH
 | 
						||
(
 | 
						||
'[ "a", true, "b" , { "e" : false }, "c" , null ]'
 | 
						||
);
 | 
						||
JSON_DEPTH
 | 
						||
(
 | 
						||
'[ "a", true, "b" , { "e" : false }, "c" , null ]'
 | 
						||
)
 | 
						||
3
 | 
						||
error ER_INVALID_JSON_TEXT_IN_PARAM
 | 
						||
SELECT JSON_DEPTH
 | 
						||
(
 | 
						||
'[ "a", true, "b" , { "e" : false }, "c" , null'
 | 
						||
);
 | 
						||
JSON_DEPTH
 | 
						||
(
 | 
						||
'[ "a", true, "b" , { "e" : false }, "c" , null'
 | 
						||
)
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4037	Unexpected end of JSON text in argument 1 to function 'json_depth'
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
# Test of JSON_REMOVE function.
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
select json_remove( null, '$[1]' );
 | 
						||
json_remove( null, '$[1]' )
 | 
						||
NULL
 | 
						||
select json_remove( null, '$[1]' ) is null;
 | 
						||
json_remove( null, '$[1]' ) is null
 | 
						||
1
 | 
						||
select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', null );
 | 
						||
json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', null )
 | 
						||
NULL
 | 
						||
select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', null ) is null;
 | 
						||
json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', null ) is null
 | 
						||
1
 | 
						||
select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$[1]', null );
 | 
						||
json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$[1]', null )
 | 
						||
NULL
 | 
						||
select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$[1]', null ) is null;
 | 
						||
json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$[1]', null ) is null
 | 
						||
1
 | 
						||
 | 
						||
# not enough args
 | 
						||
select json_remove();
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_remove'
 | 
						||
 | 
						||
# not enough args
 | 
						||
select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]' );
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_remove'
 | 
						||
 | 
						||
# not enough args
 | 
						||
select json_remove( '$[1]' );
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_remove'
 | 
						||
 | 
						||
# invalid json text
 | 
						||
error ER_INVALID_JSON_TEXT_IN_PARAM
 | 
						||
select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ', '$[1]', '$[2]' );
 | 
						||
json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ', '$[1]', '$[2]' )
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4037	Unexpected end of JSON text in argument 1 to function 'json_remove'
 | 
						||
 | 
						||
# invalid json path
 | 
						||
error ER_INVALID_JSON_PATH
 | 
						||
select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$[1', '$[2]' );
 | 
						||
json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$[1', '$[2]' )
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4041	Unexpected end of JSON path in argument 2 to function 'json_remove'
 | 
						||
 | 
						||
# invalid json path
 | 
						||
error ER_INVALID_JSON_PATH
 | 
						||
select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$[1]', '$[2' );
 | 
						||
json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$[1]', '$[2' )
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4041	Unexpected end of JSON path in argument 3 to function 'json_remove'
 | 
						||
 | 
						||
# Vacuous path expression
 | 
						||
error ER_JSON_VACUOUS_PATH
 | 
						||
select json_remove( '[ 1, 2, 3 ]', '$' );
 | 
						||
json_remove( '[ 1, 2, 3 ]', '$' )
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4051	Path expression '$' is not allowed in argument 2 to function 'json_remove'.
 | 
						||
 | 
						||
# Vacuous path expression
 | 
						||
error ER_JSON_VACUOUS_PATH
 | 
						||
select json_remove( '[ 1, 2, 3 ]', '$', '$[2]' );
 | 
						||
json_remove( '[ 1, 2, 3 ]', '$', '$[2]' )
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4051	Path expression '$' is not allowed in argument 2 to function 'json_remove'.
 | 
						||
 | 
						||
# Vacuous path expression
 | 
						||
error ER_JSON_VACUOUS_PATH
 | 
						||
select json_remove( '[ 1, 2, 3 ]', '$[1]', '$' );
 | 
						||
json_remove( '[ 1, 2, 3 ]', '$[1]', '$' )
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4051	Path expression '$' is not allowed in argument 3 to function 'json_remove'.
 | 
						||
error ER_INVALID_JSON_PATH_WILDCARD
 | 
						||
select json_remove( '[ 1, 2, 3 ]', '$[*]' );
 | 
						||
json_remove( '[ 1, 2, 3 ]', '$[*]' )
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4044	Wildcards or range in JSON path not allowed in argument 2 to function 'json_remove'
 | 
						||
error ER_INVALID_JSON_PATH_WILDCARD
 | 
						||
select json_remove( '[ 1, 2, 3 ]', '$**[2]' );
 | 
						||
json_remove( '[ 1, 2, 3 ]', '$**[2]' )
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4044	Wildcards or range in JSON path not allowed in argument 2 to function 'json_remove'
 | 
						||
error ER_INVALID_JSON_PATH_WILDCARD
 | 
						||
select json_remove( '[ 1, 2, 3 ]', '$[2]', '$[*]' );
 | 
						||
json_remove( '[ 1, 2, 3 ]', '$[2]', '$[*]' )
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4044	Wildcards or range in JSON path not allowed in argument 3 to function 'json_remove'
 | 
						||
error ER_INVALID_JSON_PATH_WILDCARD
 | 
						||
select json_remove( '[ 1, 2, 3 ]', '$[2]', '$**[2]' );
 | 
						||
json_remove( '[ 1, 2, 3 ]', '$[2]', '$**[2]' )
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4044	Wildcards or range in JSON path not allowed in argument 3 to function 'json_remove'
 | 
						||
select json_remove( '[ 1, 2, 3 ]', '$[0]' );
 | 
						||
json_remove( '[ 1, 2, 3 ]', '$[0]' )
 | 
						||
[2, 3]
 | 
						||
select json_remove( '[ 1, 2, 3 ]', '$[1]' );
 | 
						||
json_remove( '[ 1, 2, 3 ]', '$[1]' )
 | 
						||
[1, 3]
 | 
						||
select json_remove( '[ 1, 2, 3 ]', '$[2]' );
 | 
						||
json_remove( '[ 1, 2, 3 ]', '$[2]' )
 | 
						||
[1, 2]
 | 
						||
select json_remove( '[ 1, 2, 3 ]', '$[3]' );
 | 
						||
json_remove( '[ 1, 2, 3 ]', '$[3]' )
 | 
						||
[1, 2, 3]
 | 
						||
select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$[1]' );
 | 
						||
json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$[1]' )
 | 
						||
[1, 5]
 | 
						||
error ER_INVALID_JSON_PATH_WILDCARD
 | 
						||
select json_remove( '[ { "a": { "a": true } } ]', '$**.a' );
 | 
						||
json_remove( '[ { "a": { "a": true } } ]', '$**.a' )
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4044	Wildcards or range in JSON path not allowed in argument 2 to function 'json_remove'
 | 
						||
select json_remove( '[ { "a": true }, { "b": false }, { "c": null }, { "a": null } ]', '$[0].a', '$[2].c' );
 | 
						||
json_remove( '[ { "a": true }, { "b": false }, { "c": null }, { "a": null } ]', '$[0].a', '$[2].c' )
 | 
						||
[{}, {"b": false}, {}, {"a": null}]
 | 
						||
error ER_INVALID_JSON_PATH_WILDCARD
 | 
						||
select json_remove( '[ { "a": true }, { "b": [ { "c": { "a": true } }  ] }, { "c": null }, { "a": null } ]', '$**.a' );
 | 
						||
json_remove( '[ { "a": true }, { "b": [ { "c": { "a": true } }  ] }, { "c": null }, { "a": null } ]', '$**.a' )
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4044	Wildcards or range in JSON path not allowed in argument 2 to function 'json_remove'
 | 
						||
select json_remove( '{"id": 123, "name": "systemQA", "array": [1, 2, 3]}', '$[0]' );
 | 
						||
json_remove( '{"id": 123, "name": "systemQA", "array": [1, 2, 3]}', '$[0]' )
 | 
						||
{"id": 123, "name": "systemQA", "array": [1, 2, 3]}
 | 
						||
SELECT JSON_REMOVE
 | 
						||
(
 | 
						||
'{"a" : "foo", "b" : [true, {"c" : 123}]}',
 | 
						||
'$.b[ 1 ]'
 | 
						||
);
 | 
						||
JSON_REMOVE
 | 
						||
(
 | 
						||
'{"a" : "foo", "b" : [true, {"c" : 123}]}',
 | 
						||
'$.b[ 1 ]'
 | 
						||
)
 | 
						||
{"a": "foo", "b": [true]}
 | 
						||
SELECT JSON_REMOVE
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }',
 | 
						||
'$.b[ 1 ].c'
 | 
						||
);
 | 
						||
JSON_REMOVE
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }',
 | 
						||
'$.b[ 1 ].c'
 | 
						||
)
 | 
						||
{"a": "foo", "b": [true, {"c": 456}]}
 | 
						||
SELECT JSON_REMOVE
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }',
 | 
						||
'$.b[ 1 ].c'
 | 
						||
);
 | 
						||
JSON_REMOVE
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }',
 | 
						||
'$.b[ 1 ].c'
 | 
						||
)
 | 
						||
{"a": "foo", "b": [true, {}]}
 | 
						||
SELECT JSON_REMOVE
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : 123, "d" : 456 } ] }',
 | 
						||
'$.b[ 1 ].e'
 | 
						||
);
 | 
						||
JSON_REMOVE
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : 123, "d" : 456 } ] }',
 | 
						||
'$.b[ 1 ].e'
 | 
						||
)
 | 
						||
{"a": "foo", "b": [true, {"c": 123, "d": 456}]}
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
# Test of JSON_MERGE function.
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
 | 
						||
# not enough args
 | 
						||
select json_merge();
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_merge'
 | 
						||
 | 
						||
# not enough args
 | 
						||
select json_merge( '[ 1, 2, 3 ]' );
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_merge'
 | 
						||
select json_merge( null, null );
 | 
						||
json_merge( null, null )
 | 
						||
NULL
 | 
						||
select json_merge( null, '[ 1, 2, 3 ]' );
 | 
						||
json_merge( null, '[ 1, 2, 3 ]' )
 | 
						||
NULL
 | 
						||
select json_merge( '[ 1, 2, 3 ]', null );
 | 
						||
json_merge( '[ 1, 2, 3 ]', null )
 | 
						||
NULL
 | 
						||
select json_merge( null, '[ 1, 2, 3 ]', '[ 4, 5, 6 ]' );
 | 
						||
json_merge( null, '[ 1, 2, 3 ]', '[ 4, 5, 6 ]' )
 | 
						||
NULL
 | 
						||
select json_merge( '[ 1, 2, 3 ]', null, '[ 4, 5, 6 ]' );
 | 
						||
json_merge( '[ 1, 2, 3 ]', null, '[ 4, 5, 6 ]' )
 | 
						||
NULL
 | 
						||
select json_merge( '[ 1, 2, 3 ]', '[ 4, 5, 6 ]', null );
 | 
						||
json_merge( '[ 1, 2, 3 ]', '[ 4, 5, 6 ]', null )
 | 
						||
NULL
 | 
						||
error ER_INVALID_JSON_TEXT_IN_PARAM
 | 
						||
select json_merge( '[1, 2]', '[3, 4' );
 | 
						||
json_merge( '[1, 2]', '[3, 4' )
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4037	Unexpected end of JSON text in argument 2 to function 'json_merge_preserve'
 | 
						||
error ER_INVALID_JSON_TEXT_IN_PARAM
 | 
						||
select json_merge( '[1, 2', '[3, 4]' );
 | 
						||
json_merge( '[1, 2', '[3, 4]' )
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4037	Unexpected end of JSON text in argument 1 to function 'json_merge_preserve'
 | 
						||
select json_merge( '1', '2' );
 | 
						||
json_merge( '1', '2' )
 | 
						||
[1, 2]
 | 
						||
select json_merge( '1', '[2, 3]' );
 | 
						||
json_merge( '1', '[2, 3]' )
 | 
						||
[1, 2, 3]
 | 
						||
select json_merge( '[1, 2]', '3' );
 | 
						||
json_merge( '[1, 2]', '3' )
 | 
						||
[1, 2, 3]
 | 
						||
select json_merge( '1', '{ "a": 2 }' );
 | 
						||
json_merge( '1', '{ "a": 2 }' )
 | 
						||
[1, {"a": 2}]
 | 
						||
select json_merge( '{ "a": 2 }', '1' );
 | 
						||
json_merge( '{ "a": 2 }', '1' )
 | 
						||
[{"a": 2}, 1]
 | 
						||
select json_merge( '[1, 2]', '[3, 4]' );
 | 
						||
json_merge( '[1, 2]', '[3, 4]' )
 | 
						||
[1, 2, 3, 4]
 | 
						||
select json_merge( '{ "a": 2 }', '{ "b": 3}' );
 | 
						||
json_merge( '{ "a": 2 }', '{ "b": 3}' )
 | 
						||
{"a": 2, "b": 3}
 | 
						||
select json_merge( '[1, 2]', '{ "a": 2 }' );
 | 
						||
json_merge( '[1, 2]', '{ "a": 2 }' )
 | 
						||
[1, 2, {"a": 2}]
 | 
						||
select json_merge( '{ "a": 2 }', '[1, 2]' );
 | 
						||
json_merge( '{ "a": 2 }', '[1, 2]' )
 | 
						||
[{"a": 2}, 1, 2]
 | 
						||
select json_merge( '{"a": 1, "b": 2 }', '{"b": 3, "d": 4 }' );
 | 
						||
json_merge( '{"a": 1, "b": 2 }', '{"b": 3, "d": 4 }' )
 | 
						||
{"a": 1, "b": [2, 3], "d": 4}
 | 
						||
select json_merge( '{"a": 1, "b": 2 }', '{"b": [3, 4], "d": 4 }' );
 | 
						||
json_merge( '{"a": 1, "b": 2 }', '{"b": [3, 4], "d": 4 }' )
 | 
						||
{"a": 1, "b": [2, 3, 4], "d": 4}
 | 
						||
select json_merge( '{"a": 1, "b": [2, 3] }', '{"b": 4, "d": 4 }' );
 | 
						||
json_merge( '{"a": 1, "b": [2, 3] }', '{"b": 4, "d": 4 }' )
 | 
						||
{"a": 1, "b": [2, 3, 4], "d": 4}
 | 
						||
select json_merge( '{"a": 1, "b": 2 }', '{"b": {"e": 7, "f": 8}, "d": 4 }' );
 | 
						||
json_merge( '{"a": 1, "b": 2 }', '{"b": {"e": 7, "f": 8}, "d": 4 }' )
 | 
						||
{"a": 1, "b": [2, {"e": 7, "f": 8}], "d": 4}
 | 
						||
select json_merge( '{"b": {"e": 7, "f": 8}, "d": 4 }', '{"a": 1, "b": 2 }' );
 | 
						||
json_merge( '{"b": {"e": 7, "f": 8}, "d": 4 }', '{"a": 1, "b": 2 }' )
 | 
						||
{"b": [{"e": 7, "f": 8}, 2], "d": 4, "a": 1}
 | 
						||
select json_merge( '{"a": 1, "b": [2, 9] }', '{"b": [10, 11], "d": 4 }' );
 | 
						||
json_merge( '{"a": 1, "b": [2, 9] }', '{"b": [10, 11], "d": 4 }' )
 | 
						||
{"a": 1, "b": [2, 9, 10, 11], "d": 4}
 | 
						||
select json_merge( '{"a": 1, "b": [2, 9] }', '{"b": {"e": 7, "f": 8}, "d": 4 }' );
 | 
						||
json_merge( '{"a": 1, "b": [2, 9] }', '{"b": {"e": 7, "f": 8}, "d": 4 }' )
 | 
						||
{"a": 1, "b": [2, 9, {"e": 7, "f": 8}], "d": 4}
 | 
						||
select json_merge( '{"b": {"e": 7, "f": 8}, "d": 4 }', '{"a": 1, "b": [2, 9] }' );
 | 
						||
json_merge( '{"b": {"e": 7, "f": 8}, "d": 4 }', '{"a": 1, "b": [2, 9] }' )
 | 
						||
{"b": [{"e": 7, "f": 8}, 2, 9], "d": 4, "a": 1}
 | 
						||
select json_merge( '{"b": {"e": 7, "f": 8}, "d": 4 }', '{ "a": 1, "b": {"e": 20, "g": 21 } }' );
 | 
						||
json_merge( '{"b": {"e": 7, "f": 8}, "d": 4 }', '{ "a": 1, "b": {"e": 20, "g": 21 } }' )
 | 
						||
{"b": {"e": [7, 20], "f": 8, "g": 21}, "d": 4, "a": 1}
 | 
						||
select json_merge( '1', '2', '3' );
 | 
						||
json_merge( '1', '2', '3' )
 | 
						||
[1, 2, 3]
 | 
						||
select json_merge( '[1, 2 ]', '3', '[4, 5]' );
 | 
						||
json_merge( '[1, 2 ]', '3', '[4, 5]' )
 | 
						||
[1, 2, 3, 4, 5]
 | 
						||
select json_merge
 | 
						||
(
 | 
						||
'{ "a": true, "b": { "c": 3, "d": 4 }, "e": [ 1, 2 ] }',
 | 
						||
'{ "d": false, "b": { "g": 3, "d": 5 }, "f": [ 1, 2 ] }',
 | 
						||
'{ "m": true, "b": { "h": 8, "d": 4 }, "e": [ 3, 4 ] }'
 | 
						||
);
 | 
						||
json_merge
 | 
						||
(
 | 
						||
'{ "a": true, "b": { "c": 3, "d": 4 }, "e": [ 1, 2 ] }',
 | 
						||
'{ "d": false, "b": { "g": 3, "d": 5 }, "f": [ 1, 2 ] }',
 | 
						||
'{ "m": true, "b": { "h": 8, "d": 4 }, "e": [ 3, 4 ] }'
 | 
						||
)
 | 
						||
{"a": true, "b": {"c": 3, "d": [4, 5, 4], "g": 3, "h": 8}, "e": [1, 2, 3, 4], "d": false, "f": [1, 2], "m": true}
 | 
						||
SELECT JSON_MERGE
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }',
 | 
						||
'[ 5, 6]'
 | 
						||
);
 | 
						||
JSON_MERGE
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }',
 | 
						||
'[ 5, 6]'
 | 
						||
)
 | 
						||
[{"a": "foo", "b": [true, {"c": 123}]}, 5, 6]
 | 
						||
SELECT JSON_MERGE
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }',
 | 
						||
'{ "b": [ false, 34 ] }'
 | 
						||
);
 | 
						||
JSON_MERGE
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }',
 | 
						||
'{ "b": [ false, 34 ] }'
 | 
						||
)
 | 
						||
{"a": "foo", "b": [true, {"c": 123}, false, 34]}
 | 
						||
SELECT JSON_MERGE
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }',
 | 
						||
'{ "b": "bar" }'
 | 
						||
);
 | 
						||
JSON_MERGE
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }',
 | 
						||
'{ "b": "bar" }'
 | 
						||
)
 | 
						||
{"a": "foo", "b": [true, {"c": 123}, "bar"]}
 | 
						||
SELECT JSON_MERGE
 | 
						||
(
 | 
						||
'{ "a" : { "b" : 1 } }',
 | 
						||
'{ "a" : { "c" : 1 } }'
 | 
						||
);
 | 
						||
JSON_MERGE
 | 
						||
(
 | 
						||
'{ "a" : { "b" : 1 } }',
 | 
						||
'{ "a" : { "c" : 1 } }'
 | 
						||
)
 | 
						||
{"a": {"b": 1, "c": 1}}
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
# Test of JSON_TYPE function.
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
error ER_INVALID_JSON_TEXT_IN_PARAM
 | 
						||
select json_type('abc');
 | 
						||
json_type('abc')
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4038	Syntax error in JSON text in argument 1 to function 'json_type' at position 1
 | 
						||
select json_type('{"a": 2}');
 | 
						||
json_type('{"a": 2}')
 | 
						||
OBJECT
 | 
						||
select json_type('[1,2]');
 | 
						||
json_type('[1,2]')
 | 
						||
ARRAY
 | 
						||
select json_type('"scalar string"');
 | 
						||
json_type('"scalar string"')
 | 
						||
STRING
 | 
						||
select json_type('true');
 | 
						||
json_type('true')
 | 
						||
BOOLEAN
 | 
						||
select json_type('false');
 | 
						||
json_type('false')
 | 
						||
BOOLEAN
 | 
						||
select json_type('null');
 | 
						||
json_type('null')
 | 
						||
NULL
 | 
						||
select json_type('1');
 | 
						||
json_type('1')
 | 
						||
INTEGER
 | 
						||
select json_type('-0');
 | 
						||
json_type('-0')
 | 
						||
INTEGER
 | 
						||
select json_type('-0.0');
 | 
						||
json_type('-0.0')
 | 
						||
DOUBLE
 | 
						||
error ER_INVALID_TYPE_FOR_JSON
 | 
						||
select json_type(-1);
 | 
						||
json_type(-1)
 | 
						||
INTEGER
 | 
						||
error ER_INVALID_TYPE_FOR_JSON
 | 
						||
select json_type(CAST(1 AS UNSIGNED));
 | 
						||
json_type(CAST(1 AS UNSIGNED))
 | 
						||
INTEGER
 | 
						||
select json_type('32767');
 | 
						||
json_type('32767')
 | 
						||
INTEGER
 | 
						||
error ER_INVALID_TYPE_FOR_JSON
 | 
						||
select json_type(PI());
 | 
						||
json_type(PI())
 | 
						||
DOUBLE
 | 
						||
select json_type('3.14');
 | 
						||
json_type('3.14')
 | 
						||
DOUBLE
 | 
						||
error ER_INVALID_JSON_TEXT_IN_PARAM
 | 
						||
select json_type(CAST(CAST('2015-01-15' AS DATE) as CHAR CHARACTER SET 'utf8'));
 | 
						||
json_type(CAST(CAST('2015-01-15' AS DATE) as CHAR CHARACTER SET 'utf8'))
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4038	Syntax error in JSON text in argument 1 to function 'json_type' at position 5
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
# Test of json_compact(literal)
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
select json_type(json_compact(cast('2014-11-25 18:00' as datetime)));
 | 
						||
json_type(json_compact(cast('2014-11-25 18:00' as datetime)))
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4038	Syntax error in JSON text in argument 1 to function 'json_type' at position 5
 | 
						||
select json_type(json_compact(cast('2014-11-25' as date)));
 | 
						||
json_type(json_compact(cast('2014-11-25' as date)))
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4038	Syntax error in JSON text in argument 1 to function 'json_type' at position 5
 | 
						||
select json_type(json_compact(cast('18:00:59' as time)));
 | 
						||
json_type(json_compact(cast('18:00:59' as time)))
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4038	Syntax error in JSON text in argument 1 to function 'json_type' at position 3
 | 
						||
select json_type(json_compact(127));
 | 
						||
json_type(json_compact(127))
 | 
						||
INTEGER
 | 
						||
select json_type(json_compact(255));
 | 
						||
json_type(json_compact(255))
 | 
						||
INTEGER
 | 
						||
select json_type(json_compact(32767));
 | 
						||
json_type(json_compact(32767))
 | 
						||
INTEGER
 | 
						||
select json_type(json_compact(65535));
 | 
						||
json_type(json_compact(65535))
 | 
						||
INTEGER
 | 
						||
select json_type(json_compact(8388607));
 | 
						||
json_type(json_compact(8388607))
 | 
						||
INTEGER
 | 
						||
select json_type(json_compact(16777215));
 | 
						||
json_type(json_compact(16777215))
 | 
						||
INTEGER
 | 
						||
select json_type(json_compact(2147483647));
 | 
						||
json_type(json_compact(2147483647))
 | 
						||
INTEGER
 | 
						||
select json_type(json_compact(4294967295));
 | 
						||
json_type(json_compact(4294967295))
 | 
						||
INTEGER
 | 
						||
select json_type(json_compact(9223372036854775807));
 | 
						||
json_type(json_compact(9223372036854775807))
 | 
						||
INTEGER
 | 
						||
select json_type(json_compact(18446744073709551615));
 | 
						||
json_type(json_compact(18446744073709551615))
 | 
						||
INTEGER
 | 
						||
select json_type(json_compact(true));
 | 
						||
json_type(json_compact(true))
 | 
						||
INTEGER
 | 
						||
select json_type(json_compact(b'10101'));
 | 
						||
json_type(json_compact(b'10101'))
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4036	Character disallowed in JSON in argument 1 to function 'json_type' at position 1
 | 
						||
select json_type(json_compact(cast(3.14 as decimal(5,2))));
 | 
						||
json_type(json_compact(cast(3.14 as decimal(5,2))))
 | 
						||
DOUBLE
 | 
						||
select json_type(json_compact(3.14));
 | 
						||
json_type(json_compact(3.14))
 | 
						||
DOUBLE
 | 
						||
select json_type(json_compact(3.14E30));
 | 
						||
json_type(json_compact(3.14E30))
 | 
						||
DOUBLE
 | 
						||
select json_type(json_compact(cast('10101abcde' as binary)));
 | 
						||
json_type(json_compact(cast('10101abcde' as binary)))
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4038	Syntax error in JSON text in argument 1 to function 'json_type' at position 6
 | 
						||
select json_type(json_compact(ST_GeomFromText('POINT(1 1)')));
 | 
						||
json_type(json_compact(ST_GeomFromText('POINT(1 1)')))
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4036	Character disallowed in JSON in argument 1 to function 'json_type' at position 1
 | 
						||
select json_type(json_compact(ST_GeomFromText('LINESTRING(0 0,1 1,2 2)')));
 | 
						||
json_type(json_compact(ST_GeomFromText('LINESTRING(0 0,1 1,2 2)')))
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4036	Character disallowed in JSON in argument 1 to function 'json_type' at position 1
 | 
						||
select json_type(json_compact(ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),
 | 
						||
                                     (5 5,7 5,7 7,5 7, 5 5))')));
 | 
						||
json_type(json_compact(ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),
 | 
						||
                                     (5 5,7 5,7 7,5 7, 5 5))')))
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4036	Character disallowed in JSON in argument 1 to function 'json_type' at position 1
 | 
						||
select json_type(json_compact(null));
 | 
						||
json_type(json_compact(null))
 | 
						||
NULL
 | 
						||
select json_type(json_compact(null)) is null;
 | 
						||
json_type(json_compact(null)) is null
 | 
						||
1
 | 
						||
select json_type(null) is null;
 | 
						||
json_type(null) is null
 | 
						||
1
 | 
						||
select json_compact(cast('2014-11-25 18:00' as datetime));
 | 
						||
json_compact(cast('2014-11-25 18:00' as datetime))
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4038	Syntax error in JSON text in argument 1 to function 'json_compact' at position 5
 | 
						||
select json_compact(cast('2014-11-25' as date));
 | 
						||
json_compact(cast('2014-11-25' as date))
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4038	Syntax error in JSON text in argument 1 to function 'json_compact' at position 5
 | 
						||
select json_compact(cast('18:00:59' as time));
 | 
						||
json_compact(cast('18:00:59' as time))
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4038	Syntax error in JSON text in argument 1 to function 'json_compact' at position 3
 | 
						||
select json_compact(127);
 | 
						||
json_compact(127)
 | 
						||
127
 | 
						||
select json_compact(255);
 | 
						||
json_compact(255)
 | 
						||
255
 | 
						||
select json_compact(32767);
 | 
						||
json_compact(32767)
 | 
						||
32767
 | 
						||
select json_compact(65535);
 | 
						||
json_compact(65535)
 | 
						||
65535
 | 
						||
select json_compact(8388607);
 | 
						||
json_compact(8388607)
 | 
						||
8388607
 | 
						||
select json_compact(16777215);
 | 
						||
json_compact(16777215)
 | 
						||
16777215
 | 
						||
select json_compact(2147483647);
 | 
						||
json_compact(2147483647)
 | 
						||
2147483647
 | 
						||
select json_compact(4294967295);
 | 
						||
json_compact(4294967295)
 | 
						||
4294967295
 | 
						||
select json_compact(9223372036854775807);
 | 
						||
json_compact(9223372036854775807)
 | 
						||
9223372036854775807
 | 
						||
select json_compact(18446744073709551615);
 | 
						||
json_compact(18446744073709551615)
 | 
						||
18446744073709551615
 | 
						||
select json_compact(true);
 | 
						||
json_compact(true)
 | 
						||
1
 | 
						||
select json_compact(b'10101');
 | 
						||
json_compact(b'10101')
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4036	Character disallowed in JSON in argument 1 to function 'json_compact' at position 1
 | 
						||
select json_compact(cast(3.14 as decimal(5,2)));
 | 
						||
json_compact(cast(3.14 as decimal(5,2)))
 | 
						||
3.14
 | 
						||
select json_compact(3.14);
 | 
						||
json_compact(3.14)
 | 
						||
3.14
 | 
						||
select json_compact(3.14e0);
 | 
						||
json_compact(3.14e0)
 | 
						||
3.14
 | 
						||
select json_compact(cast('10101abcde' as binary));
 | 
						||
json_compact(cast('10101abcde' as binary))
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4038	Syntax error in JSON text in argument 1 to function 'json_compact' at position 6
 | 
						||
select json_compact(ST_GeomFromText('POINT(1 1)'));
 | 
						||
json_compact(ST_GeomFromText('POINT(1 1)'))
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4036	Character disallowed in JSON in argument 1 to function 'json_compact' at position 1
 | 
						||
select json_compact(ST_GeomFromText('LINESTRING(0 0,1 1,2 2)'));
 | 
						||
json_compact(ST_GeomFromText('LINESTRING(0 0,1 1,2 2)'))
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4036	Character disallowed in JSON in argument 1 to function 'json_compact' at position 1
 | 
						||
select json_compact(ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),
 | 
						||
                                     (5 5,7 5,7 7,5 7, 5 5))'));
 | 
						||
json_compact(ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),
 | 
						||
                                     (5 5,7 5,7 7,5 7, 5 5))'))
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4036	Character disallowed in JSON in argument 1 to function 'json_compact' at position 1
 | 
						||
select json_compact(null);
 | 
						||
json_compact(null)
 | 
						||
NULL
 | 
						||
select json_compact(null) is null;
 | 
						||
json_compact(null) is null
 | 
						||
1
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
# Test of JSON_KEYS function.
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
select json_keys(NULL);
 | 
						||
json_keys(NULL)
 | 
						||
NULL
 | 
						||
select json_keys(NULL, '$.b');
 | 
						||
json_keys(NULL, '$.b')
 | 
						||
NULL
 | 
						||
select json_keys(NULL, NULL);
 | 
						||
json_keys(NULL, NULL)
 | 
						||
NULL
 | 
						||
select json_keys('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.a');
 | 
						||
json_keys('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.a')
 | 
						||
NULL
 | 
						||
select json_keys('{"a": 1, "b": {"e": "foo", "b": 3}}', NULL);
 | 
						||
json_keys('{"a": 1, "b": {"e": "foo", "b": 3}}', NULL)
 | 
						||
NULL
 | 
						||
select json_keys('{"a": 1, "b": {"e": "foo", "b": 3}}');
 | 
						||
json_keys('{"a": 1, "b": {"e": "foo", "b": 3}}')
 | 
						||
["a", "b"]
 | 
						||
select json_keys('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.b');
 | 
						||
json_keys('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.b')
 | 
						||
["e", "b"]
 | 
						||
error ER_INVALID_JSON_PATH_WILDCARD
 | 
						||
select json_keys('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.*.b');
 | 
						||
json_keys('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.*.b')
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4044	Wildcards or range in JSON path not allowed in argument 2 to function 'json_keys'
 | 
						||
# returns [ "a", "b" ]
 | 
						||
SELECT JSON_KEYS('{ "a" : "foo", "b" : [ true, { "c" : "123" } ] }');
 | 
						||
JSON_KEYS('{ "a" : "foo", "b" : [ true, { "c" : "123" } ] }')
 | 
						||
["a", "b"]
 | 
						||
# returns []
 | 
						||
SELECT JSON_KEYS('{ "a" : "foo", "b" : [ true, { "c" : {} } ] }',
 | 
						||
'$.b[1].c');
 | 
						||
JSON_KEYS('{ "a" : "foo", "b" : [ true, { "c" : {} } ] }',
 | 
						||
'$.b[1].c')
 | 
						||
[]
 | 
						||
# returns NULL
 | 
						||
SELECT JSON_KEYS('{ "a" : "foo", "b" : [ true, { "c" : {} } ] }',
 | 
						||
'$.a.b[2]');
 | 
						||
JSON_KEYS('{ "a" : "foo", "b" : [ true, { "c" : {} } ] }',
 | 
						||
'$.a.b[2]')
 | 
						||
NULL
 | 
						||
error ER_INVALID_JSON_PATH
 | 
						||
SELECT JSON_KEYS('{"a":1}', '1010');
 | 
						||
JSON_KEYS('{"a":1}', '1010')
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4042	Syntax error in JSON path in argument 2 to function 'json_keys' at position 1
 | 
						||
error ER_INVALID_JSON_PATH
 | 
						||
SELECT JSON_KEYS('{"a":1}', '1010') IS NULL;
 | 
						||
JSON_KEYS('{"a":1}', '1010') IS NULL
 | 
						||
1
 | 
						||
Warnings:
 | 
						||
Warning	4042	Syntax error in JSON path in argument 2 to function 'json_keys' at position 1
 | 
						||
SELECT JSON_KEYS
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : "123" } ] }'
 | 
						||
);
 | 
						||
JSON_KEYS
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : "123" } ] }'
 | 
						||
)
 | 
						||
["a", "b"]
 | 
						||
SELECT JSON_KEYS
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : {} } ] }',
 | 
						||
'$.b[1].c'
 | 
						||
);
 | 
						||
JSON_KEYS
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : {} } ] }',
 | 
						||
'$.b[1].c'
 | 
						||
)
 | 
						||
[]
 | 
						||
SELECT JSON_KEYS
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : {} } ] }',
 | 
						||
'$.a.b[2]'
 | 
						||
);
 | 
						||
JSON_KEYS
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : {} } ] }',
 | 
						||
'$.a.b[2]'
 | 
						||
)
 | 
						||
NULL
 | 
						||
SELECT JSON_KEYS();
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'JSON_KEYS'
 | 
						||
SELECT JSON_KEYS('{}', '$', '$');
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'JSON_KEYS'
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
# CAST(<json> AS CHAR). See also 'json_conversions.test' for other
 | 
						||
# conversion tests.
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
select cast(json_keys('{"a": 1}') as char);
 | 
						||
cast(json_keys('{"a": 1}') as char)
 | 
						||
["a"]
 | 
						||
select cast(json_compact(1) as char);
 | 
						||
cast(json_compact(1) as char)
 | 
						||
1
 | 
						||
select cast(json_keys(NULL) as char);
 | 
						||
cast(json_keys(NULL) as char)
 | 
						||
NULL
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
# Path matching with double-quotes
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
select json_extract( '{ "one potato" : 1 }', '$."one potato"' );
 | 
						||
json_extract( '{ "one potato" : 1 }', '$."one potato"' )
 | 
						||
1
 | 
						||
select json_extract( '{ "a.b" : 1 }', '$."a.b"' );
 | 
						||
json_extract( '{ "a.b" : 1 }', '$."a.b"' )
 | 
						||
1
 | 
						||
select json_extract( '{ "\\"a\\"": 1}', '$."a"' );
 | 
						||
json_extract( '{ "\\"a\\"": 1}', '$."a"' )
 | 
						||
NULL
 | 
						||
select json_extract( '{ "\\"a\\"": 1}', '$."\\"a\\""' );
 | 
						||
json_extract( '{ "\\"a\\"": 1}', '$."\\"a\\""' )
 | 
						||
1
 | 
						||
select json_extract( '{ "a": 1}', '$."a"' );
 | 
						||
json_extract( '{ "a": 1}', '$."a"' )
 | 
						||
1
 | 
						||
select json_extract( '{ "a": 1}', '$.a' );
 | 
						||
json_extract( '{ "a": 1}', '$.a' )
 | 
						||
1
 | 
						||
select json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$.a[0]' );
 | 
						||
json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$.a[0]' )
 | 
						||
[3, 2]
 | 
						||
select json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$.a[0][1]' );
 | 
						||
json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$.a[0][1]' )
 | 
						||
2
 | 
						||
select json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$.a[1]' );
 | 
						||
json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$.a[1]' )
 | 
						||
[{"c": "d"}, 1]
 | 
						||
select json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$.a[1][0]' );
 | 
						||
json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$.a[1][0]' )
 | 
						||
{"c": "d"}
 | 
						||
select json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$.a[1][0].c' );
 | 
						||
json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$.a[1][0].c' )
 | 
						||
"d"
 | 
						||
select json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$."one potato"' );
 | 
						||
json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$."one potato"' )
 | 
						||
7
 | 
						||
select json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$.b.c' );
 | 
						||
json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$.b.c' )
 | 
						||
6
 | 
						||
select json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$."b.c"' );
 | 
						||
json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$."b.c"' )
 | 
						||
8
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
# Test of JSON_EXTRACT function.
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
select json_extract(NULL);
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_extract'
 | 
						||
select json_extract('$.b');
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_extract'
 | 
						||
select json_extract('{"a": 1, "b": {"e": "foo", "b": 3}}');
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_extract'
 | 
						||
error ER_INVALID_JSON_TEXT_IN_PARAM
 | 
						||
select json_extract('$.a', '{"a": 1, "b": {"e": "foo", "b": 3}}');
 | 
						||
json_extract('$.a', '{"a": 1, "b": {"e": "foo", "b": 3}}')
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4042	Syntax error in JSON path in argument 2 to function 'json_extract' at position 1
 | 
						||
select json_extract(NULL, '$.b');
 | 
						||
json_extract(NULL, '$.b')
 | 
						||
NULL
 | 
						||
select json_extract(NULL, NULL);
 | 
						||
json_extract(NULL, NULL)
 | 
						||
NULL
 | 
						||
select json_extract('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.a');
 | 
						||
json_extract('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.a')
 | 
						||
1
 | 
						||
select json_extract('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.*');
 | 
						||
json_extract('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.*')
 | 
						||
[1, {"e": "foo", "b": 3}]
 | 
						||
select json_extract('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.a', '$.b.e');
 | 
						||
json_extract('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.a', '$.b.e')
 | 
						||
[1, "foo"]
 | 
						||
select json_extract('{"a": 1, "b": [1,2,3]}', '$.b[2]');
 | 
						||
json_extract('{"a": 1, "b": [1,2,3]}', '$.b[2]')
 | 
						||
3
 | 
						||
select json_extract('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.a', NULL);
 | 
						||
json_extract('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.a', NULL)
 | 
						||
NULL
 | 
						||
# returns a JSON value containing just the string "123"
 | 
						||
SELECT JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : "123" } ] }',
 | 
						||
'$.b[ 1 ].c');
 | 
						||
JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : "123" } ] }',
 | 
						||
'$.b[ 1 ].c')
 | 
						||
"123"
 | 
						||
# returns a JSON value containing just the number 123
 | 
						||
SELECT JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }',
 | 
						||
'$.b[ 1 ].c');
 | 
						||
JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }',
 | 
						||
'$.b[ 1 ].c')
 | 
						||
123
 | 
						||
# raises an error because the document is not valid
 | 
						||
error ER_INVALID_JSON_TEXT_IN_PARAM
 | 
						||
SELECT JSON_EXTRACT('{ "a" : [ }',
 | 
						||
'$.b[ 1 ].c');
 | 
						||
JSON_EXTRACT('{ "a" : [ }',
 | 
						||
'$.b[ 1 ].c')
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4038	Syntax error in JSON text in argument 1 to function 'json_extract' at position 11
 | 
						||
# raises an error because the path is invalid
 | 
						||
error ER_INVALID_JSON_PATH
 | 
						||
SELECT JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }',
 | 
						||
'$.b[ 1 ].');
 | 
						||
JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }',
 | 
						||
'$.b[ 1 ].')
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4041	Unexpected end of JSON path in argument 2 to function 'json_extract'
 | 
						||
# returns a JSON value containing the number 123 (because of
 | 
						||
# auto-wrapping the scalar)
 | 
						||
SELECT JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }',
 | 
						||
'$.b[ 1 ].c[ 0 ]');
 | 
						||
JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }',
 | 
						||
'$.b[ 1 ].c[ 0 ]')
 | 
						||
123
 | 
						||
# returns a JSON value containing the object because of auto-wrapping
 | 
						||
SELECT JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : {"not array": 4} } ] }',
 | 
						||
'$.b[ 1 ].c[ 0 ]');
 | 
						||
JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : {"not array": 4} } ] }',
 | 
						||
'$.b[ 1 ].c[ 0 ]')
 | 
						||
{"not array": 4}
 | 
						||
# returns null because the path, although valid, does not identify a value
 | 
						||
SELECT JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }',
 | 
						||
'$.b[ 1 ].c[ 1 ]');
 | 
						||
JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }',
 | 
						||
'$.b[ 1 ].c[ 1 ]')
 | 
						||
NULL
 | 
						||
# returns a JSON value containing the number 123 (due to normalization)
 | 
						||
SELECT JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }',
 | 
						||
'$.b[ 1 ].c');
 | 
						||
JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }',
 | 
						||
'$.b[ 1 ].c')
 | 
						||
123
 | 
						||
# returns a JSON array [ "foo", true ]
 | 
						||
SELECT JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }',
 | 
						||
'$.a', '$.b[0]');
 | 
						||
JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }',
 | 
						||
'$.a', '$.b[0]')
 | 
						||
["foo", true]
 | 
						||
# returns a JSON array [ true ]
 | 
						||
SELECT JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }',
 | 
						||
'$.d', '$.b[0]');
 | 
						||
JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }',
 | 
						||
'$.d', '$.b[0]')
 | 
						||
[true]
 | 
						||
select json_extract( '[1]', '$[0][0]' );
 | 
						||
json_extract( '[1]', '$[0][0]' )
 | 
						||
1
 | 
						||
select json_extract( '[1]', '$**[0]' );
 | 
						||
json_extract( '[1]', '$**[0]' )
 | 
						||
[1]
 | 
						||
select json_extract( '{ "a": 1 }', '$.a[0]' );
 | 
						||
json_extract( '{ "a": 1 }', '$.a[0]' )
 | 
						||
1
 | 
						||
select json_extract( '{ "a": 1 }', '$**[0]' );
 | 
						||
json_extract( '{ "a": 1 }', '$**[0]' )
 | 
						||
[{"a": 1}, 1]
 | 
						||
select json_extract( '{ "a": 1 }', '$[0].a' );
 | 
						||
json_extract( '{ "a": 1 }', '$[0].a' )
 | 
						||
1
 | 
						||
select json_extract( '{ "a": 1 }', '$**.a' );
 | 
						||
json_extract( '{ "a": 1 }', '$**.a' )
 | 
						||
[1]
 | 
						||
select json_extract( '{ "a": 1 }', '$[0].a[0]' );
 | 
						||
json_extract( '{ "a": 1 }', '$[0].a[0]' )
 | 
						||
1
 | 
						||
select json_extract( '{ "a": 1 }', '$**[0]' );
 | 
						||
json_extract( '{ "a": 1 }', '$**[0]' )
 | 
						||
[{"a": 1}, 1]
 | 
						||
select json_extract( '{ "a": 1 }', '$[0].a' );
 | 
						||
json_extract( '{ "a": 1 }', '$[0].a' )
 | 
						||
1
 | 
						||
select json_extract( '{ "a": 1 }', '$**.a' );
 | 
						||
json_extract( '{ "a": 1 }', '$**.a' )
 | 
						||
[1]
 | 
						||
select json_extract( '{ "a": 1 }', '$[0][0].a' );
 | 
						||
json_extract( '{ "a": 1 }', '$[0][0].a' )
 | 
						||
1
 | 
						||
select json_extract( '{ "a": 1 }', '$[0][0][0].a' );
 | 
						||
json_extract( '{ "a": 1 }', '$[0][0][0].a' )
 | 
						||
1
 | 
						||
SELECT JSON_EXTRACT('[1, [[{"x": [{"a":{"b":{"c":42}}}]}]]]', '$**.a.*');
 | 
						||
JSON_EXTRACT('[1, [[{"x": [{"a":{"b":{"c":42}}}]}]]]', '$**.a.*')
 | 
						||
[{"c": 42}]
 | 
						||
SELECT JSON_EXTRACT('[1, [[{"x": [{"a":{"b":{"c":42}}}]}]]]',
 | 
						||
'$[1][0][0].x[0].a.*');
 | 
						||
JSON_EXTRACT('[1, [[{"x": [{"a":{"b":{"c":42}}}]}]]]',
 | 
						||
'$[1][0][0].x[0].a.*')
 | 
						||
[{"c": 42}]
 | 
						||
SELECT JSON_EXTRACT
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : "123" } ] }',
 | 
						||
'$.b[ 1 ].c'
 | 
						||
);
 | 
						||
JSON_EXTRACT
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : "123" } ] }',
 | 
						||
'$.b[ 1 ].c'
 | 
						||
)
 | 
						||
"123"
 | 
						||
SELECT JSON_EXTRACT
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }',
 | 
						||
'$.b[ 1 ].c'
 | 
						||
);
 | 
						||
JSON_EXTRACT
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }',
 | 
						||
'$.b[ 1 ].c'
 | 
						||
)
 | 
						||
123
 | 
						||
error ER_INVALID_JSON_TEXT_IN_PARAM
 | 
						||
SELECT JSON_EXTRACT
 | 
						||
(
 | 
						||
'{ "a" : [ }',
 | 
						||
'$.b[ 1 ].c'
 | 
						||
);
 | 
						||
JSON_EXTRACT
 | 
						||
(
 | 
						||
'{ "a" : [ }',
 | 
						||
'$.b[ 1 ].c'
 | 
						||
)
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4038	Syntax error in JSON text in argument 1 to function 'json_extract' at position 11
 | 
						||
error ER_INVALID_JSON_PATH
 | 
						||
SELECT JSON_EXTRACT
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }',
 | 
						||
'$.b[ 1 ].'
 | 
						||
);
 | 
						||
JSON_EXTRACT
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }',
 | 
						||
'$.b[ 1 ].'
 | 
						||
)
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4041	Unexpected end of JSON path in argument 2 to function 'json_extract'
 | 
						||
SELECT JSON_EXTRACT
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }',
 | 
						||
'$.b[ 1 ].c[ 0 ]'
 | 
						||
);
 | 
						||
JSON_EXTRACT
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }',
 | 
						||
'$.b[ 1 ].c[ 0 ]'
 | 
						||
)
 | 
						||
123
 | 
						||
SELECT JSON_EXTRACT
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }',
 | 
						||
'$.b[ 1 ].c[ 1 ]'
 | 
						||
);
 | 
						||
JSON_EXTRACT
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }',
 | 
						||
'$.b[ 1 ].c[ 1 ]'
 | 
						||
)
 | 
						||
NULL
 | 
						||
SELECT JSON_EXTRACT
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }',
 | 
						||
'$.b[ 1 ].c'
 | 
						||
);
 | 
						||
JSON_EXTRACT
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }',
 | 
						||
'$.b[ 1 ].c'
 | 
						||
)
 | 
						||
123
 | 
						||
SELECT JSON_EXTRACT
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }',
 | 
						||
'$.a', '$.b[0]'
 | 
						||
);
 | 
						||
JSON_EXTRACT
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }',
 | 
						||
'$.a', '$.b[0]'
 | 
						||
)
 | 
						||
["foo", true]
 | 
						||
SELECT JSON_EXTRACT
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }',
 | 
						||
'$.d', '$.b[0]'
 | 
						||
);
 | 
						||
JSON_EXTRACT
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }',
 | 
						||
'$.d', '$.b[0]'
 | 
						||
)
 | 
						||
[true]
 | 
						||
select json_extract( '[ { "a": 1 }, { "a": 2 } ]', '$[*].b' ) jdoc;
 | 
						||
jdoc
 | 
						||
NULL
 | 
						||
select json_extract( '[ { "a": 1 }, { "a": 2 } ]', '$[0].b' ) jdoc;
 | 
						||
jdoc
 | 
						||
NULL
 | 
						||
select json_extract( '[ { "a": 1 }, { "a": 2 } ]', '$[0].a' ) jdoc;
 | 
						||
jdoc
 | 
						||
1
 | 
						||
select json_extract( '[ { "a": 1 }, { "a": 2 } ]', '$[*].a' ) jdoc;
 | 
						||
jdoc
 | 
						||
[1, 2]
 | 
						||
select json_extract( '[ { "a": 1 }, { "b": 2 } ]', '$[*].a' ) jdoc;
 | 
						||
jdoc
 | 
						||
[1]
 | 
						||
select json_extract( '[ { "a": [3,4] }, { "b": 2 } ]', '$[0].a' ) jdoc;
 | 
						||
jdoc
 | 
						||
[3, 4]
 | 
						||
select json_extract( '[ { "a": [3,4] }, { "b": 2 } ]', '$[*].a' ) jdoc;
 | 
						||
jdoc
 | 
						||
[[3, 4]]
 | 
						||
select json_extract( '[ { "a": [3,4] }, { "b": 2 } ]', '$[0].a', '$[1].a' ) jdoc;
 | 
						||
jdoc
 | 
						||
[[3, 4]]
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
# Test of JSON_ARRAY_APPEND function.
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
select json_array_append(NULL, '$.b', json_compact(1));
 | 
						||
json_array_append(NULL, '$.b', json_compact(1))
 | 
						||
NULL
 | 
						||
select json_array_append('[1,2,3]', NULL, json_compact(1));
 | 
						||
json_array_append('[1,2,3]', NULL, json_compact(1))
 | 
						||
NULL
 | 
						||
select json_array_append('[1,2,3]', '$', NULL);
 | 
						||
json_array_append('[1,2,3]', '$', NULL)
 | 
						||
[1, 2, 3, null]
 | 
						||
select json_array_append(NULL);
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_array_append'
 | 
						||
select json_array_append(NULL, NULL);
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_array_append'
 | 
						||
select json_array_append(NULL, NULL, NULL, NULL);
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_array_append'
 | 
						||
SELECT JSON_ARRAY_APPEND(json_compact('1'), '$', 3);
 | 
						||
JSON_ARRAY_APPEND(json_compact('1'), '$', 3)
 | 
						||
[1, 3]
 | 
						||
SELECT JSON_ARRAY_APPEND(json_compact('{"a": 3}'), '$', 3);
 | 
						||
JSON_ARRAY_APPEND(json_compact('{"a": 3}'), '$', 3)
 | 
						||
[{"a": 3}, 3]
 | 
						||
error ER_INVALID_JSON_PATH_WILDCARD
 | 
						||
select json_array_append(json_compact('{"a": {"b": [3]}}'), '$**[0]', 6);
 | 
						||
json_array_append(json_compact('{"a": {"b": [3]}}'), '$**[0]', 6)
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4044	Wildcards or range in JSON path not allowed in argument 2 to function 'json_array_append'
 | 
						||
# Auto-wrapping, since because the paths identify scalars.
 | 
						||
# should return {"a": "foo", "b": ["bar", 4], "c": ["wibble", "grape"]}
 | 
						||
SELECT JSON_ARRAY_APPEND('{"a": "foo", "b": "bar", "c": "wibble"}',
 | 
						||
'$.b', json_compact(4),
 | 
						||
'$.c', json_compact('"grape"'));
 | 
						||
JSON_ARRAY_APPEND('{"a": "foo", "b": "bar", "c": "wibble"}',
 | 
						||
'$.b', json_compact(4),
 | 
						||
'$.c', json_compact('"grape"'))
 | 
						||
{"a": "foo", "b": ["bar", 4], "c": ["wibble", "grape"]}
 | 
						||
# should return {"a": "foo", "b": [1, 2, 3, 4],
 | 
						||
#                "c": ["apple", "pear", "grape"]}
 | 
						||
SELECT JSON_ARRAY_APPEND('{"a" : "foo","b": [1, 2, 3], "c": ["apple", "pear"]}',
 | 
						||
'$.b', json_compact(4),
 | 
						||
'$.c', json_compact('"grape"'));
 | 
						||
JSON_ARRAY_APPEND('{"a" : "foo","b": [1, 2, 3], "c": ["apple", "pear"]}',
 | 
						||
'$.b', json_compact(4),
 | 
						||
'$.c', json_compact('"grape"'))
 | 
						||
{"a": "foo", "b": [1, 2, 3, 4], "c": ["apple", "pear", "grape"]}
 | 
						||
SELECT JSON_ARRAY_APPEND('{"a" : "foo","b": [1, 2, 3], "c": ["apple", "pear"]}',
 | 
						||
'$.b', 4,
 | 
						||
'$.c', 'grape');
 | 
						||
JSON_ARRAY_APPEND('{"a" : "foo","b": [1, 2, 3], "c": ["apple", "pear"]}',
 | 
						||
'$.b', 4,
 | 
						||
'$.c', 'grape')
 | 
						||
{"a": "foo", "b": [1, 2, 3, 4], "c": ["apple", "pear", "grape"]}
 | 
						||
error ER_INVALID_JSON_PATH_WILDCARD
 | 
						||
select json_array_append( '[[], [], []]', '$[*]', 3, '$[*]', 4);
 | 
						||
json_array_append( '[[], [], []]', '$[*]', 3, '$[*]', 4)
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4044	Wildcards or range in JSON path not allowed in argument 2 to function 'json_array_append'
 | 
						||
error ER_INVALID_JSON_PATH_WILDCARD
 | 
						||
select json_array_append( '[[], "not array", []]', '$[*]', 3, '$[*]', 4);
 | 
						||
json_array_append( '[[], "not array", []]', '$[*]', 3, '$[*]', 4)
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4044	Wildcards or range in JSON path not allowed in argument 2 to function 'json_array_append'
 | 
						||
SELECT JSON_ARRAY_APPEND
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : "bar", "c" : "wibble" }',
 | 
						||
'$.b', 4,
 | 
						||
'$.c', "grape"
 | 
						||
);
 | 
						||
JSON_ARRAY_APPEND
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : "bar", "c" : "wibble" }',
 | 
						||
'$.b', 4,
 | 
						||
'$.c', "grape"
 | 
						||
)
 | 
						||
{"a": "foo", "b": ["bar", 4], "c": ["wibble", "grape"]}
 | 
						||
SELECT JSON_ARRAY_APPEND
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ 1, 2, 3 ], "c" : [ "apple", "pear" ] }',
 | 
						||
'$.b', 4,
 | 
						||
'$.c', "grape"
 | 
						||
);
 | 
						||
JSON_ARRAY_APPEND
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ 1, 2, 3 ], "c" : [ "apple", "pear" ] }',
 | 
						||
'$.b', 4,
 | 
						||
'$.c', "grape"
 | 
						||
)
 | 
						||
{"a": "foo", "b": [1, 2, 3, 4], "c": ["apple", "pear", "grape"]}
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
# Bug#21373874 ASSERTION `PARENT' FAILED
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
select json_array_append('{"a":1}', '$[0]', 100);
 | 
						||
json_array_append('{"a":1}', '$[0]', 100)
 | 
						||
[{"a": 1}, 100]
 | 
						||
select json_array_append('3', '$[0]', 100);
 | 
						||
json_array_append('3', '$[0]', 100)
 | 
						||
[3, 100]
 | 
						||
select json_array_append('3', '$[0][0][0][0]', 100);
 | 
						||
json_array_append('3', '$[0][0][0][0]', 100)
 | 
						||
[3, 100]
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
# Test of JSON_INSERT function.
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
select json_insert(NULL, '$.b', json_compact(1));
 | 
						||
json_insert(NULL, '$.b', json_compact(1))
 | 
						||
NULL
 | 
						||
select json_insert('[1,2,3]', NULL, json_compact(1));
 | 
						||
json_insert('[1,2,3]', NULL, json_compact(1))
 | 
						||
NULL
 | 
						||
select json_insert('[1,2,3]', '$[3]', NULL);
 | 
						||
json_insert('[1,2,3]', '$[3]', NULL)
 | 
						||
[1, 2, 3, null]
 | 
						||
select json_insert(NULL);
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_insert'
 | 
						||
select json_insert(NULL, NULL);
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_insert'
 | 
						||
select json_insert(NULL, NULL, NULL, NULL);
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_insert'
 | 
						||
select json_insert('[1,2,3]', '$[2]', 4);
 | 
						||
json_insert('[1,2,3]', '$[2]', 4)
 | 
						||
[1, 2, 3]
 | 
						||
select json_insert('[1,2,3]', '$[3]', 4);
 | 
						||
json_insert('[1,2,3]', '$[3]', 4)
 | 
						||
[1, 2, 3, 4]
 | 
						||
select json_insert('[1,2,3]', '$[10]', 4);
 | 
						||
json_insert('[1,2,3]', '$[10]', 4)
 | 
						||
[1, 2, 3, 4]
 | 
						||
select json_insert('{"c":4}', '$.c', 4);
 | 
						||
json_insert('{"c":4}', '$.c', 4)
 | 
						||
{"c": 4}
 | 
						||
select json_insert('{"c":4}', '$.a', 4);
 | 
						||
json_insert('{"c":4}', '$.a', 4)
 | 
						||
{"c": 4, "a": 4}
 | 
						||
select json_insert('1', '$', 4);
 | 
						||
json_insert('1', '$', 4)
 | 
						||
1
 | 
						||
select json_insert('1', '$[0]', 4);
 | 
						||
json_insert('1', '$[0]', 4)
 | 
						||
1
 | 
						||
select json_insert('1', '$[1]', 4);
 | 
						||
json_insert('1', '$[1]', 4)
 | 
						||
[1, 4]
 | 
						||
select json_insert('1', '$[10]', '4', '$[11]', 5);
 | 
						||
json_insert('1', '$[10]', '4', '$[11]', 5)
 | 
						||
[1, "4", 5]
 | 
						||
select json_insert('[1,2,3]', '$[2][0]', 4);
 | 
						||
json_insert('[1,2,3]', '$[2][0]', 4)
 | 
						||
[1, 2, 3]
 | 
						||
select json_insert('[1,2,3]', '$[2][2]', 4);
 | 
						||
json_insert('[1,2,3]', '$[2][2]', 4)
 | 
						||
[1, 2, [3, 4]]
 | 
						||
select json_insert('{"a": 3}', '$.a[0]', 4);
 | 
						||
json_insert('{"a": 3}', '$.a[0]', 4)
 | 
						||
{"a": 3}
 | 
						||
select json_insert('{"a": 3}', '$.a[1]', 4, '$.a[2]', '5');
 | 
						||
json_insert('{"a": 3}', '$.a[1]', 4, '$.a[2]', '5')
 | 
						||
{"a": [3, 4, "5"]}
 | 
						||
error ER_INVALID_JSON_PATH_WILDCARD
 | 
						||
select json_insert(json_compact('{"a": [1], "b": 2}'), '$.*[1]', 6);
 | 
						||
json_insert(json_compact('{"a": [1], "b": 2}'), '$.*[1]', 6)
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4044	Wildcards or range in JSON path not allowed in argument 2 to function 'json_insert'
 | 
						||
error ER_INVALID_JSON_PATH_WILDCARD
 | 
						||
select json_insert(json_compact('{"a": 1, "b": 2}'), '$.*[1]', 6);
 | 
						||
json_insert(json_compact('{"a": 1, "b": 2}'), '$.*[1]', 6)
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4044	Wildcards or range in JSON path not allowed in argument 2 to function 'json_insert'
 | 
						||
error ER_INVALID_JSON_PATH_WILDCARD
 | 
						||
select json_insert(json_compact('{"a": {"b": 3}}'),   '$.a.*[1]', 6);
 | 
						||
json_insert(json_compact('{"a": {"b": 3}}'),   '$.a.*[1]', 6)
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4044	Wildcards or range in JSON path not allowed in argument 2 to function 'json_insert'
 | 
						||
error ER_INVALID_JSON_PATH_WILDCARD
 | 
						||
select json_insert(json_compact('{"a": {"b": [3]}}'), '$.a.*[1]', 6);
 | 
						||
json_insert(json_compact('{"a": {"b": [3]}}'), '$.a.*[1]', 6)
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4044	Wildcards or range in JSON path not allowed in argument 2 to function 'json_insert'
 | 
						||
error ER_INVALID_JSON_PATH_WILDCARD
 | 
						||
select json_insert(json_compact('{"a": {"b": 3}}'),   '$**[1]', 6);
 | 
						||
json_insert(json_compact('{"a": {"b": 3}}'),   '$**[1]', 6)
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4044	Wildcards or range in JSON path not allowed in argument 2 to function 'json_insert'
 | 
						||
error ER_INVALID_JSON_PATH_WILDCARD
 | 
						||
select json_insert(json_compact('{"a": {"b": [3]}}'), '$**[1]', 6);
 | 
						||
json_insert(json_compact('{"a": {"b": [3]}}'), '$**[1]', 6)
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4044	Wildcards or range in JSON path not allowed in argument 2 to function 'json_insert'
 | 
						||
error ER_INVALID_JSON_PATH_WILDCARD
 | 
						||
select json_insert(json_compact('[1]'), '$[*][1]', 6);
 | 
						||
json_insert(json_compact('[1]'), '$[*][1]', 6)
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4044	Wildcards or range in JSON path not allowed in argument 2 to function 'json_insert'
 | 
						||
error ER_INVALID_JSON_PATH_WILDCARD
 | 
						||
select json_insert(json_compact('[1]'), '$**[1]', 6);
 | 
						||
json_insert(json_compact('[1]'), '$**[1]', 6)
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4044	Wildcards or range in JSON path not allowed in argument 2 to function 'json_insert'
 | 
						||
error ER_INVALID_JSON_PATH_WILDCARD
 | 
						||
select json_insert(json_compact('[1, [2], 3]'), '$[*][1]', 6);
 | 
						||
json_insert(json_compact('[1, [2], 3]'), '$[*][1]', 6)
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4044	Wildcards or range in JSON path not allowed in argument 2 to function 'json_insert'
 | 
						||
error ER_INVALID_JSON_PATH_WILDCARD
 | 
						||
select json_insert(json_compact('[1, [2], 3]'), '$**[1]', 6);
 | 
						||
json_insert(json_compact('[1, [2], 3]'), '$**[1]', 6)
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4044	Wildcards or range in JSON path not allowed in argument 2 to function 'json_insert'
 | 
						||
error ER_INVALID_JSON_PATH_WILDCARD
 | 
						||
select json_insert(json_compact('[[1]]'), '$[*][1]', 6);
 | 
						||
json_insert(json_compact('[[1]]'), '$[*][1]', 6)
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4044	Wildcards or range in JSON path not allowed in argument 2 to function 'json_insert'
 | 
						||
error ER_INVALID_JSON_PATH_WILDCARD
 | 
						||
select json_insert(json_compact('[[1]]'), '$**[1]', 6);
 | 
						||
json_insert(json_compact('[[1]]'), '$**[1]', 6)
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4044	Wildcards or range in JSON path not allowed in argument 2 to function 'json_insert'
 | 
						||
select json_insert(json_compact('{"a": 3}'), '$[1]', 6);
 | 
						||
json_insert(json_compact('{"a": 3}'), '$[1]', 6)
 | 
						||
[{"a": 3}, 6]
 | 
						||
SELECT JSON_INSERT('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', '$.a', true);
 | 
						||
JSON_INSERT('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', '$.a', true)
 | 
						||
{"a": "foo", "b": [1, 2, 3]}
 | 
						||
SELECT JSON_INSERT('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', '$.c', 123);
 | 
						||
JSON_INSERT('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', '$.c', 123)
 | 
						||
{"a": "foo", "b": [1, 2, 3], "c": 123}
 | 
						||
SELECT JSON_INSERT('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', '$.c', '123');
 | 
						||
JSON_INSERT('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', '$.c', '123')
 | 
						||
{"a": "foo", "b": [1, 2, 3], "c": "123"}
 | 
						||
SELECT JSON_INSERT('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', '$.a[1]', true);
 | 
						||
JSON_INSERT('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', '$.a[1]', true)
 | 
						||
{"a": ["foo", true], "b": [1, 2, 3]}
 | 
						||
SELECT JSON_INSERT('{ "a" : "foo"}', '$.b', true, '$.b', false);
 | 
						||
JSON_INSERT('{ "a" : "foo"}', '$.b', true, '$.b', false)
 | 
						||
{"a": "foo", "b": true}
 | 
						||
SELECT JSON_INSERT
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ 1, 2, 3 ] }',
 | 
						||
'$.a',
 | 
						||
true
 | 
						||
);
 | 
						||
JSON_INSERT
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ 1, 2, 3 ] }',
 | 
						||
'$.a',
 | 
						||
true
 | 
						||
)
 | 
						||
{"a": "foo", "b": [1, 2, 3]}
 | 
						||
SELECT JSON_INSERT
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ 1, 2, 3 ] }',
 | 
						||
'$.c',
 | 
						||
123
 | 
						||
);
 | 
						||
JSON_INSERT
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ 1, 2, 3 ] }',
 | 
						||
'$.c',
 | 
						||
123
 | 
						||
)
 | 
						||
{"a": "foo", "b": [1, 2, 3], "c": 123}
 | 
						||
SELECT JSON_INSERT
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ 1, 2, 3 ] }',
 | 
						||
'$.c',
 | 
						||
'123'
 | 
						||
);
 | 
						||
JSON_INSERT
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ 1, 2, 3 ] }',
 | 
						||
'$.c',
 | 
						||
'123'
 | 
						||
)
 | 
						||
{"a": "foo", "b": [1, 2, 3], "c": "123"}
 | 
						||
SELECT JSON_INSERT
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ 1, 2, 3 ] }',
 | 
						||
'$.a[1]',
 | 
						||
true
 | 
						||
);
 | 
						||
JSON_INSERT
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ 1, 2, 3 ] }',
 | 
						||
'$.a[1]',
 | 
						||
true
 | 
						||
)
 | 
						||
{"a": ["foo", true], "b": [1, 2, 3]}
 | 
						||
SELECT JSON_INSERT
 | 
						||
(
 | 
						||
'{ "a" : "foo"}',
 | 
						||
'$.b', true,
 | 
						||
'$.b', false
 | 
						||
);
 | 
						||
JSON_INSERT
 | 
						||
(
 | 
						||
'{ "a" : "foo"}',
 | 
						||
'$.b', true,
 | 
						||
'$.b', false
 | 
						||
)
 | 
						||
{"a": "foo", "b": true}
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
# Test of JSON_ARRAY_INSERT function.
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
select json_array_insert(NULL, '$.b[1]', 1);
 | 
						||
json_array_insert(NULL, '$.b[1]', 1)
 | 
						||
NULL
 | 
						||
select json_array_insert('[1,2,3]', NULL, 1);
 | 
						||
json_array_insert('[1,2,3]', NULL, 1)
 | 
						||
NULL
 | 
						||
select json_array_insert('[1,2,3]', '$[3]', NULL);
 | 
						||
json_array_insert('[1,2,3]', '$[3]', NULL)
 | 
						||
[1, 2, 3, null]
 | 
						||
select json_array_insert(NULL);
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_array_insert'
 | 
						||
select json_array_insert(NULL, NULL);
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_array_insert'
 | 
						||
select json_array_insert(NULL, NULL, NULL, NULL);
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_array_insert'
 | 
						||
error ER_INVALID_JSON_PATH_ARRAY_CELL
 | 
						||
select json_array_insert('true', '$', 1);
 | 
						||
json_array_insert('true', '$', 1)
 | 
						||
NULL
 | 
						||
error ER_INVALID_JSON_PATH_ARRAY_CELL
 | 
						||
select json_array_insert('true', '$.a', 1);
 | 
						||
json_array_insert('true', '$.a', 1)
 | 
						||
NULL
 | 
						||
error ER_INVALID_JSON_PATH_ARRAY_CELL
 | 
						||
select json_array_insert('true', '$.a[1].b', 1);
 | 
						||
json_array_insert('true', '$.a[1].b', 1)
 | 
						||
NULL
 | 
						||
select json_array_insert( 'true', '$[0]', false );
 | 
						||
json_array_insert( 'true', '$[0]', false )
 | 
						||
true
 | 
						||
select json_array_insert( 'true', '$[1]', false );
 | 
						||
json_array_insert( 'true', '$[1]', false )
 | 
						||
true
 | 
						||
select json_array_insert( '{ "a": true }', '$.a[0]', false );
 | 
						||
json_array_insert( '{ "a": true }', '$.a[0]', false )
 | 
						||
{"a": true}
 | 
						||
select json_array_insert( '{ "a": true }', '$.a[1]', false );
 | 
						||
json_array_insert( '{ "a": true }', '$.a[1]', false )
 | 
						||
{"a": true}
 | 
						||
select json_array_insert( '[]', '$[0]', false );
 | 
						||
json_array_insert( '[]', '$[0]', false )
 | 
						||
[false]
 | 
						||
select json_array_insert( '[]', '$[1]', false );
 | 
						||
json_array_insert( '[]', '$[1]', false )
 | 
						||
[false]
 | 
						||
select json_array_insert( '[true]', '$[0]', false );
 | 
						||
json_array_insert( '[true]', '$[0]', false )
 | 
						||
[false, true]
 | 
						||
select json_array_insert( '[true]', '$[1]', false );
 | 
						||
json_array_insert( '[true]', '$[1]', false )
 | 
						||
[true, false]
 | 
						||
select json_array_insert( '[true]', '$[2]', false );
 | 
						||
json_array_insert( '[true]', '$[2]', false )
 | 
						||
[true, false]
 | 
						||
select json_array_insert( '{ "a": [] }', '$.a[0]', false );
 | 
						||
json_array_insert( '{ "a": [] }', '$.a[0]', false )
 | 
						||
{"a": [false]}
 | 
						||
select json_array_insert( '{ "a": [] }', '$.a[1]', false );
 | 
						||
json_array_insert( '{ "a": [] }', '$.a[1]', false )
 | 
						||
{"a": [false]}
 | 
						||
select json_array_insert( '{ "a": [true] }', '$.a[0]', false );
 | 
						||
json_array_insert( '{ "a": [true] }', '$.a[0]', false )
 | 
						||
{"a": [false, true]}
 | 
						||
select json_array_insert( '{ "a": [true] }', '$.a[1]', false );
 | 
						||
json_array_insert( '{ "a": [true] }', '$.a[1]', false )
 | 
						||
{"a": [true, false]}
 | 
						||
select json_array_insert( '{ "a": [true] }', '$.a[2]', false );
 | 
						||
json_array_insert( '{ "a": [true] }', '$.a[2]', false )
 | 
						||
{"a": [true, false]}
 | 
						||
select json_array_insert( '[1, 2, 3, 4]', '$[0]', false );
 | 
						||
json_array_insert( '[1, 2, 3, 4]', '$[0]', false )
 | 
						||
[false, 1, 2, 3, 4]
 | 
						||
select json_array_insert( '[1, 2, 3, 4]', '$[1]', false );
 | 
						||
json_array_insert( '[1, 2, 3, 4]', '$[1]', false )
 | 
						||
[1, false, 2, 3, 4]
 | 
						||
select json_array_insert( '[1, 2, 3, 4]', '$[2]', false );
 | 
						||
json_array_insert( '[1, 2, 3, 4]', '$[2]', false )
 | 
						||
[1, 2, false, 3, 4]
 | 
						||
select json_array_insert( '[1, 2, 3, 4]', '$[3]', false );
 | 
						||
json_array_insert( '[1, 2, 3, 4]', '$[3]', false )
 | 
						||
[1, 2, 3, false, 4]
 | 
						||
select json_array_insert( '[1, 2, 3, 4]', '$[4]', false );
 | 
						||
json_array_insert( '[1, 2, 3, 4]', '$[4]', false )
 | 
						||
[1, 2, 3, 4, false]
 | 
						||
select json_array_insert( '[1, 2, 3, 4]', '$[5]', false );
 | 
						||
json_array_insert( '[1, 2, 3, 4]', '$[5]', false )
 | 
						||
[1, 2, 3, 4, false]
 | 
						||
select json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.a[0]', false );
 | 
						||
json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.a[0]', false )
 | 
						||
{"a": [false, 1, 2, 3, 4]}
 | 
						||
select json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.a[1]', false );
 | 
						||
json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.a[1]', false )
 | 
						||
{"a": [1, false, 2, 3, 4]}
 | 
						||
select json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.a[2]', false );
 | 
						||
json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.a[2]', false )
 | 
						||
{"a": [1, 2, false, 3, 4]}
 | 
						||
select json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.a[3]', false );
 | 
						||
json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.a[3]', false )
 | 
						||
{"a": [1, 2, 3, false, 4]}
 | 
						||
select json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.a[4]', false );
 | 
						||
json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.a[4]', false )
 | 
						||
{"a": [1, 2, 3, 4, false]}
 | 
						||
select json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.a[5]', false );
 | 
						||
json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.a[5]', false )
 | 
						||
{"a": [1, 2, 3, 4, false]}
 | 
						||
select json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.b[0]', false );
 | 
						||
json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.b[0]', false )
 | 
						||
{"a": [1, 2, 3, 4]}
 | 
						||
select json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.b[1]', false );
 | 
						||
json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.b[1]', false )
 | 
						||
{"a": [1, 2, 3, 4]}
 | 
						||
select json_array_insert( '"a"', '$[0]', true );
 | 
						||
json_array_insert( '"a"', '$[0]', true )
 | 
						||
"a"
 | 
						||
select json_array_insert( '[ "a" ]', '$[0][0]', true );
 | 
						||
json_array_insert( '[ "a" ]', '$[0][0]', true )
 | 
						||
["a"]
 | 
						||
select json_array_insert( '"a"', '$[1]', true );
 | 
						||
json_array_insert( '"a"', '$[1]', true )
 | 
						||
"a"
 | 
						||
error ER_INVALID_JSON_PATH_WILDCARD
 | 
						||
select json_insert('[]', '$.a.*[1]', 6);
 | 
						||
json_insert('[]', '$.a.*[1]', 6)
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4044	Wildcards or range in JSON path not allowed in argument 2 to function 'json_insert'
 | 
						||
error ER_INVALID_JSON_PATH_WILDCARD
 | 
						||
select json_insert('[]', '$**[1]', 6);
 | 
						||
json_insert('[]', '$**[1]', 6)
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4044	Wildcards or range in JSON path not allowed in argument 2 to function 'json_insert'
 | 
						||
error ER_INVALID_JSON_PATH_WILDCARD
 | 
						||
select json_insert('[]', '$[*][1]', 6);
 | 
						||
json_insert('[]', '$[*][1]', 6)
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4044	Wildcards or range in JSON path not allowed in argument 2 to function 'json_insert'
 | 
						||
select json_array_insert( '[ 1, 2, 3 ]', '$[1]', true, '$[1]', false );
 | 
						||
json_array_insert( '[ 1, 2, 3 ]', '$[1]', true, '$[1]', false )
 | 
						||
[1, false, true, 2, 3]
 | 
						||
select json_array_insert( '[ 1, 2, 3 ]', '$[1]',
 | 
						||
json_compact( '[ "a", "b", "c", "d" ]'), '$[1][2]', false );
 | 
						||
json_array_insert( '[ 1, 2, 3 ]', '$[1]',
 | 
						||
json_compact( '[ "a", "b", "c", "d" ]'), '$[1][2]', false )
 | 
						||
[1, ["a", "b", false, "c", "d"], 2, 3]
 | 
						||
error ER_INVALID_JSON_TEXT_IN_PARAM
 | 
						||
SELECT JSON_ARRAY_INSERT(JSON_EXTRACT('[1', '$'), '$[0]', 1);
 | 
						||
JSON_ARRAY_INSERT(JSON_EXTRACT('[1', '$'), '$[0]', 1)
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4037	Unexpected end of JSON text in argument 1 to function 'json_extract'
 | 
						||
error ER_INVALID_JSON_TEXT_IN_PARAM
 | 
						||
select json_array_insert( '[ 1, 2, 3 ]', '$[1]', json_extract( '[', '$' ) );
 | 
						||
json_array_insert( '[ 1, 2, 3 ]', '$[1]', json_extract( '[', '$' ) )
 | 
						||
[1, null, 2, 3]
 | 
						||
Warnings:
 | 
						||
Warning	4037	Unexpected end of JSON text in argument 1 to function 'json_extract'
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
# Test of JSON_SET function.
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
select json_set(NULL, '$.b', json_compact(1));
 | 
						||
json_set(NULL, '$.b', json_compact(1))
 | 
						||
NULL
 | 
						||
select json_set('[1,2,3]', NULL, json_compact(1));
 | 
						||
json_set('[1,2,3]', NULL, json_compact(1))
 | 
						||
NULL
 | 
						||
select json_set('[1,2,3]', '$[3]', NULL);
 | 
						||
json_set('[1,2,3]', '$[3]', NULL)
 | 
						||
[1, 2, 3, null]
 | 
						||
select json_set(NULL);
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_set'
 | 
						||
select json_set(NULL, NULL);
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_set'
 | 
						||
select json_set(NULL, NULL, NULL, NULL);
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_set'
 | 
						||
error ER_INVALID_JSON_TEXT_IN_PARAM
 | 
						||
SELECT JSON_SET('{}', '$.name', JSON_EXTRACT('', '$'));
 | 
						||
JSON_SET('{}', '$.name', JSON_EXTRACT('', '$'))
 | 
						||
{"name": null}
 | 
						||
Warnings:
 | 
						||
Warning	4037	Unexpected end of JSON text in argument 1 to function 'json_extract'
 | 
						||
select json_set('[1,2,3]', '$[2]', 4);
 | 
						||
json_set('[1,2,3]', '$[2]', 4)
 | 
						||
[1, 2, 4]
 | 
						||
select json_set('[1,2,3]', '$[3]', 4);
 | 
						||
json_set('[1,2,3]', '$[3]', 4)
 | 
						||
[1, 2, 3, 4]
 | 
						||
select json_set('[1,2,3]', '$[10]', 4);
 | 
						||
json_set('[1,2,3]', '$[10]', 4)
 | 
						||
[1, 2, 3, 4]
 | 
						||
select json_set('{"c":4}', '$.c', 5);
 | 
						||
json_set('{"c":4}', '$.c', 5)
 | 
						||
{"c": 5}
 | 
						||
select json_set('{"c":4}', '$.a', 5);
 | 
						||
json_set('{"c":4}', '$.a', 5)
 | 
						||
{"c": 4, "a": 5}
 | 
						||
select json_set('1', '$', 4);
 | 
						||
json_set('1', '$', 4)
 | 
						||
4
 | 
						||
select json_set('1', '$[0]', 4);
 | 
						||
json_set('1', '$[0]', 4)
 | 
						||
4
 | 
						||
select json_set('1', '$[1]', 4);
 | 
						||
json_set('1', '$[1]', 4)
 | 
						||
[1, 4]
 | 
						||
select json_set('1', '$[10]', '4', '$[11]', 5);
 | 
						||
json_set('1', '$[10]', '4', '$[11]', 5)
 | 
						||
[1, "4", 5]
 | 
						||
select json_set('[1,2,3]', '$[2][0]', 4);
 | 
						||
json_set('[1,2,3]', '$[2][0]', 4)
 | 
						||
[1, 2, 4]
 | 
						||
select json_set('[1,2,3]', '$[2][2]', 4);
 | 
						||
json_set('[1,2,3]', '$[2][2]', 4)
 | 
						||
[1, 2, [3, 4]]
 | 
						||
select json_set('{"a": 3}', '$.a[0]', 4);
 | 
						||
json_set('{"a": 3}', '$.a[0]', 4)
 | 
						||
{"a": 4}
 | 
						||
select json_set('{"a": 3}', '$.a[1]', 4, '$.a[2]', '5');
 | 
						||
json_set('{"a": 3}', '$.a[1]', 4, '$.a[2]', '5')
 | 
						||
{"a": [3, 4, "5"]}
 | 
						||
error ER_INVALID_JSON_PATH_WILDCARD
 | 
						||
select json_set(json_compact('{"a": {"b": [3]}}'), '$**[1]', 6);
 | 
						||
json_set(json_compact('{"a": {"b": [3]}}'), '$**[1]', 6)
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4044	Wildcards or range in JSON path not allowed in argument 2 to function 'json_set'
 | 
						||
SELECT JSON_SET('{ "a" : "foo", "b" : [ 1, 2, 3 ] }',
 | 
						||
'$.a',
 | 
						||
JSON_OBJECT());
 | 
						||
JSON_SET('{ "a" : "foo", "b" : [ 1, 2, 3 ] }',
 | 
						||
'$.a',
 | 
						||
JSON_OBJECT())
 | 
						||
{"a": {}, "b": [1, 2, 3]}
 | 
						||
SELECT JSON_SET('{ "a" : "foo"}', '$.a',
 | 
						||
JSON_OBJECT( 'b', false ), '$.a.c', true);
 | 
						||
JSON_SET('{ "a" : "foo"}', '$.a',
 | 
						||
JSON_OBJECT( 'b', false ), '$.a.c', true)
 | 
						||
{"a": {"b": false, "c": true}}
 | 
						||
select json_set('{ "a" : "foo", "b" : [ 1, 2, 3 ] }',
 | 
						||
'$.a',
 | 
						||
json_compact('{}'));
 | 
						||
json_set('{ "a" : "foo", "b" : [ 1, 2, 3 ] }',
 | 
						||
'$.a',
 | 
						||
json_compact('{}'))
 | 
						||
{"a": {}, "b": [1, 2, 3]}
 | 
						||
select json_set('{ "a" : "foo", "b" : [ 1, 2, 3 ] }',
 | 
						||
'$.c',
 | 
						||
json_compact('[true, false]'));
 | 
						||
json_set('{ "a" : "foo", "b" : [ 1, 2, 3 ] }',
 | 
						||
'$.c',
 | 
						||
json_compact('[true, false]'))
 | 
						||
{"a": "foo", "b": [1, 2, 3], "c": [true, false]}
 | 
						||
select json_set('1', '$[3]', 2);
 | 
						||
json_set('1', '$[3]', 2)
 | 
						||
[1, 2]
 | 
						||
select json_set('{ "a" : "foo"}', '$.a',
 | 
						||
json_compact('{"b": false}'), '$.a.c', true);
 | 
						||
json_set('{ "a" : "foo"}', '$.a',
 | 
						||
json_compact('{"b": false}'), '$.a.c', true)
 | 
						||
{"a": {"b": false, "c": true}}
 | 
						||
SELECT JSON_SET
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ 1, 2, 3 ] }',
 | 
						||
'$.a',
 | 
						||
JSON_OBJECT()
 | 
						||
);
 | 
						||
JSON_SET
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ 1, 2, 3 ] }',
 | 
						||
'$.a',
 | 
						||
JSON_OBJECT()
 | 
						||
)
 | 
						||
{"a": {}, "b": [1, 2, 3]}
 | 
						||
SELECT JSON_SET
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ 1, 2, 3 ] }',
 | 
						||
'$.c',
 | 
						||
JSON_ARRAY( true, false )
 | 
						||
);
 | 
						||
JSON_SET
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ 1, 2, 3 ] }',
 | 
						||
'$.c',
 | 
						||
JSON_ARRAY( true, false )
 | 
						||
)
 | 
						||
{"a": "foo", "b": [1, 2, 3], "c": [true, false]}
 | 
						||
SELECT JSON_SET
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ 1, 2, 3 ] }',
 | 
						||
'$.c',
 | 
						||
JSON_ARRAY( json_compact( 'true'), json_compact( 'false') )
 | 
						||
);
 | 
						||
JSON_SET
 | 
						||
(
 | 
						||
'{ "a" : "foo", "b" : [ 1, 2, 3 ] }',
 | 
						||
'$.c',
 | 
						||
JSON_ARRAY( json_compact( 'true'), json_compact( 'false') )
 | 
						||
)
 | 
						||
{"a": "foo", "b": [1, 2, 3], "c": [true, false]}
 | 
						||
SELECT JSON_SET
 | 
						||
(
 | 
						||
'1',
 | 
						||
'$[3]',
 | 
						||
2
 | 
						||
);
 | 
						||
JSON_SET
 | 
						||
(
 | 
						||
'1',
 | 
						||
'$[3]',
 | 
						||
2
 | 
						||
)
 | 
						||
[1, 2]
 | 
						||
SELECT JSON_SET
 | 
						||
(
 | 
						||
'{ "a" : "foo"}',
 | 
						||
'$.a', JSON_OBJECT( 'b', false ),
 | 
						||
'$.a.c', true
 | 
						||
);
 | 
						||
JSON_SET
 | 
						||
(
 | 
						||
'{ "a" : "foo"}',
 | 
						||
'$.a', JSON_OBJECT( 'b', false ),
 | 
						||
'$.a.c', true
 | 
						||
)
 | 
						||
{"a": {"b": false, "c": true}}
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
# Test of JSON_REPLACE function.
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
select json_replace(NULL, '$.b', json_compact(1));
 | 
						||
json_replace(NULL, '$.b', json_compact(1))
 | 
						||
NULL
 | 
						||
select json_replace('[1,2,3]', NULL, json_compact(1));
 | 
						||
json_replace('[1,2,3]', NULL, json_compact(1))
 | 
						||
NULL
 | 
						||
select json_replace('[1,2,3]', '$[2]', NULL);
 | 
						||
json_replace('[1,2,3]', '$[2]', NULL)
 | 
						||
[1, 2, null]
 | 
						||
select json_replace(NULL);
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_replace'
 | 
						||
select json_replace(NULL, NULL);
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_replace'
 | 
						||
select json_replace(NULL, NULL, NULL, NULL);
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_replace'
 | 
						||
select json_replace('[1,2,3]', '$[2]', 4);
 | 
						||
json_replace('[1,2,3]', '$[2]', 4)
 | 
						||
[1, 2, 4]
 | 
						||
select json_replace('[1,2,3]', '$[3]', 4);
 | 
						||
json_replace('[1,2,3]', '$[3]', 4)
 | 
						||
[1, 2, 3]
 | 
						||
select json_replace('[1,2,3]', '$[10]', 4);
 | 
						||
json_replace('[1,2,3]', '$[10]', 4)
 | 
						||
[1, 2, 3]
 | 
						||
select json_replace('{"c":4}', '$.c', 5);
 | 
						||
json_replace('{"c":4}', '$.c', 5)
 | 
						||
{"c": 5}
 | 
						||
select json_replace('{"c":4}', '$.a', 5);
 | 
						||
json_replace('{"c":4}', '$.a', 5)
 | 
						||
{"c": 4}
 | 
						||
select json_replace('1', '$', 4);
 | 
						||
json_replace('1', '$', 4)
 | 
						||
4
 | 
						||
select json_replace('1', '$[0]', 4);
 | 
						||
json_replace('1', '$[0]', 4)
 | 
						||
4
 | 
						||
select json_replace('1', '$[1]', 4);
 | 
						||
json_replace('1', '$[1]', 4)
 | 
						||
1
 | 
						||
select json_replace('1', '$[10]', '4', '$[11]', 5);
 | 
						||
json_replace('1', '$[10]', '4', '$[11]', 5)
 | 
						||
1
 | 
						||
select json_replace('[1,2,3]', '$[2][0]', 4);
 | 
						||
json_replace('[1,2,3]', '$[2][0]', 4)
 | 
						||
[1, 2, 4]
 | 
						||
select json_replace('[1,2,3]', '$[2][2]', 4);
 | 
						||
json_replace('[1,2,3]', '$[2][2]', 4)
 | 
						||
[1, 2, 3]
 | 
						||
select json_replace('{"a": 3}', '$.a[0]', 4);
 | 
						||
json_replace('{"a": 3}', '$.a[0]', 4)
 | 
						||
{"a": 4}
 | 
						||
select json_replace('{"a": 3}', '$.a[1]', 4, '$.a[2]', '5');
 | 
						||
json_replace('{"a": 3}', '$.a[1]', 4, '$.a[2]', '5')
 | 
						||
{"a": 3}
 | 
						||
SELECT JSON_REPLACE('{ "a" : "foo", "b" : [ 1, 2, 3 ] }',
 | 
						||
'$.c',
 | 
						||
true);
 | 
						||
JSON_REPLACE('{ "a" : "foo", "b" : [ 1, 2, 3 ] }',
 | 
						||
'$.c',
 | 
						||
true)
 | 
						||
{"a": "foo", "b": [1, 2, 3]}
 | 
						||
SELECT JSON_REPLACE('{ "a" : "foo", "b" : [ 1, 2, 3 ] }',
 | 
						||
'$.a[0]',
 | 
						||
true);
 | 
						||
JSON_REPLACE('{ "a" : "foo", "b" : [ 1, 2, 3 ] }',
 | 
						||
'$.a[0]',
 | 
						||
true)
 | 
						||
{"a": true, "b": [1, 2, 3]}
 | 
						||
SELECT JSON_REPLACE('{ "a" : "foo", "b" : [ 1, 2, 3 ] }',
 | 
						||
'$.b[5]',
 | 
						||
true);
 | 
						||
JSON_REPLACE('{ "a" : "foo", "b" : [ 1, 2, 3 ] }',
 | 
						||
'$.b[5]',
 | 
						||
true)
 | 
						||
{"a": "foo", "b": [1, 2, 3]}
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
# Test of JSON_ARRAY function.
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
select json_array(NULL, '$.b', json_compact(1));
 | 
						||
json_array(NULL, '$.b', json_compact(1))
 | 
						||
[null, "$.b", 1]
 | 
						||
select json_array('[1,2,3]', NULL, json_compact(1));
 | 
						||
json_array('[1,2,3]', NULL, json_compact(1))
 | 
						||
["[1,2,3]", null, 1]
 | 
						||
select json_array('[1,2,3]', '$[3]', NULL);
 | 
						||
json_array('[1,2,3]', '$[3]', NULL)
 | 
						||
["[1,2,3]", "$[3]", null]
 | 
						||
select json_array();
 | 
						||
json_array()
 | 
						||
[]
 | 
						||
select json_array(3.14);
 | 
						||
json_array(3.14)
 | 
						||
[3.14]
 | 
						||
select json_array('[1,2,3]');
 | 
						||
json_array('[1,2,3]')
 | 
						||
["[1,2,3]"]
 | 
						||
select json_array(json_compact('[1,2,3]'));
 | 
						||
json_array(json_compact('[1,2,3]'))
 | 
						||
[[1,2,3]]
 | 
						||
select json_array(1,2,3);
 | 
						||
json_array(1,2,3)
 | 
						||
[1, 2, 3]
 | 
						||
select json_array(b'0', b'1', b'10');
 | 
						||
json_array(b'0', b'1', b'10')
 | 
						||
["\u0000", "\u0001", "\u0002"]
 | 
						||
SELECT JSON_ARRAY();
 | 
						||
JSON_ARRAY()
 | 
						||
[]
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
# Test of JSON_OBJECT function.
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
select json_object( 'a' );
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_object'
 | 
						||
select json_object( 'a', 1, 'b' );
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_object'
 | 
						||
error ER_JSON_DOCUMENT_NULL_KEY
 | 
						||
select json_object( null, 1 );
 | 
						||
json_object( null, 1 )
 | 
						||
{"": 1}
 | 
						||
select json_object();
 | 
						||
json_object()
 | 
						||
{}
 | 
						||
select json_object( 'a', null );
 | 
						||
json_object( 'a', null )
 | 
						||
{"a": null}
 | 
						||
select json_object( 'a', 1 );
 | 
						||
json_object( 'a', 1 )
 | 
						||
{"a": 1}
 | 
						||
select json_object( 'a', 1, 'b', 'foo' );
 | 
						||
json_object( 'a', 1, 'b', 'foo' )
 | 
						||
{"a": 1, "b": "foo"}
 | 
						||
select json_object( 'a', 1, 'b', 'foo', 'c', json_compact( '{ "d": "wibble" }') );
 | 
						||
json_object( 'a', 1, 'b', 'foo', 'c', json_compact( '{ "d": "wibble" }') )
 | 
						||
{"a": 1, "b": "foo", "c": { "d": "wibble" }}
 | 
						||
select json_object( 'a', true, 'b', false, 'c', json_compact( 'null') );
 | 
						||
json_object( 'a', true, 'b', false, 'c', json_compact( 'null') )
 | 
						||
{"a": true, "b": false, "c": null}
 | 
						||
select json_valid( json_object( '"a"', 1 ) );
 | 
						||
json_valid( json_object( '"a"', 1 ) )
 | 
						||
1
 | 
						||
select json_object( REPEAT('a', 64 * 1024), 1 );
 | 
						||
json_object( REPEAT('a', 64 * 1024), 1 )
 | 
						||
{"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 1}
 | 
						||
select json_object(json_array(), json_array());
 | 
						||
json_object(json_array(), json_array())
 | 
						||
{"[]": []}
 | 
						||
select json_object( cast(json_array() as char), json_array());
 | 
						||
json_object( cast(json_array() as char), json_array())
 | 
						||
{"[]": []}
 | 
						||
select json_object( 1, json_array());
 | 
						||
json_object( 1, json_array())
 | 
						||
{"1": []}
 | 
						||
select json_object( cast(1 as char), json_array());
 | 
						||
json_object( cast(1 as char), json_array())
 | 
						||
{"1": []}
 | 
						||
SELECT JSON_OBJECT();
 | 
						||
JSON_OBJECT()
 | 
						||
{}
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
# Test of JSON_SEARCH function.
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
select json_search();
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_search'
 | 
						||
select json_search( '{ "a": true }' );
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_search'
 | 
						||
select json_search( '{ "a": true }', 'one' );
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_search'
 | 
						||
select json_search( null, 'one', 'foo' );
 | 
						||
json_search( null, 'one', 'foo' )
 | 
						||
NULL
 | 
						||
select json_search( '{ "a": "foo" }', null, 'foo' );
 | 
						||
json_search( '{ "a": "foo" }', null, 'foo' )
 | 
						||
NULL
 | 
						||
select json_search( '{ "a": "foo" }', 'one', 'foo', null, null );
 | 
						||
json_search( '{ "a": "foo" }', 'one', 'foo', null, null )
 | 
						||
NULL
 | 
						||
select json_search( '{ "a": "foo" }', 'one', 'foo', null, '$.a', null );
 | 
						||
json_search( '{ "a": "foo" }', 'one', 'foo', null, '$.a', null )
 | 
						||
NULL
 | 
						||
error ER_JSON_BAD_ONE_OR_ALL_ARG
 | 
						||
select json_search( '{ "a": "foo" }', 'twof', 'foo' );
 | 
						||
json_search( '{ "a": "foo" }', 'twof', 'foo' )
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4046	Argument 2 to function 'json_search' must be "one" or "all".
 | 
						||
error ER_JSON_BAD_ONE_OR_ALL_ARG
 | 
						||
select json_search( '{ "a": "foo" }', 'two', 'foo' );
 | 
						||
json_search( '{ "a": "foo" }', 'two', 'foo' )
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4046	Argument 2 to function 'json_search' must be "one" or "all".
 | 
						||
select json_search( '{ "a": "foo" }', 'one', 'foo', 'ab' );
 | 
						||
ERROR HY000: Incorrect arguments to ESCAPE
 | 
						||
error ER_INVALID_JSON_PATH
 | 
						||
select json_search( '{ "a": "foo" }', 'one', 'foo', null, '$a' );
 | 
						||
json_search( '{ "a": "foo" }', 'one', 'foo', null, '$a' )
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4042	Syntax error in JSON path in argument 5 to function 'json_search' at position 2
 | 
						||
error ER_INVALID_JSON_PATH
 | 
						||
select json_search( '{ "a": "foo" }', 'all', 'foo', null, '$.a', '$b' );
 | 
						||
json_search( '{ "a": "foo" }', 'all', 'foo', null, '$.a', '$b' )
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4042	Syntax error in JSON path in argument 6 to function 'json_search' at position 2
 | 
						||
select json_search(a, b, c);
 | 
						||
ERROR 42S22: Unknown column 'a' in 'SELECT'
 | 
						||
select json_search( '{ "a": "foobar" }', 'one', 'foo%' );
 | 
						||
json_search( '{ "a": "foobar" }', 'one', 'foo%' )
 | 
						||
"$.a"
 | 
						||
select json_search( '{ "a": "foobar", "b": "focus", "c": [ "arm", "foot", "shoulder" ] }', 'one', 'foo%' );
 | 
						||
json_search( '{ "a": "foobar", "b": "focus", "c": [ "arm", "foot", "shoulder" ] }', 'one', 'foo%' )
 | 
						||
"$.a"
 | 
						||
select json_search( '{ "a": "foobar", "b": "focus", "c": [ "arm", "foot", "shoulder" ] }', 'all', 'foo%' );
 | 
						||
json_search( '{ "a": "foobar", "b": "focus", "c": [ "arm", "foot", "shoulder" ] }', 'all', 'foo%' )
 | 
						||
["$.a", "$.c[1]"]
 | 
						||
select json_search( '{ "a": "foobar", "b": "focus", "c": [ "arm", "foot", "shoulder" ] }', 'all', 'f__us' );
 | 
						||
json_search( '{ "a": "foobar", "b": "focus", "c": [ "arm", "foot", "shoulder" ] }', 'all', 'f__us' )
 | 
						||
"$.b"
 | 
						||
select json_search( '{ "a": [ "foolish", "folly", "foolhardy"  ], "b" : "fool" }', 'all', 'foo%', null, '$.a' );
 | 
						||
json_search( '{ "a": [ "foolish", "folly", "foolhardy"  ], "b" : "fool" }', 'all', 'foo%', null, '$.a' )
 | 
						||
["$.a[0]", "$.a[2]"]
 | 
						||
select json_search( '{ "a": [ "foolish", "folly", "foolhardy"  ], "b" : "fool" }', 'all', 'foo%', null, '$.a', '$.b' );
 | 
						||
json_search( '{ "a": [ "foolish", "folly", "foolhardy"  ], "b" : "fool" }', 'all', 'foo%', null, '$.a', '$.b' )
 | 
						||
["$.a[0]", "$.a[2]", "$.b"]
 | 
						||
select json_search( '{ "a": [ "foolish", "folly", "foolhardy"  ], "b" : "fool" }', 'one', 'foo%', null, '$.a', '$.b' );
 | 
						||
json_search( '{ "a": [ "foolish", "folly", "foolhardy"  ], "b" : "fool" }', 'one', 'foo%', null, '$.a', '$.b' )
 | 
						||
"$.a[0]"
 | 
						||
select json_search( '{ "a": [ "foolish", "folly", "foolhardy"  ], "b" : "fool" }', 'ALL', 'foo%', null, '$.a' );
 | 
						||
json_search( '{ "a": [ "foolish", "folly", "foolhardy"  ], "b" : "fool" }', 'ALL', 'foo%', null, '$.a' )
 | 
						||
["$.a[0]", "$.a[2]"]
 | 
						||
select json_search( '{ "a": [ "foolish", "folly", "foolhardy"  ], "b" : "fool" }', 'aLl', 'foo%', null, '$.a', '$.b' );
 | 
						||
json_search( '{ "a": [ "foolish", "folly", "foolhardy"  ], "b" : "fool" }', 'aLl', 'foo%', null, '$.a', '$.b' )
 | 
						||
["$.a[0]", "$.a[2]", "$.b"]
 | 
						||
select json_search( '{ "a": [ "foolish", "folly", "foolhardy"  ], "b" : "fool" }', 'ONE', 'foo%', null, '$.a', '$.b' );
 | 
						||
json_search( '{ "a": [ "foolish", "folly", "foolhardy"  ], "b" : "fool" }', 'ONE', 'foo%', null, '$.a', '$.b' )
 | 
						||
"$.a[0]"
 | 
						||
select json_search
 | 
						||
(
 | 
						||
'[ { "a": { "b": { "c": "fool" } } }, { "b": { "c": "shoulder" } }, { "c": { "c": "food"} } ]',
 | 
						||
'all',
 | 
						||
'foo%',
 | 
						||
null,
 | 
						||
'$**.c'
 | 
						||
);
 | 
						||
json_search
 | 
						||
(
 | 
						||
'[ { "a": { "b": { "c": "fool" } } }, { "b": { "c": "shoulder" } }, { "c": { "c": "food"} } ]',
 | 
						||
'all',
 | 
						||
'foo%',
 | 
						||
null,
 | 
						||
'$**.c'
 | 
						||
)
 | 
						||
["$[0].a.b.c", "$[2].c.c"]
 | 
						||
select json_search
 | 
						||
(
 | 
						||
'[ { "a": { "b": { "c": "showtime" } } }, { "b": { "c": "shoulder" } }, { "c": { "c": "shoe"} } ]',
 | 
						||
'all',
 | 
						||
'sho%',
 | 
						||
null,
 | 
						||
'$**.c'
 | 
						||
);
 | 
						||
json_search
 | 
						||
(
 | 
						||
'[ { "a": { "b": { "c": "showtime" } } }, { "b": { "c": "shoulder" } }, { "c": { "c": "shoe"} } ]',
 | 
						||
'all',
 | 
						||
'sho%',
 | 
						||
null,
 | 
						||
'$**.c'
 | 
						||
)
 | 
						||
["$[0].a.b.c", "$[1].b.c", "$[2].c.c"]
 | 
						||
select json_search
 | 
						||
(
 | 
						||
'[ { "a": { "b": { "c": "showtime" } } }, { "b": { "c": "shoulder" } }, { "c": { "c": "shoe"} } ]',
 | 
						||
'all',
 | 
						||
'sho%e',
 | 
						||
null,
 | 
						||
'$**.c'
 | 
						||
);
 | 
						||
json_search
 | 
						||
(
 | 
						||
'[ { "a": { "b": { "c": "showtime" } } }, { "b": { "c": "shoulder" } }, { "c": { "c": "shoe"} } ]',
 | 
						||
'all',
 | 
						||
'sho%e',
 | 
						||
null,
 | 
						||
'$**.c'
 | 
						||
)
 | 
						||
["$[0].a.b.c", "$[2].c.c"]
 | 
						||
select json_search
 | 
						||
(
 | 
						||
'[ { "a": { "b": { "c": "showtime" } } }, { "b": { "c": "shoulder" } }, { "c": { "c": "shoe"} } ]',
 | 
						||
'all',
 | 
						||
'sho%',
 | 
						||
null,
 | 
						||
'$[*].c'
 | 
						||
);
 | 
						||
json_search
 | 
						||
(
 | 
						||
'[ { "a": { "b": { "c": "showtime" } } }, { "b": { "c": "shoulder" } }, { "c": { "c": "shoe"} } ]',
 | 
						||
'all',
 | 
						||
'sho%',
 | 
						||
null,
 | 
						||
'$[*].c'
 | 
						||
)
 | 
						||
"$[2].c.c"
 | 
						||
select json_search
 | 
						||
(
 | 
						||
'[ { "a": { "b": { "c": "showtime" } } }, [ { "b": { "c": "shout" } }, { "c": { "c": "shoe"} } ] ]',
 | 
						||
'all',
 | 
						||
'sho%',
 | 
						||
null,
 | 
						||
'$[1]**.c'
 | 
						||
);
 | 
						||
json_search
 | 
						||
(
 | 
						||
'[ { "a": { "b": { "c": "showtime" } } }, [ { "b": { "c": "shout" } }, { "c": { "c": "shoe"} } ] ]',
 | 
						||
'all',
 | 
						||
'sho%',
 | 
						||
null,
 | 
						||
'$[1]**.c'
 | 
						||
)
 | 
						||
["$[1][0].b.c", "$[1][1].c.c"]
 | 
						||
select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo%bar' );
 | 
						||
json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo%bar' )
 | 
						||
["$[0]", "$[1]"]
 | 
						||
select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo\%bar' );
 | 
						||
json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo\%bar' )
 | 
						||
"$[1]"
 | 
						||
select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo|%bar', '|' );
 | 
						||
json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo|%bar', '|' )
 | 
						||
"$[1]"
 | 
						||
select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo|%bar', '|', '$[0]' );
 | 
						||
json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo|%bar', '|', '$[0]' )
 | 
						||
NULL
 | 
						||
select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo|%bar', '|', '$[0]', '$[1]' );
 | 
						||
json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo|%bar', '|', '$[0]', '$[1]' )
 | 
						||
"$[1]"
 | 
						||
select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo|%bar', '|', '$[0]', '$[1]', '$[2]' );
 | 
						||
json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo|%bar', '|', '$[0]', '$[1]', '$[2]' )
 | 
						||
"$[1]"
 | 
						||
select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo\%bar', null );
 | 
						||
json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo\%bar', null )
 | 
						||
"$[1]"
 | 
						||
select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo\%bar', null, '$[0]' );
 | 
						||
json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo\%bar', null, '$[0]' )
 | 
						||
NULL
 | 
						||
select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo\%bar', null, '$[1]' );
 | 
						||
json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo\%bar', null, '$[1]' )
 | 
						||
"$[1]"
 | 
						||
select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo|%bar', '|', '$[0]' );
 | 
						||
json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo|%bar', '|', '$[0]' )
 | 
						||
NULL
 | 
						||
select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo|%bar', '|', '$[1]' );
 | 
						||
json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo|%bar', '|', '$[1]' )
 | 
						||
"$[1]"
 | 
						||
select json_search( '[ "abc", "ABC" ]', 'all', 'aBc' );
 | 
						||
json_search( '[ "abc", "ABC" ]', 'all', 'aBc' )
 | 
						||
["$[0]", "$[1]"]
 | 
						||
select json_search( '[ "abc", "ABC" ]', 'all', 'abc' );
 | 
						||
json_search( '[ "abc", "ABC" ]', 'all', 'abc' )
 | 
						||
["$[0]", "$[1]"]
 | 
						||
select json_search( '[ "abc", "ABC" ]', 'all', 'ABC' );
 | 
						||
json_search( '[ "abc", "ABC" ]', 'all', 'ABC' )
 | 
						||
["$[0]", "$[1]"]
 | 
						||
select json_search( '[ 10, "10", 1.0, "1.0" ]', 'all', '1%' );
 | 
						||
json_search( '[ 10, "10", 1.0, "1.0" ]', 'all', '1%' )
 | 
						||
["$[0]", "$[1]", "$[2]", "$[3]"]
 | 
						||
SELECT JSON_SEARCH
 | 
						||
(
 | 
						||
'{ "a" : 123, "b" : [ 123, 456 ] }',
 | 
						||
'one',
 | 
						||
'123'
 | 
						||
);
 | 
						||
JSON_SEARCH
 | 
						||
(
 | 
						||
'{ "a" : 123, "b" : [ 123, 456 ] }',
 | 
						||
'one',
 | 
						||
'123'
 | 
						||
)
 | 
						||
"$.a"
 | 
						||
SELECT JSON_SEARCH
 | 
						||
(
 | 
						||
'{ "a" : "123", "b" : [ 123, "789", "123", "456", "123" ] }',
 | 
						||
'one',
 | 
						||
'123',
 | 
						||
null,
 | 
						||
'$.b'
 | 
						||
);
 | 
						||
JSON_SEARCH
 | 
						||
(
 | 
						||
'{ "a" : "123", "b" : [ 123, "789", "123", "456", "123" ] }',
 | 
						||
'one',
 | 
						||
'123',
 | 
						||
null,
 | 
						||
'$.b'
 | 
						||
)
 | 
						||
"$.b[0]"
 | 
						||
SELECT JSON_SEARCH
 | 
						||
(
 | 
						||
'{ "a" : "123", "b" : { "key" : "123" } }',
 | 
						||
'one',
 | 
						||
'123'
 | 
						||
);
 | 
						||
JSON_SEARCH
 | 
						||
(
 | 
						||
'{ "a" : "123", "b" : { "key" : "123" } }',
 | 
						||
'one',
 | 
						||
'123'
 | 
						||
)
 | 
						||
"$.a"
 | 
						||
SELECT JSON_SEARCH
 | 
						||
(
 | 
						||
'{ "a" : "1243", "b" : { "key" : "1234" } }',
 | 
						||
'one',
 | 
						||
'123%'
 | 
						||
);
 | 
						||
JSON_SEARCH
 | 
						||
(
 | 
						||
'{ "a" : "1243", "b" : { "key" : "1234" } }',
 | 
						||
'one',
 | 
						||
'123%'
 | 
						||
)
 | 
						||
"$.b.key"
 | 
						||
SELECT JSON_SEARCH
 | 
						||
(
 | 
						||
'{ "a" : "1243", "b" : { "key" : "1234", "c": "directorysub%directoryabc" } }',
 | 
						||
'one',
 | 
						||
'dir%torysub@%dir%',
 | 
						||
'@'
 | 
						||
);
 | 
						||
JSON_SEARCH
 | 
						||
(
 | 
						||
'{ "a" : "1243", "b" : { "key" : "1234", "c": "directorysub%directoryabc" } }',
 | 
						||
'one',
 | 
						||
'dir%torysub@%dir%',
 | 
						||
'@'
 | 
						||
)
 | 
						||
"$.b.c"
 | 
						||
SELECT JSON_SEARCH
 | 
						||
(
 | 
						||
'{ "a" : "1243", "b" : { "key" : "1234" } }',
 | 
						||
'one',
 | 
						||
'123%',
 | 
						||
null,
 | 
						||
'$.c'
 | 
						||
);
 | 
						||
JSON_SEARCH
 | 
						||
(
 | 
						||
'{ "a" : "1243", "b" : { "key" : "1234" } }',
 | 
						||
'one',
 | 
						||
'123%',
 | 
						||
null,
 | 
						||
'$.c'
 | 
						||
)
 | 
						||
NULL
 | 
						||
SELECT JSON_UNQUOTE
 | 
						||
(
 | 
						||
JSON_SEARCH
 | 
						||
(
 | 
						||
'{ "onepotato": "foot", "one potato": "food" , "one \\"potato": "fool" }',
 | 
						||
'all',
 | 
						||
'food'
 | 
						||
  )
 | 
						||
);
 | 
						||
JSON_UNQUOTE
 | 
						||
(
 | 
						||
JSON_SEARCH
 | 
						||
(
 | 
						||
'{ "onepotato": "foot", "one potato": "food" , "one \\"potato": "fool" }',
 | 
						||
'all',
 | 
						||
'food'
 | 
						||
  )
 | 
						||
)
 | 
						||
$.one potato
 | 
						||
select json_type(case (null is null) when 1 then
 | 
						||
json_compact('null') else
 | 
						||
json_compact('[1,2,3]') end);
 | 
						||
json_type(case (null is null) when 1 then
 | 
						||
json_compact('null') else
 | 
						||
json_compact('[1,2,3]') end)
 | 
						||
NULL
 | 
						||
select json_type(case (null is not null) when 1 then
 | 
						||
json_compact('null') else
 | 
						||
json_compact('[1,2,3]') end);
 | 
						||
json_type(case (null is not null) when 1 then
 | 
						||
json_compact('null') else
 | 
						||
json_compact('[1,2,3]') end)
 | 
						||
ARRAY
 | 
						||
select json_type( if(null is null,
 | 
						||
json_compact('null'),
 | 
						||
json_compact('[1,2,3]')) );
 | 
						||
json_type( if(null is null,
 | 
						||
json_compact('null'),
 | 
						||
json_compact('[1,2,3]')) )
 | 
						||
NULL
 | 
						||
select json_type( if(null is not null,
 | 
						||
json_compact('null'),
 | 
						||
json_compact('[1,2,3]')));
 | 
						||
json_type( if(null is not null,
 | 
						||
json_compact('null'),
 | 
						||
json_compact('[1,2,3]')))
 | 
						||
ARRAY
 | 
						||
select cast(json_extract(json_compact(concat('[', json_compact('["A",2]'), ']')),
 | 
						||
'$[0][1]') as char) = 2;
 | 
						||
cast(json_extract(json_compact(concat('[', json_compact('["A",2]'), ']')),
 | 
						||
'$[0][1]') as char) = 2
 | 
						||
1
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
# Test of aggregate function MAX, MIN.
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
select max(json_compact('[1,2,3]'));
 | 
						||
max(json_compact('[1,2,3]'))
 | 
						||
[1,2,3]
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
# Test of JSON_QUOTE, JSON_UNQUOTE
 | 
						||
# ----------------------------------------------------------------------
 | 
						||
select json_quote();
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_quote'
 | 
						||
select json_quote('abc', 'def');
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_quote'
 | 
						||
select json_quote(NULL, 'def');
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_quote'
 | 
						||
select json_quote('abc', NULL);
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_quote'
 | 
						||
select json_unquote();
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_unquote'
 | 
						||
select json_unquote('"abc"', '"def"');
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_unquote'
 | 
						||
select json_unquote(NULL, 'def');
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_unquote'
 | 
						||
select json_unquote('"abc"', NULL);
 | 
						||
ERROR 42000: Incorrect parameter count in the call to native function 'json_unquote'
 | 
						||
select json_quote(NULL);
 | 
						||
json_quote(NULL)
 | 
						||
NULL
 | 
						||
select json_unquote(NULL);
 | 
						||
json_unquote(NULL)
 | 
						||
NULL
 | 
						||
select json_quote('abc');
 | 
						||
json_quote('abc')
 | 
						||
"abc"
 | 
						||
select json_quote(convert('abc' using ascii));
 | 
						||
json_quote(convert('abc' using ascii))
 | 
						||
"abc"
 | 
						||
select json_quote(convert('abc' using latin1));
 | 
						||
json_quote(convert('abc' using latin1))
 | 
						||
"abc"
 | 
						||
select json_quote(convert('abc' using utf8));
 | 
						||
json_quote(convert('abc' using utf8))
 | 
						||
"abc"
 | 
						||
select json_quote(convert('abc' using utf8mb4));
 | 
						||
json_quote(convert('abc' using utf8mb4))
 | 
						||
"abc"
 | 
						||
select json_unquote('abc');
 | 
						||
json_unquote('abc')
 | 
						||
abc
 | 
						||
select json_unquote('"abc"');
 | 
						||
json_unquote('"abc"')
 | 
						||
abc
 | 
						||
select json_unquote(convert('"abc"' using ascii));
 | 
						||
json_unquote(convert('"abc"' using ascii))
 | 
						||
abc
 | 
						||
select json_unquote(convert('"abc"' using latin1));
 | 
						||
json_unquote(convert('"abc"' using latin1))
 | 
						||
abc
 | 
						||
select json_unquote(convert('"abc"' using utf8));
 | 
						||
json_unquote(convert('"abc"' using utf8))
 | 
						||
abc
 | 
						||
select json_unquote(convert('"abc"' using utf8mb4));
 | 
						||
json_unquote(convert('"abc"' using utf8mb4))
 | 
						||
abc
 | 
						||
select json_quote('"');
 | 
						||
json_quote('"')
 | 
						||
"\""
 | 
						||
select json_unquote('"');
 | 
						||
json_unquote('"')
 | 
						||
"
 | 
						||
Warnings:
 | 
						||
Warning	4037	Unexpected end of JSON text in argument 1 to function 'json_unquote'
 | 
						||
error ER_INCORRECT_TYPE
 | 
						||
select json_quote(123);
 | 
						||
json_quote(123)
 | 
						||
NULL
 | 
						||
error ER_INCORRECT_TYPE
 | 
						||
select json_unquote(123);
 | 
						||
json_unquote(123)
 | 
						||
123
 | 
						||
select json_unquote('""');
 | 
						||
json_unquote('""')
 | 
						||
 | 
						||
select char_length(json_unquote('""'));
 | 
						||
char_length(json_unquote('""'))
 | 
						||
0
 | 
						||
select json_unquote('"" ');
 | 
						||
json_unquote('"" ')
 | 
						||
 | 
						||
select json_unquote(json_compact(json_quote('abc')));
 | 
						||
json_unquote(json_compact(json_quote('abc')))
 | 
						||
abc
 | 
						||
select json_compact('{"abc": "foo"}');
 | 
						||
json_compact('{"abc": "foo"}')
 | 
						||
{"abc":"foo"}
 | 
						||
select json_unquote(json_compact('{"abc": "foo"}'));
 | 
						||
json_unquote(json_compact('{"abc": "foo"}'))
 | 
						||
{"abc": "foo"}
 | 
						||
select json_extract(json_compact('{"abc": "foo"}'), '$.abc');
 | 
						||
json_extract(json_compact('{"abc": "foo"}'), '$.abc')
 | 
						||
"foo"
 | 
						||
select json_unquote(json_extract(json_compact('{"abc": "foo"}'), '$.abc'));
 | 
						||
json_unquote(json_extract(json_compact('{"abc": "foo"}'), '$.abc'))
 | 
						||
foo
 | 
						||
select json_unquote('["a", "b", "c"]');
 | 
						||
json_unquote('["a", "b", "c"]')
 | 
						||
["a", "b", "c"]
 | 
						||
select json_unquote(json_compact('["a", "b", "c"]'));
 | 
						||
json_unquote(json_compact('["a", "b", "c"]'))
 | 
						||
["a", "b", "c"]
 | 
						||
select charset(json_unquote('"abc"'));
 | 
						||
charset(json_unquote('"abc"'))
 | 
						||
utf8mb4
 | 
						||
select json_quote(convert(X'e68891' using utf8));
 | 
						||
json_quote(convert(X'e68891' using utf8))
 | 
						||
"我"
 | 
						||
select json_quote(convert(X'e68891' using utf8mb4));
 | 
						||
json_quote(convert(X'e68891' using utf8mb4))
 | 
						||
"我"
 | 
						||
select json_compact(json_quote(convert(X'e68891' using utf8)));
 | 
						||
json_compact(json_quote(convert(X'e68891' using utf8)))
 | 
						||
"我"
 | 
						||
select json_unquote(convert(X'e68891' using utf8));
 | 
						||
json_unquote(convert(X'e68891' using utf8))
 | 
						||
我
 | 
						||
select  json_quote(json_quote(json_quote('abc')));
 | 
						||
json_quote(json_quote(json_quote('abc')))
 | 
						||
"\"\\\"abc\\\"\""
 | 
						||
select  json_unquote(json_unquote(json_unquote(        # long round trip of it
 | 
						||
json_quote(json_quote(json_quote('abc'))))));
 | 
						||
json_unquote(json_unquote(json_unquote(        # long round trip of it
 | 
						||
json_quote(json_quote(json_quote('abc'))))))
 | 
						||
abc
 | 
						||
select json_compact(cast('2015-01-15 23:24:25' as datetime));
 | 
						||
json_compact(cast('2015-01-15 23:24:25' as datetime))
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4038	Syntax error in JSON text in argument 1 to function 'json_compact' at position 5
 | 
						||
select json_unquote(json_compact(cast('2015-01-15 23:24:25' as datetime)));
 | 
						||
json_unquote(json_compact(cast('2015-01-15 23:24:25' as datetime)))
 | 
						||
2015-01-15 23:24:25
 | 
						||
select json_compact(st_geomfromtext('point(1 1)'));
 | 
						||
json_compact(st_geomfromtext('point(1 1)'))
 | 
						||
NULL
 | 
						||
Warnings:
 | 
						||
Warning	4036	Character disallowed in JSON in argument 1 to function 'json_compact' at position 1
 | 
						||
select json_unquote(json_compact(st_geomfromtext('point(1 1)')));
 | 
						||
json_unquote(json_compact(st_geomfromtext('point(1 1)')))
 | 
						||
 |